public void Persistir(CategoriaContabil categoria)
        {
            var mensagens = new CategoriaValidator().Validate(categoria).Errors;

            if (mensagens.Count > 0)
            {
                foreach (var mensagem in mensagens)
                {
                    _notificationHandler.AddMensagem(mensagem.PropertyName, mensagem.ErrorMessage);
                }
                return;
            }

            if ((_categoriaContabilRepository.Validar(categoria)))
            {
                _notificationHandler.AddMensagem("Sigla", "PERSISTIR_CATEGORIA_DUPLICIDADE");
                return;
            }

            if (categoria.Id == 0)
            {
                _categoriaContabilRepository.Adicionar(categoria);
            }
            else
            {
                _categoriaContabilRepository.Update(categoria);
            }
            _unitOfWork.Commit();
        }
        public RelatorioEtapa ExtratoFinanceiro(int projetoId)
        {
            var AlocacoesRh = _context.AlocacoesRh
                              .Include("CatalogEmpresa")
                              .Where(m => m.ProjetoId == projetoId)
                              .Select(m => new {
                EtapaId        = m.EtapaId,
                Etapa          = m.Etapa,
                Empresa        = m.Empresa,
                CatalogEmpresa = m.Empresa.CatalogEmpresa
            })
                              .ToList();
            var AlocacoesRm = _context.AlocacoesRm
                              .Include("CatalogEmpresa")
                              .Where(m => m.ProjetoId == projetoId)
                              .Select(m => new {
                EtapaId        = m.EtapaId,
                Etapa          = m.Etapa,
                Empresa        = m.EmpresaFinanciadora,
                CatalogEmpresa = m.EmpresaFinanciadora.CatalogEmpresa
            })
                              .ToList();
            var Etapas = AlocacoesRh
                         .Concat(AlocacoesRm)
                         .OrderBy(p => p.EtapaId);

            var RelatorioEtapas = Etapas
                                  .GroupBy(p => p.Etapa)
                                  .Distinct()
                                  .ToList();

            RelatorioEtapa relatorio = new RelatorioEtapa();

            relatorio.Etapas = new List <RelatorioEtapas>();
            relatorio.Total  = RelatorioEtapas.Count();
            relatorio.Valor  = 0;
            var i = 1;

            foreach (var Etapa in  RelatorioEtapas)
            {
                decimal ValorEtapa = 0;
                string  nomeEtapa  = "Etapa " + i;

                //var empresas = new List<RelatorioEtapaEmpresas>();
                var empresas = Etapas
                               .Where(e => e.EtapaId == Etapa.First().EtapaId)
                               .GroupBy(e => e.Empresa);

                var RelatorioEtapaEmpresas = new List <RelatorioEtapaEmpresas>();
                foreach (var empresa in empresas)
                {
                    decimal ValorEmpresa = 0;
                    string  nomeEmpresa  = null;
                    if (empresa.First().Empresa.CatalogEmpresaId > 0)
                    {
                        nomeEmpresa = empresa.First().Empresa.CatalogEmpresa.Nome;
                    }
                    else
                    {
                        nomeEmpresa = empresa.First().Empresa.RazaoSocial;
                    }

                    var data = new List <RelatorioEtapaItems>();
                    foreach (CategoriaContabil categoria in CategoriaContabil.GetValues(typeof(CategoriaContabil)))
                    {
                        int total = 0;
                        if (categoria.ToString() == "RH")
                        {
                            //obter alocações recursos humanos
                            var rhs = _context.AlocacoesRh
                                      .Where(p => p.EmpresaId == empresa.First().Empresa.Id)
                                      .Where(p => p.EtapaId == Etapa.First().EtapaId)
                                      .Include("RecursoHumano")
                                      .ToList();
                            total = AlocacoesRh.Count();
                            if (total > 0)
                            {
                                foreach (AlocacaoRh a in rhs)
                                {
                                    decimal valor = (a.HrsMes1 + a.HrsMes2 + a.HrsMes3 + a.HrsMes4 + a.HrsMes5 + a.HrsMes6) * a.RecursoHumano.ValorHora;
                                    data.Add(new RelatorioEtapaItems
                                    {
                                        AlocacaoId        = a.Id,
                                        Desc              = a.RecursoHumano.NomeCompleto,
                                        RecursoHumano     = a.RecursoHumano,
                                        CategoriaContabil = categoria.ToString(),
                                        Valor             = valor
                                    });
                                    ValorEmpresa += valor;
                                }
                            }
                            // Fim RH
                        }
                        else
                        {
                            // Outras Categorias
                            var rms = _context.AlocacoesRm
                                      .Where(p => p.EtapaId == Etapa.First().EtapaId)
                                      .Where(p => p.EmpresaFinanciadoraId == empresa.First().Empresa.Id)
                                      .Include(p => p.RecursoMaterial)
                                      .Where(p => p.RecursoMaterial.CategoriaContabil == categoria)
                                      .Include("Etapa.EtapaProdutos")
                                      .ToList();
                            total = AlocacoesRm.Count();
                            if (total > 0)
                            {
                                foreach (AlocacaoRm a in rms)
                                {
                                    decimal valor = (a.Qtd) * a.RecursoMaterial.ValorUnitario;
                                    data.Add(new RelatorioEtapaItems
                                    {
                                        AlocacaoId        = a.Id,
                                        Desc              = a.RecursoMaterial.Nome,
                                        RecursoMaterial   = a.RecursoMaterial,
                                        CategoriaContabil = categoria.ToString(),
                                        Valor             = valor
                                    });
                                    ValorEmpresa += valor;
                                }
                            }
                        }
                    }
                    if (data.Count() > 0)
                    {
                        RelatorioEtapaEmpresas.Add(new RelatorioEtapaEmpresas {
                            Desc    = nomeEmpresa,
                            Empresa = empresa.First().Empresa,
                            Items   = data,
                            Total   = data.Count(),
                            Valor   = ValorEmpresa
                        });
                    }
                    ValorEtapa += ValorEmpresa;
                }
                //Fim Outros Relatorios
                relatorio.Etapas.Add(new RelatorioEtapas
                {
                    Nome     = nomeEtapa,
                    Etapa    = Etapa.First().Etapa,
                    Empresas = RelatorioEtapaEmpresas,
                    Total    = RelatorioEtapaEmpresas.Count(),
                    Valor    = ValorEtapa
                });
                relatorio.Valor += ValorEtapa;
                i++;
            }
            return(relatorio);
        }