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 Terceirização |
| Função: | TECA740.PRW |
| Ticket: | Não há |
| Requisito/Story/Issue (informe o requisito relacionado) : | DSERSGS-10241 |
02. SITUAÇÃO/REQUISITO
Ao gerar um orçamento de serviço, o calculo para a primeira parcela de um contrato é necessário que o mesmo seja informado manualmente.
03. SOLUÇÃO
Criação de gatilho para o calculo automático do valor da primeira parcela, quando é informado o período inicial.
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_PERINI |
| Sequencia | 001 |
| Cnt. Dominio | TFF_VLPRPA |
| Tipo | Primário |
| Regra | U_CalcValor() |
| Posiciona | Não |
| Condicao | U_Condicao() |
Após a criação do gatilho, inclua as seguintes funções (user function).
#INCLUDE "PROTHEUS.CH"
#INCLUDE "FWMVCDEF.CH"
User Function CalcValor()
Local aAreaTFF := TFF->(GetArea()) // Salva area
Local nDataIni := Day(dDataBase)
Local nMes := Month(dDataBase)
Local nAno := Year(dDataBase)
Local dDataIniCtr := cTod("")
Local dDataFimCtr := cTod("")
Local cCompet := ""
Local cCodTFJ := ""
Local cCodTFF := ""
Local nDataFim := 30 //Qtd de dias para calculo do Vlr dia.
Local nValor := 0
Local nQtd := 0
Local nDtFimMes := Day(dDataBase)
Local cCompetAnt := ""
Local nMesAnt := 0
Local nAnoAnt := 0
Local oModel := FwModelActive()
If IsInCallStack("AT870Antco")
dDataIniCtr := PARAMIXB[1]
dDataFimCtr := PARAMIXB[2]
nDataIni := Day(dDataIniCtr) //dia de inicio do contrato
nDtFimMes := Day(dDataFimCtr) // dia de fim do contrato
nMes := Month(dDataIniCtr)
nAno := Year(dDataIniCtr)
cCodTFJ := PARAMIXB[3]
nValor := PARAMIXB[4] // preço de venda do contrato
nQtd := PARAMIXB[5] // preço de venda do contrato
cCompetAnt := PARAMIXB[6]
cCodTFF := PARAMIXB[7]
Else
dDataIniCtr := FwFldGet("TFF_PERINI")
dDataFimCtr := FwFldGet("TFF_PERFIM")
nDataIni := Day(dDataIniCtr) //dia de inicio do contrato
nDtFimMes := Day(dDataFimCtr) // dia de fim do contrato
nMes := Month(dDataIniCtr)
nAno := Year(dDataIniCtr)
cCodTFJ := FwFldGet("TFJ_CODIGO")
nValor := FwFldGet("TFF_PRCVEN") // preço de venda do contrato
nQtd := FwFldGet("TFF_QTDVEN") // preço de venda do contrato
cCompetAnt := At740GtPer()
cCodTFF := FwFldGet("TFF_COD")
EndIf
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 Month(dDataFimCtr) == Month(dDataIniCtr) .And. Year(dDataFimCtr) == Year(dDataIniCtr)
nValor := (nValor/nDataFim)*((nDtFimMes-nDataIni)+1)
Else
nValor := (nValor/nDataFim)*((nDataFim-nDataIni)+1)
EndIf
//Arredonda o valor
nValor := nValor * nQtd
nValor := Round(nValor,TamSX3("TFL_VLPRPA")[2])
//Atualiza o cronograma
At740IAuto("TFF", cCodTFF, cCompet, nValor, cCodTFJ,cCompetAnt,nDataIni > 1)
FWModelActive(oModel)
RestArea(aAreaTFF)
Return nValor
User Function Condicao()
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 .AND. Day(FwFldGet("TFF_PERFIM")) != 1
lRet := .T.
EndIf
Return lRet
Exemplo
Veja abaixo de uma forma mais detalhada como será feito o calculo do valor da próxima parcela
Valor do Posto é de R$4.500,00
O dia de inicio do posto é 15/04/2021
O calculo a ser feito será
((4500 / 30) * (30-15)+1 )
((150) * (16)) = 2400
onde o resultado do valor da próxima parcela será de R$2.400,00
A quantidade de dias é 16, pois contamos o dia de inicio, ou seja, do dia 15 ao dia 30 tem 16 dias se contarmos o dia 15.
A função Condição() é 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 ao ser informado uma data de inicio do contrato(TFF_PERINI), o calculo será feito conforme o dia e o valor(TFF_PRCVEN).
05. ASSUNTOS RELACIONADOS
