예제 #1
0
        public virtual bool ChefeImediato(Usuario chefe)
        {
            var          cargoDemandante = ProcessoResposta.ObterUltimoCargoDemandante();
            UsuarioCargo chefeImediato   = null;

            if (cargoDemandante != null)
            {
                switch (cargoDemandante.TipoCargo)
                {
                case EnumTipoCargo.Gabinete:
                case EnumTipoCargo.Gerencia:
                    // Se o demandante for Chefe de Gabinete, retorna seu Diretor.
                    // Se o demandante for Gerente, retorna seu Chefe de Gabinete.
                    chefeImediato = cargoDemandante.ObterCargoPai(1);

                    if (chefeImediato != null && chefeImediato.Usuario != null && chefeImediato.Usuario.ID == chefe.ID)
                    {
                        return(true);
                    }

                    break;

                case EnumTipoCargo.GerenciaAdjunta:
                case EnumTipoCargo.Funcionario:
                    // Se o demandante for Gerente Adjunto, retorna seus Gerentes.
                    // Se o demandante for Funcionário, retorna seus Gerentes Adjuntos.
                    var gerentes = cargoDemandante.CargoPai.UsuariosCargos;

                    if (gerentes != null && gerentes.Any(x => x.Usuario.ID == chefe.ID))
                    {
                        return(true);
                    }

                    break;
                }
            }

            return(false);
        }
