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