/*
* This file is part of SGEA - Sistema de Gestão de Eventos Acadêmicos - TADS IFNMG Campus Januária.
*
* SGEA is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* SGEA is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with SGEA. If not, see <http://www.gnu.org/licenses/>.
*/
package br.edu.ifnmg.GerenciamentoEventos.Apresentacao;
import br.edu.ifnmg.DomainModel.Arquivo;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Atividade;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.AtividadeTipo;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Evento;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Inscricao;
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.DomainModel.Services.ArquivoRepositorio;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Servicos.AtividadeRepositorio;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Servicos.EventoRepositorio;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Servicos.InscricaoRepositorio;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Servicos.InscricaoService;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Servicos.QuestionarioRepositorio;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Servicos.QuestionarioRespostaRepositorio;
import br.edu.ifnmg.GerenciamentoEventos.Aplicacao.ControllerBase;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.ConflitoHorarioException;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.LimiteInscricoesExcedidoException;
import br.edu.ifnmg.DomainModel.Pessoa;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.EventoInscricaoCategoria;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Servicos.EventoInscricaoCategoriaRepositorio;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Servicos.PessoaRepositorioLocal;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Submissao;
import br.edu.ifnmg.GerenciamentoEventos.Infraestrutura.PagSeguroService;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import org.primefaces.event.FileUploadEvent;
/**
*
* @author petronio
*/
@Named(value = "publicoController")
@RequestScoped
public class PublicoController extends ControllerBase implements Serializable {
@EJB
EventoRepositorio eventoDAO;
@EJB
AtividadeRepositorio atividadeDAO;
@EJB
InscricaoRepositorio inscricaoDAO;
@EJB
InscricaoService inscricaoservice;
@EJB
PessoaRepositorioLocal pessoaDAO;
@EJB
QuestionarioRepositorio questionarioDAO;
@EJB
QuestionarioRespostaRepositorio respostaDAO;
@EJB
ArquivoRepositorio arqDAO;
@EJB
PagSeguroService pagseguro;
@EJB
EventoInscricaoCategoriaRepositorio categoriaDAO;
Evento evento;
Atividade atividade;
Inscricao inscricao;
InscricaoItem inscricaoItem;
Questao questao;
Questionario questionario;
Submissao submissao;
EventoInscricaoCategoria categoria;
/**
* Creates a new instance of PublicoController
*/
public PublicoController() {
}
public List<Evento> getEventos() {
return eventoDAO.Ordenar("inicio", "DESC").Buscar();
}
public List<AtividadeTipo> getAtividadesTipos() {
List<AtividadeTipo> tmp = atividadeDAO.BuscarAtividadesTiposPorEvento(getEvento());
return tmp;
}
public List<Atividade> getAtividades(AtividadeTipo t) throws IOException {
List<Atividade> tmp = atividadeDAO.BuscarAtividadesPorEventoETipo(getEvento(), t);
return tmp;
}
public void setInscricao(Inscricao i) {
inscricao = i;
setSessao("inscricao", i);
}
public EventoInscricaoCategoria getCategoria() {
if(categoria == null){
categoria = (EventoInscricaoCategoria) getSessao("categoria", categoriaDAO);
}
return categoria;
}
public void setCategoria(EventoInscricaoCategoria categoria) {
this.categoria = categoria;
setSessao("categoria", categoria);
}
public Inscricao getInscricao() {
if (inscricao == null) {
inscricao = (Inscricao) getSessao("inscricao", inscricaoDAO);
if (inscricao != null)
return inscricao;
else if (inscricao == null && getEvento() != null) {
setInscricao(inscricaoDAO.Abrir(getEvento(), getUsuarioCorrente()));
return inscricao;
} else {
return null;
}
} else {
return inscricao;
}
}
public Evento getEvento() {
if (evento == null) {
evento = (Evento) getSessao("evento", eventoDAO);
}
return evento;
}
public void setEvento(Evento e) {
this.evento = e;
setAtividade(null);
setInscricao(null);
setSessao("evento", e);
}
public Atividade getAtividade() {
if (atividade == null) {
atividade = (Atividade) getSessao("atividade", atividadeDAO);
}
return atividade;
}
public void setAtividade(Atividade a) {
this.atividade = a;
setSessao("atividade", a);
setInscricaoItem(null);
}
public void inscreverEvento() throws IOException {
setInscricao(inscricaoservice.inscrever(getEvento(), getUsuarioCorrente(), getCategoria()));
if (inscricao != null) {
processaQuestionarioEvento(inscricao);
}
Mensagem("Sucesso", "Inscrição realizada com sucesso!");
}
public String cancelarInscricaoEvento() {
inscricao = inscricaoDAO.Refresh(getInscricao());
if (inscricaoservice.cancelar(inscricao)) {
inscricao = null;
return "selecionaEvento.xhtml";
} else {
return "";
}
}
public void efetuarPagamento() {
inscricao = inscricaoDAO.Refresh(getInscricao());
try {
String redirect = pagseguro.Enviar(inscricao);
Redirect(redirect);
} catch (Exception ex) {
AppendLog(ex.getMessage());
Mensagem("Erro", "falha ao iniciar processo de pagamento!");
}
}
public void setInscricaoItem(InscricaoItem i) {
this.inscricaoItem = i;
setSessao("inscricaoItem", i);
checked = false;
}
private boolean checked = false;
public InscricaoItem getInscricaoItem() {
if (inscricaoItem == null && !checked) {
inscricaoItem = (InscricaoItem) getSessao("inscricaoItem", inscricaoDAO);
if (inscricaoItem == null && getInscricao() != null) {
setInscricaoItem(inscricaoDAO.Abrir(getInscricao(), getAtividade()));
} else {
return null;
}
checked = true;
}
return inscricaoItem;
}
public void inscreverAtividade() throws IOException {
try {
inscricao = inscricaoDAO.Refresh(getInscricao());
setInscricaoItem(inscricaoservice.inscrever(inscricao, getAtividade(), getUsuarioCorrente()));
if (inscricaoItem != null) {
processaQuestionarioAtividade();
}
Mensagem("Sucesso", "Inscrição realizada com sucesso!");
} catch (ConflitoHorarioException ex) {
Atividade tmp = (Atividade) ex.getConflitante();
MensagemErro("Conflito de Horário", "Não foi possível realizar a inscrição nessa atividade pois há um conflito de horário com a atividade " + tmp.getNome() + " em que você já está inscrito!");
} catch (LimiteInscricoesExcedidoException ex) {
MensagemErro("Limite excedido!", "Só é possível realizar " + ex.getLimite() + " inscrições para " + ex.getTipo().getNome());
}
}
public String cancelarInscricaoAtividade() {
inscricao = inscricaoDAO.Refresh(getInscricao());
if (inscricaoservice.cancelar(getInscricaoItem())) {
setInscricaoItem(null);
return "inscricao.xhtml";
} else {
Mensagem("ERRO", "Falha ao cancelar a inscrição! Entre em contato com o administrador!");
AppendLog("Falha ao cancelar a inscrição");
return "";
}
}
public void processaQuestionario(Inscricao i, Questionario qr) {
//i = inscricaoDAO.Refresh(i);
QuestionarioResposta resposta = i.getResposta();
if (resposta == null) {
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);
i.setResposta(resposta);
Rastrear(i);
inscricaoDAO.Salvar(i);
}
public void processaQuestionarioEvento(Inscricao i) {
processaQuestionario(i, i.getEvento().getQuestionario());
}
public void processaQuestionarioEvento() {
processaQuestionario(getInscricao(), getInscricao().getEvento().getQuestionario());
}
public void processaQuestionarioAtividade() {
processaQuestionario(getInscricaoItem(), getInscricaoItem().getAtividade().getQuestionario());
}
public void arquivoFileUpload(FileUploadEvent evt) {
try {
inscricao = inscricaoDAO.Refresh(getInscricao());
String key = evt.getComponent().getClientId();
boolean item = key.contains("item-");
Inscricao i = item ? getInscricaoItem() : getInscricao();
if (i == null) {
if (item) {
inscreverAtividade();
} else {
inscreverEvento();
}
i = item ? getInscricaoItem() : getInscricao();
}
QuestionarioResposta resposta = i.getResposta();
if (resposta == null) {
resposta = new QuestionarioResposta();
resposta.setPessoa(getUsuarioCorrente());
resposta.setQuestionario(questionario);
} else {
resposta = respostaDAO.Refresh(resposta);
}
Arquivo arq = arqDAO.Salvar(evt.getFile().getInputstream(), evt.getFile().getFileName(),
getConfiguracao("DIRETORIO_ARQUIVOS"), getUsuarioCorrente());
String idQuestao = key.substring(key.lastIndexOf("-") + 1);
Long id = Long.parseLong(idQuestao);
Questao q = questionarioDAO.AbrirQuestao(id);
QuestaoResposta r = resposta.RespostaDeQuestao(q);
if (r == null) {
r = new QuestaoResposta();
r.setQuestao(q);
}
r.setArquivo(arq);
resposta.add(r);
Rastrear(resposta);
respostaDAO.Salvar(resposta);
i.setResposta(resposta);
Rastrear(i);
inscricaoDAO.Salvar(i);
} catch (IOException ex) {
Logger.getLogger(PublicoController.class.getName()).log(Level.SEVERE, null, ex);
}
}
@Override
public void enviarMensagem() {
String tmp = getMensagem();
List<Pessoa> admin = new ArrayList<>();
tmp = tmp + "\n" + getUsuarioCorrente().toString();
if (getAtividade() != null) {
tmp = tmp + "\n" + "Atividade: " + getAtividade().getNome();
admin.addAll(getAtividade().getResponsaveis());
}
if (getEvento() != null) {
tmp = tmp + "\n" + "Evento: " + getEvento().getNome();
if (admin.isEmpty()) {
admin.addAll(getEvento().getResponsaveis());
}
}
if (getInscricao() != null) {
tmp = tmp + "\n" + "Inscrição: " + getInscricao().getId().toString();
}
setAssunto("[SGE]" + getAssunto());
setMensagem(tmp);
if (admin.isEmpty()) {
admin.add(pessoaDAO.Abrir("petronio.candido@gmail.com"));
}
setDestinatarios(admin);
super.enviarMensagem();
}
public List<Atividade> getAtividadesPublicas() {
return atividadeDAO.Join("tipo", "t")
.IgualA("t.publico", true)
.IgualA("evento", getEvento())
.Ordenar("nome", "ASC")
.Buscar();
}
public List<Atividade> getResponsavelPorAtividades() {
return atividadeDAO
.IgualA("responsavelPrincipal", getUsuarioCorrente())
.IgualA("evento", getEvento())
.Ordenar("nome", "ASC")
.Buscar();
}
public List<Atividade> getEquipeDeAtividades() {
return atividadeDAO
.IgualA("geraCertificado", true)
.Join("responsaveis", "r")
.IgualA("r.id", getUsuarioCorrente().getId())
.IgualA("evento", getEvento())
.Ordenar("nome", "ASC")
.Buscar();
}
public List<Evento> getAvaliador() {
return eventoDAO
.Join("avaliadores", "a")
.IgualA("a.id", getUsuarioCorrente().getId())
.IgualA("id", getEvento().getId())
.Buscar();
}
}