/*
*
* 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.List;
import modelo.DeFamPer;
import modelo.DeModPer;
import modelo.Familia;
import modelo.HP;
import modelo.Modelo;
import modelo.PerioPAP;
import modelo.PerioPM;
import br.blog.arruda.plot.Plot;
import br.blog.arruda.plot.data.PlotData;
import service.anotacao.Transacional;
import service.controleTransacao.FabricaDeAppService;
import service.exception.AplicacaoException;
import DAO.DeFamPerDAO;
import DAO.DeModPerDAO;
import DAO.FamiliaDAO;
import DAO.HPDAO;
import DAO.PerioPAPDAO;
import DAO.PerioPMDAO;
import DAO.Impl.DeFamPerDAOImpl;
import DAO.Impl.DeModPerDAOImpl;
import DAO.Impl.FamiliaDAOImpl;
import DAO.Impl.HPDAOImpl;
import DAO.Impl.PerioPAPDAOImpl;
import DAO.Impl.PerioPMDAOImpl;
import DAO.controle.FabricaDeDao;
import DAO.exception.ObjetoNaoEncontradoException;
/**
*
* DeFamPerAppService � uma classe de servi�o que possui as regras de neg�cio para manipular inicialmente
* a entidade DeFamPer. Estas manipula��es incluem quando necess�rio chamadas as interfaces DAOs,
* outras classes de servi�o e acessos a informa��es do BD.
*
* A classe DeFamPerAppService fora criada para atender ao Padr�o MVC, Model Vision Control, sendo a mesma uma
* classe de servi�o que � capaz de efetuar: controle de transa��o, ou seja esta classe possui o recurso de
* abrir transa�ao, commitar e fechar uma transa�ao atrav�s de um interceptador de servi�o.
* Neste interceptador ser� definido se o m�todo � transacional ou n�o e em fun��o desta informa��o
* o interceptador ir� usar ou n�o uma transa��o.
*
* @author marques.araujo
*
*/
public class DeFamPerAppService {
// DAOs
private static FamiliaDAO familiaDAO;
private static PerioPAPDAO perioPAPDAO;
private static DeFamPerDAO deFamPerDAO;
private static DeModPerDAO deModPerDAO;
private static HPDAO hpDAO;
// Services
private static DadosGraficoViewAppService dadosGraficoViewService;
private static PerioPAPAppService perioPAPAppService ;
@SuppressWarnings("unchecked")
public DeFamPerAppService() {
try {
// DAOs
familiaDAO = FabricaDeDao.getDao(FamiliaDAOImpl.class);
perioPAPDAO = FabricaDeDao.getDao(PerioPAPDAOImpl.class);
deFamPerDAO = FabricaDeDao.getDao(DeFamPerDAOImpl.class);
deModPerDAO = FabricaDeDao.getDao(DeModPerDAOImpl.class);
hpDAO = FabricaDeDao.getDao(HPDAOImpl.class);
// Services
perioPAPAppService = FabricaDeAppService.getAppService(PerioPAPAppService.class);
dadosGraficoViewService = FabricaDeAppService.getAppService(DadosGraficoViewAppService.class);
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
}
@Transacional
public void altera(DeFamPer deFamPer) {
deFamPerDAO.altera(deFamPer);
}
@Transacional
public void inclui(DeFamPer deFamPer){
deFamPerDAO.inclui(deFamPer);
}
/**
* Inclui defamper totalizando os dados de modelo.
* @param deFamPer
*/
@Transacional
public void incluiTotalizandoDeModPer(DeFamPer deFamPer){
inclui(deFamPer);
totalizaDeModPerParaDeFamPer(deFamPer);
}
/**
* Totaliza o DeFamPer em questao, percorrendo os demodpers relativos
* a ele, e totalizando ovenda e pedido.
* depois salva o defamper.
* @param deFamPer
*/
@Transacional
public void totalizaDeModPerParaDeFamPer(DeFamPer deFamPer){
//recupera a lista de demodpers desse defamper
List<DeModPer> listaDeModPer = recuperaDeModPersDeUmDeFamPer(deFamPer);
Double vendaTotalizada=0.0;
Double pedidoTotalizado= 0.0;
//percorre os demodpers totalizando seus valores
for(DeModPer deModPer: listaDeModPer){
vendaTotalizada+=deModPer.getVendasProjetadasModelo();
pedidoTotalizado+=deModPer.getPedidosModelo();
}
//seta os valores totalizados em defamper.
deFamPer.setVendasProjetadasFamilia(vendaTotalizada);
deFamPer.setPedidosFamilia(pedidoTotalizado);
//salva o defamper em banco com as alteracoes.
altera(deFamPer);
}
/**
* Totaliza vendas e pedidos de todos os deFamPers
*/
@Transacional
public void totalizaDeModPerParaTodosDeFamPers(){
List<DeFamPer> listaDeFamPers = deFamPerDAO.recuperaListaDeDemandaFamiliaPerioPAP();
for(DeFamPer deFamPer: listaDeFamPers){
totalizaDeModPerParaDeFamPer(deFamPer);
}
}
/**
* Recupera os DeModPer de um DeFamPer.
* @param deFamPer
* @return
*/
@Transacional
public List<DeModPer> recuperaDeModPersDeUmDeFamPer(DeFamPer deFamPer){
List<DeModPer> listaDeModPer = new ArrayList<DeModPer>();
List<PerioPM> listaPerioPM = deFamPer.getPerioPAP().getPerioPMs();
//recupera os modelos dessa familia desse defamper.
Familia familia=null;
try {
familia = familiaDAO.recuperaUmaFamiliaEModelos(deFamPer.getFamilia().getId());
} catch (ObjetoNaoEncontradoException e1) {
}
List<Modelo> listaModelo = familia.getModelos();
//percorre os periosPM do perioPAP do defamper em questao.
for(PerioPM perioPM: listaPerioPM){
//percorre os modelos da familia desse defamper.
for(Modelo modelo : listaModelo){
try {
DeModPer deModPer = deModPerDAO.recuperaDeModPerPorPeriodoEModelo(perioPM, modelo);
listaDeModPer.add(deModPer);
} catch (ObjetoNaoEncontradoException e) {
}
}
}
return listaDeModPer;
}
@Transacional
public void exclui(DeFamPer deFamPer){
DeFamPer deFamPerBD = null;
try {
deFamPerBD = deFamPerDAO.getPorIdComLock(deFamPer.getIdDeFamPer());
} catch (ObjetoNaoEncontradoException e) {
}
deFamPerDAO.exclui(deFamPerBD);
}
/**
* Inclui defampers baseado no intervalo pap do hpCorrente.
* @param familia
* @throws AplicacaoException
*/
@Transacional
public void incluiDemandas(Familia familia) throws AplicacaoException {
DeFamPer deFamPer = null;
int periodoInicial;
int periodoFinal;
List<HP> hp = hpDAO.recuperaListaDeHP();
if (hp.isEmpty()){
throw new AplicacaoException("hp.NAO_CADASTRADO");
}
HP hpCorrente = hp.get(0);
try {
periodoInicial = hpCorrente.getPerioPAPInicDemFam().getPeriodoPAP(); //.getPeriodoPM(); // .getPerioPMInicDemMod().getPeriodoPM();
//periodoInicial = hpCorrente.getPerioPMInicDemMod().getPeriodoPM();
// System.out.println("***************************"+periodoInicial);
periodoFinal = hpCorrente.getPerioPAPFinalDemFam().getPeriodoPAP(); //.getPeriodoPM(); // .getPerioPMFinalDemMod().getPeriodoPM();
//periodoFinal = hpCorrente.getPerioPMFinalDemMod().getPeriodoPM();
// System.out.println("*********************"+periodoFinal);
} catch (NullPointerException ex){
throw new AplicacaoException("hp.PERIODO_DEMANDA_NAO_CADASTRADO");
}
//List<PerioPM> periodos = perioPMDAO.recuperaIntervaloDePerioPMs(periodoInicial, periodoFinal);
List<PerioPAP> periodos = perioPAPDAO.recuperaIntervaloDePerioPAPs(periodoInicial, periodoFinal);
// System.out.println("/////////////////"+periodos+"/////////////////////");
for (PerioPAP perioPAP : periodos) {
deFamPer = new DeFamPer(familia, perioPAP);
// System.out.println(">>>>>>>>>>>>>>>"+deFamPer);
deFamPerDAO.inclui(deFamPer);
}
}
/**
* Retorna uma string que representa os dados do grafico de Demanda de uma familia.
* @param demandasModelo
* @return
*/
public Plot gerarDadosGrafico(List<DeFamPer> demandasFamilia) {
ArrayList<PlotData> listaDadosGrafico = new ArrayList<PlotData>();
Plot grafico = new Plot();
PlotData dado = new PlotData();
ArrayList<Double> listVendasTotais = new ArrayList<Double>();
ArrayList<Double> listPedidosTotais = new ArrayList<Double>();
ArrayList<Double> listPeriodosPAP = new ArrayList<Double>();
//popula os dados que irao para os eixos.
for(DeFamPer deFamPer : demandasFamilia){
listVendasTotais.add(deFamPer.getVendasProjetadasFamilia());
listPedidosTotais.add(deFamPer.getPedidosFamilia());
listPeriodosPAP.add(Double.valueOf(deFamPer.getPerioPAP().getPeriodoPAP()));
}
//Cria os dados de grafico com os valores recuperados anteriormente.
PlotData dadoVendasTotais = dadosGraficoViewService.gerarPlotDataEmBarras(listPeriodosPAP, listVendasTotais);
dadoVendasTotais.setLabel("Vendas");
listaDadosGrafico.add(dadoVendasTotais);
PlotData dadoPedidosTotais = dadosGraficoViewService.gerarPlotDataEmBarras(listPeriodosPAP, listPedidosTotais);
dadoPedidosTotais.setLabel("Pedidos");
listaDadosGrafico.add(dadoPedidosTotais);
//====seta as opcoes basicas do grafico
grafico = dadosGraficoViewService.gerarPlotComLabels(listaDadosGrafico, "Agregado", "Vendas/Pedidos");
//retorna o grafico.
return grafico;
}
/**
* Retorna uma string que representa os dados do grafico de Demanda de uma familia.
* @param demandasModelo
* @return
*/
public String imprimirDadosGrafico(List<DeFamPer> demandasFamilia) {
Plot grafico = gerarDadosGrafico(demandasFamilia);
return grafico.printData();
}
/**
* Como a relacao � eager, ao recuperar a lista de perioPAPs vem junto as
* listas de PerioPMs Alem de recuperar lista paginada atribui os campos
* calculados todos.
*
*/
public List<PerioPAP> recuperaListaPaginadaDeFamPerPerioPAPs() throws AplicacaoException{//public List<PerioPAP> recuperaListaPaginadaDePerioPAPs() {
List<PerioPAP> listaDePerioPAP = perioPAPDAO.recuperaListaPaginadaDePerioPAPs();
if(!listaDePerioPAP.isEmpty()){
// System.out.println(">>>>>>>>>>>>>>>>>>>>> A lista de Pap nao esta vazia! <<<<<<<<<<<<<<<<<<<<<<<<<<");
// System.out.println(">>>>>>>>>>>>>>>>>>listaDePerioPAP ="+listaDePerioPAP);
}
// System.out.println(">>>>>>>>>>>>> Tamanho = "+listaDePerioPAP.size());
for (PerioPAP perioPAP : listaDePerioPAP) {
// Obtem PeriodoPM inicial e final desse PerioPAP
PerioPM perioPMInicial = perioPAPAppService.obtemPrimeiroPerioPMdoPerioPAP(perioPAP);
// System.out.println("Pegou o perioPMInicial"+perioPMInicial);
// se for null significa que o perioPAP 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
perioPAP.setPeriodoPMInic(perioPMInicial.getPeriodoPM());
perioPAP.setDataInicial(perioPMInicial.getDataInicial());
PerioPM perioPMFinal = perioPAPAppService.obtemUltimoPerioPMdoPerioPAP(perioPAP);
perioPAP.setPeriodoPMFinal(perioPMFinal.getPeriodoPM());
perioPAP.setDataFinal(perioPMFinal.getDataFinal());
/*
perioPAP.setNumDiasUteis(perioPMService
.calculaTotalDiasUteisIntervalo(perioPMInicial,
perioPMFinal));
*/
}
return listaDePerioPAP;
}
public List<DeFamPer> recuperaListaDeDeFamPerPorFamilia(Familia familia){
List<DeFamPer> listaDeFamper = deFamPerDAO.recuperaListaDeDeFamPerPorFamilia(familia);
return listaDeFamper;
}
}