예제 #2
0
        /// <summary>
        /// Obtém todos os analistas dessa Etapa.
        /// </summary>
        /// <param name="diretores">Diretores da UF do demandante. Precisa vir de fora pois possuem um fluxo diferente.</param>
        /// <param name="usuario">Usuário possível analista</param>
        /// <param name="cargos">OPCIONAL. Filtrar os analistas para estes cargos específicos</param>
        /// <returns></returns>
        public virtual List <Usuario> ObterAnalistas(List <UsuarioCargo> diretores, Usuario usuario = null, List <Cargo> cargos = null)
        {
            var demandante = ProcessoResposta.Usuario;

            var cargoDemandante = ProcessoResposta.ObterUltimoCargoDemandante();

            var analistas = new List <Usuario>();

            if (cargoDemandante == null)
            {
                return(analistas);
            }

            var permissoesAnalise = Etapa.Permissoes.Where(x => x.Analisar == true).AsQueryable();

            // Se a etapa for especificamente para um usuário definido, adiciona o usuário como analista.
            var permissaoColaborador = permissoesAnalise.Where(x => x.Usuario != null);

            if (permissaoColaborador.Any())
            {
                analistas.AddRange(permissaoColaborador.Select(x => x.Usuario));
            }

            // Se for primeira etapa ou etapa para o solicitante, adiciona o demandante como analista.
            if (cargos == null && (Etapa.PrimeiraEtapa || permissoesAnalise.Any(x => x.Solicitante == true)))
            {
                analistas.Add(demandante);
            }

            // Se o demandante for Diretor e a etapa for para ser analisada por qualquer nível acima do demandante, os outros diretores serão os analistas.
            if (cargoDemandante.DiretoriaCargo() != null && cargoDemandante.DiretoriaCargo().Ativo&& cargoDemandante.TipoCargo == EnumTipoCargo.Diretoria &&
                permissoesAnalise.Any(
                    x => x.ChefeImediato == true || x.GerenteAdjunto == true || x.DiretorCorrespondente == true))
            {
                AdicionarAnalistaAoRetorno(analistas, diretores.Where(x => x.Usuario.ID != demandante.ID).ToList(), cargos);
            }

            // Se for etapa para o Chefe Imediato, adiciona o chefe 1 nível acima do demandante.
            if (permissoesAnalise.Any(x => x.ChefeImediato == true))
            {
                UsuarioCargo chefeImediato = null;

                switch (cargoDemandante.TipoCargo)
                {
                case EnumTipoCargo.Gabinete:
                case EnumTipoCargo.Gerencia:
                    // Se o demandante for Chefe de Gabinete, retorna seu Diretor.
                    // Se o demandante for Gerente, retorna seu Chefe de Gabinete.
                    chefeImediato = cargoDemandante.ObterCargoPai(1);

                    break;

                case EnumTipoCargo.GerenciaAdjunta:
                case EnumTipoCargo.Funcionario:
                    // Se o demandante for Gerente Adjunto, retorna seus Gerentes.
                    // Se o demandante for Funcionário, retorna seus Gerentes Adjuntos.
                    var gerentes = cargoDemandante.CargoPai.UsuariosCargos;

                    if (gerentes.Any())
                    {
                        AdicionarAnalistaAoRetorno(analistas, gerentes, cargos);
                    }

                    break;
                }

                if (chefeImediato != null && chefeImediato.Cargo != null && chefeImediato.Cargo.DiretoriaCargo().Ativo)
                {
                    AdicionarAnalistaAoRetorno(analistas, chefeImediato, cargos);
                }
            }

            // Se for etapa para o Gerente Adjunto, adiciona o chefe 2 níveis acima do demandante.
            if (permissoesAnalise.Any(x => x.GerenteAdjunto == true))
            {
                UsuarioCargo gerenteAdjunto = null;

                switch (cargoDemandante.TipoCargo)
                {
                case EnumTipoCargo.Gabinete:
                    // Se o demandante for Chefe de Gabinete, retorna os outros diretores que não são o seu Diretor.
                    var diretorGabinete = cargoDemandante.ObterCargoPai(1);

                    AdicionarAnalistaAoRetorno(analistas,
                                               diretores.Where(x => x.Cargo.Ativo && diretorGabinete == null || (x.Usuario.ID != diretorGabinete.Usuario.ID))
                                               .ToList(), cargos);

                    break;

                case EnumTipoCargo.Gerencia:
                case EnumTipoCargo.GerenciaAdjunta:
                    // Se o demandante for Gerente, retorna seu Diretor.
                    // Se o demandante for Gerente Adjunto, retorna seu Chefe de Gabinete.
                    gerenteAdjunto = cargoDemandante.ObterCargoPai(2);

                    break;

                case EnumTipoCargo.Funcionario:
                    // Se o demandante for Funcionário, retorna seus Gerentes.
                    var gerentes = cargoDemandante.CargoPai.CargoPai.UsuariosCargos;

                    if (gerentes.Any())
                    {
                        AdicionarAnalistaAoRetorno(analistas, gerentes, cargos);
                    }

                    break;
                }

                if (gerenteAdjunto != null && gerenteAdjunto.Cargo != null && gerenteAdjunto.Cargo.DiretoriaCargo().Ativo)
                {
                    AdicionarAnalistaAoRetorno(analistas, gerenteAdjunto, cargos);
                }
            }

            // Se for etapa para o diretor correspondente, adiciona o diretor do setor do demandante.
            if (permissoesAnalise.Any(x => x.DiretorCorrespondente == true))
            {
                UsuarioCargo diretorCorrespondente = null;

                switch (cargoDemandante.TipoCargo)
                {
                case EnumTipoCargo.Gabinete:
                    // Se o demandante for Chefe de Gabinete, retorna seu Diretor.
                    diretorCorrespondente = cargoDemandante.ObterCargoPai(1);

                    break;

                case EnumTipoCargo.Gerencia:
                    // Se o demandante for Gerente, retorna seu Diretor.
                    diretorCorrespondente = cargoDemandante.ObterCargoPai(2);

                    break;

                case EnumTipoCargo.GerenciaAdjunta:
                    // Se o demandante for Gerente Adjunto, retorna seu Diretor.
                    diretorCorrespondente = cargoDemandante.ObterCargoPai(3);

                    break;

                case EnumTipoCargo.Funcionario:
                    //Se o demandante for Funcionário do Gabinete, retorna o Diretor e Chefe de Gabinete
                    if (cargoDemandante.CargoPai.TipoCargo == EnumTipoCargo.Gabinete)
                    {
                        //ADICIONA DIRETOR
                        diretorCorrespondente = cargoDemandante.ObterCargoPai(2);

                        if (diretorCorrespondente != null)
                        {
                            AdicionarAnalistaAoRetorno(analistas, diretorCorrespondente, cargos);
                        }

                        //ADICIONA O CHEFE DE GABINETE
                        diretorCorrespondente = cargoDemandante.ObterCargoPai(1);
                    }
                    else
                    {
                        // Se o demandante for Funcionário, retorna seu Diretor.
                        diretorCorrespondente = cargoDemandante.ObterCargoPai(4);
                    }
                    break;
                }

                if (diretorCorrespondente != null && diretorCorrespondente.Cargo != null && diretorCorrespondente.Cargo.DiretoriaCargo().Ativo)
                {
                    AdicionarAnalistaAoRetorno(analistas, diretorCorrespondente, cargos);
                }

                // Caso possa ser aprovada por chefe de gabinete, obtem os chefes de gabinete do setor
                if (Etapa.PodeSerAprovadoChefeGabinete)
                {
                    UsuarioCargo chefeGabinete = null;

                    switch (cargoDemandante.TipoCargo)
                    {
                    case EnumTipoCargo.Gerencia:
                        // Se o demandante for Gerente, retorna seu Diretor.
                        chefeGabinete = cargoDemandante.ObterCargoPai(1);

                        break;

                    case EnumTipoCargo.GerenciaAdjunta:
                        // Se o demandante for Gerente Adjunto, retorna seu Diretor.
                        chefeGabinete = cargoDemandante.ObterCargoPai(2);

                        break;

                    case EnumTipoCargo.Funcionario:
                        // Se o demandante for Funcionário, retorna seu Diretor.
                        chefeGabinete = cargoDemandante.ObterCargoPai(3);
                        break;
                    }

                    if (chefeGabinete != null && chefeGabinete.Cargo != null && chefeGabinete.Cargo.DiretoriaCargo().Ativo)
                    {
                        AdicionarAnalistaAoRetorno(analistas, chefeGabinete, cargos);
                    }
                }
            }

            // Faz um agrupamento pelo ID e retorna somente o primeiro de cada agrupamento.
            // É uma forma de fazer um "DistinctBy" pelo ID para evitar analista duplicados.
            var retorno = new List <Usuario>();

            retorno.AddRange(analistas.GroupBy(x => x.ID).Select(x => x.FirstOrDefault()).OrderBy(x => x.Nome).ToList());

            if (PermissoesNucleoEtapaResposta.Any())
            {
                retorno.AddRange(PermissoesNucleoEtapaResposta.Where(x =>
                                                                     x.EtapaPermissaoNucleo != null &&
                                                                     x.EtapaPermissaoNucleo.HierarquiaNucleoUsuario != null &&
                                                                     x.EtapaPermissaoNucleo.HierarquiaNucleoUsuario.HierarquiaNucleo != null &&
                                                                     x.EtapaPermissaoNucleo.HierarquiaNucleoUsuario.HierarquiaNucleo.Ativo &&
                                                                     x.EtapaPermissaoNucleo.HierarquiaNucleoUsuario.Usuario != null &&
                                                                     x.EtapaPermissaoNucleo.HierarquiaNucleoUsuario.Usuario.UF.ID == x.EtapaResposta.ProcessoResposta.Processo.Uf.ID)
                                 .Select(x => x.EtapaPermissaoNucleo.HierarquiaNucleoUsuario.Usuario));
            }

            if (usuario != null && ListaEtapaEncaminhamentoUsuario.Any())
            {
                //ADICIONA USUARIOS COM ETAPA ENCAMINHADA PENDENTE
                var usuarioEtapaEncaminhamento = ListaEtapaEncaminhamentoUsuario
                                                 .Where(x => x.EtapaPermissaoNucleo.HierarquiaNucleoUsuario.Usuario.ID == usuario.ID)
                                                 .Where(x => x.StatusEncaminhamento == (int)enumStatusEncaminhamentoEtapa.Aguardando)
                                                 .Select(x => x.EtapaPermissaoNucleo.HierarquiaNucleoUsuario.Usuario);
                retorno.AddRange(usuarioEtapaEncaminhamento);
            }

            return(retorno);
        }