/*
*
* Copyright (c) 2013 - 2014 INT - National Institute of Technology & COPPE - Alberto Luiz Coimbra Institute
- Graduate School and Research in Engineering.
* See the file license.txt for copyright permission.
*
*/
package service;
import java.util.List;
import modelo.PerioPAP;
import modelo.PerioPAPVig;
import modelo.PerioPM;
import modelo.PerioPMVig;
import service.anotacao.Transacional;
import service.controleTransacao.FabricaDeAppService;
import service.exception.AplicacaoException;
import DAO.PerioPAPDAO;
import DAO.PerioPAPVigDAO;
import DAO.PerioPMVigDAO;
import DAO.Impl.PerioPAPDAOImpl;
import DAO.Impl.PerioPAPVigDAOImpl;
import DAO.Impl.PerioPMVigDAOImpl;
import DAO.controle.FabricaDeDao;
import DAO.exception.ObjetoNaoEncontradoException;
/**
*
* As classes de servi�o � que possuem as regras de neg�cio. Fazem as cr�ticas
* quando necess�rio e chamam as classes DAO para pegar as informa��es do BD.
*
* S�o essas classes AppService que fazem o controle de transa�ao, ou seja quem
* abre a transa�ao, "quem commita" atrav�s do interceptador de appservice. Aqui
* defino se o metodo � transacional ou n�o e em fun�ao desta informa�ao o
* interceptador vai usar ou nao transacao.
*
*
*
* @author felipe
*
*/
public class PerioPAPVigAppService {
// DAOs
private static PerioPAPVigDAO perioPAPVigDAO;
private static PerioPAPDAO perioPAPDAO;
private static PerioPMVigDAO perioPMVigDAO;
// Services
private static PerioPMVigAppService perioPMVigService;
public PerioPAPVigAppService() {
try {
// DAOs
// O atributo PerioPMDAO em tempo de compilacao eh do tipo
// PerioPMDAO e em runtime ele eh do tipo PerioPMDAOImpl
perioPAPVigDAO = FabricaDeDao.getDao(PerioPAPVigDAOImpl.class);
perioPAPDAO = FabricaDeDao.getDao(PerioPAPDAOImpl.class);
perioPMVigDAO = FabricaDeDao.getDao(PerioPMVigDAOImpl.class);
// Services
perioPMVigService = FabricaDeAppService.getAppService(PerioPMVigAppService.class);
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
}
/**
* Inclui um objeto do tipo PerioPAPVig, mas antes verifica se ja existe um
* periodo com este numero.
*
* @throws AplicacaoException
*/
@Transacional
public void inclui(PerioPAPVig perioPAPVig) throws AplicacaoException {
try {
perioPAPVigDAO.recuperaPerioPAPVigPorPeriodoPAP(perioPAPVig.getPeriodoPAP());
throw new AplicacaoException("perioPAPVig.PERIODO_EXISTENTE");
} catch (ObjetoNaoEncontradoException e) {
}
perioPAPVigDAO.inclui(perioPAPVig);
}
/**
* Inclui um objeto do tipo PerioPAP equivalente ao PerioPM informado. Antes
* verifica se ja existe um periodoPAP com este numero.
*
* Atualiza os campos calculados do PerioPAP com as informa�oes do PerioPM
* (datas inicial e final, Numero do PerioPM e NumDiasUteis) PeriodoPAP �
* feito inicialmente = PeriodoPM.
* Inclui PerioPM depois de
* perioPM.setPerioPAP.
*
* � preciso incluir primeiro o PerioPAP apesar da inclusao ser feita no
* PerioPM pois o PerioPAP � o lado um da relacao 1 para muitos.
*
* @throws AplicacaoException
*/
@Transacional
public void incluiComPerioPMVig(PerioPMVig perioPMVig) throws AplicacaoException {
PerioPAPVig perioPAPVig = new PerioPAPVig();
perioPAPVig.setPeriodoPAP(perioPMVig.getPeriodoPM());
perioPAPVig.setDataInicial(perioPMVig.getDataInicial());
perioPAPVig.setDataFinal(perioPMVig.getDataFinal());
perioPAPVig.setNumDiasUteis(perioPMVig.getNumDiasUteisMatriz());
try {
perioPAPVigDAO.recuperaPerioPAPVigPorPeriodoPAP(perioPAPVig.getPeriodoPAP());
throw new AplicacaoException("perioPAPVig.PERIODO_EXISTENTE");
} catch (ObjetoNaoEncontradoException e) {
}
try {
perioPAPVigDAO.inclui(perioPAPVig);
// depois de incluir o perioPAP no DB ele vai chamar a inclusao do
// perioPM
perioPMVig.setPerioPAPVig(perioPAPVig);
perioPMVigService.inclui(perioPMVig);
} catch (AplicacaoException e) {
}
}
@Transacional
public void incluiCopiandoTodosPerioPAPs() throws AplicacaoException{
List<PerioPAP> listaDePerioPAPs = perioPAPDAO.recuperaListaDePerioPAPs();
for(PerioPAP perioPAP : listaDePerioPAPs){
this.incluiCopiandoPerioPAP(perioPAP);
}
}
@Transacional
public void incluiCopiandoPerioPAP(PerioPAP perioPAP)
throws AplicacaoException
{
PerioPAPVig perioPAPVig = new PerioPAPVig();
perioPAPVig.setDataInicial(perioPAP.getDataInicial());
perioPAPVig.setDataFinal(perioPAP.getDataFinal());
perioPAPVig.setNumDiasUteis(perioPAP.getNumDiasUteis());
perioPAPVig.setPeriodoPAP(perioPAP.getPeriodoPAP());
//Atencao neste momento perioPMVig nao existe ainda
//nao tem problema essa inicializacao pois os campos abaixos sao integer
//e nao tem ligacao direta com perioPMVig.
perioPAPVig.setPeriodoPMInic(perioPAP.getPeriodoPMInic());
perioPAPVig.setPeriodoPMFinal(perioPAP.getPeriodoPMFinal());
//Como nesse momento ainda n tenho nenhum perioPMVig, eu tenho q setar como null a lista de perioPMVig
//de um perioPMVig
perioPAPVig.setPerioPMVigs(null);
this.inclui(perioPAPVig);
return;
}
/**
* Nao existe opcao em tela para a exclusao de perioPAPVigs, esse metodo � chamado, a partir de regras de negocios,
* como alteracoes e reinicializacao
*
* @param perioPAPVig
* @throws AplicacaoException
*/
@Transacional
public void exclui(PerioPAPVig perioPAPVig) throws AplicacaoException {
PerioPAPVig perioPAPVigBD = null;
try {
perioPAPVigBD = perioPAPVigDAO.getPorIdComLock(perioPAPVig.getId());
} catch (ObjetoNaoEncontradoException e) {
throw new AplicacaoException("perioPAPVig.NAO_ENCONTRADO");
}
perioPAPVigDAO.exclui(perioPAPVigBD);
}
public List<PerioPAPVig> recuperaListaDePerioPAPVigs() {
return perioPAPVigDAO.recuperaListaDePerioPAPVigs();
}
@Transacional
public void apagaTodos() throws AplicacaoException{
List<PerioPAPVig> listaDePerioPAPVig = perioPAPVigDAO.recuperaListaDePerioPAPVigs();
for(PerioPAPVig perioPAPVig : listaDePerioPAPVig){
this.exclui(perioPAPVig);
}
}
/**
* Como a relacao � eager, ao recuperar a lista de perioPAPVigs vem junto as
* listas de PerioPMVigs Alem de recuperar lista paginada atribui os campos
* calculados todos.
*
*/
public List<PerioPAPVig> recuperaListaPaginadaDePerioPAPVigs() {
List<PerioPAPVig> listaDePerioPAPVig = perioPAPVigDAO
.recuperaListaPaginadaDePerioPAPVigs();
for (PerioPAPVig perioPAPVig : listaDePerioPAPVig) {
// Obtem PeriodoPM inicial e final desse PerioPAP
PerioPMVig perioPMVigInicial = obtemPrimeiroPerioPMVigdoPerioPAPVig(perioPAPVig);
// se for null significa que o perioPAPVig atual deveria ter sido
// deletado e por alguma razao n foi,
// pois nao tem nenhum perioPM ligado a ele.
// Atribui valores atuais para os campos calculados
perioPAPVig.setPeriodoPMInic(perioPMVigInicial.getPeriodoPM());
perioPAPVig.setDataInicial(perioPMVigInicial.getDataInicial());
PerioPMVig perioPMVigFinal = obtemUltimoPerioPMVigdoPerioPAPVig(perioPAPVig);
perioPAPVig.setPeriodoPMFinal(perioPMVigFinal.getPeriodoPM());
perioPAPVig.setDataFinal(perioPMVigFinal.getDataFinal());
perioPAPVig.setNumDiasUteis(perioPMVigService
.calculaTotalDiasUteisIntervalo(perioPMVigInicial,
perioPMVigFinal));
}
return listaDePerioPAPVig;
}
@Transacional
public PerioPAPVig recuperaPerioPAPVigPorPeriodoPAP(int periodoPAP) {
PerioPAPVig perioPAPVigDB = new PerioPAPVig();
try {
perioPAPVigDB = perioPAPVigDAO.recuperaPerioPAPVigPorPeriodoPAP(periodoPAP);
} catch (ObjetoNaoEncontradoException e) {
}
return perioPAPVigDB;
}
/**
* O numero de dias uteis do perioPAPVig � calculado
* a partir do numero de dias uteis de cada perioPMVig que ele possui.
* @param periodos
* @return
*/
public double calculaTotalDiasUteis(List<PerioPMVig> periodos) {
double total = 0.0;
for (PerioPMVig perioPMVig : periodos) {
total += perioPMVig.getNumDiasUteisMatriz();
}
return total;
}
/**
* Dado um objeto PerioPAPVig o metodo retorna o primeiro periopmVig de sua lista
* Retorna null caso a listaDePerioPMVigs seja vazia.
* @param perioPAPVig
* @return
*/
public PerioPMVig obtemPrimeiroPerioPMVigdoPerioPAPVig(PerioPAPVig perioPAPVig) {
List<PerioPMVig> listaPerioPMVigs = perioPMVigDAO
.recuperaListaDePerioPMVigsPorPerioPAPVig(perioPAPVig);
PerioPMVig perioPMVig = null;
if (!listaPerioPMVigs.isEmpty()) {
perioPMVig = (PerioPMVig) listaPerioPMVigs.get(0);
}
return perioPMVig;
}
/**
* Dado um objeto PerioPAPVig o metodo retorna o ultimo periopmVig de sua lista
* Retorna null caso a listaDePerioPMVigs seja vazia.
* @param perioPAPVig
* @return
*/
public PerioPMVig obtemUltimoPerioPMVigdoPerioPAPVig(PerioPAPVig perioPAPVig) {
List<PerioPMVig> listaPerioPMVigs = perioPMVigDAO
.recuperaListaDePerioPMVigsPorPerioPAPVig(perioPAPVig);
PerioPMVig perioPMVig = listaPerioPMVigs.get(listaPerioPMVigs.size() - 1);
if (perioPMVig == null) {
return null;
}
return perioPMVig;
}
}