No artigo de hoje, vamos demonstrar em como validar o último dia útil de um ano, para que o vencimento real de um título a receber seja postergado em 1 dia;
Recentemente, um cliente perguntou se seria possível que se um título caísse o vencimento no último dia útil do ano, que fosse postergado em 1, mas que isso fosse dinâmico, sem precisar ficar cadastrando na tabela 63 da SX5 (poderia ser feito, mas o cliente gostaria que fosse algo automático via fonte).
Pois, acontece que o último dia útil em um ano, pode ser considerado feriado nos bancos, como se fosse uma pausa para descanso.
E isso acarreta, que por exemplo, até 2027 o último dia útil seja o 31/12. Já em 2028, o último dia útil vai ser 29/12.
Ai para fazer dinamicamente, foi usado o Ponto de Entrada F040VENCR, que é disparado na validação do vencimento para preencher o vencimento real, ai a lógica desenvolvida foi:
- Se for o mês de Dezembro
- Pega o último e vem voltando (31, 30, 29, 28, etc)
- Quando for um dia útil, sai do laço
- Se o vencimento real, for esse último dia útil ou for igual a emissão, vai ser incrementando em +1 e depois buscado a próxima data válida
Abaixo o código fonte desenvolvido conforme a lógica acima:
//Bibliotecas #Include "TOTVS.ch" /*/{Protheus.doc} F040VENCR Ponto de entrada na validação do Vencimento no Contas a Receber para popular o Vencimento Real @type user function @author Atilio @since 23/12/2024 /*/ User Function F040VENCR() Local aArea := FWGetArea() Local dVencReal := M->E1_VENCREA Local dUltDia Local nCount := 7 //Se o mês for dezembro If Month(dVencReal) == 12 //Pega o último dia do ano dUltDia := LastDate(dVencReal) //Vem voltando uma semana While nCount <= 7 .And. nCount >= 1 //Se for um dia útil, sai do laço If DataValida(dUltDia) == dUltDia Exit EndIf //Diminui 1 dia dUltDia := DaySub(dUltDia, 1) nCount-- EndDo //Se o vencimento real for igual ao último dia útil do ano, incrementa 1, e pega a próxima data válida (feriado bancário) If dVencReal == dUltDia .Or. dVencReal == M->E1_EMISSAO dVencReal := DaySum(dVencReal, 1) dVencReal := DataValida(dVencReal, .T.) EndIf EndIf FWRestArea(aArea) Return dVencReal
Bom pessoal, por hoje é só.
Abraços e até a próxima.