/*
*
* 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.HashMap;
import java.util.LinkedList;
import java.util.List;
import modelo.Parametros;
import modelo.TecModel;
import modelo.Tecido;
import modelo.TecidoRelatorio;
import relatorio.Relatorio;
import relatorio.RelatorioFactory;
import service.anotacao.Transacional;
import service.controleTransacao.FabricaDeAppService;
import service.exception.AplicacaoException;
import DAO.ParametrosDAO;
import DAO.TecidoDAO;
import DAO.Impl.ParametrosDAOImpl;
import DAO.Impl.TecidoDAOImpl;
import DAO.anotacao.RecuperaLista;
import DAO.controle.FabricaDeDao;
import DAO.exception.ObjetoNaoEncontradoException;
import exception.relatorio.RelatorioException;
/**
*
* TecidoAppService � uma classe de servi�o que possui as regras de neg�cio para manipular inicialmente
* a entidade Tecido. 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 TecidoAppService 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 TecidoAppService {
// DAOs
private static TecidoDAO tecidoDAO;
private static ParametrosDAO parametrosDAO;
// Services
private static ParametrosAppService parametrosService;
public TecidoAppService() {
try {
// DAOs
tecidoDAO = FabricaDeDao.getDao(TecidoDAOImpl.class);
parametrosDAO = FabricaDeDao.getDao(ParametrosDAOImpl.class);
// Services
parametrosService = FabricaDeAppService.getAppService(ParametrosAppService.class);
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
}
@Transacional
public void inclui(Tecido tecido) throws AplicacaoException {
Parametros parametro = parametrosDAO.recuperaListaDeParametros().get(0);
if (!parametro.isInicPlanejamento()){
throw new AplicacaoException("parametros.PLANEJAMENTO_NAO_INCIALIZADO");
}
try {
tecidoDAO.recuperaTecidoPorCodigo(tecido.getCodTecido());
throw new AplicacaoException("tecido.CODIGO_EXISTENTE");
} catch (ObjetoNaoEncontradoException e) {
}
tecidoDAO.inclui(tecido).getId();
}
/*
* Uma outra solu�ao para validar o campo fatorDeRendimento
* seria a cria�ao dos validadores atraves de uma tag converter
* como fora ensinado no curso do Carlos Ribeiro.
*
*/
@Transacional
public void altera(Tecido umTecido)
throws AplicacaoException {
if(umTecido.getFatorDeRendimento() > 0.0){
tecidoDAO.altera(umTecido);
}else{
throw new AplicacaoException("O valor de cada campo deve ser maior que zero.");
}
}
/** verificar se o exclui esta correto **/
@Transacional
public void exclui(Tecido umTecido)
throws AplicacaoException
{
Tecido tecido;
try
{
// System.out.println("<<<<<<<<<<< Passou pelo exclui de TecidoAppService. >>>>>>>>>>>");
tecido = tecidoDAO.getPorIdComLock((umTecido.getId()));
}
catch(ObjetoNaoEncontradoException e)
{ throw new AplicacaoException("Tecido n�o encontrado.");
}
tecidoDAO.exclui(tecido);
}
public Tecido recuperaTecido(long id)
throws AplicacaoException {
try {
return tecidoDAO.getPorId(id);
} catch (ObjetoNaoEncontradoException e) {
throw new AplicacaoException("Tecido n�o encontrado");
}
}
// Verificar se realmente este metodo sera necessario
public Tecido recuperaTecidoPorCodigo(String codTecido)
throws AplicacaoException {
try {
return tecidoDAO.recuperaTecidoPorCodigo(codTecido);
} catch (ObjetoNaoEncontradoException e) {
// System.out
// .println("O metodo recuperaUmTecidoPeloCodigo de TecidoAppService retornou uma excecao isto signifca que Tecido nao foi encontrada no bnco");
throw new AplicacaoException("Tecido n�o encontrado");
}
}
public List<Tecido> recuperaListaDeTecidos() throws AplicacaoException
{
List<Tecido> tecidos = tecidoDAO.recuperaListaDeTecidos();
if (tecidos.size() == 0)
{ throw new AplicacaoException("Tecidos n�o encontrados");
}
else
{ return tecidos;
}
}
public List<Tecido> recuperaListaDeTecidosPorDescricao(String descrTecido) {
return tecidoDAO.recuperaListaDeTecidosPorDescricao(descrTecido);
}
/**
*
* Recupera a lista de todos os recursos que possuam c�digo
* aproximado com o passado por parametro.
* @param String
* @return List<Tecido>
*
*/
public List<Tecido> recuperaListaDeTecidosPeloCodigoLike(String codTecido){
return tecidoDAO.recuperaListaDeTecidosPeloCodigoLike(codTecido);
}
public List<Tecido> recuperaListaPaginadaDeTecidos() {
return tecidoDAO.recuperaListaPaginadaDeTecidos();
}
/**
* Este m�todo � respons�vel por recuperar uma lista de Tecido com seus respectios TecModels.
* @author marques.araujo
* @param Tecido
* @return Tecido
* @throws AplicacaoException
*
*/
public Tecido recuperaTecidoComListaDeTecModels(Tecido tecido) throws AplicacaoException {
try {
return tecidoDAO.recuperaTecidoComListaDeTecModels(tecido);
} catch (ObjetoNaoEncontradoException e) {
throw new AplicacaoException("tecido.NAO_ENCONTRADO");
}
}
public List<Tecido> recuperaListaDeTecidosQueTenhamApenasTecModels(){
return tecidoDAO.recuperaListaDeTecidosQueTenhamApenasTecModels();
}
/**
* Este m�todo retorna uma lista de tecidos j� tendo efetuado o c�lculo do consumoPorLoteKg
* para cada um dos tecidos da lista.
* @author marques.araujo
* @return List<Tecido>
*
*/
public List<Tecido> recuperaListaPaginadaDeTecidosComListaDeTecModels() {
List<Tecido> listaTecidos = tecidoDAO.recuperaListaPaginadaDeTecidosComListaDeTecModels();
List<Parametros> listaParametro = parametrosService.recuperaListaDeParametros();
/*
*
* Como o parametro � um arquivo de registro �nico basta pegar o primeiro elemento da Classe Parametro.
*
*/
Double percentualDePerda = listaParametro.get(0).getPercentualDePerda();
for (Tecido tecido : listaTecidos) {
for (TecModel tecModel : tecido.getTecModels()) {
Double consumoPorLoteKg = (tecModel.getConsumoPorLoteMt()*(percentualDePerda/100 + 1))/tecido.getFatorDeRendimento();
tecModel.setConsumoPorLoteKg(consumoPorLoteKg);
}
}
return listaTecidos;
}
/**
* Este m�todo � respons�vel or gerar relat�rio simples.
* @param List<Tecido>
* @return void
* @throws AplicacaoException
*/
@SuppressWarnings("unchecked")
public void gerarRelatorio(List<Tecido> listaDeTecidos) throws AplicacaoException {
// System.out.println("Antes do metodo getRelatorio dentro de gerarRelatorio de TecidoAppService");
Relatorio relatorio = RelatorioFactory.getRelatorio(Relatorio.RELATORIO_LISTAGEM_DE_TECIDOS);
if(relatorio != null)
System.out.println("A variavel do tipo Relatorio e difente de null em TecdioAppService");
// System.out.println("Depois do metodo getRelatorio dentro de gerarRelatorio de TecidoAppService");
try{
relatorio.gerarRelatorio(listaDeTecidos, new HashMap());
} catch (RelatorioException re){
throw new AplicacaoException("tecido.RELATORIO_NAO_GERADO");
}
}
/**
* Este m�todo � respons�vel por gerar um relat�rio a partir das classes Tecido e Modelo.
* @author marques.araujo
* @param List<Tecido>
* @return void
* @throws AplicacaoException
*/
@SuppressWarnings("unchecked")
public void gerarRelatorioAgregado(List<Tecido> listaDeTecidos) throws AplicacaoException {
//RECUPERANDO A LISTA DE PARAMETROS COM O OBJETIVO DE PEGAR O PRIMEIRA OCORRENCIA
List<Parametros> listaDeParametros = parametrosService.recuperaListaDeParametros();
System.out.println(">>>>>>>>>>>>>> Antes da variavel relatorio em gerarRelatorioAgregado>>>>>>");
Relatorio relatorio = RelatorioFactory.getRelatorio(Relatorio.RELATORIO_LISTAGEM_DE_TECMODELS);
System.out.println(">>>>>>>>>>>>>> Depois da variavel relatorio em gerarRelatorioAgregado>>>>>>");
if(relatorio!=null){
System.out.println("A variavel relatorio eh diferente de null");
}else{
System.out.println("A variavel relatorio tem valor null");
}
try{
relatorio.gerarRelatorio(this.converterParaTecidoRelatorio(listaDeTecidos,listaDeParametros),new HashMap());
System.out.println(">>>>>>>>>>>>>> Depois da variavel relatorio em gerarRelatorioAgregado executando converterParaTecidoRelatorio>>>>>>");
} catch (RelatorioException re){
throw new AplicacaoException("tecido.RELATORIO_NAO_GERADO");
}
}
/**
* Este m�todo � respons�vel por recuperar uma lista de Tecidos com seus respectivos TecModels com o consumoPorLoteKg j� calculado.
* @author marques.araujo
* @return List<Tecido>
*
*/
public List<Tecido> recuperaListaDeTecidosComTecModels(){
List<Tecido> listaTecidos = tecidoDAO.recuperaListaDeTecidosComTecModels();
List<Parametros> listaParametro = parametrosService.recuperaListaDeParametros();
// System.out.println("Tamanho da lista de tecidos="+listaTecidos);
/*
*
* Como o parametro eh um arquivo de registro unico basta pegar o primeiro elemento da lista.
*
*/
Double percentualDePerda = listaParametro.get(0).getPercentualDePerda();
for (Tecido tecido : listaTecidos) {
for (TecModel tecModel : tecido.getTecModels()) {
Double consumoPorLoteKg = (tecModel.getConsumoPorLoteMt()*(percentualDePerda/100 + 1))/tecido.getFatorDeRendimento();
tecModel.setConsumoPorLoteKg(consumoPorLoteKg);
}
}
return listaTecidos;
}
/*
// Para usar o metodo abaixo fique ciente que sera necessario
// fazer o calculo para o atributo consumoPorLoteKg. Este atributo
// deve ser calculado seguindo a formula abaixo:
// Double consumoPorLoteKg = (tecModel.getConsumoPorLoteMt()*(percentualDePerda/100 + 1))/tecido.getFatorDeRendimento();
// O metodo abaixo foi criado partindo do presuposto que no relatorioListagemTecModels.jrxml
// seria realizado o calculo do atributo consumoPorLoteKg.
public List<Tecido> recuperaListaDeTecidosComTecModels(){
return tecidoDAO.recuperaListaDeTecidosComTecModels();
}
*/
/**
* Este m�todo � respons�vel por gerar objetos do tipo TecidoRelatorio a partir de objetos do tipo Tecido e Modelo.
* @author marques.araujo
* @param List<Tecido> tecidos, List<Parametros> parametros
* @return List<TecidoRelatorio>
*
*/
public List<TecidoRelatorio> converterParaTecidoRelatorio(List<Tecido> tecidos,List<Parametros> parametros){
List<TecidoRelatorio> tecidosRelatorio = new LinkedList<TecidoRelatorio>();
System.out.println(">>>>>>>>>>>>>> Rodou o metodo converterParaTecidoRelatorio >>>>>>>>");
System.out.println("Quantidade de tecidos="+tecidos.size());
for (Tecido tecido : tecidos) {
System.out.println(">>>>>>>>>>>>>> Entrou no for");
if (tecido.getTecModels().isEmpty()){
System.out.println(">>>>>>>>>>>>>> UM tecido nao possui tecmodels");
tecidosRelatorio.add(new TecidoRelatorio(tecido,null,null,null));
}
//Perceba que o tecido que nao tiver tecmodels nao entrara no segundo for e tambem nao dara erro.
for (TecModel tecmodel : tecido.getTecModels()) {
// O ATRIBUTO setConsumoPorLoteKg ESTA SENDO CALCULADO NO PROPRIO RELATORIO
// tecmodel.setConsumoPorLoteKg(1000*tecmodel.getConsumoPorLoteMt());//VERIFICAR A FORMULA CORRETA
TecidoRelatorio tecido_Relatorio = new TecidoRelatorio(tecido,tecmodel,tecmodel.getModelo(),parametros.get(0));
tecidosRelatorio.add(tecido_Relatorio);
}
}
System.out.println(">>>>>>>>>>>>>> Rodou e chegou no final do metodo converterParaTecidoRelatorio >>>>>>>>");
return tecidosRelatorio;
}
}