Descrição do problema
O dígito verificador calculado por _checksum em brutils/legal_process.py sai sempre 1 abaixo do correto. Por isso, is_valid_legal_process rejeita números reais de processo, e generate_legal_process gera números que o padrão do CNJ considera inválidos.
A Resolução CNJ nº 65/2008 (Anexo VIII) define o DV pelo algoritmo ISO 7064 MOD 97-10:
DD = 98 - ((NNNNNNN AAAA J TR OOOO * 100) mod 97)
A implementação atual usa 97 no lugar de 98:
return str(97 - ((int(basenum) * 100) % 97)).zfill(2)
Outro jeito de conferir: com o DV no final, um número válido satisfaz int(NNNNNNN AAAA J TR OOOO DD) % 97 == 1. Os números gerados hoje pelo brutils dão 0.
Para Reproduzir
- Chamar
is_valid_legal_process com números reais e públicos:
>>> from brutils import is_valid_legal_process
>>> is_valid_legal_process("5046512-94.2016.4.04.7000") # JFPR
False
>>> is_valid_legal_process("0069758-61.2015.4.01.3400") # JFDF
False
- Comparar o DV calculado com o real:
>>> from brutils.legal_process import _checksum
>>> _checksum(504651220164047000) # DV real: 94
'93'
>>> _checksum(6975820154013400) # DV real: 61
'60'
- Conferir um número gerado:
>>> from brutils import generate_legal_process
>>> n = generate_legal_process()
>>> int(n[:7] + n[9:] + n[7:9]) % 97 # deveria ser 1
0
Comportamento esperado
is_valid_legal_process aceita números reais de processo e generate_legal_process gera números com DV válido. Os valores esperados nos testes (_checksum e os números usados em test_is_valid) também precisam ser corrigidos, porque foram gerados com a mesma fórmula.
Desktop (por favor, forneça as seguintes informações):
- Sistema Operacional: Windows 10 (o problema é de cálculo, não depende de SO)
- Versão do brutils:
main (2.5.0)
Contexto adicional
Trabalho com automação em sistemas de tribunais (PJe, eProc) e encontrei o problema validando números reais. Reproduzindo, achei também problemas na tabela data/legal_process_ids.json, que ficam fora desta issue e posso abrir à parte se fizer sentido:
- TRF6 ausente:
orgao_4 só tem os TRFs de 1 a 5, mas o TRF6 existe desde 2022. Números como 6043923-06.2026.4.06.3800 são rejeitados mesmo com o DV correto.
- TR dos tribunais superiores: pela Resolução 65, STF (J=1), CNJ (J=2) e STJ (J=3) usam
TR = 00, mas a tabela tem 1, 2 e 3. Também faltam o TR = 00 de TST, TSE e STM, e o OOOO = 0000 dos processos originários de 2º grau na Justiça Federal.
- Default congelado em
generate: orgao: int = randint(1, 9) é avaliado uma vez só, no import. Todas as chamadas de generate_legal_process() sem argumento no mesmo processo usam o mesmo órgão. O mesmo vale para o year.
Se aprovarem, abro o PR com a correção do DV e os testes ajustados. Bora!
Descrição do problema
O dígito verificador calculado por
_checksumembrutils/legal_process.pysai sempre 1 abaixo do correto. Por isso,is_valid_legal_processrejeita números reais de processo, egenerate_legal_processgera números que o padrão do CNJ considera inválidos.A Resolução CNJ nº 65/2008 (Anexo VIII) define o DV pelo algoritmo ISO 7064 MOD 97-10:
A implementação atual usa
97no lugar de98:Outro jeito de conferir: com o DV no final, um número válido satisfaz
int(NNNNNNN AAAA J TR OOOO DD) % 97 == 1. Os números gerados hoje pelo brutils dão0.Para Reproduzir
is_valid_legal_processcom números reais e públicos:Comportamento esperado
is_valid_legal_processaceita números reais de processo egenerate_legal_processgera números com DV válido. Os valores esperados nos testes (_checksume os números usados emtest_is_valid) também precisam ser corrigidos, porque foram gerados com a mesma fórmula.Desktop (por favor, forneça as seguintes informações):
main(2.5.0)Contexto adicional
Trabalho com automação em sistemas de tribunais (PJe, eProc) e encontrei o problema validando números reais. Reproduzindo, achei também problemas na tabela
data/legal_process_ids.json, que ficam fora desta issue e posso abrir à parte se fizer sentido:orgao_4só tem os TRFs de 1 a 5, mas o TRF6 existe desde 2022. Números como6043923-06.2026.4.06.3800são rejeitados mesmo com o DV correto.TR = 00, mas a tabela tem1,2e3. Também faltam oTR = 00de TST, TSE e STM, e oOOOO = 0000dos processos originários de 2º grau na Justiça Federal.generate:orgao: int = randint(1, 9)é avaliado uma vez só, no import. Todas as chamadas degenerate_legal_process()sem argumento no mesmo processo usam o mesmo órgão. O mesmo vale para oyear.Se aprovarem, abro o PR com a correção do DV e os testes ajustados. Bora!