Árvore de páginas


01. DADOS GERAIS

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

GPEM070

Ticket:8581039
Requisito/Story/Issue:DRHPAG-35723
Pacote:

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

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

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

12.1.27: https://suporte.totvs.com/portal/p/10098/download?e=969472


02. SITUAÇÃO/REQUISITO

Foi efetuado o procedimento para adiar o pagamento de 1/3 de férias no cálculo de férias do funcionário, conforme documentação disponível aqui

Ao efetuar o cálculo de provisão de férias, o valor de 1/3 de férias não é mais demonstrado no relatório. Da mesma forma, a baixa desse valor também não era gerada quando da quitação na folha de pagamento, através da geração do valor pela rotina PGTFER927, de acordo a este tutorial.


03. SOLUÇÃO

Para que na situação acima o saldo do valor de 1/3 de férias adiado seja mantido na conta até o seu efetivo pagamento na folha, quando efetivamente será efetuado a baixa do valor, foi feito uma alteração no cálculo da provisão (rotina GPEM070) e foi disponibilizado abaixo um arquivo .prx de exemplo contendo a implementação dos pontos de entrada GP070P13GP070CODGP070FBX. O arquivo deverá ser baixado, alterado conforme necessidade e compilado no RPO.

Obs.: NÃO é necessário cadastrá-lo no menu, pois o arquivo somente contém implementações de pontos de entrada.


Informação

Cada ponto de entrada possui uma finalidade diferente:

  • GP070P13: irá retornar o valor de 1/3 de férias adiado para o saldo da provisão.
  • GP070COD: por padrão, o sistema somente considera as verbas dos IDs de cálculo 0077, 0079, 0090 e 0095 para efetuar a baixa de 1/3 de férias. Com o ponto de entrada, será possível considerar a verba gerada na folha através da rotina PGTFER927.
  • GP070FBX: por padrão, o sistema somente verifica e realiza a baixa de férias em período que o funcionário está de férias. Como a quitação de 1/3 de férias na folha poderá ocorrer em período que o funcionário não está de férias, o ponto de entrada irá forçar a verificação da baixa mesmo nesse período.


Dessa forma, quando o sistema efetuar o cálculo da provisão de férias, através da execução do ponto de entrada GP070P13 será efetuado uma validação para buscar o valor da verba de base de 1/3 de férias adiado gerado no cálculo de férias e esse valor será retornado ao saldo da provisão de férias. Isso ocorrerá a partir do cálculo de férias que teve o 1/3 de férias adiado até o período em que ocorrer a quitação de 1/3 de férias na folha.

Quando for efetuado a quitação de 1/3 de férias adiado na folha, através do ponto de entrada GP070COD será adicionado o código da verba da folha para que o sistema efetue a baixa desse valor na coluna de 1/3 de férias. E, através do ponto de entrada GP070FBX, o sistema irá verificar e efetuar a baixa de 1/3 de férias mesmo em período em que o funcionário não esteja de férias, pois por padrão não ocorre essa verificação para evitar processamento desnecessário.

Importante

Conforme explicado acima, os pontos de entrada irão alterar o cálculo da provisão. Dessa forma, é necessário recalcular a provisão de férias a partir do período em que se iniciou o adiamento de 1/3 de férias.


O arquivo de exemplo pode ser baixado ao clicar no ícone abaixo:

exemplo_v5.prx

Histórico de atualizações

v5 - 02/12/2020 - Correção na validação da data final para a busca das informações.

v4 - 11/11/2020 - Correção para tratar corretamente o período de pagamento de 1/3 adiado na folha para não efetuar baixa de férias em período que não houve o adiamento de 1/3 de férias.

v3 - 30/10/2020 - Melhoria para validar, caso tenha ocorrido, o adiamento de 1/3 sobre abono e o próprio abono.

v2 - 23/10/2020 - Correção para não considerar férias iniciadas em mês seguinte ao período de cálculo da provisão.

v1 - 11/06/2020 - Versão inicial do ponto de entrada.



Na parte superior do ponto de entrada, foram declaradas 12 variáveis auxiliares do tipo Static, que irão conter as definições de período inicial e verbas. Os valores devem ser alterados conforme o período de adiamento de 1/3 de férias e de acordo com o código das verbas que foram cadastradas no cadastro de verbas:

