Example #1
0
        public RegrasContratacao ObterRegrasContratacao(ModeloPropostaCompleto modeloProposta,
                                                        long cpfTitular,
                                                        DateTime dataNascimentoTitular,
                                                        Model.Enum.SexoEnum sexoTitular,
                                                        string ufTitular,
                                                        Produto.Profissao profissaoTitular,
                                                        short periodicidade,
                                                        Model.Enum.SexoEnum sexoConjuge,
                                                        DateTime dataNascimentoConjuge,
                                                        short prazoCerto,
                                                        short tempoPrazoAntecipado,
                                                        short idadePagamentoAntecipado,
                                                        short prazoDecrescimo,
                                                        Model.Enum.TipoRelacaoSegurado tipoRelacaoSegurado,
                                                        decimal renda)
        {
            var produtosParaSimulacao = this.ObterProdutosSemRestricoes(modeloProposta.Produtos, tipoRelacaoSegurado, profissaoTitular, dataNascimentoTitular, ufTitular);
            var limitesOperacionais   = this.ObterLimitesDisponiveis(modeloProposta.PoliticaAceitacao, cpfTitular, dataNascimentoTitular, ufTitular, profissaoTitular, renda, modeloProposta.Produtos);
            var calculo = CalcularPremioCapitalSemCustoFixo(dataNascimentoTitular, sexoTitular, ufTitular, profissaoTitular.CBO, periodicidade, sexoConjuge, dataNascimentoConjuge, prazoCerto, tempoPrazoAntecipado, idadePagamentoAntecipado, prazoDecrescimo, modeloProposta);
            var retorno = MontarRegrasContratacao(limitesOperacionais, calculo);

            retorno.TicketMinimo = (decimal)modeloProposta.TicketMinimo.GetValueOrDefault();

            return(retorno);
        }
Example #2
0
        private List <LimiteDisponivel> ObterLimitesDisponiveis(PoliticaAceitacao politicaAceitacao,
                                                                long cpf,
                                                                DateTime dataNascimento,
                                                                string uf,
                                                                Produto.Profissao profissao,
                                                                decimal renda,
                                                                List <Model.Produto> produtos)
        {
            if (politicaAceitacao == null)
            {
                throw new ArgumentNullException(nameof(politicaAceitacao));
            }

            var limites = new ConcurrentBag <LimiteDisponivel>();
            var capitaisAcumuladosCliente = ObterCapitalSegurado(new PesquisaCapitalSegurado()
            {
                Cpf            = cpf,
                DataNascimento = dataNascimento
            });

            var taskFaixaEtaria = Task.Run(() =>
            {
                politicaAceitacao.LimitesOperacionaisPorFaixaEtaria
                .Where(l => l.IdadeInicial <= dataNascimento.Idade() && l.IdadeFinal >= dataNascimento.Idade())
                .ToList()
                .ForEach(l =>
                {
                    limites.Add(CalcularLimiteDisponivel(l, capitaisAcumuladosCliente, Convert.ToDecimal(l.ValorMaximoCapitalSegurado), "Faixa Etária", produtos));
                });
            });
            var taskProfissao = Task.Run(() =>
            {
                politicaAceitacao.LimitesOperacionaisPorProfissao
                .Where(l => l.ProfissoesId.Contains(profissao.Id))
                .ToList()
                .ForEach(l =>
                {
                    limites.Add(CalcularLimiteDisponivel(l, capitaisAcumuladosCliente, Convert.ToDecimal(l.ValorMaximoCapitalSegurado), "Profissão", produtos));
                });
            });
            var taskRenda = Task.Run(() =>
            {
                politicaAceitacao.LimitesOperacionaisPorRenda
                .Where(l => l.IdadeInicial <= dataNascimento.Idade() && l.IdadeFinal >= dataNascimento.Idade())
                .ToList()
                .ForEach(l =>
                {
                    var valorMaximo = ObterCapitalAcumuladoPorCobertura(l, capitaisAcumuladosCliente);
                    limites.Add(CalcularLimiteDisponivel(l, capitaisAcumuladosCliente, Convert.ToDecimal(renda * l.MultiploRenda), "Renda", produtos));
                });
            });

            taskFaixaEtaria.Wait();
            taskProfissao.Wait();
            taskRenda.Wait();

            var menoresLimites = from lim in (from l in limites group l by l.Causa)
                                 select new LimiteDisponivel()
            {
                Causa       = lim.First().Causa,
                Produtos    = lim.First().Produtos,
                ValorMaximo = lim.Min(l => l.ValorMaximo)
            };

            return(menoresLimites.ToList());
        }
