private List <ValoresRelatorioRentabilidadeDto> FiltrarTipoRelatorio(FiltroRelatorioRentabilidadeDiretoriaDto filtro, int idCelulaSelecionada, List <ProcedureHierarquiaModel> celulaValidadas, List <ValoresRelatorioRentabilidadeDto> valoresRelatorio)
        {
            var result = PrepararResultadoRelatorio(valoresRelatorio, celulaValidadas, idCelulaSelecionada);

            if (filtro.TipoRelatorio == "CO")
            {
                result = result.Where(x => x.Tipo != "" && x.Tipo != "CLIENTE: ").ToList();
            }

            return(result);
        }
        private List <ItemLancamentoFinanceiro> ObterItensLancamentoRepassesPagos(FiltroRelatorioRentabilidadeDiretoriaDto filtro, out List <RepasseRelatorioRentabilidadeModel> repassesPagos)
        {
            List <ItemLancamentoFinanceiro> itensLancamentos = new List <ItemLancamentoFinanceiro>();

            repassesPagos = ObterRepassesPagosPorCelulas(filtro.IdsCelula);
            var repassesLista = SplitListRepasse(repassesPagos);

            foreach (var repasseAgrupado in repassesLista)
            {
                itensLancamentos.AddRange(_itemLancamentoFinanceiroRepository.ObterItensLancamentoPorIdRepassePagoPorPeriodo(repasseAgrupado.Select(x => x.Id).ToList(), filtro.DtInicio, filtro.DtFim));
            }

            return(itensLancamentos);
        }
        private List <ItemLancamentoFinanceiro> ObterItensLancamentoPorServico(FiltroRelatorioRentabilidadeDiretoriaDto filtro, out List <ServicoContratadoRelatorioRentabilidadeModel> servicos)
        {
            List <ItemLancamentoFinanceiro> itensLancamentos = new List <ItemLancamentoFinanceiro>();

            servicos = ObterServicosPorCelulas(filtro.IdsCelula);

            var servicosLista = SplitListServico(servicos);

            foreach (var servicosAgrupado in servicosLista)
            {
                itensLancamentos = _itemLancamentoFinanceiroRepository.ObterItensLancamentoPorIdServicoContratadoPorPeriodo(servicosAgrupado.Select(x => x.Id).ToList(), filtro.DtInicio, filtro.DtFim);
            }

            return(itensLancamentos);
        }
        public List <ValoresRelatorioRentabilidadeDto> ObterInformacoesPorDiretoria(FiltroRelatorioRentabilidadeDiretoriaDto filtro)
        {
            var idCelulaSelecionada = filtro.IdsCelula.LastOrDefault();
            var proceduresService   = new ProceduresService(_connectionStrings.Value.EacessoConnection);
            var celulaValidadas     = proceduresService.ObterHierarquiaCelulas(filtro.IdsCelula.LastOrDefault());
            var idsCelulaValidadas  = celulaValidadas.Select(x => x.IdCelula).Concat(celulaValidadas.Select(x => x.IdCelulaSup)).Distinct().ToList();

            filtro.IdsCelula = idsCelulaValidadas;
            #region variaveis
            var servicos          = new List <ServicoContratadoRelatorioRentabilidadeModel>();
            var repassesPagos     = new List <RepasseRelatorioRentabilidadeModel>();
            var repassesRecebidos = new List <RepasseRelatorioRentabilidadeModel>();
            List <ValoresRelatorioRentabilidadeDto> valoresRelatorio        = new List <ValoresRelatorioRentabilidadeDto>();
            List <ValoresRelatorioRentabilidadeDto> valoresRelatorioCliente = new List <ValoresRelatorioRentabilidadeDto>();
            List <ValoresRelatorioRentabilidadeDto> valoresRelatorioCelula  = new List <ValoresRelatorioRentabilidadeDto>();
            var itensLancamentosServico           = new List <ItemLancamentoFinanceiro>();
            var itensLancamentosRepassesPagos     = new List <ItemLancamentoFinanceiro>();
            var itensLancamentosRepassesRecebidos = new List <ItemLancamentoFinanceiro>();
            var celulas        = new List <CelulaEacesso>();
            var celulasService = new CelulaEacessoService(_connectionStrings.Value.EacessoConnection);
            celulas = celulasService.ObterCelulasPorIds(filtro.IdsCelula);
            #endregion


            itensLancamentosServico           = ObterItensLancamentoPorServico(filtro, out servicos);
            itensLancamentosRepassesPagos     = ObterItensLancamentoRepassesPagos(filtro, out repassesPagos);
            itensLancamentosRepassesRecebidos = ObterItensLancamentoRepassesRecebidos(filtro, out repassesRecebidos);

            var itensAgrupados = itensLancamentosServico.GroupBy(x => x.IdServicoContratado);
            var itensAgrupadosRepassesPagos     = itensLancamentosRepassesPagos.GroupBy(x => x.IdRepasse);
            var itensAgrupadosRepassesRecebidos = itensLancamentosRepassesRecebidos.GroupBy(x => x.IdRepasse);
            var repassesPagosAgrupados          = repassesPagos.GroupBy(x => x.IdServicoContratado);
            var repassesRecebidosAgrupados      = repassesRecebidos.GroupBy(x => x.IdServicoContratado);

            var idsServicos = itensAgrupados.Select(x => new ManipularValoresRelatorio {
                Id = x.Key.Value, Tipo = "S"
            }).Distinct().ToList();
            var idsRepassesPagos = itensAgrupadosRepassesPagos.Select(x => new ManipularValoresRelatorio {
                Id = x.Key.Value, Tipo = "R"
            }).Distinct();
            var idsRepassesRecebidos = itensAgrupadosRepassesRecebidos.Select(x => new ManipularValoresRelatorio {
                Id = x.Key.Value, Tipo = "R"
            }).Distinct();

            foreach (var item in repassesPagosAgrupados)
            {
                if (!idsServicos.Any(x => x.Id == item.Key))
                {
                    idsServicos.Add(new ManipularValoresRelatorio {
                        Id = item.Key, Tipo = "S"
                    });
                }
            }

            foreach (var item in repassesRecebidosAgrupados)
            {
                if (!idsServicos.Any(x => x.Id == item.Key))
                {
                    idsServicos.Add(new ManipularValoresRelatorio {
                        Id = item.Key, Tipo = "S"
                    });
                }
            }

            foreach (var idItem in idsServicos)
            {
                var servicoAtual = new ServicoContratadoRelatorioRentabilidadeModel();
                if (idItem.Tipo == "S")
                {
                    servicoAtual = servicos.FirstOrDefault(x => x.Id == idItem.Id);
                }
                else
                {
                    var idServico = repassesPagosAgrupados.FirstOrDefault(x => x.Any(y => y.Id == idItem.Id));
                    if (idServico != null)
                    {
                        servicoAtual = servicos.FirstOrDefault(x => x.Id == idServico.Key);
                    }
                    else
                    {
                        idServico = repassesRecebidosAgrupados.FirstOrDefault(x => x.Any(y => y.Id == idItem.Id));
                        if (idServico != null)
                        {
                            servicoAtual = servicos.FirstOrDefault(x => x.Id == idServico.Key);
                        }
                    }
                }
                IGrouping <int?, ItemLancamentoFinanceiro> itemServico = null;
                itemServico = itensAgrupados.FirstOrDefault(x => x.Key == servicoAtual.Id);
                if (itemServico == null)
                {
                    var idsPagos = repassesPagos.Where(x => x.IdServicoContratado == servicoAtual.Id).Select(x => x.Id).ToList();
                    var itens    = itensLancamentosRepassesPagos.Where(x => idsPagos.Contains(x.IdRepasse.Value));
                    foreach (var item in itens)
                    {
                        item.IdServicoContratado = repassesPagos.FirstOrDefault(x => x.Id == item.IdRepasse).IdServicoContratado;
                    }
                    itemServico = itensLancamentosRepassesPagos.Where(x => idsPagos.Contains(x.IdRepasse.Value)).GroupBy(x => x.IdServicoContratado).FirstOrDefault();
                }
                if (itemServico == null)
                {
                    var idsPagos = repassesRecebidos.Where(x => x.IdServicoContratado == servicoAtual.Id).Select(x => x.Id).ToList();
                    var itens    = itensLancamentosRepassesRecebidos.Where(x => idsPagos.Contains(x.IdRepasse.Value));
                    foreach (var item in itens)
                    {
                        item.IdServicoContratado = repassesRecebidos.FirstOrDefault(x => x.Id == item.IdRepasse).IdServicoContratado;
                    }
                    itemServico = itensLancamentosRepassesRecebidos.Where(x => idsPagos.Contains(x.IdRepasse.Value)).GroupBy(x => x.IdServicoContratado).FirstOrDefault();
                }
                if (itemServico == null)
                {
                    continue;
                }
                var valorRelatorio = new ValoresRelatorioRentabilidadeDto();
                valorRelatorio.Descricao = "SERVIÇO:" + servicos.FirstOrDefault(x => x.Id == servicoAtual.Id).DescEscopo;
                valorRelatorio.Tipo      = "";
                valorRelatorio.Nivel     = 4;
                valorRelatorio.IdServico = servicoAtual.Id;
                valorRelatorio.IdCelula  = servicoAtual.IdCelula;
                valorRelatorio.IdCliente = servicos.FirstOrDefault(x => x.Id == servicoAtual.Id).IdCliente;

                CalcularValorFaturamentoServico(valorRelatorio, itemServico, celulas);
                CalcularValorAjusteFaturamento(valorRelatorio, itemServico, servicos.FirstOrDefault(x => x.Id == servicoAtual.Id), itensLancamentosRepassesPagos.ToList(), repassesPagos, celulas);
                CalcularValorFaturamentoAjusteServico(valorRelatorio, celulas);
                CalcularValorMarkup(valorRelatorio, itemServico, servicos.FirstOrDefault(x => x.Id == servicoAtual.Id), itensLancamentosRepassesPagos.ToList(), repassesPagos, celulas);
                CalcularValorDespesasGerais(valorRelatorio, itemServico, servicos.FirstOrDefault(x => x.Id == servicoAtual.Id), itensLancamentosRepassesPagos.ToList(), repassesPagos, celulas);
                CalcularValorDespesasSalario(valorRelatorio, itemServico, servicos.FirstOrDefault(x => x.Id == servicoAtual.Id), itensLancamentosRepassesPagos.ToList(), repassesPagos, celulas);
                CalcularValorDespesasCelula(valorRelatorio, itemServico, servicos.FirstOrDefault(x => x.Id == servicoAtual.Id), itensLancamentosRepassesPagos.ToList(), repassesPagos, celulas);
                CalcularValorTotalDespesa(valorRelatorio, itemServico);
                CalcularValorImpostoRepasse(valorRelatorio, itensLancamentosRepassesPagos.ToList(), repassesPagos, servicoAtual, celulas);
                CalcularValorRepassePago(valorRelatorio, itensLancamentosRepassesPagos.ToList(), repassesPagos, servicoAtual, celulas);
                CalcularValorRepasseRecebido(valorRelatorio, itensLancamentosRepassesRecebidos.ToList(), repassesRecebidos, servicoAtual, celulas);
                CalcularValorLucroServico(valorRelatorio);
                CalcularValorPorcentagemLucroServico(valorRelatorio);

                valoresRelatorio.Add(valorRelatorio);
            }

            return(FiltrarTipoRelatorio(filtro, idCelulaSelecionada, celulaValidadas, valoresRelatorio));
        }