Static cPIniMP927   :=	"202003"//Variável para definir o período inicial que começou o adiamento de 1/3 de férias
Static cPFimMP927   :=	"202007"//Variável para definir o período final do adiamento de 1/3 de férias
Static cPPgtoFol    :=	"202012"//Variável para definir o período em que ocorre o pagamento em folha de 1/3 adiado
Static cVbUmTFer    :=	"MP1"//Variável para definir o código da verba de base de 1/3 de férias mês
Static cVbUmTFMS    :=	"MP2"//Variável para definir o código da verba de base de 1/3 de férias mês seguinte
Static cVbUmTAbo    :=	"MP5"//Variável para definir o código da verba de base de 1/3 de abono mês
Static cVbUmTAMS    :=	"MP6"//Variável para definir o código da verba de base de 1/3 de abono mês
Static cVbAboMes    :=	"MPX"//Variável para definir o código da verba de base de abono mês
Static cVbAboMS     :=	"MPY"//Variável para definir o código da verba de base de abono mês seguinte
Static cVbUmTFol    :=	"MP9"//Variável para definir o código da verba de 1/3 de férias paga na folha
Static cVbUmTAFol   :=	"MPA"//Variável para definir o código da verba de 1/3 de abono paga na folha
Static cVbAbTFol    :=	"MPZ"//Variável para definir o código da verba de abono paga na folha


No exemplo acima, foi definido que em 03/2020 foi iniciado o adiamento de 1/3 de férias com término em 07/2020 e em 12/2020 será efetuado o pagamento em folha do valor de 1/3 adiado. As verbas MP1 e MP2 foram cadastradas como do tipo base referente ao 1/3 de férias mês e mês seguinte adiado, as verbas MP5 e MP6 foram cadastradas como do tipo base referente ao 1/3 de abono mês e mês seguinte adiado, as verbas MPX e MPY foram cadastradas como do tipo base referente ao abono mês e mês seguinte adiado e são gerados no Cálculo de Férias; já a verba MP9 é a verba de provento que será gerada na folha para o pagamento de 1/3 de férias adiado, a verba MPA é a verba de provento que será gerada na folha para o pagamento de 1/3 de abono adiado e a verba MPZ é a verba de provento que será gerada na folha para o pagamento do abono adiado.



O ponto de entrada irá efetuar os seguintes procedimentos:

Linha 33: se o cálculo da provisão está entre o período inicial e período de pagamento 1/3 de férias;

Linha 35: se o período estiver em aberto, efetua busca na tabela SRC para verba de quitação de 1/3 de férias adiado, ou se o período estiver fechado, efetua a busca na tabela SRD. Se encontrar a verba, significa que não é necessário retornar o saldo de 1/3 de férias;

Linha 43: se precisa retornar o saldo de 1/3 de férias e encontrar cálculo de férias para o funcionário na tabela SRH;

Linha 45: percorre todos os registros da tabela SRH para o funcionário;

Linha 47: se o cálculo de férias iniciou entre o período inicial e período final do adiamento de 1/3 de férias;

Linha 49: se encontrou na tabela SRR pela verba de base de 1/3 de férias mês;

Linha 51: percorre todos os registros da tabela SRR da verba de base de 1/3 de férias mês para o funcionário;

Linha 52: pega o valor da verba através do campo RR_VALOR;

Linha 53: adiciona o valor da verba encontrada na posição do Array de férias vencidas correspondente ao saldo atual de 1/3 de férias;

Linha 54: adiciona o valor de INSS correspondente a verba encontrada na posição do Array de férias vencidas correspondente ao saldo atual de INSS;

Linha 55: adiciona o valor de FGTS correspondente a verba encontrada na posição do Array de férias vencidas correspondente ao saldo atual de FGTS;

Linha 56: adiciona o valor de PIS correspondente a verba encontrada na posição do Array de férias vencidas correspondente ao saldo atual de PIS;

Linha 61: se encontrou na tabela SRR pela verba de base de 1/3 de férias mês seguinte;

