private static void CalcularValorRepassePago(ValoresRelatorioRentabilidadeDto valoresRelatorio, List <ItemLancamentoFinanceiro> itemLancamentoFinanceiros, List <RepasseRelatorioRentabilidadeModel> repassesPagos, ServicoContratadoRelatorioRentabilidadeModel servico, List <CelulaEacesso> celulas)
        {
            var repassesPorServico = repassesPagos.Where(x => x.IdServicoContratado == servico.Id).Select(x => x.Id).ToList();
            var itensLancamentoRepassePorServico = itemLancamentoFinanceiros.Where(x => repassesPorServico.Contains(x.IdRepasse.Value));

            valoresRelatorio.VlRepPag += itensLancamentoRepassePorServico.Where(x => x.LancamentoFinanceiro.DescricaoTipoLancamento == "D" && x.LancamentoFinanceiro.IdTipoDespesa != null && x.LancamentoFinanceiro.TipoDespesa.SgTipoDespesa == "RP").Sum(x => x.VlLancamento);
        }
        private static void CalcularValorRepasseRecebido(ValoresRelatorioRentabilidadeDto valoresRelatorio, List <ItemLancamentoFinanceiro> itemLancamentoFinanceiros, List <RepasseRelatorioRentabilidadeModel> repassesRecebidos, ServicoContratadoRelatorioRentabilidadeModel servico, List <CelulaEacesso> celulas)
        {
            var repassesPorServico = repassesRecebidos.Where(x => x.IdServicoContratado == servico.Id).Select(x => x.Id).ToList();
            var itensLancamentoRepassePorServico = itemLancamentoFinanceiros.Where(x => repassesPorServico.Contains(x.IdRepasse.Value)).ToList();
            var tiposPossiveis = new string[] { "RP", "PR", "IN", "PI", "CO", "CS", "IR", "FG", "BN" };

            valoresRelatorio.VlRepRec += itensLancamentoRepassePorServico.Where(x => x.LancamentoFinanceiro.DescricaoTipoLancamento == "C" && x.LancamentoFinanceiro.IdTipoDespesa != null && tiposPossiveis.Contains(x.LancamentoFinanceiro.TipoDespesa.SgTipoDespesa)).ToList().Sum(x => x.VlLancamento);
        }
        private void CalcularValorDespesasGeraisRepasse(ValoresRelatorioRentabilidadeDto valorRelatorio, ServicoContratadoRelatorioRentabilidadeModel servico, List <ItemLancamentoFinanceiro> itensLancamentoFinanceiro, List <CelulaEacesso> celulas)
        {
            var lancamentosValidos = itensLancamentoFinanceiro.Where(x => x.LancamentoFinanceiro.IdTipoDespesa != null &&
                                                                     (x.LancamentoFinanceiro.TipoDespesa.SgTipoDespesa == "DG" ||
                                                                      x.LancamentoFinanceiro.TipoDespesa.SgTipoDespesa == "DF")
                                                                     );

            valorRelatorio.VlDespGeral += lancamentosValidos.Sum(x => x.VlLancamento);
        }
        private void CalcularValorDespesasSalarioRepasse(ValoresRelatorioRentabilidadeDto valorRelatorio, ServicoContratadoRelatorioRentabilidadeModel servico, List <ItemLancamentoFinanceiro> itensLancamentoFinanceiro, List <CelulaEacesso> celulas)
        {
            var tipoCelula         = celulas.FirstOrDefault(x => x.IdCelula == servico.IdCelula);
            var lancamentosValidos = itensLancamentoFinanceiro.Where(x => x.LancamentoFinanceiro.IdTipoDespesa != null &&
                                                                     (
                                                                         (
                                                                             (x.LancamentoFinanceiro.TipoDespesa.SgTipoDespesa == "SP" && (servico.SiglaTipoServico != "ACC" || tipoCelula.IdTipoCelula != 1)) ||
                                                                             (x.LancamentoFinanceiro.TipoDespesa.SgTipoDespesa == "SG" && tipoCelula.IdTipoCelula != 1)
                                                                         )
                                                                     )
                                                                     );

            valorRelatorio.VlDespSal += lancamentosValidos.Sum(x => x.VlLancamento);
        }
        private void CalcularValorDespesasCelula(ValoresRelatorioRentabilidadeDto valorRelatorio, IGrouping <int?, ItemLancamentoFinanceiro> itemServico, ServicoContratadoRelatorioRentabilidadeModel servico, List <ItemLancamentoFinanceiro> itensLancamentosRepassesPagos, List <RepasseRelatorioRentabilidadeModel> repassesPagos, List <CelulaEacesso> celulas)
        {
            var tipoCelula     = celulas.FirstOrDefault(x => x.IdCelula == servico.IdCelula);
            var somenteCompras = itemServico.Where(x => x.LancamentoFinanceiro.DescricaoOrigemLancamento == "CP").ToList();

            somenteCompras = somenteCompras.Where(x => x.LancamentoFinanceiro.IdTipoDespesa != null &&
                                                  (
                                                      (x.LancamentoFinanceiro.TipoDespesa.SgTipoDespesa == "SG" && tipoCelula.IdTipoCelula == 1) ||
                                                      (x.LancamentoFinanceiro.DescOrigemCompraEacesso == "GPD") ||
                                                      (x.LancamentoFinanceiro.TipoDespesa.SgTipoDespesa == "SP" && tipoCelula.IdTipoCelula == 1 && servico.SiglaTipoServico == "ACC")
                                                  )
                                                  ).ToList();

            valorRelatorio.VlDespCel += somenteCompras.Sum(x => x.VlLancamento);
            var repassesPorServico = repassesPagos.Where(x => x.IdServicoContratado == itemServico.Key).Select(x => x.Id).ToList();


            CalcularValorDespesasCelulaRepasse(valorRelatorio, servico, itensLancamentosRepassesPagos.Where(x => repassesPorServico.Contains(x.IdRepasse.Value)).ToList(), celulas);
        }
        private void CalcularValorDespesasCelulaRepasse(ValoresRelatorioRentabilidadeDto valorRelatorio, ServicoContratadoRelatorioRentabilidadeModel servico, List <ItemLancamentoFinanceiro> itensLancamentoFinanceiro, List <CelulaEacesso> celulas)
        {
            var tipoCelula         = celulas.FirstOrDefault(x => x.IdCelula == servico.IdCelula);
            var tiposPossiveis     = new string[] { "PR", "IN", "PI", "CO", "CS", "IR", "FG", "BN" };
            var lancamentosValidos =
                itensLancamentoFinanceiro.Where(x => x.LancamentoFinanceiro.IdTipoDespesa != null &&
                                                (
                                                    (x.LancamentoFinanceiro.TipoDespesa.SgTipoDespesa == "SP" && tipoCelula.IdTipoCelula == 1 && servico.SiglaTipoServico == "ACC") ||
                                                    (x.LancamentoFinanceiro.TipoDespesa.SgTipoDespesa == "SG" && tipoCelula.IdTipoCelula == 1) ||
                                                    (
                                                        tiposPossiveis.Contains(x.LancamentoFinanceiro.TipoDespesa.SgTipoDespesa) && (tipoCelula.IdTipoCelula == 1 && servico.SiglaTipoServico == "ACC")
                                                    )
                                                )
                                                );

            valorRelatorio.VlDespCel += lancamentosValidos.Sum(x => x.VlLancamento);
        }
        private void CalcularValorAjusteFaturamento(ValoresRelatorioRentabilidadeDto valorRelatorio, IGrouping <int?, ItemLancamentoFinanceiro> itemServico, ServicoContratadoRelatorioRentabilidadeModel servico, List <ItemLancamentoFinanceiro> itensLancamentosRepassesPagos, List <RepasseRelatorioRentabilidadeModel> repassesPagos, List <CelulaEacesso> celulas)
        {
            var repassesPorServico = repassesPagos.Where(x => x.IdServicoContratado == itemServico.Key).Select(x => x.Id).ToList();
            var itensValidos       = itensLancamentosRepassesPagos.Where(x => repassesPorServico.Contains(x.IdRepasse.Value));

            var lancamentosValidos = itensValidos.Where(x => x.LancamentoFinanceiro.IdTipoDespesa != null &&
                                                        x.LancamentoFinanceiro.TipoDespesa.SgTipoDespesa == "AJ"
                                                        ).ToList();

            valorRelatorio.VlAjustFat += lancamentosValidos.Sum(x => (x.VlInc.Value - x.VlDesc.Value));
        }
        private void CalcularValorImpostoRepasse(ValoresRelatorioRentabilidadeDto valorRelatorio, List <ItemLancamentoFinanceiro> itensLancamentosRepassesPagos, List <RepasseRelatorioRentabilidadeModel> repassesPagos, ServicoContratadoRelatorioRentabilidadeModel servico, List <CelulaEacesso> celulas)
        {
            var tipoCelula     = celulas.FirstOrDefault(x => x.IdCelula == servico.IdCelula);
            var tiposPossiveis = new List <string> {
                "PR", "IN", "PI", "CO", "CS", "IR", "FG", "BN"
            };
            var repassesPorServico = repassesPagos.Where(x => x.IdServicoContratado == servico.Id).Select(x => x.Id).ToList();

            var itensLancamentoRepassePorServico =
                itensLancamentosRepassesPagos.Where(x =>
                                                    repassesPorServico.Contains(x.IdRepasse.Value) &&
                                                    (tipoCelula.IdTipoCelula != 1 || servico.SiglaTipoServico != "ACC")
                                                    &&
                                                    tiposPossiveis.Contains(x.LancamentoFinanceiro.TipoDespesa.SgTipoDespesa)
                                                    );

            valorRelatorio.VlRepPagImp = itensLancamentoRepassePorServico.Sum(x => x.VlLancamento);
        }
        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));
        }
        private void CalcularValorMarkup(ValoresRelatorioRentabilidadeDto valorRelatorio, IGrouping <int?, ItemLancamentoFinanceiro> itemServico, ServicoContratadoRelatorioRentabilidadeModel servicoContratadoRelatorioRentabilidadeModel, List <ItemLancamentoFinanceiro> itensLancamentosRepassesPagos, List <RepasseRelatorioRentabilidadeModel> repassesPagos, List <CelulaEacesso> celulas)
        {
            var repassesPorServico = repassesPagos.Where(x => x.IdServicoContratado == itemServico.Key).Select(x => x.Id).ToList();
            var itensValidos       = itensLancamentosRepassesPagos.Where(x => repassesPorServico.Contains(x.IdRepasse.Value)).ToList();
            var lancamentosValidos = itensValidos.Where(x => x.LancamentoFinanceiro.IdTipoDespesa != null && x.LancamentoFinanceiro.TipoDespesa.SgTipoDespesa == "AJ").ToList();

            // var valorMarkupServico = (itemServico.Where(x => x.LancamentoFinanceiro.DescricaoOrigemLancamento == "FT").ToList().Sum(x => x.VlLancamento) * (Math.Round(servicoContratadoRelatorioRentabilidadeModel.VlMarkup / 100, 2)));
            var valorMarkupServico   = valorRelatorio.VlFat * (Math.Round(servicoContratadoRelatorioRentabilidadeModel.VlMarkup / 100, 2));
            var valorMarkupServicoIr = valorRelatorio.VlFatIr * (Math.Round(servicoContratadoRelatorioRentabilidadeModel.VlMarkup / 100, 2));
            var valorMarkupRepasse   = Math.Round((lancamentosValidos.Sum(x => (x.VlInc.Value - x.VlDesc.Value)) * (servicoContratadoRelatorioRentabilidadeModel.VlMarkup / 100)), 2);

            valorRelatorio.VlMarkUp   = valorMarkupServico + valorMarkupRepasse;
            valorRelatorio.VlMarkUpIr = valorMarkupServicoIr + valorMarkupRepasse;
        }
        private void CalcularValorDespesasGerais(ValoresRelatorioRentabilidadeDto valorRelatorio, IGrouping <int?, ItemLancamentoFinanceiro> itemServico, ServicoContratadoRelatorioRentabilidadeModel servico, List <ItemLancamentoFinanceiro> itensLancamentosRepassesPagos, List <RepasseRelatorioRentabilidadeModel> repassesPagos, List <CelulaEacesso> celulas)
        {
            var tiposValidos   = new string[] { "DG", "DF" };
            var somenteCompras = itemServico.Where(x => x.LancamentoFinanceiro.DescricaoOrigemLancamento == "CP").ToList();

            somenteCompras = somenteCompras.Where(x =>
                                                  x.LancamentoFinanceiro.IdTipoDespesa != null &&
                                                  tiposValidos.Contains(x.LancamentoFinanceiro.TipoDespesa.SgTipoDespesa) &&
                                                  (x.LancamentoFinanceiro.DescOrigemCompraEacesso != "GPD" || x.LancamentoFinanceiro.DescOrigemCompraEacesso == null)
                                                  ).ToList();

            valorRelatorio.VlDespGeral += somenteCompras.Sum(x => x.VlLancamento);
            var repassesPorServico = repassesPagos.Where(x => x.IdServicoContratado == itemServico.Key).Select(x => x.Id).ToList();

            CalcularValorDespesasGeraisRepasse(valorRelatorio, servico, itensLancamentosRepassesPagos.Where(x => repassesPorServico.Contains(x.IdRepasse.Value)).ToList(), celulas);
        }