/*
*
* 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.CapacDia;
import modelo.Parametros;
import modelo.PerioPM;
import service.anotacao.Transacional;
import service.controleTransacao.FabricaDeAppService;
import service.exception.AplicacaoException;
import DAO.CapacDiaDAO;
import DAO.PerioPMDAO;
import DAO.ParametrosDAO;
import DAO.Impl.CapacDiaDAOImpl;
import DAO.Impl.ParametrosDAOImpl;
import DAO.Impl.PerioPMDAOImpl;
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 CapacDiaAppService {
// DAOs
private static CapacDiaDAO capacDiaDAO;
private static ParametrosDAO parametrosDAO;
// private static PerioPMDAO perioPMDAO;
// Services
// private static PerioPMAppService perioPMService;
public CapacDiaAppService() {
try {
// DAOs
// O atributo PerioPMDAO em tempo de compilacao eh do tipo
// PerioPMDAO e em runtime ele eh do tipo PerioPMDAOImpl
capacDiaDAO = FabricaDeDao.getDao(CapacDiaDAOImpl.class);
parametrosDAO = FabricaDeDao.getDao(ParametrosDAOImpl.class);
// perioPMDAO = FabricaDeDao.getDao(PerioPMDAOImpl.class);
// Services
// perioPMService = FabricaDeAppService
// .getAppService(PerioPMAppService.class);
} catch (Exception e) {
e.printStackTrace();
// O comando a seguir s� ser� usado caso haja a cria��o de um service.
// Exemplo:
// Um Service A tem dentro de si a chamada de um Service B, s� que o Service B tamb�m tem
// uma chamada para o Service A, logo um service chamaria o outro sem parar causando assim um loop infinito.
// Contudo, em termos de uso do sistemas esse erro n�o ocorreria de forma clara,
// pois a View seria carregada sem dados.
// Para evitar que esse tipo de erro gere confus�es - como o usu�rio pensar que o banco foi perdido, por exemplo -
// utilizamos o comando System.exit(1) que interrompe a aplica��o, deixando explicita a ocorr�ncia do erro.
//System.exit(1);
}
}
/**
* Inclui um objeto do tipo CapacDia, mas antes verifica se ja existe um
* CapacDia com este perioPM.
*
* @throws AplicacaoException
*/
@Transacional
public void inclui(CapacDia capacDia) throws AplicacaoException {
try {
capacDiaDAO.recuperaCapacDiaPorPerioPM(capacDia.getPerioPM());
throw new AplicacaoException("capacDia.CAPACDIA_EXISTENTE");
} catch (ObjetoNaoEncontradoException e) {
}
capacDiaDAO.inclui(capacDia);
}
@Transacional
public void altera(CapacDia capacDia) {
// Obtem Parametros para pegar o valor da margem de seguranca
Parametros parametros = null;
parametros = parametrosDAO.recuperaListaDeParametros().get(0);
// Atribui valores atuais para os campos calculados
capacDia.setCapacProdDiariaEmMinMg(capacDia.getCapacProdDiariaEmMin()*(parametros.getMargemSeguranca()/100));
capacDiaDAO.altera(capacDia);
}
/**
* Alteracao da capacidade de producao diaria em todos os registros a partir
* da variavel capacidadePadrao informada pelo usuario
**/
@Transacional
public void alteraCapacPadrao(double capacidadePadrao) {
List<CapacDia> listaDeCapacDiaria = capacDiaDAO.recuperaListaDeCapacDias();
for(CapacDia capacDiaAtual : listaDeCapacDiaria){
capacDiaAtual.setCapacProdDiariaEmMin(capacidadePadrao);
altera(capacDiaAtual);
}
}
/**
* Nao existe opcao em tela para a exclusao de perioPAPs, esse metodo � chamado, a partir de regras de negocios,
* como alteracoes e reinicializacao
*
* @param perioPAP
* @throws AplicacaoException
*/
@Transacional
public void exclui(CapacDia capacDia) throws AplicacaoException {
CapacDia capacDiaBD = null;
try {
capacDiaBD = capacDiaDAO.getPorIdComLock(capacDia.getId());
} catch (ObjetoNaoEncontradoException e) {
throw new AplicacaoException("capacDia.NAO_ENCONTRADO");
}
capacDiaDAO.exclui(capacDiaBD);
}
public List<CapacDia> recuperaListaDeCapacDias() {
return capacDiaDAO.recuperaListaDeCapacDias();
}
/**
* Como a relacao � eager, ao recuperar a lista de CapacDias vem junto as
* listas de PerioPMs Alem de recuperar lista paginada atribui os campos
* calculados todos.
*
*/
public List<CapacDia> recuperaListaPaginadaDeCapacDias() {
List<CapacDia> listaDeCapacDia = capacDiaDAO.recuperaListaPaginadaDeCapacDias();
// Obtem Parametros para pegar o valor da margem de seguranca
Parametros parametros = null;
parametros = parametrosDAO.recuperaListaDeParametros().get(0);
for (CapacDia capacDia : listaDeCapacDia) {
// Atribui valores atuais para os campos calculados
capacDia.setCapacProdDiariaEmMinMg(capacDia.getCapacProdDiariaEmMin()*(parametros.getMargemSeguranca()/100));
}
return listaDeCapacDia;
}
}