Linha 63: percorre todos os registros da tabela SRR da verba de base de 1/3 de férias mês seguinte para o funcionário;

Linha 64: pega o valor da verba através do campo RR_VALOR;

Linha 65: adiciona o valor da verba encontrada na posição do Array de férias vencidas correspondente ao saldo atual de 1/3 de férias;

Linha 66: adiciona o valor de INSS correspondente a verba encontrada na posição do Array de férias vencidas correspondente ao saldo atual de INSS;

Linha 67: adiciona o valor de FGTS correspondente a verba encontrada na posição do Array de férias vencidas correspondente ao saldo atual de FGTS;

Linha 68: adiciona o valor de PIS correspondente a verba encontrada na posição do Array de férias vencidas correspondente ao saldo atual de PIS;

Linha 73: se encontrou na tabela SRR pela verba de base de 1/3 de abono mês;

Linha 75: percorre todos os registros da tabela SRR da verba de base de 1/3 de abono mês para o funcionário;

Linha 76: pega o valor da verba através do campo RR_VALOR;

Linha 77: adiciona o valor da verba encontrada na posição do Array de férias vencidas correspondente ao saldo atual de 1/3 de férias;

Linha 78: adiciona o valor de INSS correspondente a verba encontrada na posição do Array de férias vencidas correspondente ao saldo atual de INSS;

Linha 79: adiciona o valor de FGTS correspondente a verba encontrada na posição do Array de férias vencidas correspondente ao saldo atual de FGTS;

Linha 80: adiciona o valor de PIS correspondente a verba encontrada na posição do Array de férias vencidas correspondente ao saldo atual de PIS;

Linha 85: se encontrou na tabela SRR pela verba de base de 1/3 de abono mês seguinte;

Linha 87: percorre todos os registros da tabela SRR da verba de base de 1/3 de abono mês seguinte para o funcionário;

Linha 88: pega o valor da verba através do campo RR_VALOR;

Linha 89: adiciona o valor da verba encontrada na posição do Array de férias vencidas correspondente ao saldo atual de 1/3 de férias;

Linha 90: adiciona o valor de INSS correspondente a verba encontrada na posição do Array de férias vencidas correspondente ao saldo atual de INSS;

Linha 91: adiciona o valor de FGTS correspondente a verba encontrada na posição do Array de férias vencidas correspondente ao saldo atual de FGTS;

Linha 92: adiciona o valor de PIS correspondente a verba encontrada na posição do Array de férias vencidas correspondente ao saldo atual de PIS;

Linha 97: se encontrou na tabela SRR pela verba de base de abono mês;

Linha 99: percorre todos os registros da tabela SRR da verba de abono mês para o funcionário;

Linha 100: pega o valor da verba através do campo RR_VALOR;

Linha 101: adiciona o valor da verba encontrada na posição do Array de férias vencidas correspondente ao saldo atual de 1/3 de férias;

Linha 102: adiciona o valor de INSS correspondente a verba encontrada na posição do Array de férias vencidas correspondente ao saldo atual de INSS;

Linha 103: adiciona o valor de FGTS correspondente a verba encontrada na posição do Array de férias vencidas correspondente ao saldo atual de FGTS;

Linha 104: adiciona o valor de PIS correspondente a verba encontrada na posição do Array de férias vencidas correspondente ao saldo atual de PIS;

Linha 109: se encontrou na tabela SRR pela verba de base de abono mês seguinte;

Linha 111: percorre todos os registros da tabela SRR da verba de base de abono mês seguinte para o funcionário;

Linha 112: pega o valor da verba através do campo RR_VALOR;

Linha 113: adiciona o valor da verba encontrada na posição do Array de férias vencidas correspondente ao saldo atual de 1/3 de férias;

Linha 114: adiciona o valor de INSS correspondente a verba encontrada na posição do Array de férias vencidas correspondente ao saldo atual de INSS;

Linha 115: adiciona o valor de FGTS correspondente a verba encontrada na posição do Array de férias vencidas correspondente ao saldo atual de FGTS;

Linha 116: adiciona o valor de PIS correspondente a verba encontrada na posição do Array de férias vencidas correspondente ao saldo atual de PIS;


