Árvore de páginas

Tempo aproximado para leitura: 05 min

 DADOS GERAIS

Linha de Produto:Microsiga Protheus
Segmento:RH
Módulo:SIGAGPE
Função:

GPEM060.PRX

Ticket:8243352
Requisito/Story/Issue (informe o requisito relacionado):

DRHPAG-33780

Pacotes:

12.1.17: https://suporte.totvs.com/portal/p/10098/download?e=946342

12.1.23: https://suporte.totvs.com/portal/p/10098/download?e=946343

12.1.25: https://suporte.totvs.com/portal/p/10098/download?e=946344


02. SITUAÇÃO/REQUISITO

Solicita-se ponto de entrada para possibilitar o cálculo de mais de um período de férias programadas automaticamente. Atualmente, existindo um férias programadas em mais de um período aquisitivo, apenas o primeiro é calculado, tendo que executar a rotina novamente para calcular o segundo período.


03. SOLUÇÃO

Criação do ponto de entrada GP060MULT que deverá retornar um array contendo as seguintes informações:


PosiçãoConteúdoTipo
1Dias de fériasNumérico
2Data Inicio das fériasData
3Data Início do período aquisitivoData
4Data de pagamento do período de cálculo (RCH_DTPAGO)Data
5Data do Recibo de fériasData
6Data do Aviso de fériasData
7Se possui abono pecuniárioLógico
8Dias de Abono PecuniárioNumérico


No momento da execução do array, a tabela SRH (Cabeçalho de férias) estará posicionada no último registro incluído, sendo possível saber qual foi o último período aquisitivo utilizado, ou programação de férias pelos campos SRH→RH_DATABAS, SRH→RH_DATAINI e SRH→RH_DATAFIM, além dos demais campos da tabela.


Exemplo de criação do ponto de entrada


Considerando a tabela de Dias de Direito a seguir:


E a seguinte parametrização de cálculo:

Hoje o sistema calcularia apenas as férias com início em 01/03/2019, para que o segundo período seja calculado o ponto de entrada terá que retorna as informações do segundo período aquisitivo, que poderia ser feito da seguinte forma:



#INCLUDE "PROTHEUS.CH"

User Function GP060MULT()
Local aArea         := GetArea()
Local aAreaSRF      := SRF->(GetArea())
Local aRet          := {}
Local dDataBas      := SRH->RH_DATABAS          //Data inicio do período aquisitivo calculado
Local dDataIni      := SRH->RH_DATAINI          //Data inicio das férias calculadas
Local dDataFim      := SRH->RH_DATAFIM          //Data fim das férias calculadas
Local dDataPago     := CtoD("")                 //Data de pagamento do período
Local dDataRec      := CtoD("")                 //Data do recibo de férias
Local dDataAvi      := CtoD("")                 //Data do aviso de férias
Local nDiasFer      := 0                        //Dias de Férias programadas
Local nDiasAbo      := 0                        //Dias de Abono programados

DbSelectArea("SRF")
DbSetOrder(1) //RF_FILIAL, RF_MAT, RF_DATABAS, RF_PD, R_E_C_N_O_, D_E_L_E_T_

If SRF->(DbSeek(SRA->RA_FILIAL + SRA->RA_MAT + DtoS(dDataBas))) //Posiciona no período aquisitivo calculado
    SRF->(DbSkip()) //Vai para o próximo peeríodo aquisitivo
    If SRF->RF_FILIAL + SRF->RF_MAT == SRA->RA_FILIAL + SRA->RA_MAT
        dDataBas  := SRF->RF_DATABAS
        dDataIni  := SRF->RF_DATAINI
        nDiasFer  := SRF->RF_DFEPRO1
        nDiasAbo  := SRF->RF_DABPRO1
        dDataFim  := dDataIni + nDiasFer + nDiasAbo
        dDataAvi  := DataValida(dDataIni - 30,.F.)                           
        dDataPago := StoD(AnoMes(dDataIni)+StrZero(F_ULTDIA(dDataIni),2)) //Último dia do mês de inicio das férias
        dDataRec  := DataValida(DataValida(dDataIni-1,.F.)-1,.F.)         //Define a data do recibo como 2 dias úteis antes da data de inicio das férias
        
        aRet := {nDiasFer, dDataIni, dDataBas, dDataPago, dDataRec, dDataAvi, nDiasAbo > 0, nDiasAbo}
    EndIf 
EndIf

RestArea(aAreaSRF)
RestArea(aArea)

Return aRet

Importante

1 - O código acima é um exemplo para demonstrar as possibilidades de uso do ponto de entrada. O conteúdo do ponto de entrada, bem como as regras para utilizá-lo, devem ser desenvolvidas de acordo com a necessidade de cada cliente.

2 - O ponto de entrada deve retornar apenas um período no array, após efetuar o novo cálculo, o ponto de entrada é chamado mais um vez para que, caso necessário, um novo período seja informado. Se o array for retornado sem dados, o cálculo prossegue para o próximo funcionário.