Example #3
0
        private bool CoberturaRestrita(Model.Cobertura cobertura, DateTime dataNascimento, string uf, Produto.Profissao profissaoProponente, out string motivo)
        {
            motivo = string.Empty;

            if (dataNascimento.Idade() < cobertura.IdadeMinima)
            {
                motivo = $"Cobertura {cobertura.Id} - {cobertura.Descricao} removida da simulação pois a idade do proponente ({dataNascimento.Idade()}) é inferior a idade mínima para contratação {cobertura.IdadeMinima}";

                return(true);
            }

            if (dataNascimento.Idade() > cobertura.IdadeMaxima)
            {
                motivo = $"Cobertura {cobertura.Id} - {cobertura.Descricao} removida da simulação pois a idade do proponente ({dataNascimento.Idade()}) é superior a idade máxima para contratação {cobertura.IdadeMaxima}";

                return(true);
            }

            if (cobertura.ProfissoesRecusadas.Contains(profissaoProponente.Id))
            {
                motivo = $"Cobertura {cobertura.Id} - {cobertura.Descricao} removida da simulação pois a profissão do proponente ({profissaoProponente.CBO} - {profissaoProponente.Descricao}) é recusada pela cobertura";

                return(true);
            }

            if (cobertura.UFsRecusadas.Contains(uf))
            {
                motivo = $"Cobertura {cobertura.Id} - {cobertura.Descricao} removida da simulação pois a UF do proponente ({uf}) é recusada pela cobertura";

                return(true);
            }

            return(false);
        }
Example #4
0
        private bool ProdutoRestrito(Model.Produto produto, Model.Enum.TipoRelacaoSegurado?tipoRelacaoSegurado, Produto.Profissao profissaoProponente, out string motivo)
        {
            motivo = string.Empty;

            //produto.ProfissoesAceitas

            if (produto.ProfissoesAceitas.Any() && !produto.ProfissoesAceitas.Contains(profissaoProponente.Id))
            {
                motivo = $"Produto {produto.Id} - {produto.Descricao} removido da simulação pois profissão do proponente ({profissaoProponente.CBO} - {profissaoProponente.Descricao}) não é aceita para contratação";

                return(true);
            }

            if ((tipoRelacaoSegurado.HasValue && produto.TipoProponente.Id != (int)tipoRelacaoSegurado) || (!tipoRelacaoSegurado.HasValue && produto.TipoProponente.Id == TIPOPROPONENTECONJUGE))
            {
                motivo = $"Produto {produto.Id} - {produto.Descricao} removido da simulação pois é um produto de cônjugue e o proponente da simulação é titular";

                return(true);
            }

            return(false);
        }
Example #5
0
        private List <Model.Produto> ObterProdutosSemRestricoes(List <Model.Produto> produtos, Model.Enum.TipoRelacaoSegurado?tipoRelacaoSegurado, Produto.Profissao profissaoProponente, DateTime dataNascimento, string uf)
        {
            var produtosParaSimulacao = new List <Model.Produto>();

            foreach (var produto in produtos)
            {
                string motivoRestricaoProduto;

                bool produtoRestrito = ProdutoRestrito(produto, tipoRelacaoSegurado, profissaoProponente, out motivoRestricaoProduto);

                if (produtoRestrito)
                {
                    Mensagens.Add(new Observacao(descricao: motivoRestricaoProduto));

                    continue;
                }

                var produtoParaSimulacao = ObjectClone.DoClone(produto);

                var coberturasObrigatoriasRemovidas = new List <Model.Cobertura>();

                foreach (var cobertura in produto.Coberturas)
                {
                    string motivoRestricaoCobertura;

                    bool coberturaRestrita = CoberturaRestrita(cobertura, dataNascimento, uf, profissaoProponente, out motivoRestricaoCobertura);

                    if (coberturaRestrita && cobertura.Obrigatoria.Value)
                    {
                        coberturasObrigatoriasRemovidas.Add(cobertura);

                        Mensagens.Add(new Observacao(descricao: motivoRestricaoCobertura));

                        continue;
                    }

                    if (coberturaRestrita)
                    {
                        Mensagens.Add(new Observacao(descricao: motivoRestricaoCobertura));

                        continue;
                    }

                    produtoParaSimulacao.Coberturas.Add(ObjectClone.DoClone(cobertura));
                }

                if (coberturasObrigatoriasRemovidas.Any())
                {
                    string mensagem = $"Produto {produto.Id} - {produto.Descricao} removido da simulação pois possui restrição em alguma(s) cobertura(s) obrigatória(s). Cobertura(s): { string.Join(", ", coberturasObrigatoriasRemovidas.Select(c => $"{c.Id} - {c.Descricao}")) }";

                    Mensagens.Add(new Observacao(descricao: mensagem));

                    continue;
                }

                produtosParaSimulacao.Add(produtoParaSimulacao);
            }

            return(produtosParaSimulacao);
        }