pyboleto
pyboleto copied to clipboard
Invalid date, must be between 1997/07/01 and 2024/11/15
Olá, O código fonte do pacote data.py. Vi o seguinte trecho de código:
due_date_days = (self.data_vencimento - _EPOCH).days
if not (9999 >= due_date_days >= 0):
raise TypeError(
"Invalid date, must be between 1997/07/01 and 2024/11/15")
Fiquei curioso. Gostaria de saber por que existe essa validação de vencimento apenas entre 1997/07/01 e 2024/11/15
Corresponde ao cálculo do fator de vencimento do código de barras. Conforme a metodologia utilizada, esse fator recebe a informação da diferença em dias da data de vencimento do boleto em relação à data 07/10/1997 (não achei fonte que explique essa data exata). O campo possui apenas 4 posições, sendo 9999 o seu limite e por isso a limitação no método. Aqui tem um erro na pyBoleto, pois a data limite somando 9999 é na verdade 21/02/2025, e não 15/11/2024 como está na mensagem de erro. Além disso, existe uma solução de contorno para o cálculo do código de barras para vencimentos maiores do que 21/02/2025 que é apresentado no anexo IV da especificação do BB, onde informa que datas superiores à 21/02/2025 reiniciam o fator para o valor 1000. Por exemplo, a data 23/02/2025 vai ter o fator 1001.
Uma consideração adicional que eu vi no documento do BB é que o fator de vencimento é "suprimido" por boletos com valores maiores do que R$ 99.999.999,99, visto que o espaço estipulado para valor é 10. Eu nunca vi isso implementado, então acredito que ninguém aplique essa validação em seus sistemas (até pq um boleto de 100 milhões não se vê muito por aí). Eu só fiquei com uma dúvida neste caso: é feito padding '0' no fator de vencimento restante?
Corresponde ao cálculo do fator de vencimento do código de barras. Conforme a metodologia utilizada, esse fator recebe a informação da diferença em dias da data de vencimento do boleto em relação à data 07/10/1997 (não achei fonte que explique essa data exata). O campo possui apenas 4 posições, sendo 9999 o seu limite e por isso a limitação no método. Aqui tem um erro na pyBoleto, pois a data limite somando 9999 é na verdade 21/02/2025, e não 15/11/2024 como está na mensagem de erro. Além disso, existe uma solução de contorno para o cálculo do código de barras para vencimentos maiores do que 21/02/2025 que é apresentado no anexo IV da especificação do BB, onde informa que datas superiores à 21/02/2025 reiniciam o fator para o valor 1000. Por exemplo, a data 23/02/2025 vai ter o fator 1001.
Uma consideração adicional que eu vi no documento do BB é que o fator de vencimento é "suprimido" por boletos com valores maiores do que R$ 99.999.999,99, visto que o espaço estipulado para valor é 10. Eu nunca vi isso implementado, então acredito que ninguém aplique essa validação em seus sistemas (até pq um boleto de 100 milhões não se vê muito por aí). Eu só fiquei com uma dúvida neste caso: é feito padding '0' no fator de vencimento restante?
Boa noite, tudo bem ? Você implementou ou conhece alguém que implementou o cálculo de boletos para datas acima de '21/02/2025' ?
Ainda não implementamos, mas pela especificação atual do BB, podemos usar a solução de contorno.
Com o registro online, é provável que os códigos de barras e linhas digitáveis sejam gerados diretamente via API do banco emissor do boleto. Neste caso, não é necessário realizar os cálculos via pyboleto, basta usar o que é enviado pelo consumidor do package. Isso faz com que o cálculo de data seja desconsiderado, pois os valores já estarão calculados pelos próprios bancos.
Tem um pull request que já aceita os valores calculados externamente e, por consequência, não realiza os cálculos: https://github.com/Trust-Code/python-boleto/pull/36
@pfrozi Muito obrigado pelo retorno. Estou testando na minha aplicação a solução de contorno que você descreveu acima. Estou adicionando essa modificação na property do 'barcode':
if due_date_days < 0:
raise TypeError("Invalid date, must be greater than 1997/07/01")
if due_date_days > 9999:
due_date_days = due_date_days - 9000