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
JavaScript
;
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