Skip to content

Dígito verificador do processo jurídico (CNJ) calculado com 97 em vez de 98 #784

Description

@joaopalmeidao

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

  1. 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
  1. 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'
  1. 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!

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions