/// <summary>
        /// Obtém o tipo de cobertura agrupado de acordo com a classificação da Api
        /// </summary>
        /// <param name="cobertura">cobertura</param>
        /// <returns>true or false</returns>
        private TipoCoberturaAgrupadoEnum?ObterTipoCobertura(Contrato.CoberturaProdutoNegociado cobertura)
        {
            switch ((TipoCoberturaEnum)cobertura.Tipo)
            {
            case TipoCoberturaEnum.Vgbl:
            case TipoCoberturaEnum.Pgbl:
                return(TipoCoberturaAgrupadoEnum.Acumulacao);

            case TipoCoberturaEnum.Previdencia:
                return(TipoCoberturaAgrupadoEnum.Previdencia);

            case TipoCoberturaEnum.Seguro:
            case TipoCoberturaEnum.VidaIndividual:
                return(TipoCoberturaAgrupadoEnum.RiscoIndividual);

            case TipoCoberturaEnum.Servico:
                if (CoberturaPossuiPreco(cobertura))
                {
                    return(TipoCoberturaAgrupadoEnum.ServicoPrecificado);
                }
                return(TipoCoberturaAgrupadoEnum.Servico);

            case TipoCoberturaEnum.Emprestimo:
                return(TipoCoberturaAgrupadoEnum.Emprestimo);

            default:
                return(null);
            }
        }
 /// <summary>
 /// Obtém o valor fixo da cobertura repassado ao cliente, caso exista
 /// </summary>
 /// <param name="cobertura"></param>
 /// <returns>valor fixo ou null, caso não exista</returns>
 private float?ObterValorFixo(Contrato.CoberturaProdutoNegociado cobertura)
 {
     if (cobertura.ValoresRepassadoAoCliente != null && cobertura.ValoresRepassadoAoCliente.Count > 0)
     {
         return((float)cobertura.ValoresRepassadoAoCliente.Where(v => v != null && v.TipoRepasseCliente == TipoRepasseClienteEnum.Fixo).Sum(v => v.Valor)); /*rever*/
     }
     return(null);
 }
        /// <summary>
        /// Verifica se uma cobertura possui valores repassados ao cliente
        /// </summary>
        /// <param name="cobertura">cobertura</param>
        /// <returns>true or false</returns>
        private bool CoberturaPossuiPreco(Contrato.CoberturaProdutoNegociado cobertura)
        {
            if (cobertura.ValoresRepassadoAoCliente != null && cobertura.ValoresRepassadoAoCliente.Count > 0)
            {
                return(cobertura.ValoresRepassadoAoCliente.Where(v => v != null && v.TipoRepasseCliente == TipoRepasseClienteEnum.Fixo).Any(v => v.Valor > 0));
            }

            return(false);
        }
        /// <summary>
        /// Obtém o valor de capital fixo, caso exista
        /// </summary>
        /// <param name="cobertura"></param>
        /// <returns>capital fixo ou null, caso não exista</returns>
        private float?ObterCapitalFixo(Contrato.CoberturaProdutoNegociado cobertura)
        {
            if (cobertura.ValorCapitalFixo != null)
            {
                return((float)cobertura.ValorCapitalFixo);
            }

            return(null);
        }
 /// <summary>
 /// Preenche as causas da cobertura
 /// </summary>
 /// <param name="produtoCobertura">cobertura (Api)</param>
 /// <param name="cobertura">cobertura (Esb)</param>
 /// <param name="limites">limites operacionais</param>
 private void PreencherCausas(Cobertura produtoCobertura, Contrato.CoberturaProdutoNegociado cobertura, List <Contrato.LimiteOperacionalPorFaixa> limites)
 {
     if (cobertura.CoberturaId != null)
     {
         produtoCobertura.Causas = limites.Where(l => l.CoberturasIds.Contains(cobertura.CoberturaId.Value))
                                   .GroupBy(l => l.TipoGrupoCobertura).Select(g => new Causa {
             Descricao = g.Key
         }).ToList();
     }
 }
        /// <summary>
        /// Preenche o tipo de cobertura agrupado da Api
        /// </summary>
        /// <param name="produtoCobertura">cobertura (Api)</param>
        /// <param name="cobertura">cobertura (Esb)</param>
        private void PreencherTipoCobertura(Cobertura produtoCobertura, Contrato.CoberturaProdutoNegociado cobertura)
        {
            TipoCoberturaAgrupadoEnum?tipoCobertura = ObterTipoCobertura(cobertura);

            if (tipoCobertura != null)
            {
                produtoCobertura.Tipo           = new TipoCobertura();
                produtoCobertura.Tipo.Id        = (int?)tipoCobertura.Value;
                produtoCobertura.Tipo.Descricao = ((TipoCoberturaAgrupadoEnum)produtoCobertura.Tipo.Id).GetDescription();
            }
        }
 /// <summary>
 /// Preenche as UFs recusadas da cobertura e do produto
 /// Considera que o conjunto de UFs recusadas do produto é a união das UFs recusadas das coberturas
 /// </summary>
 /// <param name="produtoApi">produto (Api)</param>
 /// <param name="produtoCobertura">cobertura (Api)</param>
 /// <param name="cobertura">cobertura (Esb)</param>
 private void PreencherUFsRecusadas(Model.Produto produtoApi, Cobertura produtoCobertura, Contrato.CoberturaProdutoNegociado cobertura)
 {
     produtoCobertura.UFsRecusadas = cobertura.UFsRecusadasIds.Select(uf => uf).ToList();
     if (produtoCobertura.UFsRecusadas.Count > 0)
     {
         if (produtoApi.UFsRecusadas.Count == 0)
         {
             produtoApi.UFsRecusadas.AddRange(produtoCobertura.UFsRecusadas);
         }
         else
         {
             produtoApi.UFsRecusadas = produtoApi.UFsRecusadas.Union(produtoCobertura.UFsRecusadas).ToList();
         }
     }
 }
        /// <summary>
        /// Preenche os fundos vinculados à cobertura e ao produto
        /// Considera que o conjunto de fundos do produto é a interseção dos fundos das coberturas
        /// </summary>
        /// <param name="produtoApi">produto (Api)</param>
        /// <param name="produtoCobertura">cobertura (Api)</param>
        /// <param name="cobertura">cobertura (Esb)</param>
        private void PreencherFundos(Model.Produto produtoApi, Cobertura produtoCobertura, Contrato.CoberturaProdutoNegociado cobertura)
        {
            produtoCobertura.Fundos = new List <Model.Fundo>();
            foreach (var fundo in cobertura.Fundos)
            {
                var fundoApi = new Model.Fundo();
                fundoApi.Id = fundo.Id;
                //fundoApi.Cnpj = não existe referência ao cnpj no serviço
                fundoApi.NomeFantasia            = fundo.NomeFantasia;
                fundoApi.PercentualRendaVariavel = (float?)fundo.PercentualRendaVariavel;
                fundoApi.Sigla = fundo.Codigo;

                produtoCobertura.Fundos.Add(fundoApi);
            }

            if (produtoCobertura.Fundos.Count > 0)
            {
                if (produtoApi.Fundos.Count == 0)
                {
                    produtoApi.Fundos.AddRange(produtoCobertura.Fundos);
                }
                else
                {
                    produtoApi.Fundos = produtoApi.Fundos.Intersect(produtoCobertura.Fundos).ToList();
                }
            }
        }
        /// <summary>
        /// Preenche os prazos de decréscimo da cobertura e do produto
        /// Considera que o conjunto de prazos de decréscimo do produto é a interseção dos prazos de decréscimo das coberturas
        /// </summary>
        /// <param name="produtoApi">produto (Api)</param>
        /// <param name="produtoCobertura">cobertura (Api)</param>
        /// <param name="cobertura">cobertura (Esb)</param>
        private void PreencherPrazoDecrescimo(Model.Produto produtoApi, Cobertura produtoCobertura, Contrato.CoberturaProdutoNegociado cobertura)
        {
            produtoCobertura.PrazoDecrescimo = new List <int>();
            if (cobertura.DecrescimoContribuicao != null && cobertura.DecrescimoContribuicao.Count > 0)
            {
                produtoCobertura.PrazoDecrescimo = cobertura.DecrescimoContribuicao.GroupBy(d => d.Prazo).Select(g => (int)g.Key).ToList();

                if (produtoCobertura.PrazoDecrescimo.Count > 0)
                {
                    if (produtoApi.PrazoDecrescimo.Count == 0)
                    {
                        produtoApi.PrazoDecrescimo.AddRange(produtoCobertura.PrazoDecrescimo);
                    }
                    else
                    {
                        produtoApi.PrazoDecrescimo = produtoApi.PrazoDecrescimo.Intersect(produtoCobertura.PrazoDecrescimo).ToList();
                    }
                }
            }
        }
        /// <summary>
        /// Preenche os campos de antecipação (idade e tempo) da cobertura e do produto
        /// Considera que o conjunto valores de antecipação do produto é a interseção dos valores de antecipação das coberturas
        /// </summary>
        /// <param name="produtoApi">produto (Api)</param>
        /// <param name="produtoCobertura">cobertura (Api)</param>
        /// <param name="cobertura">cobertura (Esb)</param>
        private void PreencherAntecipacao(Model.Produto produtoApi, Cobertura produtoCobertura, Contrato.CoberturaProdutoNegociado cobertura)
        {
            produtoCobertura.IdadeAntecipacao = new List <int>();
            produtoCobertura.TempoAntecipacao = new List <int>();
            if (cobertura.AdiantamentoContribuicao != null && cobertura.AdiantamentoContribuicao.Count > 0)
            {
                var adiantamento = cobertura.AdiantamentoContribuicao.FirstOrDefault();
                produtoCobertura.IdadeAntecipacao = adiantamento?.Idade.Select(i => (int)i).ToList();
                produtoCobertura.TempoAntecipacao = adiantamento?.Prazo.Select(p => (int)p).ToList();

                if (produtoCobertura.IdadeAntecipacao != null && produtoCobertura.IdadeAntecipacao.Count > 0)
                {
                    if (produtoApi.IdadeAntecipacao.Count == 0)
                    {
                        produtoApi.IdadeAntecipacao.AddRange(produtoCobertura.IdadeAntecipacao);
                    }
                    else
                    {
                        produtoApi.IdadeAntecipacao = produtoApi.IdadeAntecipacao.Intersect(produtoCobertura.IdadeAntecipacao).ToList();
                    }
                }

                if (produtoCobertura.TempoAntecipacao != null && produtoCobertura.TempoAntecipacao.Count > 0)
                {
                    if (produtoApi.TempoAntecipacao.Count == 0)
                    {
                        produtoApi.TempoAntecipacao.AddRange(produtoCobertura.TempoAntecipacao);
                    }
                    else
                    {
                        produtoApi.TempoAntecipacao = produtoApi.TempoAntecipacao.Intersect(produtoCobertura.TempoAntecipacao).ToList();
                    }
                }
            }
        }
 /// <summary>
 /// Preenche o tipo de relação com o segurado da cobertura
 /// </summary>
 /// <param name="produtoCobertura">cobertura (Api)</param>
 /// <param name="cobertura">cobertura (Esb)</param>
 private void PreencherTipoRelacaoSegurado(Cobertura produtoCobertura, Contrato.CoberturaProdutoNegociado cobertura)
 {
     produtoCobertura.TipoRelacaoSegurado           = new Model.TipoRelacaoSegurado();
     produtoCobertura.TipoRelacaoSegurado.Id        = cobertura.TipoRelacaoSegurado;
     produtoCobertura.TipoRelacaoSegurado.Descricao = ((TipoRelacaoSeguradoEnum)cobertura.TipoRelacaoSegurado).GetDescription();
 }
        /// <summary>
        /// Preenche os prazos de cobertura da cobertura e do produto
        /// Considera que o conjunto de prazos de cobertura do produto é a interseção dos prazos de cobertura das coberturas
        /// </summary>
        /// <param name="produtoApi">produto (Api)</param>
        /// <param name="produtoCobertura">cobertura (Api)</param>
        /// <param name="cobertura">cobertura (Esb)</param>
        private void PreencherPrazoCerto(Model.Produto produtoApi, Cobertura produtoCobertura, Contrato.CoberturaProdutoNegociado cobertura)
        {
            produtoCobertura.PrazoCerto = new List <int>();
            if (cobertura.PrazoDeCobertura != null && cobertura.PrazoDeCobertura.Count > 0)
            {
                produtoCobertura.PrazoCerto = cobertura.PrazoDeCobertura.Select(p => (int)p).ToList(); /*verificar*/

                if (produtoCobertura.PrazoCerto.Count > 0)
                {
                    if (produtoApi.PrazoCerto.Count == 0)
                    {
                        produtoApi.PrazoCerto.AddRange(produtoCobertura.PrazoCerto);
                    }
                    else
                    {
                        produtoApi.PrazoCerto = produtoApi.PrazoCerto.Intersect(produtoCobertura.PrazoCerto).ToList();
                    }
                }
            }
        }
        /// <summary>
        /// Preenche os prazos de renda da cobertura e do produto
        /// Considera que o conjunto de prazos de renda do produto é a interseção dos prazos de renda das coberturas
        /// </summary>
        /// <param name="produtoApi"></param>
        /// <param name="produtoCobertura"></param>
        /// <param name="cobertura"></param>
        private void PreencherPrazoRenda(Model.Produto produtoApi, Cobertura produtoCobertura, Contrato.CoberturaProdutoNegociado cobertura)
        {
            produtoCobertura.PrazoRenda = new List <PrazoRenda>();
            if (cobertura.Rendas != null && cobertura.Rendas.Count > 0)
            {
                produtoCobertura.PrazoRenda = cobertura.Rendas.Where(r => r.PrazoInicial > 0 && r.PrazoFinal > 0).Select(p => new PrazoRenda()
                {
                    Id = p.Tipo.Id, Descricao = p.Tipo.Descricao, ValorMinimo = p.PrazoInicial, ValorMaximo = p.PrazoFinal
                }).ToList();                                                                                                                                                                                                                                         /*verificar*/

                if (produtoCobertura.PrazoRenda.Count > 0)
                {
                    if (produtoApi.PrazoRenda.Count == 0)
                    {
                        produtoApi.PrazoRenda.AddRange(produtoCobertura.PrazoRenda);
                    }
                    else
                    {
                        produtoApi.PrazoRenda = produtoApi.PrazoRenda.Intersect(produtoCobertura.PrazoRenda).ToList();
                    }
                }
            }
        }