/*
*
* 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.ArrayList;
import java.util.HashMap;
import java.util.List;
import exception.relatorio.RelatorioException;
import relatorio.Relatorio;
import relatorio.RelatorioFactory;
import service.anotacao.Transacional;
import service.controleTransacao.FabricaDeAppService;
import service.exception.AplicacaoException;
import DAO.controle.FabricaDeDao;
import DAO.exception.ObjetoNaoEncontradoException;
import modelo.CadPlan;
import modelo.DeModPer;
import modelo.Familia;
import modelo.Modelo;
import modelo.ModeloDecorado;
import modelo.ModeloRelatorio;
import modelo.PMP;
import modelo.Parametros;
import modelo.PerioPMVig;
import modelo.Recurso;
import DAO.CadPlanDAO;
import DAO.FamiliaDAO;
import DAO.ModeloDAO;
import DAO.PMPDAO;
import DAO.ParametrosDAO;
import DAO.PerioPMVigDAO;
import DAO.Impl.CadPlanDAOImpl;
import DAO.Impl.FamiliaDAOImpl;
import DAO.Impl.ModeloDAOImpl;
import DAO.Impl.PMPDAOImpl;
import DAO.Impl.ParametrosDAOImpl;
import DAO.Impl.PerioPMVigDAOImpl;
public class ModeloAppService {
// DAOs
private static ModeloDAO modeloDAO;
private static FamiliaDAO familiaDAO;
private static ParametrosDAO parametrosDAO;
private static CadPlanDAO cadPlanDAO;
private static PMPDAO pmpDAO;
private static PerioPMVigDAO perioPMVigDAO;
// Services
private static DeModPerAppService deModPerService;
private static FamiliaAppService familiaService;
@SuppressWarnings("unchecked")
public ModeloAppService() {
try {
// DAOs
modeloDAO = FabricaDeDao.getDao(ModeloDAOImpl.class);
familiaDAO = FabricaDeDao.getDao(FamiliaDAOImpl.class);
parametrosDAO = FabricaDeDao.getDao(ParametrosDAOImpl.class);
cadPlanDAO = FabricaDeDao.getDao(CadPlanDAOImpl.class);
pmpDAO = FabricaDeDao.getDao(PMPDAOImpl.class);
perioPMVigDAO = FabricaDeDao.getDao(PerioPMVigDAOImpl.class);
// Services
deModPerService = FabricaDeAppService.getAppService(DeModPerAppService.class);
familiaService = FabricaDeAppService.getAppService(FamiliaAppService.class);
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
}
/**
* M�todo que tenta incluir um modelo, caso n�o haja nenhum cadastrado com o mesmo c�digo.
*
* @author Walanem
* @throws AplicacaoException
*/
@Transacional
public void inclui(Modelo modelo) throws AplicacaoException {
Parametros parametro = parametrosDAO.recuperaListaDeParametros().get(0);
if (!parametro.isInicPlanejamento()){
throw new AplicacaoException("parametros.PLANEJAMENTO_NAO_INCIALIZADO");
}
try {
modeloDAO.recuperaModeloPorCodigo(modelo.getCodModelo());
throw new AplicacaoException("modelo.CODIGO_EXISTENTE");
} catch (ObjetoNaoEncontradoException ob) {
}
modeloDAO.inclui(modelo);
this.recalcularAtributosDaFamilia(modelo.getFamilia());
try {
deModPerService.incluiDemandas(modelo);
} catch (AplicacaoException ex) {
throw new AplicacaoException(ex.getMessage());
}
// M�dulo que inclui PlPerMods no BD, no intuito de sempre termos um n�mero equivalente de PlPerMods para
// CadPlans e Modelos.
List<CadPlan> cadPlansCadastrados = cadPlanDAO.recuperaListaDeCadPlan();
if (!cadPlansCadastrados.isEmpty()){
PlanoModeloAppService planoModeloService; // Inicializa��o c�clica
try {
planoModeloService = FabricaDeAppService.getAppService(PlanoModeloAppService.class);
planoModeloService.incluirPlanoModeloParaNovoModelo(cadPlansCadastrados, modelo);
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
}
}
/**
* M�todo padr�o de altera��o de Modelo.
*
* @author Walanem
* @throws AplicacaoException
*/
@Transacional
public void altera(Modelo modelo) throws AplicacaoException {
//verifica se tem cadplans cadastrados, se tiver nao pode alterar o modelo.
if(cadPlanDAO.recuperaListaDeCadPlan().size()> 0){
throw new AplicacaoException("modelo.CADPLAN_CADASTRADOS");
}
modeloDAO.altera(modelo);
this.recalcularAtributosDaFamilia(modelo.getFamilia());
}
/**
* M�todo que atualiza os campos usados na implementacao do PMP de um modelo especifico
* para que assumam os respectivos valores usados na tabela de modelo no momento da inclusao do PMP vigente
* Ex:
* modelo.trPMP = modelo.tr
*
* @author felipe.arruda
*/
@Transacional
public void atualizaCamposPMP(Modelo modelo) {
modelo.setTrPMP(modelo.getTr());
modelo.setTamLotePMP(modelo.getTamLote());
modelo.setCoberturaPMP(modelo.getCobertura());
modelo.setEstqInicModelPMP(modelo.getEstqInicModel());
modelo.setRecebimentoPendentePMP(modelo.getRecebimentoPendente());
modelo.setEstqEmFaltaPMP(modelo.getEstqEmFalta());
modeloDAO.altera(modelo);
}
/**
* Verifica se existe um pmp, isso � se tem um plano implementado.
* Se tiver ele atualiza o valor do estoque em falta do modelo para ser a
* quantidade que aparece negativa do campo DispProj relativos
* ao primeiro periodo do PMP.
* @throws AplicacaoException
*/
public Modelo atualizaEstoqueEmFaltaDeModeloPorPMP(Modelo modelo) throws AplicacaoException{
//perioPMVig
PerioPMVig perioPMVig=null;
try {
//tenta recuperar perioPMVig relativo ao periodo 1
perioPMVig = perioPMVigDAO.recuperaPerioPMVigPorPeriodoPM(1);
//tenta recuperar o pmp relativo a esse modelo e ao periodo 1
PMP pmp = pmpDAO.recuperaPMPPorModeloEPerioPMVig(modelo, perioPMVig);
if(pmp.getDispProjModel() < 0){
modelo.setEstqEmFalta(pmp.getDispProjModel()*-1);
}
} catch (ObjetoNaoEncontradoException e) {
throw new AplicacaoException("modelo.PMP_NAO_ENCONTRADO");
}
return modelo;
}
/**
* M�todo que exclui um Modelo, caso n�o hajam Demandas associadas a ele.
*
* O m�todo getPorIdComLock() � utilizado para garantir exclus�o m�tua, pois o m�todo � cr�tico e requer isolamento.
*
*
* Quando excluir Modelo, exclui em cascata os recModels associados,
* devido as regras da rela��o estabelecidas no Modelo.java (Felipe)
*
*
* @author Walanem
* @throws AplicacaoException
*/
@Transacional
public void exclui(Modelo modelo) throws AplicacaoException {
Modelo modeloBD = null;
try {
modeloBD = modeloDAO.getPorIdComLock(modelo.getId());
} catch (ObjetoNaoEncontradoException e) {
throw new AplicacaoException("modelo.NAO_ENCONTRADO");
}
//this.recalcularAtributosDaFamilia(modelo.getFamilia());
modeloDAO.exclui(modeloBD);
this.recalcularAtributosDaFamilia(modelo.getFamilia());
}
@Transacional
public void recalcularAtributosDaFamilia(Familia familia){
List<Modelo> modelos = modeloDAO.recuperaListaDeModelosPorFamilia(familia);
Double totalTmuc = 0.0;
Double totalCobertura = 0.0;
Double totalEstoqueInicial = 0.0;
for (Modelo modeloCorrente : modelos) {
totalTmuc += modeloCorrente.getTuc();
totalCobertura += modeloCorrente.getCobertura();
totalEstoqueInicial += modeloCorrente.getEstqInicModel();
}
if (!modelos.isEmpty()){
familia.setTmuc(totalTmuc/modelos.size());
familia.setCobertura(totalCobertura/modelos.size());
familia.setEstqInicFam(totalEstoqueInicial);
familiaService.altera(familia);
}
}
public List<Modelo> recuperaListaDeModelosPorFamilia(Familia familia) {
return modeloDAO.recuperaListaDeModelosPorFamilia(familia);
}
/**
* Usa um m�todo do DAO para recuperar um modelo juntamente com a sua familia
*
* @author Walanem
* @throws AplicacaoException
*/
public Modelo recuperaUmModeloComFamilia(Modelo modelo) throws AplicacaoException {
try {
return modeloDAO.recuperaUmModeloComFamilia(modelo);
} catch (ObjetoNaoEncontradoException e) {
throw new AplicacaoException("modelo.NAO_ENCONTRADO");
}
}
/**
*
* Usa modeloDAO para recuperar lista de todos os modelos. Retorna um List de Modelo
*
* @author Walanem
* @throws AplicacaoException
*/
public List<Modelo> recuperaListaDeModelos() throws AplicacaoException {
List<Modelo> modelos = modeloDAO.recuperaListaDeModelos();
if (modelos.isEmpty()) {
throw new AplicacaoException("modelo.MODELOS_INEXISTENTES");
} else {
return modelos;
}
}
public List<Modelo> recuperaListaDeModelosComFamilias() {
return modeloDAO.recuperaListaDeModelosComFamilias();
}
public List<Modelo> recuperaListaPaginadaDeModelosComFamilias(){
return modeloDAO.recuperaListaPaginadaDeModelosComFamilias();
}
public List<Modelo> recuperaListaDeModelosComFamiliasEPeriodos(){
return modeloDAO.recuperaListaDeModelosComFamiliasEPeriodos();
}
public Modelo recuperaModeloComFamiliaEPeriodos(Modelo modelo) throws AplicacaoException{
Modelo modeloBD = null;
try{
modeloBD = modeloDAO.recuperaModeloComFamiliaEPeriodos(modelo);
} catch (ObjetoNaoEncontradoException exc) {
throw new AplicacaoException("modelo.NAO_ENCONTRADO");
}
return modeloBD;
}
public List<Modelo> recuperaListaPaginadaDeModelosComFamiliaComListaDePMPs() {
return modeloDAO.recuperaListaPaginadaDeModelosComFamiliaComListaDePMPs();
}
public Modelo recuperaModeloPorCodigo(String codigoModelo) throws AplicacaoException {
Modelo modeloBD = null;
try {
modeloBD = modeloDAO.recuperaModeloPorCodigo(codigoModelo);
} catch (ObjetoNaoEncontradoException exc) {
throw new AplicacaoException("modelo.NAO_ENCONTRADO");
}
return modeloBD;
}
/**
*
* Recupera a lista de todos os modelos que possuam c�digo aproximado com o passado por parametro.
*
* @author Walanem
*/
public List<Modelo> recuperaModeloPorCodigoLike(String codigoModelo){
return modeloDAO.recuperaModeloPorCodigoLike(codigoModelo);
}
public List<Modelo> recuperaModeloPorDescricao(String descricaoModelo) {
return modeloDAO.recuperaModeloPorDescricao(descricaoModelo);
}
@SuppressWarnings("unchecked")
public void gerarRelatorio(List<Modelo> modelos) throws AplicacaoException {
Relatorio relatorio = RelatorioFactory.getRelatorio(Relatorio.RELATORIO_LISTAGEM_DE_MODELOS);
List<ModeloRelatorio> dados = this.converterModelosParaModelosRelatorio(modelos);
try{
relatorio.gerarRelatorio(dados, new HashMap());
} catch (RelatorioException re){
throw new AplicacaoException("modelo.RELATORIO_NAO_GERADO");
}
}
/**
* M�todo auxiliar para convers�o de ModelosDecorados em ModeloRelatorio, pois esta classe possui atributos
* oriundos de outras entidades.
*
* @author Walanem
*/
public List<ModeloRelatorio> converterModelosParaModelosRelatorio(List<Modelo> modelos) {
ModeloRelatorio modeloRelatorio = null;
List<ModeloRelatorio> modelosRelatorio = new ArrayList<ModeloRelatorio>(modelos.size());
for (Modelo modelo : modelos) {
modeloRelatorio = new ModeloRelatorio(modelo);
modelosRelatorio.add(modeloRelatorio);
}
return modelosRelatorio;
}
}