Árvore de páginas

01. DADOS GERAIS

Produto:

TOTVS Prestadores de Serviços Terceirização

Linha de Produto:

Linha Protheus

Segmento:

Serviços

Módulo:Prestadores de Serviços
Função:Não há
País:Brasil
Ticket:Não há
Requisito/Story/Issue (informe o requisito relacionado) :DSERSGS-10968


02. SITUAÇÃO/REQUISITO

Criar um gatilho para calcular o valor da próxima parcela considerando a data final digitada. 

03. SOLUÇÃO

Criação de gatilho para o calculo automático do valor da próxima parcela considerando a data final digitada.

O calculo será feito quando o mês e ano da data inicial e da data final forem iguais e quando a database estiver no mesmo mês e ano da data final, realizando a proporcionalidade.

Importante

Essa implementação só será executada para contratos recorrentes(TFJ_CNTREC) e não terá efeito para itens extras.

04. DEMAIS INFORMAÇÕES


Exemplo de Uso

Crie o seguinte gatilho pelo configurador:


CampoConteúdo
CampoTFF_PERFIM
Sequencia001
Cnt. Dominio

TFF_VLPRPA

TipoPrimário
RegraU_ValFinal()
PosicionaNão
CondiçãoU_ValidRec()


Após a criação do gatilho, inclua as seguintes funções (user function):


Exemplo de Uso
#INCLUDE "PROTHEUS.CH"
#INCLUDE "FWMVCDEF.CH"
 
User Function ValFinal()
Local nDataIni      := Day(FwFldGet("TFF_PERINI")) //dia de inicio do contrato
Local nDtFimMes     := Day(FwFldGet("TFF_PERFIM")) // dia de fim do contrato
Local nMes          := Month(FwFldGet("TFF_PERFIM"))
Local nAno          := Year(FwFldGet("TFF_PERFIM"))
Local cCompet       := ""
Local cCodTFJ       := FwFldGet("TFJ_CODIGO")
Local nDataFim      := 30  // ultimo dia do mes
Local nDtPerfim     := 30  // ultimo dia do mes
Local nDtIniPer     := Day(FirstDate(FwFldGet("TFF_PERFIM"))) // primeiro dia do mes
Local nValor        := FwFldGet("TFF_PRCVEN") // preço de venda do contrato
Local nQtd          := FwFldGet("TFF_QTDVEN") // preço de venda do contrato
Local nValProx      := FwFldGet("TFF_VLPRPA")  
Local cCompetAnt    := At740GtPer()
Local nMesAnt       := 0
Local nAnoAnt       := 0
Local oModel	    := FwModelActive()
Local lAltera       := .T.

If !Empty(cCompetAnt)
    nMesAnt := Month(cCompetAnt)
    nAnoAnt := Year(cCompetAnt)
    If Len(cValToChar(nMesAnt)) == 1
        cCompetAnt  := "0" + cValToChar(nMesAnt) + "/" + cValToChar(nAnoAnt)
    Else
        cCompetAnt := cValToChar(nMesAnt) + "/" + cValToChar(nAnoAnt)
    EndIf 
EndIf

If Len(cValToChar(nMes)) == 1
    cCompet  := "0" + cValToChar(nMes) + "/" + cValToChar(nAno)
Else
    cCompet := cValToChar(nMes) + "/" + cValToChar(nAno)
EndIf 

If isInCallStack("TECA870")
    //Só realiza o calculo quando o mes e ano do periodo final for o mesmo do periodo inicial
    If Month(dDataBase) == Month(FwFldGet("TFF_PERFIM")) .And. Year(dDataBase) == Year(FwFldGet("TFF_PERFIM")) .And. Month(FwFldGet("TFF_PERFIM")) <> Month(FwFldGet("TFF_PERINI"))   
        nValor := (nValor/nDtPerfim)*((nDtFimMes-nDtIniPer)+1)   
    Else
        lAltera := .F. 
        If Year(FwFldGet("TFF_PERFIM")) <> Year(FwFldGet("TFF_PERINI"))
            If nDtFimMes == Day(LastDate(FwFldGet("TFF_PERFIM")))
                nValor := (nValor/nDataFim)*((nDataFim-1)+1)
            Else 
                nValor := (nValor/nDataFim) * nDtFimMes
            EndIf    
        Else
            If Month(FwFldGet("TFF_PERFIM")) <> Month(FwFldGet("TFF_PERINI"))
                If nDtFimMes == Day(LastDate(FwFldGet("TFF_PERFIM")))
                    nValor := (nValor/nDataFim)*((nDataFim-1)+1)
                Else 
                    nValor := (nValor/nDataFim) * nDtFimMes
                EndIf    
            Else
                nValor := (nValor/nDataFim)*((nDtFimMes-nDataIni)+1)
            EndIf   
        EndIf
    EndIf
Else
     If Month(FwFldGet("TFF_PERFIM")) == Month(FwFldGet("TFF_PERINI")) .And. Year(FwFldGet("TFF_PERFIM")) == Year(FwFldGet("TFF_PERINI"))
        If nDtFimMes == LastDate(FwFldGet("TFF_PERFIM"))
            nValor := (nValor/nDataFim)*30
        Else
            nValor := (nValor/nDataFim)*((nDtFimMes-nDataIni)+1)
        EndIf    
     Else
        nValor := (nValor/nDataFim) * nDtFimMes
        lAltera := .F. 
    EndIf
EndIf
 
//Arredonda o valor
nValor := nValor * nQtd
nValor := Round(nValor,TamSX3("TFL_VLPRPA")[2])

If nValor > 0
    //Atualiza o cronograma
    At740IAuto("TFF", FwFldGet("TFF_COD"), cCompet, nValor, cCodTFJ,cCompetAnt,nDtFimMes < Day(LastDate(FwFldGet("TFF_PERFIM")))) 
EndIf

If !lAltera
    nValor := nValProx
EndIf

FWModelActive(oModel)

Return nValor
  
User Function ValidRec()
Local lRet  := .F.
Local lIsRecorrente := FwFldGet("TFJ_CNTREC") == "1"
Local lIsItenExtra  := FwfldGet("TFF_COBCTR") == "2"
 
//Só será executado para contratos recorrentes e não será executado para item extra
If lIsRecorrente .And. !lIsItenExtra
    lRet := .T.
EndIf
 
Return lRet


A função ValidRec() é criada para garantir que o gatilho não vai ser executado para contratos não recorrentes e itens extras


Se a condição criada for positiva, o gatilho será chamado e o calculo será feito.

Com isso o valor da próxima parcela será reajustado quando o mês e ano do período final for o mesmo do período inicial, realizando o calculo proporcional, caso o mês e ano for diferente do período inicial, o calculo será ajustado para verificar somente o período inicial, ou seja, vai realizar o mesmo calculo para o gatilho existente no período inicial.





05. ASSUNTOS RELACIONADOS