Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Pessoal,
Bom dia!
Gostaria da ajuda de vocês para tentar resolver o seguinte problema:
Estou desenvolvendo uma aplicação que faz a projeção de pagamentos baseado nos valores do Ano/Mês que o usuário selecionar, a parte lógica do cálculo dos pagamentos já está implementada e funcionando bem, fiz essa projeção pensando em pagamentos mensais, porém existem contratos que o pagamento será bimestral, semestral etc, isso me complicou na hora de calcular a quantidade restantes de parcelas para pagamento do contrato (baseado na seleção do usuário)
Exemplo: O usuário deseja realizar a projeção de pagamentos a partir do Ano de 2015 no mês de dezembro, então eu preciso calcular a quantidade de parcelas que já foram pagas até esse período e a partir daí projetar os próximos pagamentos.
Datas a serem utilizadas
Início da amortização : 15/01/2016
Fim da amortização: 15/10/2018 (O fim será sempre o mesmo, a quantidade de parcelas até ele é que irá variar, baseado no Ano/Mês que o usuário escolher)
Cálculo do número de parcelas : No período de 15/01/2016 a 15/10/2018 existem 34 meses. Portanto, número de parcelas de amortização 34.
Um fator complicador, é justamente a forma de pagamento, se é mensal, semestral etc, pois não poderia apenas subtrair o Ano/Mês selecionado do Ano/Mês da primeira amortização para obter a quantidade de parcelas já pagas.
Vocês possuem alguma sugestão?
Preciso descobrir a quantidade de parcelas que já foram pagas para o contrato baseado na data que está sendo projetada - data de inicio da amortização e jogar esse valor para a variável vQtParcelas que irá controlar o loop.
Abaixo deixo o script que contém a forma que estou trabalhando:
Obrigado!
LET NumRowsContrato=NoOfRows('GDP_CONTRATO')-1;
//for dos contratos
FOR i=0 to $(NumRowsContrato) //Faz a iteração para cada contrato
LET vNuContrato=Peek('GDPCONTR_NU',$(i),'GDP_CONTRATO');
LET vQtParcelas=Peek('GDPCONTR_QT_PARCELA_AMORT',$(i),'GDP_CONTRATO'); //Quantidade total de parcelas de amortização
LET vDtAssinatura=peek('GDPCONTR_DT_ASSINATURA', $(i),'GDP_CONTRATO');
LET vQTSimulacoes=peek('GDP_TOTAL_SIMULACOES', $(i),'GDP_CONTRATO'); //Quantidade total de simulações
LET vDtIniAmortizacao=Peek('GDPCONTR_DT_INIC_AMORTIZACAO',$(i),'GDP_CONTRATO'); //Data da primeira amortização
//LET vDtIniSimulacao=peek('GDPCONTR_DT_IMPORT_PLAN', $(i),'GDP_CONTRATO');
LET vDtIniSimulacao=peek('GDPCONTR_DT_INIC_AMORTIZACAO', $(i),'GDP_CONTRATO'); //Data do inicio da simulação = data da primeira amortização
LET vPeriodo = Peek('PRDO_CD_AMORTIZACAO', $(i),'GDP_CONTRATO'); //Periodicidade de Pagamento (Diaria, Mensal, Semestral etc)
FOR K=1 to $(vQTSimulacoes) //Verifica quantas simulações devem ser feitas para cada contrato
LET vAno = YEAR('$(vDtIniSimulacao)');
LET vMes = NUM(MONTH('$(vDtIniSimulacao)'));
TMP:
LOAD VL_DIVIDA resident GDP_IMPORT_PLANH_CONTRATO where CHAVE_CONTRATO = '$(vNuContrato)' and GDPIMPLCON_DT_ANO = '$(vAno)' and GDPIMPLCON_NU_MES = '$(vMes)';
Let vSaldo = peek('VL_DIVIDA', 0,'TMP');
drop Table TMP;
IF ('$(vDtIniSimulacao)' <= '$(vDtIniAmortizacao)') THEN
LET vQtParcelas = '$(vQtParcelas)';
ELSE
LET vQtParcelas = '$(vQtParcelas)'-1;
ENDIF
FOR J=1 to $(vQtParcelas) //Projeta o valor para os Ano/Meses posteriores a seleção do usuário
IF ('$(J)' = 1) THEN
LET vSaldo = '$(vSaldo)';
LET vAmortizacao = '$(vSaldo)'/('$(vQtParcelas)'-'$(J)'+1);
ELSE
LET vSaldo = '$(vSaldo)'-'$(vAmortizacao)';
ENDIF;
LET vQtdMes = 0;
IF('$(vPeriodo)' = 4) THEN
LET vQtdMes = 1;
ELSEIF('$(vPeriodo)' = 5) THEN
LET vQtdMes = 2;
ELSEIF('$(vPeriodo)' = 6) THEN
LET vQtdMes = 3;
ELSEIF('$(vPeriodo)' = 7) THEN
LET vQtdMes = 4;
ELSEIF('$(vPeriodo)' = 😎 THEN
LET vQtdMes = 6;
ELSEIF('$(vPeriodo)' = 9) THEN
LET vQtdMes = 12;
ELSE
LET vQtdMes = 0;
ENDIF
TABELA_SIMULACAO: //Tabela que armazena os dados da projeção
LOAD '$(vNuContrato)' as GDPCONTR_NU,
'$(J)' as GDP_NU_PARCELA,
'$(vQtParcelas)' as GDP_QT_PARCELAS,
'$(vDtIniAmortizacao)' as GDP_DT_INI_AMORTIZACAO,
Num(Year('$(vDtIniSimulacao)')) as GDP_ANO_SIMULACAO,
Num(Month('$(vDtIniSimulacao)')) as GDP_MES_SIMULACAO,
Num(Year(AddMonths('$(vDtIniSimulacao)',('$(J)' * '$(vQtdMes)') -'$(vQtdMes)'))) as GDP_ANO_PROJECAO,
Num(Month(AddMonths('$(vDtIniSimulacao)',('$(J)' * '$(vQtdMes)')-'$(vQtdMes)'))) as GDP_MES_PROJECAO,
'$(vSaldo)' as GDP_VL_CONTRATO,
'$(vAmortizacao)' as GDP_VL_PARCELA,
'$(vSaldo)' - '$(vAmortizacao)' AS GDP_SALDO_DEVEDOR
AutoGenerate 1;
Next;
LET vDtIniSimulacao = AddMonths('$(vDtIniSimulacao)', $(vQtdMes));
NEXT;
Next;
STORE TABELA_SIMULACAO into $(CaminhoDest)GDP_CONTRATO_SIMULACAO.qvd (qvd);
O que te indica se é Mensal, Trimestral ou Semestral?
Se houver esse campo com essa informação será apenas mais um IF em sua fórmula:
IF( Flag = 'Mensal', [Quantidade de meses no intervalo],
IF( Flag = 'Trimestral', Round([Quantidade de meses no intervalo] / 3),
IF( Flag = 'Semestral', Round([Quantidade de meses no intervalo] / 6)
))) as QuantidadeParcelas
Yuri,
O campo vPeriodo utilizado nessa bloco de código abaixo que faz essa validação:
Minha necessidade é contar quantas parcelas foram pagas no intervalo entre o Início da Amortização do Contrato e a Data selecionada pelo usuário, dependendo da forma de pagamento em um ano eu posso ter 1 único pagamento no ano (anual), 2 pagamentos (semestral) etc.
Tentei fazer algo separado para depois adicionar na aplicação, mas não tô tendo muito sucesso
LET vQtdMes = 0;
LET vPeriodo = 4;
IF('$(vPeriodo)' = 4) THEN
LET vQtdMes = 1;
ELSEIF('$(vPeriodo)' = 5) THEN
LET vQtdMes = 2;
ELSEIF('$(vPeriodo)' = 6) THEN
LET vQtdMes = 3;
ELSEIF('$(vPeriodo)' = 7) THEN
LET vQtdMes = 4;
ELSEIF('$(vPeriodo)' = 😎 THEN
LET vQtdMes = 6;
ELSEIF('$(vPeriodo)' = 9) THEN
LET vQtdMes = 12;
ELSE
LET vQtdMes = 0;
ENDIF
LET vQqtdParcelasTotal = 96;
LET vDataInicioAmortizacao = '15/10/2010';
L
Tô anexando o Script que tô trabalhando pra tentar facilitar o entendimento, talvez eu não esteja explicando muito bem.
Kleiton, vou verificar seu exemplo e te retorno
Obrigado Yuri!