/*
* 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.DomainModel.Servicos;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Atividade;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.ConflitoHorarioException;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Controle;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Evento;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.Inscricao;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.InscricaoCategoria;
import br.edu.ifnmg.GerenciamentoEventos.DomainModel.InscricaoItem;
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.InscricaoStatus;
import java.util.Date;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
/**
*
* @author petronio
*/
@Stateless
public class InscricaoService {
@EJB
ControleRepositorio controleDAO;
@EJB
InscricaoRepositorio inscricaoDAO;
public Inscricao inscrever(Evento e, Pessoa p) {
return inscrever(e, p, null);
}
public Inscricao inscrever(Evento e, Pessoa p, EventoInscricaoCategoria eic){
Inscricao tmp = new Inscricao();
tmp.setPessoa(p);
tmp.setEvento(e);
List<Inscricao> list = inscricaoDAO.Buscar(tmp);
if(list.size() > 0)
return list.get(0);
if(!e.isPeriodoInscricaoAberto())
return null;
if(!e.isNecessitaInscricao())
return null;
Controle c = controleDAO.Abrir(e);
if(e.getNumeroVagas() > 0){
if(c.getQuantidadeGeral() < e.getNumeroVagas()){
return criaInscricao(c, e, p, InscricaoCategoria.Normal,eic);
}
else if(c.getQuantidadeListaEspera() < (e.getNumeroVagas()*0.1)){
return criaInscricao(c, e, p, InscricaoCategoria.ListaEspera,eic);
}
} else {
return criaInscricao(c, e, p, InscricaoCategoria.Normal,eic);
}
return null;
}
private Atividade checarConflitos(Inscricao i, Atividade b){
for(InscricaoItem item : i.getItens()){
Atividade a = item.getAtividade();
boolean condA = a.getInicio().after(b.getTermino());
boolean condB = a.getTermino().before(b.getInicio());
if( !( condA || condB) )
return a;
}
return null;
}
public InscricaoItem inscrever(Inscricao i, Atividade e, Pessoa p) throws ConflitoHorarioException,LimiteInscricoesExcedidoException{
InscricaoItem tmp = inscricaoDAO.Abrir(i, e);
if(tmp != null)
return tmp;
tmp = new InscricaoItem(i, e);
List<InscricaoItem> list = inscricaoDAO.Buscar(tmp);
if(list.size() > 0)
return list.get(list.size() - 1);
if(!e.isPeriodoInscricaoAberto())
return null;
if(!e.isNecessitaInscricao())
return null;
Atividade atv = checarConflitos(i, e);
if(atv != null)
throw new ConflitoHorarioException(atv);
Controle c = controleDAO.Abrir(e);
if(e.getNumeroVagas() > 0){
int inscPorTipo = 0;
if(i.getEventoInscricaoCategoria() == null){
inscPorTipo = i.getEvento().getLimiteInscricoes(e.getTipo());
} else {
inscPorTipo = i.getEventoInscricaoCategoria().getLimiteInscricoes(e.getTipo());
}
if(inscPorTipo > 0){
Long inscs = inscricaoDAO.QuantidadeInscricoes(i, e);
if(inscs >= inscPorTipo)
throw new LimiteInscricoesExcedidoException(inscPorTipo,e.getTipo());
} else if(inscPorTipo == 0){
throw new LimiteInscricoesExcedidoException(inscPorTipo,e.getTipo());
}
if(c.getQuantidadeGeral() < e.getNumeroVagas()){
return criaInscricaoItem(c, i, e, p, InscricaoCategoria.Normal);
}
else if(c.getQuantidadeListaEspera() < (e.getNumeroVagas()*0.1)){
return criaInscricaoItem(c, i, e, p, InscricaoCategoria.ListaEspera);
}
} else {
return criaInscricaoItem(c, i, e, p, InscricaoCategoria.Normal);
}
return null;
}
public boolean cancelar(Inscricao i){
if(inscricaoDAO.Apagar(i)){
Controle c = controleDAO.Abrir(i.getEvento());
if(i.getCategoria() == InscricaoCategoria.Normal)
c.setQuantidadeGeral(c.getQuantidadeGeral() - 1);
else
c.setQuantidadeListaEspera(c.getQuantidadeListaEspera()- 1);
return controleDAO.Alterar(c);
} else {
return false;
}
}
public boolean cancelar(InscricaoItem i){
if(inscricaoDAO.Apagar(i)){
Controle c = controleDAO.Abrir(i.getAtividade());
if(i.getCategoria() == InscricaoCategoria.Normal)
c.setQuantidadeGeral(c.getQuantidadeGeral() - 1);
else
c.setQuantidadeListaEspera(c.getQuantidadeListaEspera()- 1);
return controleDAO.Alterar(c);
} else {
return false;
}
}
public boolean promoverListaEsperaParaNormal(InscricaoItem i){
if(i.getCategoria() != InscricaoCategoria.ListaEspera)
return false;
Controle c = controleDAO.Abrir(i.getAtividade());
if(i.getAtividade().getNumeroVagas() <= c.getQuantidadeGeral())
return false;
i.setCategoria(InscricaoCategoria.Normal);
if(inscricaoDAO.Salvar(i)){
c.setQuantidadeGeral(c.getQuantidadeGeral() + 1);
c.setQuantidadeListaEspera(c.getQuantidadeListaEspera() - 1);
return controleDAO.Alterar(c);
} else {
return false;
}
}
private Inscricao criaInscricao(Controle ctl, Evento e, Pessoa p, InscricaoCategoria c, EventoInscricaoCategoria eic) {
Inscricao i = new Inscricao();
i.setEvento(e);
i.setPessoa(p);
i.setCriador(p);
i.setDataCriacao(new Date());
i.setDataInscricao(new Date());
i.setCategoria(c);
i.setEventoInscricaoCategoria(eic);
i.setOrdem(c == InscricaoCategoria.Normal ? ctl.getQuantidadeGeral() : ctl.getQuantidadeListaEspera());
if(!e.requerPagamento()) i.setStatus(InscricaoStatus.Confirmada);
if(inscricaoDAO.Salvar(i)){
if(i.getCategoria() == InscricaoCategoria.Normal)
ctl.setQuantidadeGeral(ctl.getQuantidadeGeral() + 1);
else
ctl.setQuantidadeListaEspera(ctl.getQuantidadeListaEspera() + 1);
if(controleDAO.Alterar(ctl))
return i;
else return null;
}
else
return null;
}
private InscricaoItem criaInscricaoItem(Controle ctl, Inscricao i, Atividade e, Pessoa p, InscricaoCategoria c) {
InscricaoItem it;
it = new InscricaoItem(i, e);
it.setCriador(p);
it.setDataCriacao(new Date());
it.setDataInscricao(new Date());
it.setCategoria(c);
it.setOrdem(c == InscricaoCategoria.Normal ? ctl.getQuantidadeGeral() : ctl.getQuantidadeListaEspera());
i.add(it);
i.setDataUltimaAlteracao(new Date());
i.setUltimoAlterador(p);
if(!e.requerPagamento()) it.setStatus(InscricaoStatus.Confirmada);
if(inscricaoDAO.Salvar(it)){
if(c == InscricaoCategoria.Normal)
ctl.setQuantidadeGeral(ctl.getQuantidadeGeral() + 1);
else
ctl.setQuantidadeListaEspera(ctl.getQuantidadeListaEspera() + 1);
if(controleDAO.Alterar(ctl))
return it;
else return null;
}
else
return null;
}
}