public ActionResult Calcular(PropostaViewModel propostaView)
        {
            var calculo = new CalculoPrevidencia();

            var db = new SimuladorPrevidenciaDB();
            var proposta = db.Propostas.FirstOrDefault(c => c.Id == propostaView.Id);

            if (proposta == null)
            {
                proposta = GravarProposta(propostaView, new RetornoCalculo());
            }

            // Realiza o cálculo da proposta informada:
            var retornoCalculo = calculo.Calcular(proposta);

            if (retornoCalculo.ExecutadoSucesso)
            {
                TempData["Sucesso"] = retornoCalculo.Mensagem;

                //ViewBag utilizadas para armazenar os dados do gráfico
                ViewBag.TotalInvestido = retornoCalculo.InvestidoGrafico;
                ViewBag.MontanteAcumulado = retornoCalculo.MontanteGrafico;
                ViewBag.Mes = retornoCalculo.Mes;
            }
            else
            {
                TempData["Erro"] = retornoCalculo.Mensagem;
                return RedirectToAction("Create", "Proposta", new { id = propostaView.IdCliente });
            }

            // Grava a proposta no banco:
            //Esta linha esta duplicando o registro.
            // var p = GravarProposta(propostaView, retornoCalculo);

            // Dados do model:
            var resultado = new ResultadoCalculoViewModel
            {
                Id = proposta.Id,
                Cliente = propostaView.Cliente,
                Cpf = propostaView.CPF,
                InvestimentoInicial = propostaView.InvestimentoIncial,
                InvestimentoMensal = propostaView.InvestimentoMensal,
                Prazo = propostaView.TempoInvestimento,
                TotalInvestido = retornoCalculo.TotalInvestido,
                MontanteFinal = retornoCalculo.MontanteFinal,
                RendaFinal = retornoCalculo.RendaMensal,
                TempoRecebimento = retornoCalculo.TotalMeses,
                TipoRetorno = proposta.TipoRetornoEsperado,
                DadosProposta = propostaView
            };

            return View(resultado);
        }
        private Proposta NovaProposta(PropostaViewModel prop, RetornoCalculo calculo, SimuladorPrevidenciaDB contexto)
        {
            var cliente = contexto.Clientes.Find(prop.IdCliente);
            var perfil = contexto.Perfis.Find(prop.Perfil);

            var proposta = new Proposta{
                Aprovada = false,
                Cliente = cliente,
                InvestimentoInicial = prop.InvestimentoIncial,
                InvestimentoMensal = prop.InvestimentoMensal,
                Perfil = perfil,
                RendaEsperadaMes = prop.RendaEsperadaMes,
                TempoInvestimento = prop.TempoInvestimento,
                PrazoRecebimento = calculo.TotalMeses,
                TempoRecebimento = prop.TempoRecebimento,
                TipoRetornoEsperado = prop.TipoRetornoEsperado
            };

            contexto.Propostas.Add(proposta);
            contexto.SaveChanges();

            return proposta;
        }
 /// <summary>
 /// Exibe a tela de edição de uma proposta.
 /// </summary>
 /// <param name="id">ID da proposta</param>
 /// <returns></returns>
 public ActionResult Edit(int id = 0)
 {
     PropostaViewModel proposta = new PropostaViewModel(id);
     if (proposta == null)
     {
         return HttpNotFound();
     }
     return View(proposta);
 }
        private Proposta GravarProposta(PropostaViewModel prop, RetornoCalculo calculo)
        {
            var contexto = new SimuladorPrevidenciaDB();

            var proposta = contexto.Propostas.Find(prop.Id);

            if (proposta == null)
            {
                return NovaProposta(prop, calculo, contexto);
            }

            var perfil = contexto.Perfis.Find(prop.Perfil);

            proposta.Aprovada = false;
            proposta.InvestimentoInicial = prop.InvestimentoIncial;
            proposta.InvestimentoMensal = prop.InvestimentoMensal;
            proposta.Perfil = perfil;
            proposta.RendaEsperadaMes = prop.RendaEsperadaMes;
            proposta.TempoInvestimento = prop.TempoInvestimento;
            proposta.PrazoRecebimento = calculo.TotalMeses;
            proposta.TempoRecebimento = prop.TempoRecebimento;
            proposta.TipoRetornoEsperado = prop.TipoRetornoEsperado;

            db.Entry(proposta).State = EntityState.Modified;
            contexto.SaveChanges();

            return proposta;
        }
        /// <summary>
        /// Tela inicial com formulário para criação da proposta
        /// </summary>
        /// <param name="id">ID do cliente</param>
        /// <returns></returns>
        public ActionResult Create(int id=0)
        {
            PropostaViewModel proposta = new PropostaViewModel();
            var cliente = db.Clientes.Find(id);

            if (cliente == null)
                return HttpNotFound();

            proposta.IdCliente = id;
            proposta.Cliente = cliente.Nome;
            proposta.CPF = cliente.Cpf;
            proposta.RendaFamiliar = cliente.RendaFamiliar;

            return View(proposta);
        }