/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package br.edu.ifnmg.GerenciamentoEventos.Apresentacao;
import br.edu.ifnmg.DomainModel.AreaConhecimento;
import br.edu.ifnmg.DomainModel.Arquivo;
import br.edu.ifnmg.DomainModel.Pessoa;
import br.edu.ifnmg.DomainModel.Services.AreaConhecimentoRepositorio;
import br.edu.ifnmg.GerenciamentoEventos.Aplicacao.ControllerBaseEntidade;
import br.edu.ifnmg.GerenciamentoEventos.Aplicacao.GenericDataModel;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Atividade;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Evento;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.InscricaoItem;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Questao;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.QuestaoResposta;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Questionario;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.QuestionarioResposta;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Servicos.AtividadeRepositorio;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Servicos.SubmissaoService;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Servicos.EventoRepositorio;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Servicos.InscricaoRepositorio;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Servicos.QuestionarioRepositorio;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Servicos.QuestionarioRespostaRepositorio;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Servicos.SubmissaoRepositorio;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Submissao;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.SubmissaoAvaliacao;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.SubmissaoStatus;
import java.io.IOException;
import javax.inject.Named;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.event.SelectEvent;
/**
*
* @author Isla Guedes
*/
@Named(value = "submissaoController")
@RequestScoped
public class SubmissaoController
extends ControllerBaseEntidade<Submissao> implements Serializable {
/**
* Creates a new instance of SubmissaoController
*/
public SubmissaoController() {
}
@EJB
SubmissaoRepositorio dao;
@EJB
InscricaoRepositorio daoInsc;
@EJB
EventoRepositorio daoEvt;
@EJB
AtividadeRepositorio daoAtiv;
@EJB
AreaConhecimentoRepositorio daoArea;
@EJB
QuestionarioRepositorio questionarioDAO;
@EJB
QuestionarioRespostaRepositorio respostaDAO;
@EJB
SubmissaoService service;
AreaConhecimento areaConhecimento;
String palavraChave;
Evento evento;
Atividade atividade;
Pessoa avaliador;
@Override
public Submissao getFiltro() {
if (filtro == null) {
filtro = new Submissao();
String stat = getSessao("sbctrl_status");
if (stat != null) {
filtro.setStatus(SubmissaoStatus.valueOf(stat));
}
filtro.setTitulo(getSessao("sbctrl_titulo"));
filtro.setAutor1(getSessao("sbctrl_autor1"));
filtro.setAutor2(getSessao("sbctrl_autor2"));
}
return filtro;
}
@Override
public void setFiltro(Submissao filtro) {
this.filtro = filtro;
if (filtro != null) {
setSessao("sbctrl_status", filtro.getStatus().toString());
setSessao("sbctrl_titulo", filtro.getTitulo());
setSessao("sbctrl_autor1", filtro.getAutor1());
setSessao("sbctrl_autor2", filtro.getAutor2());
}
}
@PostConstruct
public void init() {
setRepositorio(dao);
setPaginaEdicao("editarSubmissao.xhtml");
setPaginaListagem("listagemSubmissoes.xhtml");
checaEventoPadrao();
}
public void checaEventoPadrao() {
String evt = getConfiguracao("EVENTO_PADRAO");
if (evt != null ) {
Evento padrao = daoEvt.Abrir(Long.parseLong(evt));
setEvento(padrao);
}
}
InscricaoItem inscricaoItem;
public InscricaoItem getInscricao() {
if (inscricaoItem == null) {
inscricaoItem = (InscricaoItem) getSessao("inscricaoItem", daoInsc);
}
return inscricaoItem;
}
public String criaSubmissaoAtividade() {
if (getInscricao() == null) {
return "inscricaoAtividade.xhtml";
}
novo();
return "submissao.xhtml";
}
@Override
public List<Submissao> getListagem() {
if (getFiltro().getStatus() != null || getEvento() != null || getAtividade() != null) {
return dao.Buscar(getFiltro(), getEvento(), getAtividade());
} else {
return dao.BuscarTexto(getFiltro().getTitulo());
}
}
@Override
public void limpar() {
setEntidade(new Submissao());
}
public SubmissaoStatus[] getStatus() {
return SubmissaoStatus.values();
}
@Override
public void salvar() {
if (getInscricao() != null) {
getEntidade().setInscricao(getInscricao());
}
super.salvar();
checagem();
setEntidade(entidade);
}
public String concluir() {
if (checagem()) {
entidade.pendente();
super.salvar();
return "minhasSubmissoes.xhtml";
} else {
return "";
}
}
public boolean checagem() {
if (!entidade.hasAreaConhecimento()) {
Mensagem("Falha", "Você precisa adicionar pelo menos uma Área de conhecimento!");
return false;
}
if (!entidade.hasPalavrasChave()) {
Mensagem("Falha", "Você precisa adicionar pelo menos uma Palavra-Chave!");
return false;
}
if (!entidade.hasMinimoDeArquivos()) {
Mensagem("Falha", "Você precisa adicionar arquivos!");
return false;
}
if (!entidade.hasMinimoDeAutores()) {
Mensagem("Falha", "Você precisa adicionar autores!");
return false;
}
return true;
}
public AreaConhecimento getAreaConhecimento() {
return areaConhecimento;
}
public void setAreaConhecimento(AreaConhecimento areaConhecimento) {
this.areaConhecimento = areaConhecimento;
}
public void addAreaConhecimento() {
if (getEntidade().getAreasConhecimento().size() <= 2) {
getEntidade().add(areaConhecimento);
if (dao.Salvar(entidade)) {
Mensagem("Sucesso", "Área de conhecimento adicionada com êxito!");
} else {
Mensagem("Falha", "Falha ao adicionar Área de conhecimento!");
AppendLog("Erro ao anexar a Área de conhecimento " + String.valueOf(areaConhecimento) + " a submissão " + entidade + ":" + dao.getErro());
}
areaConhecimento = null;
} else {
Mensagem("Atenção", "Devem ser cadastradas no máximo duas áreas de conhecimento!");
}
}
public void removeAreaConhecimento() {
getEntidade().remove(areaConhecimento);
dao.Salvar(entidade);
areaConhecimento = null;
}
public String getPalavraChave() {
return palavraChave;
}
public void setPalavraChave(String palavraChave) {
this.palavraChave = palavraChave;
}
public void addPalavraChave() {
if (getEntidade().getPalavraschave().size() <= 5) {
getEntidade().add(palavraChave);
if (dao.Salvar(entidade)) {
Mensagem("Sucesso", "Palavra chave adicionada com êxito!");
} else {
Mensagem("Falha", "Falha ao adicionar palavra chave!");
AppendLog("Erro ao anexar a palavra chave " + String.valueOf(palavraChave) + " a submissão " + entidade + ":" + dao.getErro());
}
palavraChave = null;
} else {
Mensagem("Atenção", "Devem ser cadastradas no máximo 5 palavras-chave!");
}
}
public void removePalavraChave() {
getEntidade().remove(palavraChave);
dao.Salvar(entidade);
palavraChave = null;
}
public void fileUploadListener(FileUploadEvent event) {
entidade = dao.Refresh(getEntidade());
Arquivo tmp = criaArquivo(event.getFile());
String arq = (String) event.getComponent().getAttributes().get("arquivo");
switch (arq) {
case "Arquivo Identificado":
entidade.setArquivo1(tmp);
break;
case "Arquivo Não Identificado":
entidade.setArquivo2(tmp);
break;
}
if (dao.Salvar(entidade)) {
Mensagem("Sucesso", "Arquivo anexado com êxito!");
AppendLog("Anexou o arquivo " + tmp + " a submissão " + entidade);
} else {
Mensagem("Falha", "Falha ao anexar o arquivo!");
AppendLog("Erro ao anexar o arquivo " + tmp + " a submissão " + entidade + ":" + dao.getErro());
}
}
public GenericDataModel getPublicoDataModel() {
return new GenericDataModel<>(getPublicoListagem(), repositorio);
}
public GenericDataModel getAvaliadorDataModel() {
return new GenericDataModel<>(getAvaliadorListagem(), repositorio);
}
public List<Submissao> getPublicoListagem() {
InscricaoItem inscricaoItem = (InscricaoItem) getSessao("inscricaoItem", daoInsc);
if (inscricaoItem == null) {
return null;
}
return dao.IgualA("inscricao", inscricaoItem).Buscar();
}
public List<Submissao> getAvaliadorListagem() {
return dao.PorAvaliador(SubmissaoStatus.Atribuido, getEvento(), getUsuarioCorrente());
}
public void onPublicoRowSelect(SelectEvent event) {
try {
Submissao obj = (Submissao) event.getObject();
setId(obj.getId());
FacesContext.getCurrentInstance().getExternalContext().redirect("submissao.xhtml");
} catch (IOException ex) {
Mensagem("Falha", "Falha ao abrir submissão!");
AppendLog("Falha ao abrir submissão:" + ex);
}
}
public String abreAvaliacao() {
setSessao("inscricaoItem", getEntidade().getInscricao());
return "submissaoAvaliar.xhtml";
}
public QuestionarioResposta processaQuestionario() {
//i = inscricaoDAO.Refresh(i);
QuestionarioResposta resposta = getEntidade().getResposta();
if (resposta == null) {
Questionario qr = ((InscricaoItem) getEntidade().getInscricao()).getAtividade().getQuestionario();
resposta = new QuestionarioResposta(getUsuarioCorrente(), qr);
} else {
resposta = respostaDAO.Refresh(resposta);
}
FacesContext fc = FacesContext.getCurrentInstance();
ExternalContext ec = fc.getExternalContext();
Map<String, String> req = ec.getRequestParameterMap();
for (String key : req.keySet()) {
if (key.contains("valor-")) {
String idQuestao = key.substring(key.lastIndexOf("-") + 1);
if (idQuestao.contains("_focus")) {
continue;
}
if (idQuestao.contains("_input")) {
idQuestao = idQuestao.replace("_input", "");
}
Long id = Long.parseLong(idQuestao);
Questao q = questionarioDAO.AbrirQuestao(id);
QuestaoResposta r = resposta.RespostaDeQuestao(q);
String valor = req.get(key);
if (r == null) {
r = new QuestaoResposta();
}
r.setQuestao(q);
r.setValor(valor);
Rastrear(r);
resposta.add(r);
}
}
Rastrear(resposta);
//respostaDAO.Salvar(resposta);
return resposta;
}
public Evento getEvento() {
if (evento == null) {
evento = (Evento) getSessao("sbctrl_evt", daoEvt);
}
return evento;
}
public void setEvento(Evento evento) {
this.evento = evento;
setSessao("sbctrl_evt", evento);
}
public Atividade getAtividade() {
if (atividade == null) {
atividade = (Atividade) getSessao("sbctrl_ativ", daoAtiv);
}
return atividade;
}
public void setAtividade(Atividade atividade) {
this.atividade = atividade;
setSessao("sbctrl_ativ", atividade);
}
public void reindexarAreasConhecimento() {
for (Submissao s : dao.Buscar()) {
if (!s.getAreasConhecimento().isEmpty()) {
List<AreaConhecimento> remover = new ArrayList<>();
List<AreaConhecimento> adicionar = new ArrayList<>();
for (AreaConhecimento a : s.getAreasConhecimento()) {
if (!a.isArea() && !a.isGrandeArea()) {
remover.add(a);
AreaConhecimento tmp = daoArea.Abrir(a.getAreaCodigo());
adicionar.add(tmp);
}
}
for (AreaConhecimento c : remover) {
s.remove(c);
}
for (AreaConhecimento c : adicionar) {
s.add(c);
}
if (!dao.Salvar(s)) {
AppendLog(dao.getErro().getMessage());
}
}
}
}
public Pessoa getAvaliador() {
return avaliador;
}
public void setAvaliador(Pessoa avaliador) {
this.avaliador = avaliador;
}
public void addAvaliador() {
getEntidade().add(avaliador);
if(dao.Salvar(getEntidade())){
Mensagem("Sucesso!", "Avaliador adicionado com êxito!");
} else {
Mensagem("Falha!", "Falha ao adicionar avaliador!");
}
}
public void removeAvaliador() {
getEntidade().remove(avaliador);
if(dao.Salvar(getEntidade())){
Mensagem("Sucesso!", "Avaliador removido com êxito!");
} else {
Mensagem("Falha!", "Falha ao remover avaliador!");
}
}
public void distribuir() {
service.Distribuir(getEvento());
}
private void processar(SubmissaoStatus status){
QuestionarioResposta resposta = processaQuestionario();
SubmissaoAvaliacao avaliacao = new SubmissaoAvaliacao();
avaliacao.setAvaliador(getUsuarioCorrente());
avaliacao.setStatus(status);
avaliacao.setSubmissao(getEntidade());
avaliacao.setResposta(resposta);
getEntidade().add(avaliacao);
if(dao.Salvar(getEntidade())){
Mensagem("Sucesso!", "Avaliação registrada com êxito!");
AppendLog("Avaliação registrada:" + getEntidade().getTitulo() + " - " + status);
} else {
Mensagem("Falha!", "Avaliação não registrada!");
AppendLog("Avaliação não registrada:" + getEntidade().getTitulo() + " - " + status + " = " + dao.getErro());
}
}
public void aprovar() {
processar(SubmissaoStatus.Aprovado);
}
public void reprovar() {
processar(SubmissaoStatus.Reprovado);
}
public void verificarStatus(){
service.VerificarStatus(getEvento());
}
public List<Pessoa> getAutores() {
List<Pessoa> tmp = new ArrayList<>();
for(Submissao s : getListagem()){
tmp.add(s.getInscricao().getPessoa());
}
return tmp;
}
public List<Pessoa> getAvaliadores() {
List<Pessoa> tmp = new ArrayList<>();
for(Submissao s : getListagem()){
tmp.addAll(s.getAvaliadores());
}
return tmp;
}
}