private IList <Usuario> ObterUsuariosPermissoes(Usuario demandante, IQueryable <EtapaPermissao> queryPermissoes, bool possuiChefeDeGabineteAnalista, bool analisar) { var listaUsuarios = queryPermissoes.Where(p => p.Usuario != null).Select(p => p.Usuario).ToList(); var temPermissaoChefe = queryPermissoes.Any(p => p.ChefeImediato == true); var bmPermissao = new BMPermissao(); if (temPermissaoChefe) { // Adicionar chefes imediatos. listaUsuarios.AddRange(bmPermissao.ObterChefeImediato(demandante.Email)); } var temGerenteAdjunto = queryPermissoes.Any(p => p.GerenteAdjunto == true); if (temGerenteAdjunto) { // Adicionar gerentes adjuntos. var gerentesAdjuntos = bmPermissao.ObterGerentesAdjuntos(demandante.Email); if (gerentesAdjuntos != null) { listaUsuarios.AddRange(gerentesAdjuntos); } } var temPermissaoDiretor = queryPermissoes.Any(p => p.DiretorCorrespondente == true); if (temPermissaoDiretor) { List <Usuario> diretores = new List <Usuario>(); diretores = bmPermissao.ObterDiretoresCorrespondente(demandante.Email); // Atenção: Diretor só deve ser notificado na análise se checado o NotificaDiretorAnalise, SE for notificação avisa sempre if (!analisar || (analisar && queryPermissoes.First().Etapa.NotificaDiretorAnalise)) { if (diretores.Count > 0) { listaUsuarios.AddRange(diretores); } } // A opção de notificar acessores só é possível atualmente para os analistas if (analisar && possuiChefeDeGabineteAnalista && diretores.Count > 0) { var assessoresAnalistas = bmPermissao.ObterAssessoresAnalistas(diretores); listaUsuarios.AddRange(assessoresAnalistas); } } // Adiciona o solitante se ele deve ser notificado var notificaSolicitante = queryPermissoes.Any(p => p.Solicitante == true); if (notificaSolicitante && demandante != null) { listaUsuarios.Add(demandante); } return(listaUsuarios.Where(x => x != null).Distinct().ToList()); }