Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Invalid date, must be between 1997/07/01 and 2024/11/15 #72

Open
rafaelreuber opened this issue Sep 9, 2018 · 5 comments
Open

Invalid date, must be between 1997/07/01 and 2024/11/15 #72

rafaelreuber opened this issue Sep 9, 2018 · 5 comments

Comments

@rafaelreuber
Copy link

rafaelreuber commented Sep 9, 2018

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

@pfrozi
Copy link

pfrozi commented Oct 7, 2020

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?

@ianAraujj
Copy link

ianAraujj commented Jan 24, 2024

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' ?

@pfrozi
Copy link

pfrozi commented Jan 24, 2024

Ainda não implementamos, mas pela especificação atual do BB, podemos usar a solução de contorno.

@pfrozi
Copy link

pfrozi commented Jan 25, 2024

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: Trust-Code/python-boleto#36

@ianAraujj
Copy link

ianAraujj commented Jan 25, 2024

@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

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants