4 Replies Latest reply: Jun 30, 2016 7:48 AM by Kleiton Moraes RSS

    Calculo com Intervalo entre datas

    Kleiton Moraes

      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)' = 8) 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);
      
        • Re: Calculo com Intervalo entre datas
          Yuri Nicolett

          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

            • Re: Calculo com Intervalo entre datas
              Kleiton Moraes

              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)' = 8) 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.