Subversion Repositories Integrator Subversion

Rev

Blame | Last modification | View Log | Download | RSS feed

package br.gov.al.saude.rhd.web.managebean.sessao;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.faces.bean.ManagedBean;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;

import br.gov.al.saude.framework.security.authentication.authorities.IndraGrantedAuthority;
import br.gov.al.saude.framework.security.authentication.entity.UserIndra;
import br.gov.al.saude.framework.security.context.ContextoSeguranca;
import br.gov.al.saude.framework.web.exception.VerificadorLancamentoException;
import br.gov.al.saude.framework.web.exception.VerificadorLancamentoException.CommandBean;
import br.gov.al.saude.framework.web.message.LancadorMensagem;
import br.gov.al.saude.rhd.constantes.ConstantesRhd;
import br.gov.al.saude.rhd.core.application.cronograma.CronogramaFacade;
import br.gov.al.saude.rhd.core.application.grupoavaliacao.GrupoAvaliacaoFacade;
import br.gov.al.saude.rhd.core.application.ordenador.Ordenador;
import br.gov.al.saude.rhd.core.application.ordenador.impl.OrdenadorImpl;
import br.gov.al.saude.rhd.core.application.servidor.ServidorFacade;
import br.gov.al.saude.rhd.model.Cronograma;
import br.gov.al.saude.rhd.model.CronogramaEtapa;
import br.gov.al.saude.rhd.model.view.ServidorView;
import br.gov.al.saude.sca.model.usuario.view.UsuarioView;

@Component
@ManagedBean
@Scope("session")
public class SessaoBean implements Serializable {

        private static final long serialVersionUID = 1L;
       
        private CronogramaFacade cronogramaFacade;
        private GrupoAvaliacaoFacade grupoAvaliacaoFacade;
        private ServidorFacade servidorFacade;
       
        private ContextoSeguranca contextoSeguranca;
       
        private ServidorView servidor;
       
        private Cronograma cronogramaCorrente;
        private Ordenador ordenador;
       
        private Boolean temPapelServidor;
        private Boolean temPapelCoordenador;
        private Boolean temPapelApoiador;
       
        @Autowired
        public SessaoBean(ServidorFacade servidorFacade, CronogramaFacade cronogramaFacade, GrupoAvaliacaoFacade grupoAvaliacaoFacade, ContextoSeguranca contextoSeguranca) {
                this.cronogramaFacade = cronogramaFacade;
                this.servidorFacade = servidorFacade;
                this.grupoAvaliacaoFacade = grupoAvaliacaoFacade;
                this.contextoSeguranca = contextoSeguranca;
                consultarCronogramaCorrente();
                servidor = getServidorUsuarioLogado();
                setPermissoes();
                ordenador = new OrdenadorImpl();
        }
       
        public Boolean getTemPapelServidor() {
                return temPapelServidor;
        }
       
        public void setTemPapelServidor(Boolean temPapelServidor) {
                this.temPapelServidor = temPapelServidor;
        }
       
        public Boolean getTemPapelCoordenador() {
                return temPapelCoordenador;
        }
       
        public void setTemPapelCoordenador(Boolean temPapelCoordenador) {
                this.temPapelCoordenador = temPapelCoordenador;
        }
       
        public Boolean getTemPapelApoiador() {
                return temPapelApoiador;
        }
       
        public void setTemPapelApoiador(Boolean temPapelApoiador) {
                this.temPapelApoiador = temPapelApoiador;
        }
       
        public Boolean temPapelServidor() {
                return getTemPapelServidor();
        }
        public Boolean temPapelCoordenador() {
                return getTemPapelCoordenador();
        }
        public Boolean temPapelApoiador() {
                return getTemPapelApoiador();
        }
       
        private void setPermissoes() {
                setTemPapelServidor(verificarPermissao(ConstantesRhd.ROLE_PAPEL_SERVIDOR));
                setTemPapelCoordenador(verificarPermissao(ConstantesRhd.ROLE_PAPEL_COORDENADOR));
                setTemPapelApoiador(verificarPermissao(ConstantesRhd.ROLE_PAPEL_APOIADOR));
        }
       