//Ponto de entrada para alterar o valor provisionado de férias vencidas para retornar o valor de 1/3 para o saldo
User Function GP070P13()
    
    Local aAreaSRC  := SRC->( GetArea() )
    Local aAreaSRD  := SRD->( GetArea() )
    Local aAreaSRH  := SRH->( GetArea() )
    Local aAreaSRR  := SRR->( GetArea() )
    Local lProvUmT  := .T.
    Local nValAbo   := 0
    Local nValUmT   := 0
    
    SRC->( dbSetOrder(1) ) // RC_FILIAL+RC_MAT+RC_PD+RC_CC+RC_SEMANA+RC_SEQ
    SRD->( dbSetOrder(1) ) // RD_FILIAL+RD_MAT+RD_DATARQ+RD_PD+RD_SEMANA+RD_SEQ+RD_CC+RD_PROCES
    SRH->( dbSetOrder(1) ) // RH_FILIAL+RH_MAT+DTOS(RH_DATABAS)+DTOS(RH_DATAINI)
    SRR->( dbSetOrder(1) ) // RR_FILIAL+RR_MAT+RR_TIPO3+DTOS(RR_DATA)+RR_PD+RR_CC+RR_PROCES
    
    //Se o cálculo da provisão estiver dentro do período do adiamento do 1/3
    If cAnoMes >= cPIniMP927 .And. cAnoMes <= cPPgtoFol
        //Pesquisa na tabela SRC a verba de pagamento do 1/3 adiado
        If SRC->( dbSeek(SRA->RA_FILIAL + SRA->RA_MAT + cVbUmTFol) ) .And. SRC->RC_PERIODO == cAnoMes
            lProvUmT := .F.
        EndIf
        //Pesquisa na tabela SRD a verba de pagamento do 1/3 adiado
        If SRD->( dbSeek(SRA->RA_FILIAL + SRA->RA_MAT + cAnoMes + cVbUmTFol) )
            lProvUmT := .F.
        EndIf
        //Se não houve pagamento do 1/3 adiado realiza busca na tabela SRH para verificar se o funcionário possui férias calculadas
        If lProvUmT .And. SRH->( dbSeek(SRA->RA_FILIAL + SRA->RA_MAT) )
            //Pesquisa por todos os registros existentes na tabela SRH para o funcionário
            While SRH->( !Eof() ) .And. SRA->RA_FILIAL+SRA->RA_MAT == SRH->RH_FILIAL+SRH->RH_MAT
                //Se o cálculo das férias estiver dentro do período do adiamento do 1/3
                If cAnoMes >= AnoMes(SRH->RH_DATAINI) .And. AnoMes(SRH->RH_DATAINI) >= cPIniMP927 .And. AnoMes(SRH->RH_DATAINI) <= cPFimMP927
                    //Pesquisa nas verbas calculadas nas férias do funcionário pela verba de base de 1/3 de férias mês
                    If SRR->( dbSeek(SRA->RA_FILIAL + SRA->RA_MAT + "F" + dToS(SRH->RH_DATAINI) + cVbUmTFer ) )
                        //Pesquisa por todos os registros existentes na tabela SRR para o funcionário referente à verba de base de 1/3
                        While SRR->( !Eof() ) .And. SRA->RA_FILIAL+SRA->RA_MAT+"F"+dToS(SRH->RH_DATAINI)+cVbUmTFer == SRR->RR_FILIAL+SRR->RR_MAT+SRR->RR_TIPO3+dToS(SRR->RR_DATA)+SRR->RR_PD
                            nValUmT := SRR->RR_VALOR
                            aFerVenc[_Atual,_1Ter] += nValUmT//1/3 de férias
                            aFerVenc[_Atual,_INSS] += NoRound(nValUmT * (nPercEmp+nPercTer+nPercAcTrab))//INSS
                            aFerVenc[_Atual,_FGTS] += NoRound(nValUmT * nPercFgts)//FGTS
                            aFerVenc[_Atual,_PIS]  += NoRound(nValUmT * nPercPis)//PIS
                            SRR->( dbSkip() )
                        End
                    EndIf
                    //Pesquisa nas verbas calculadas nas férias do funcionário pela verba de base de 1/3 de férias mês seguinte
                    If SRR->( dbSeek(SRA->RA_FILIAL + SRA->RA_MAT + "F" + dToS(SRH->RH_DATAINI) + cVbUmTFMS ) )
                        //Pesquisa por todos os registros existentes na tabela SRR para o funcionário referente à verba de base de 1/3
                        While SRR->( !Eof() ) .And. SRA->RA_FILIAL+SRA->RA_MAT+"F"+dToS(SRH->RH_DATAINI)+cVbUmTFMS == SRR->RR_FILIAL+SRR->RR_MAT+SRR->RR_TIPO3+dToS(SRR->RR_DATA)+SRR->RR_PD
                            nValUmT := SRR->RR_VALOR
                            aFerVenc[_Atual,_1Ter] += nValUmT//1/3 de férias
                            aFerVenc[_Atual,_INSS] += NoRound(nValUmT * (nPercEmp+nPercTer+nPercAcTrab))//INSS
                            aFerVenc[_Atual,_FGTS] += NoRound(nValUmT * nPercFgts)//FGTS
                            aFerVenc[_Atual,_PIS]  += NoRound(nValUmT * nPercPis)//PIS
                            SRR->( dbSkip() )
                        End
                    EndIf
                    //Pesquisa nas verbas calculadas nas férias do funcionário pela verba de base de 1/3 de abono mês
                    If SRR->( dbSeek(SRA->RA_FILIAL + SRA->RA_MAT + "F" + dToS(SRH->RH_DATAINI) + cVbUmTAbo ) )
                        //Pesquisa por todos os registros existentes na tabela SRR para o funcionário referente à verba de base de 1/3
                        While SRR->( !Eof() ) .And. SRA->RA_FILIAL+SRA->RA_MAT+"F"+dToS(SRH->RH_DATAINI)+cVbUmTAbo == SRR->RR_FILIAL+SRR->RR_MAT+SRR->RR_TIPO3+dToS(SRR->RR_DATA)+SRR->RR_PD
                            nValUmT := SRR->RR_VALOR
                            aFerVenc[_Atual,_1Ter] += nValUmT//1/3 de abono
                            aFerVenc[_Atual,_INSS] += NoRound(nValUmT * (nPercEmp+nPercTer+nPercAcTrab))//INSS
                            aFerVenc[_Atual,_FGTS] += NoRound(nValUmT * nPercFgts)//FGTS
                            aFerVenc[_Atual,_PIS]  += NoRound(nValUmT * nPercPis)//PIS
                            SRR->( dbSkip() )
                        End
                    EndIf
                    //Pesquisa nas verbas calculadas nas férias do funcionário pela verba de base de 1/3 de abono mês seguinte
                    If SRR->( dbSeek(SRA->RA_FILIAL + SRA->RA_MAT + "F" + dToS(SRH->RH_DATAINI) + cVbUmTAMS ) )
                        //Pesquisa por todos os registros existentes na tabela SRR para o funcionário referente à verba de base de 1/3
                        While SRR->( !Eof() ) .And. SRA->RA_FILIAL+SRA->RA_MAT+"F"+dToS(SRH->RH_DATAINI)+cVbUmTAMS == SRR->RR_FILIAL+SRR->RR_MAT+SRR->RR_TIPO3+dToS(SRR->RR_DATA)+SRR->RR_PD
                            nValUmT := SRR->RR_VALOR
                            aFerVenc[_Atual,_1Ter] += nValUmT//1/3 de abono
                            aFerVenc[_Atual,_INSS] += NoRound(nValUmT * (nPercEmp+nPercTer+nPercAcTrab))//INSS
                            aFerVenc[_Atual,_FGTS] += NoRound(nValUmT * nPercFgts)//FGTS
                            aFerVenc[_Atual,_PIS]  += NoRound(nValUmT * nPercPis)//PIS
                            SRR->( dbSkip() )
                        End
                    EndIf
                    //Pesquisa nas verbas calculadas nas férias do funcionário pela verba de base de abono mês
                    If SRR->( dbSeek(SRA->RA_FILIAL + SRA->RA_MAT + "F" + dToS(SRH->RH_DATAINI) + cVbAboMes ) )
                        //Pesquisa por todos os registros existentes na tabela SRR para o funcionário referente à verba de base de 1/3
                        While SRR->( !Eof() ) .And. SRA->RA_FILIAL+SRA->RA_MAT+"F"+dToS(SRH->RH_DATAINI)+cVbAboMes == SRR->RR_FILIAL+SRR->RR_MAT+SRR->RR_TIPO3+dToS(SRR->RR_DATA)+SRR->RR_PD
                            nValAbo := SRR->RR_VALOR
                            aFerVenc[_Atual,_Prov] += nValAbo//Abono
                            aFerVenc[_Atual,_INSS] += NoRound(nValAbo * (nPercEmp+nPercTer+nPercAcTrab))//INSS
                            aFerVenc[_Atual,_FGTS] += NoRound(nValAbo * nPercFgts)//FGTS
                            aFerVenc[_Atual,_PIS]  += NoRound(nValAbo * nPercPis)//PIS
                            SRR->( dbSkip() )
                        End
                    EndIf
                    //Pesquisa nas verbas calculadas nas férias do funcionário pela verba de base de abono mês seguinte
                    If SRR->( dbSeek(SRA->RA_FILIAL + SRA->RA_MAT + "F" + dToS(SRH->RH_DATAINI) + cVbAboMS ) )
                        //Pesquisa por todos os registros existentes na tabela SRR para o funcionário referente à verba de base de 1/3
                        While SRR->( !Eof() ) .And. SRA->RA_FILIAL+SRA->RA_MAT+"F"+dToS(SRH->RH_DATAINI)+cVbAboMS == SRR->RR_FILIAL+SRR->RR_MAT+SRR->RR_TIPO3+dToS(SRR->RR_DATA)+SRR->RR_PD
                            nValAbo := SRR->RR_VALOR
                            aFerVenc[_Atual,_Prov] += nValAbo//Abono
                            aFerVenc[_Atual,_INSS] += NoRound(nValAbo * (nPercEmp+nPercTer+nPercAcTrab))//INSS
                            aFerVenc[_Atual,_FGTS] += NoRound(nValAbo * nPercFgts)//FGTS
                            aFerVenc[_Atual,_PIS]  += NoRound(nValAbo * nPercPis)//PIS
                            SRR->( dbSkip() )
                        End
                    EndIf
                EndIf
                SRH->( dbSkip() )
            End
        EndIf
    EndIf
    
    RestArea( aAreaSRC )
    RestArea( aAreaSRD )
    RestArea( aAreaSRH )
    RestArea( aAreaSRR )
    
