Пример #1
0
        public List <Usuario> ObterChefeImediato(string email)
        {
            var retorno = new List <Usuario>();

            if (string.IsNullOrWhiteSpace(email))
            {
                return(retorno);
            }

            var hierarquia = repositorio.session.Query <Hierarquia>().FirstOrDefault(x => x.Email == email);

            if (hierarquia != null)
            {
                // CodUnidade maior que 5 vai até o Chefe de Gabinete.
                if (hierarquia.CodUnidade.Length > 5)
                {
                    // Funcionário.
                    if (hierarquia.CargoFuncionario == null)
                    {
                        retorno.Add(ObterChefeImediatoDoFuncionario(hierarquia));
                    }
                    // Gerente adjunto.
                    else if (hierarquia.CargoFuncionario.ToLower().Contains("gerente adj") || hierarquia.CargoFuncionario.ToLower().Contains("secretário-geral"))
                    {
                        retorno.Add(ObterChefeImediatoDoGerenteAdjunto(hierarquia));
                    }
                    // Chefe imediato.
                    else if (hierarquia.CargoFuncionario.ToLower().Contains("gerente") || hierarquia.CargoFuncionario.ToLower().Contains("assessor") || hierarquia.CargoFuncionario.ToLower().Contains("secretário-geral"))
                    {
                        retorno.Add(ObterChefeImediatoDoGerente(hierarquia));

                        var bmPermissao         = new BMPermissao();
                        var diretores           = bmPermissao.ObterDiretoresCorrespondente(hierarquia.Email);
                        var assessoresAnalistas = bmPermissao.ObterAssessoresAnalistas(diretores);
                        retorno.AddRange(assessoresAnalistas);
                        assessoresAnalistas = bmPermissao.ObterAssessoresAnalistas(new List <Usuario> {
                            (new BMUsuario()).ObterPorEmail(hierarquia.Email)
                        });
                        retorno.AddRange(assessoresAnalistas);
                    }
                    else if (hierarquia.CargoFuncionario.ToLower().Contains("chefe"))
                    {
                        retorno.Add(ObterChefeImediatoDoChefeDeGabinete(hierarquia));
                    }
                }
                else
                {
                    // Caso seja diretor, obtém os outros diretores como "chefes imediatos".
                    if (hierarquia.CodUnidade.Length == 5)
                    {
                        var outrosDiretores =
                            repositorio.session.Query <Hierarquia>()
                            .Where(x => x.CodUnidade.Length == 5 && x.CodPessoa != hierarquia.CodPessoa);

                        var bmUsuario = new BMUsuario();

                        foreach (var diretor in outrosDiretores)
                        {
                            retorno.Add(bmUsuario.ObterPorEmail(diretor.Email));
                        }
                    }
                }
            }

            return(retorno.Where(x => x != null).ToList());
        }
Пример #2
0
        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);
        }