UNPKG

cnj-validate

Version:

Biblioteca TypeScript para validação e análise de números de processos em conformidade com o CNJ (Conselho Nacional de Justiça) do Brasil

222 lines 7.36 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.decomposeCNJ = decomposeCNJ; exports.validateCNJComponents = validateCNJComponents; exports.extractYear = extractYear; exports.extractSegment = extractSegment; exports.extractCourt = extractCourt; exports.isFromYear = isFromYear; exports.isFromSegment = isFromSegment; const districts_1 = require("../data/districts"); const segments_1 = require("../data/segments"); const errors_1 = require("../types/errors"); /** * Constante para composição do número de argumento */ const MATH_SUFFIX = '00'; /** * Decompõe um número CNJ em seus componentes individuais * @param cnj Número CNJ no formato NNNNNNN-DD.AAAA.J.CT.0000 ou NNNNNNNDDAAAAJCT0000 * @returns Estrutura DecomposedCNJ com todos os componentes */ function decomposeCNJ(cnj) { // Valida o tamanho básico if (cnj.length > 25 || cnj.length < 20) { throw errors_1.CNJValidationError.invalidLength(cnj, 20); } // Verifica se é formato com hífen (formatado) const isFormatted = cnj.includes('-'); if (isFormatted) { return decomposeFormattedCNJ(cnj); } else { return decomposeUnformattedCNJ(cnj); } } /** * Decompõe CNJ formatado (NNNNNNN-DD.AAAA.J.CT.0000) */ function decomposeFormattedCNJ(cnj) { const parts = cnj.split('-'); if (parts.length !== 2) { throw errors_1.CNJValidationError.invalidFormat(cnj); } const lawsuitNumber = parts[0]; const remainingParts = parts[1].split('.'); if (remainingParts.length !== 5) { throw errors_1.CNJValidationError.invalidFormat(cnj); } const [verifyingDigit, protocolYear, segment, court, sourceUnit] = remainingParts; return buildDecomposedCNJ({ lawsuitNumber, verifyingDigit, protocolYear, segment, court, sourceUnit, }); } /** * Decompõe CNJ não formatado (NNNNNNNDDAAAAJCT0000) */ function decomposeUnformattedCNJ(cnj) { if (cnj.length !== 20) { throw errors_1.CNJValidationError.invalidLength(cnj, 20); } const lawsuitNumber = cnj.substring(0, 7); const verifyingDigit = cnj.substring(7, 9); const protocolYear = cnj.substring(9, 13); const segment = cnj.substring(13, 14); const court = cnj.substring(14, 16); const sourceUnit = cnj.substring(16, 20); return buildDecomposedCNJ({ lawsuitNumber, verifyingDigit, protocolYear, segment, court, sourceUnit, }); } /** * Constrói a estrutura DecomposedCNJ com informações complementares */ function buildDecomposedCNJ(components) { const { lawsuitNumber, verifyingDigit, protocolYear, segment, court, sourceUnit, } = components; // Gera número de argumento para validação const argNumber = lawsuitNumber + protocolYear + segment + court + sourceUnit + MATH_SUFFIX; // Busca informações de distrito const districtKey = (0, districts_1.generateDistrictKey)(segment, court, sourceUnit); const districtInfo = (0, districts_1.getDistrictInfo)(districtKey); // Busca informações de segmento const segmentInfo = (0, segments_1.getSegment)(segment); // Gera código do tribunal const tj = generateTJCode(segment, court, districtInfo?.uf || '', segmentInfo); // Formata CNJ completo const lawsuitCNJFormat = `${lawsuitNumber}-${verifyingDigit}.${protocolYear}.${segment}.${court}.${sourceUnit}`; return { lawsuitCNJFormat, lawsuitNumber, verifyingDigit, protocolYear, segment, court, sourceUnit, argNumber, district: districtInfo?.sourceUnit || '', uf: districtInfo?.uf || '', tj, }; } /** * Gera código do tribunal baseado no segmento e outros parâmetros */ function generateTJCode(segment, court, uf, segmentInfo) { if (!segmentInfo) { return ''; } const segmentNumber = segmentInfo.number; // Para segmentos 1, 2, 3, 4, 7: usa número do tribunal if ([1, 2, 3, 4, 7].indexOf(segmentNumber) !== -1) { const courtNumber = parseInt(court, 10); if (isNaN(courtNumber)) { return ''; } return segmentInfo.short + courtNumber.toString(); } // Para outros segmentos: usa UF return segmentInfo.short + uf; } /** * Valida componentes básicos de um CNJ */ function validateCNJComponents(components) { const { lawsuitNumber, verifyingDigit, protocolYear, segment, court, sourceUnit, } = components; // Valida número do processo (7 dígitos) if (!/^\d{7}$/.test(lawsuitNumber)) { throw new errors_1.CNJValidationError('INVALID_FORMAT', 'Número do processo deve ter 7 dígitos', 'INVALID_LAWSUIT_NUMBER', { lawsuitNumber }); } // Valida dígito verificador (2 dígitos) if (!/^\d{2}$/.test(verifyingDigit)) { throw new errors_1.CNJValidationError('INVALID_FORMAT', 'Dígito verificador deve ter 2 dígitos', 'INVALID_VERIFYING_DIGIT', { verifyingDigit }); } // Valida ano (4 dígitos, entre 1998 e ano atual + 1) if (!/^\d{4}$/.test(protocolYear)) { throw new errors_1.CNJValidationError('INVALID_FORMAT', 'Protocol year must have 4 digits', 'INVALID_PROTOCOL_YEAR', { protocolYear }); } // Validate segment (1 digit) if (!/^\d{1}$/.test(segment)) { throw new errors_1.CNJValidationError('INVALID_FORMAT', 'Segmento deve ter 1 dígito', 'INVALID_SEGMENT', { segment }); } // Valida tribunal (2 dígitos) if (!/^\d{2}$/.test(court)) { throw new errors_1.CNJValidationError('INVALID_FORMAT', 'Código do tribunal deve ter 2 dígitos', 'INVALID_COURT', { court }); } // Valida unidade de origem (4 dígitos) if (!/^\d{4}$/.test(sourceUnit)) { throw new errors_1.CNJValidationError('INVALID_FORMAT', 'Código da unidade de origem deve ter 4 dígitos', 'INVALID_SOURCE_UNIT', { sourceUnit }); } } /** * Extrai ano de um número CNJ * @param cnj Número CNJ * @returns Ano de protocolo */ function extractYear(cnj) { try { const decomposed = decomposeCNJ(cnj); return decomposed.protocolYear; } catch { return ''; } } /** * Extrai segmento de um número CNJ * @param cnj Número CNJ * @returns Código de segmento */ function extractSegment(cnj) { try { const decomposed = decomposeCNJ(cnj); return decomposed.segment; } catch { return ''; } } /** * Extrai tribunal de um número CNJ * @param cnj Número CNJ * @returns Código de tribunal */ function extractCourt(cnj) { try { const decomposed = decomposeCNJ(cnj); return decomposed.court; } catch { return ''; } } /** * Verifica se um CNJ é de um ano específico * @param cnj Número CNJ * @param year Ano a ser verificado * @returns true se for do ano especificado */ function isFromYear(cnj, year) { const cnjYear = extractYear(cnj); return cnjYear === year; } /** * Verifica se um CNJ é de um segmento específico * @param cnj Número CNJ * @param segment Segmento a ser verificado * @returns true se for do segmento especificado */ function isFromSegment(cnj, segment) { const cnjSegment = extractSegment(cnj); return cnjSegment === segment; } //# sourceMappingURL=decomposer.js.map