Return 



Linha 136: adiciona o código da verba de quitação de 1/3 de férias adiado na folha na variável Private cCodUmTer, para que o sistema efetue a baixa na coluna de 1/3 de férias;

Linha 137: adiciona o código da verba de quitação de 1/3 de abono adiado na folha na variável Private cCodUmTer, para que o sistema efetue a baixa na coluna de 1/3 de férias;

Linha 138: adiciona o código da verba de quitação de 1/3 de abono adiado na folha na variável Private cCodAbono, para que o sistema efetue a baixa na coluna de 1/3 de férias;

Linha 139: adiciona o código da verba de quitação do abono adiado na folha na variável Private cCodAbono, para que o sistema efetue a baixa na coluna de férias;


//Ponto de entrada para adicionar uma verba específica nas variáveis que irão controlar a divisão da baixa de férias
User Function GP070COD()

cCodUmTer   += cVbUmTFol+"*"
cCodAbono   += cVbUmTAFol+"*"
cCodAbono   += cVbAbTFol+"*"

Return



Linha 149: se o cálculo da provisão está no período de pagamento em folha de 1/3 de férias adiado;

Linha 150: atribui .T. para a variável lBaixa para que indique ao sistema que seja forçado a busca pela baixa de férias;


//Ponto de entrada para forçar a busca pela baixa de férias, mesmo em mês que o funcionário não está de férias
User Function GP070FBX()

Local lBaixa := .F.

//Se o cálculo da provisão estiver no período de pagamento do 1/3 adiado em folha, força a verificação da baixa
If cAnoMes == cPPgtoFol
    lBaixa := .T.
EndIf

Return lBaixa