Skip to main content
Announcements
Qlik Connect 2024! Seize endless possibilities! LEARN MORE
cancel
Showing results for 
Search instead for 
Did you mean: 
kkmoraes
Contributor III
Contributor III

Calculo com Intervalo entre datas

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);

Labels (2)
4 Replies
nicolett_yuri

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

kkmoraes
Contributor III
Contributor III
Author

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.

nicolett_yuri

Kleiton, vou verificar seu exemplo e te retorno

kkmoraes
Contributor III
Contributor III
Author

Obrigado Yuri!