예제 #1
0
        public void VerificarDisponibilidadeGlobal(ConcessaoEntidade concessao, decimal valorPrestacao, decimal valorLiquido, decimal valorSolicitado)
        {
            var motivoIndisponivel = string.Empty;

            if ((concessao.ValorLimite >= 0) & (valorSolicitado.Arredonda(2) > concessao.TetoMaximo.Arredonda(2)))
            {
                motivoIndisponivel += "Valor Solicitado excede o teto máximo estipulado\n";
            }

            if ((concessao.TetoMinimo >= 0) & (valorSolicitado.Arredonda(2) < concessao.TetoMinimo.Arredonda(2)))
            {
                motivoIndisponivel += "Valor Solicitado inferior ao teto mínimo estipulado \n";
            }

            if (valorPrestacao.Arredonda(2) > concessao.MargemConsignavelCalculada.Arredonda(2))
            {
                motivoIndisponivel += "Valor da Prestação excede o Valor da margem consignável calculado \n";
            }

            if (valorSolicitado.Arredonda(2) < concessao.ValorContratosReformados.Arredonda(2))
            {
                motivoIndisponivel += "Valor solicitado inferior ao valor dos contratos a reformar \n";
            }

            //if (valorLiquido == 0)
            //    motivoIndisponivel += "Saldo do novo contrato é zero.\n";

            if (valorLiquido < 0)
            {
                motivoIndisponivel += "Saldo insuficiente \n";
            }

            var disponibilidade = string.IsNullOrEmpty(motivoIndisponivel);

            MotivoContrato         += motivoIndisponivel;
            DisponibilidadeContrato = disponibilidade;
        }
        public decimal CalcularLimitePorPrazo(
            decimal margemConsiginavel,
            decimal limitante1,
            decimal limitante2 = 0,
            decimal prazo      = 0,
            bool calculaMargem = true)
        {
            /*
             * baseado na calculo_limite_por_prazo.xlsx
             * =SE(
             *  SE(
             *      PGTO(taxaJuros; prazo; - (total + valorCorrecao)) <= prestacaoSemTaxas;
             *      limitante;
             *      total / (fatorCorrecao + 1)
             *  )
             *  <= limitante;
             *  SE(
             *      PGTO(taxaJuros; prazo; - (total + valorCorrecao)) <= prestacaoSemTaxas;
             *      limitante;
             *      total / (fatorCorrecao + 1)
             *  );
             *  limitante)
             */

            decimal prestacaoSemTaxas = CalcularPrestacaoSemTaxas(margemConsiginavel, calculaMargem).Arredonda(2);

            var prazoUsar = prazo != 0 ? prazo : Natureza.PRAZO_MAX.Value;

            decimal taxaJuros = (TaxaConcessao.TX_JUROS.Value / 100);

            if (CATEGORIAS_AJUSTAR_RESERVA.Contains(Plano.CD_CATEGORIA))
            {
                limitante1 = AjustarReservaPelaTaxa(limitante1);
                limitante2 = AjustarReservaPelaTaxa(limitante2);
            }

            decimal fatorCorrecao = ObterFatorAtualizacao(DataCredito);

            if (!string.IsNullOrEmpty(Modalidade.IND_CORR_VL_SOLIC))
            {
                fatorCorrecao -= 1;
            }

            decimal valorCorrecao = ObterValorAtualizacao(limitante1, DataCredito);

            if (limitante2 == 0)
            {
                limitante2 = limitante1;
            }

            decimal total = VP(prazoUsar, taxaJuros, 0, prestacaoSemTaxas);

            var pgmt = PMT((double)taxaJuros, (int)prazoUsar, (double)(total + valorCorrecao));

            var totalCorrigido = total / (fatorCorrecao + 1);

            var valorLimiteInicial =
                pgmt < prestacaoSemTaxas ?
                limitante1 :
                totalCorrigido;

            decimal limiteCalculado =
                valorLimiteInicial <= limitante2 ?
                valorLimiteInicial :
                limitante2;

            return(limiteCalculado.Arredonda(2));
        }