        public ServidorView getServidor() {
                return servidor;
        }

        public Cronograma getCronogramaCorrente() {
                return cronogramaCorrente;
        }
       
        public void setCronogramaCorrente(Cronograma cronogramaCorrente) {
                this.cronogramaCorrente = cronogramaCorrente;
        }

        public List<CronogramaEtapa> getListaCronogramaEtapas() {
                List<CronogramaEtapa> listaCronogramaEtapas = new ArrayList<CronogramaEtapa>();
                if (cronogramaCorrente != null) {
                        listaCronogramaEtapas = new ArrayList<CronogramaEtapa>(getCronogramaCorrente().getCronogramaEtapas());
                }
                return (List<CronogramaEtapa>) ordenador.ordenar(listaCronogramaEtapas);
        }

        public UsuarioView getUsuarioLogado() {
                return (UsuarioView) obterUserIndra().getPrincipal();
        }
       
        public UserIndra obterUserIndra() {
                Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
                UserIndra principal = (UserIndra) authentication.getPrincipal();
                return principal;
        }
       
        public Boolean verificarSeEtapaEstaVigente(Long sequencialEtapa) {
                for (CronogramaEtapa etapa : getEtapaCorrente()) {
                        if (etapa.getEtapa().getCodigo().equals(sequencialEtapa)) {
                                return true;
                        }
                }
                return false;
        }
       
        public List<CronogramaEtapa> getEtapaCorrente() {
                List<CronogramaEtapa> listaEtapasVigentes = new ArrayList<CronogramaEtapa>();
                if (getCronogramaCorrente() != null) {
                        for (CronogramaEtapa etapaCorrente : getCronogramaCorrente().getCronogramaEtapas()) {
                                if (etapaCorrente.isDataEstaVigente()) {
                                        listaEtapasVigentes.add(etapaCorrente);
                                }
                        }
                }
                return listaEtapasVigentes;
        }
       
        public Boolean verificarSeServidorEhAvaliadorIhGrupoAprovado() {
                return grupoAvaliacaoFacade.isAvaliadorDeGrupoAprovado(getUsuarioLogado().getSequencialPessoa(), getCronogramaCorrente());
        }
       
        public void consultarCronogramaCorrente() {
                cronogramaCorrente = cronogramaFacade.consultarCronogramaCorrente();
        }
       
        public void cadastrarCronograma(final Cronograma entidade) {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        public void execute() {
                                cronogramaFacade.cadastrar(entidade);
                                consultarCronogramaCorrente();
                                LancadorMensagem.lancarSucessoRedirecionandoTela("Registro cadastrado com sucesso!", "/paginas/cronograma.xhtml");
                        }
                });
        }
       
        public void alterarCronograma(final Cronograma entidade, final List<CronogramaEtapa> listaCronogramaEtapas, final UserIndra usuarioLogado) {
                new VerificadorLancamentoException().tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean() {
                        @Override
                        public void execute() {
                                entidade.setCronogramaEtapas(null);
                                entidade.adicionarCronogramaEtapas(listaCronogramaEtapas);
                                cronogramaFacade.alterarCronogramaInserindoHistorico(entidade, (UsuarioView) usuarioLogado.getPrincipal());
                                consultarCronogramaCorrente();
                                LancadorMensagem.lancarSucessoRedirecionandoTela("Registro alterado com sucesso!", "/paginas/cronograma.xhtml");
                        }
                });
        }
       
        private Boolean verificarPermissao(String permissao) {
                GrantedAuthority authority = new IndraGrantedAuthority(permissao);
                Collection<? extends GrantedAuthority> authorities = contextoSeguranca.obterUserIndra().getAuthorities();
                return authorities.contains(authority);
        }
       
        private ServidorView getServidorUsuarioLogado() {
                try {
                        return servidorFacade.consultarDadosPessoais(getUsuarioLogado().getSequencialPessoa());
                } catch (Exception e) {}
                return null;
        }
       
}