/// <summary>
        /// Obtém as políticas de aceitação de todas as propostas de um determinado CNPJ
        /// </summary>
        /// <param name="cnpj">CNPJ do parceiro</param>
        /// <param name="canalVenda">Canal de venda</param>
        /// <returns></returns>
        public IQueryable <PoliticaAceitacao> ObterTodos(long cnpj, short canalVenda)
        {
            var pesquisa = new PesquisaModelosDeProposta();

            pesquisa.Cnpj         = cnpj;
            pesquisa.CanalDeVenda = canalVenda; /*verificar*/

            var resultadoPesquisarModelos = ServiceWcf <INegociacaoService> .UseSync(n => n.PesquisarModelosDeProposta(pesquisa));

            if (resultadoPesquisarModelos.HouveErrosDuranteProcessamento)
            {
                throw new Exception(string.Join(", ", resultadoPesquisarModelos.Mensagens));
            }

            var listaModeloProposta = resultadoPesquisarModelos.Valor;

            var politicas = new List <PoliticaAceitacao>();

            foreach (var modeloPropostaEsb in listaModeloProposta)
            {
                PoliticaAceitacao politicaAceitacao = ObterLimitesOperacionais(modeloPropostaEsb.Codigo);

                if (politicaAceitacao == null)
                {
                    continue;
                }

                politicas.Add(politicaAceitacao);
            }

            return(politicas.AsQueryable());
        }
        /// <summary>
        /// Constrói um objeto de produto para retorno com o resultado do serviço de produtos e limites
        /// </summary>
        /// <param name="codigoModeloProposta">Código do modelo de proposta</param>
        /// <param name="politicasIds"></param>
        /// <returns></returns>
        public PoliticaAceitacao ObterLimitesOperacionais(string codigoModeloProposta, PoliticaDeAceitacao politicaAceitacao = null)
        {
            if (politicaAceitacao == null)
            {
                var parametroPoliticaAceitacao = ObterParametroLimitesOperacionais(codigoModeloProposta);
                var resultadoPoliticaAceitacao = ServiceWcf <INegociacaoService> .UseSync(n => n.ObterLimitesOperacionais(parametroPoliticaAceitacao));

                politicaAceitacao = resultadoPoliticaAceitacao.Valor;
            }

            var limites  = politicaAceitacao.LimitesOperacionais;
            var politica = new PoliticaAceitacao();

            politica.DataUltimaAlteracao = politicaAceitacao.DataInicioVigencia;
            politica.CigarrosExame       = politicaAceitacao.QtdeMaximaCigarrosExame;
            politica.CigarrosRecusa      = politicaAceitacao.QtdeMaximaCigarrosRecusa;
            politica.ImcMaximoExame      = (int)politicaAceitacao.IMCMaximoExame;  /*verificar*/
            politica.ImcMaximoRecusa     = (int)politicaAceitacao.IMCMaximoRecusa; /*verificar*/
            politica.ImcMinimoExame      = (int)politicaAceitacao.IMCMinimoExame;  /*verificar*/
            politica.ImcMinimoRecusa     = (int)politicaAceitacao.IMCMinimoRecusa; /*verificar*/

            politica.LimitesOperacionaisPorFaixaEtaria = new List <LimiteOperacionalFaixaEtaria>();
            politica.LimitesOperacionaisPorProfissao   = new List <LimiteOperacionalProfissao>();
            politica.LimitesOperacionaisPorRenda       = new List <LimiteOperacionalRenda>();
            foreach (var limite in limites)
            {
                IncluirLimites(limite, politica);
            }

            return(politica);
        }
        private void IncluirLimites(LimiteOperacionalPorFaixa limite, PoliticaAceitacao politica)
        {
            foreach (var limitePorIdade in limite.LimitesPorIdade)
            {
                var politicaFaixaEtaria = new LimiteOperacionalFaixaEtaria();
                politicaFaixaEtaria.Causa      = limite.TipoGrupoCobertura;
                politicaFaixaEtaria.Coberturas = limite.CoberturasIds;
                politicaFaixaEtaria.ValorMaximoCapitalSegurado = (int)limitePorIdade.Limite;
                politicaFaixaEtaria.IdadeInicial = limitePorIdade.IdadeInicial;
                politicaFaixaEtaria.IdadeFinal   = limitePorIdade.IdadeFinal;
                politica.LimitesOperacionaisPorFaixaEtaria.Add(politicaFaixaEtaria);
            }

            foreach (var limitePorProfissao in limite.LimitesPorProfissoes)
            {
                var politicaProfissao = new LimiteOperacionalProfissao();
                politicaProfissao.Causa      = limite.TipoGrupoCobertura;
                politicaProfissao.Coberturas = limite.CoberturasIds;
                politicaProfissao.ValorMaximoCapitalSegurado = (int)limitePorProfissao.Limite;
                politicaProfissao.ProfissoesId = limitePorProfissao.ProfissoesEsimId;
                politica.LimitesOperacionaisPorProfissao.Add(politicaProfissao);
            }

            foreach (var limitePorRenda in limite.LimitesPorRenda)
            {
                var politicaRenda = new LimiteOperacionalRenda();
                politicaRenda.Coberturas    = limite.CoberturasIds;
                politicaRenda.Causa         = limite.TipoGrupoCobertura;
                politicaRenda.IdadeInicial  = limitePorRenda.IdadeInicial;
                politicaRenda.IdadeFinal    = limitePorRenda.IdadeFinal;
                politicaRenda.MultiploRenda = (int)limitePorRenda.MultiploRenda;
                politica.LimitesOperacionaisPorRenda.Add(politicaRenda);
            }
        }
Пример #4
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());
        }