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:
| Campo | Conteúdo |
|---|---|
| Campo | TFF_PERFIM |
| Sequencia | 001 |
| Cnt. Dominio | TFF_VLPRPA |
| Tipo | Primário |
| Regra | U_ValFinal() |
| Posiciona | Não |
| Condição | U_ValidRec() |
Após a criação do gatilho, inclua as seguintes funções (user function):
#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 nVlrCob := FwFldGet("TFF_VLRCOB")
Local nValor := IIF(nVlrCob > 0, nVlrCob, 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
nValor := IIF(nVlrCob > 0, 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