public List <ProcessoResposta> ConsultarEtapasAnalisada(Usuario usuario, int?numero, int?demandanteId, int?processoId) { var idsProcessoRespostas = repositorio.session.Query <EtapaResposta>() .Fetch(x => x.Etapa) .Fetch(x => x.ProcessoResposta) .Fetch(x => x.Analista) .Where(x => x.Status != (int)enumStatusEtapaResposta.Aguardando && x.Etapa != null && x.Etapa.PrimeiraEtapa == false && x.ProcessoResposta.Concluido == false && x.Analista != null && x.Analista.ID == usuario.ID && (numero == null || x.ProcessoResposta.ID == numero) && (demandanteId == null || x.ProcessoResposta.Usuario.ID == demandanteId) && (processoId == null || x.ProcessoResposta.Processo.ID == processoId) ).ToList() .Select(x => x.ProcessoResposta.ID) .Distinct().ToList(); var processosRespostas = repositorio.session.Query <ProcessoResposta>() .Where(x => idsProcessoRespostas.Contains(x.ID)).ToList(); var processos = new BMProcessoResposta().ObterTodosIQueryable() .Select(x => new { Processo = new Processo { ID = x.Processo.ID, Nome = x.Processo.Nome // TODO: Outros campos do Procesos que precisas. }, Usuario = new Usuario { ID = x.Usuario.ID, Nome = x.Usuario.Nome, Unidade = x.Usuario.Unidade, CPF = x.Usuario.CPF }, IdProcessoResposta = x.ID }) .Where(x => idsProcessoRespostas.Contains(x.IdProcessoResposta)) .ToList(); foreach (var processoResposta in processosRespostas) { var dado = processos.FirstOrDefault(x => x.IdProcessoResposta == processoResposta.ID); processoResposta.Processo = dado.Processo; processoResposta.Usuario = dado.Usuario; } return(processosRespostas); }
public List <EtapaResposta> ConsultarEtapasAAnalisar(Usuario usuario, int?numero, int?demandanteId, int?processoId, int?etapaId, List <Cargo> cargos = null, bool somenteEtapasComUmAnalista = false) { var diretores = new List <UsuarioCargo>(); var cargoUsuario = usuario.ObterCargo(); if (cargoUsuario != null) { // Buscar todos os diretores, pela UF do UsuarioCargo. diretores = new BMUsuarioCargo().ObterPorTipoCargo(EnumTipoCargo.Diretoria).Where(x => x.Cargo.Uf.ID == cargoUsuario.Cargo.Uf.ID).ToList(); } var bmProcessoResposta = new BMProcessoResposta(); var bmEtapaResposta = new BMEtapaResposta(); var bmUsuario = new BMUsuario(); var bmEtapaPermissao = new BMEtapaPermissao(); var idsEtapasRespostasAbertas = bmEtapaResposta.ObterTodosIQueryable() .Where(x => x.Ativo) .Where(x => x.ProcessoResposta.Status != 0) .Where(x => x.Status == (int)enumStatusEtapaResposta.Aguardando) .Where(x => x.DataPreenchimento == null) .Select(x => x.ID).ToList(); var idsProcessosRespostasAbertos = bmProcessoResposta.ObterTodosIQueryable() .Where(x => x.ListaEtapaResposta.AsQueryable() .Select(er => new { er.ID }) //.Where(er => idsEtapasRespostasAbertas.Contains(er.ID)).Count() > 0 .Any(er => idsEtapasRespostasAbertas.Contains(er.ID)) ); var ids = idsProcessosRespostasAbertos.Select(x => x.ID).AsEnumerable().Take(10000); var demandantes = bmUsuario.ObterTodosIQueryable() .Where(x => x.ListaProcessoResposta.Any(pr => idsProcessosRespostasAbertos.Select(a => a.ID).Contains(pr.ID)))//.ToList() .Select(x => new { Usuario = new Usuario { ID = x.ID, Nome = x.Nome, Email = x.Email, CPF = x.CPF, Unidade = x.Unidade, UF = x.UF, ListaUsuarioCargo = x.ListaUsuarioCargo }, Processos = x.ListaProcessoResposta.Select(y => y.ID) .Where(prId => ids.Contains(prId)).ToList() }).ToList(); var etapasRespostasAnalistas = bmEtapaResposta.ObterTodosIQueryable() .Where(x => ids.Contains(x.ProcessoResposta.ID)) .Select(x => new EtapaResposta { ID = x.ID, ProcessoResposta = new ProcessoResposta { ID = x.ProcessoResposta.ID }, Analista = x.Analista != null ? new Usuario { ID = x.Analista.ID } : null }).ToList(); foreach (var processoResposta in idsProcessosRespostasAbertos) { processoResposta.Usuario = demandantes.FirstOrDefault(d => d.Processos.Contains(processoResposta.ID))?.Usuario; processoResposta.ListaEtapaResposta = etapasRespostasAnalistas.Where(x => x.ProcessoResposta.ID == processoResposta.ID).ToList(); } var etapasRespostas = bmEtapaResposta.ObterTodosIQueryable() .Where(x => idsEtapasRespostasAbertas.Contains(x.ID)) .Select(er => new EtapaResposta { ID = er.ID, DataPreenchimento = er.DataPreenchimento, DataAlteracao = er.DataAlteracao, PrazoEncaminhamento = er.PrazoEncaminhamento, PermissoesNucleoEtapaResposta = er.PermissoesNucleoEtapaResposta, ListaEtapaEncaminhamentoUsuario = er.ListaEtapaEncaminhamentoUsuario }).ToList(); var etapas = new BMEtapa().ObterTodosIQueryable() .Where(x => x.ListaEtapaResposta.Any(er => idsEtapasRespostasAbertas.Contains(er.ID))) .Select(x => new Etapa { ID = x.ID, PodeSerAprovadoChefeGabinete = x.PodeSerAprovadoChefeGabinete, Nome = x.Nome, ListaEtapaResposta = x.ListaEtapaResposta.Select(er => new EtapaResposta { ID = er.ID }).ToList() }).ToList(); var etapasIds = etapas.Select(x => x.ID).ToList(); var permissoes = bmEtapaPermissao.ObterTodosIQueryable().Where(x => etapasIds.Contains(x.Etapa.ID)) .Select(x => new EtapaPermissao { ID = x.ID, Notificar = x.Notificar, Analisar = x.Analisar, ChefeImediato = x.ChefeImediato, DiretorCorrespondente = x.DiretorCorrespondente, GerenteAdjunto = x.GerenteAdjunto, Solicitante = x.Solicitante, Etapa = new Etapa { ID = x.Etapa.ID } }) .ToList(); var idsPermissoes = permissoes.Select(x => x.ID).ToList(); // Quebra a lista de permissões para não supera o limite do LINQ de 2100 registros em um IN var idPremissoesGroupList = splitList(idsPermissoes, 2000); foreach (var idPremissoesGroup in idPremissoesGroupList) { var usuariosPermissoes = bmUsuario.ObterTodosIQueryable() .Where(x => x.ListaEtapaPermissao.Any(p => idPremissoesGroup.Contains(p.ID))) .Select(x => new Usuario { ID = x.ID }) .ToList() .Select(x => new { Usuario = x, Permissoes = bmEtapaPermissao.ObterTodosIQueryable() .Where(p => etapasIds.Contains(p.Etapa.ID) && p.Usuario != null && p.Usuario.ID == x.ID) .Select(p => new { p.ID }) .Select(p => p.ID) .ToList() }).ToList(); foreach (var permissao in permissoes) { permissao.Usuario = usuariosPermissoes.FirstOrDefault(x => x.Permissoes.Any(pId => pId == permissao.ID))?.Usuario; } } var vinculoEtapaComEtapaResposta = bmEtapaResposta.ObterTodosIEnumerable().AsQueryable() .Where(x => etapasIds.Contains(x.Etapa.ID)) .Select(x => new { EtapaId = x.Etapa.ID, EtapaRespostaId = x.ID }) .ToList(); foreach (var etapa in etapas) { etapa.Permissoes = permissoes.Where(p => p.Etapa.ID == etapa.ID).ToList(); etapa.ListaEtapaResposta = vinculoEtapaComEtapaResposta.Where(x => x.EtapaId == etapa.ID) .Select(x => new EtapaResposta { ID = x.EtapaRespostaId }).ToList(); } var idsProcessosRespostasAbertos2 = idsProcessosRespostasAbertos.ToList(); foreach (var etapaResposta in etapasRespostas) { etapaResposta.ProcessoResposta = idsProcessosRespostasAbertos2.FirstOrDefault(pr => pr.ListaEtapaResposta.Any(er => er.ID == etapaResposta.ID)); etapaResposta.Etapa = etapas.AsEnumerable().FirstOrDefault( x => x.ListaEtapaResposta .Select(er => new { er.ID }).AsEnumerable() .ToList() .Any(er => er.ID == etapaResposta.ID)); } var retorno = etapasRespostas.Where(er => UsuarioPodeAnalisar(diretores, er, numero, demandanteId, processoId, etapaId, usuario, cargos, somenteEtapasComUmAnalista)).ToList(); //CASO ETAPA ENCAMINHADA PELO USUARIO ESTIVER PENDENTE, A ETAPA NAO EXIBE PARA O USUARIO retorno = retorno.Where(x => x.ListaEtapaEncaminhamentoUsuario != null && x.ListaEtapaEncaminhamentoUsuario.Select(y => y.UsuarioEncaminhamento.ID).Contains(usuario.ID) ? x.ListaEtapaEncaminhamentoUsuario.Any(z => z.UsuarioEncaminhamento.ID == usuario.ID && z.StatusEncaminhamento != (int)enumStatusEncaminhamentoEtapa.Aguardando) : true).ToList(); //CASO ETAPA ENCAMINHADA PELO USUARIO NAO ESTIVER PENDENTE, A ETAPA NAO EXIBE PARA O USUARIO retorno = retorno.Where(x => x.ListaEtapaEncaminhamentoUsuario != null && x.ListaEtapaEncaminhamentoUsuario.Select(y => y.EtapaPermissaoNucleo.HierarquiaNucleoUsuario.Usuario.ID).Contains(usuario.ID) ? x.ListaEtapaEncaminhamentoUsuario.Any(z => z.EtapaPermissaoNucleo.HierarquiaNucleoUsuario.Usuario.ID == usuario.ID && z.StatusEncaminhamento != (int)enumStatusEncaminhamentoEtapa.Negado) : true).ToList(); return(retorno); }