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;
}
}