Validar o Último Dia Útil de um Ano via AdvPL

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:

  1. Se for o mês de Dezembro
  2. Pega o último e vem voltando (31, 30, 29, 28, etc)
  3. Quando for um dia útil, sai do laço
  4. 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.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação