package br.com.centralit.citcorpore.negocio; import java.util.Collection; import br.com.centralit.citcorpore.bean.LimiteAprovacaoAutoridadeDTO; import br.com.centralit.citcorpore.bean.LimiteAprovacaoDTO; import br.com.centralit.citcorpore.bean.LimiteAprovacaoProcessoDTO; import br.com.centralit.citcorpore.bean.ValorLimiteAprovacaoDTO; import br.com.centralit.citcorpore.integracao.LimiteAprovacaoAutoridadeDao; import br.com.centralit.citcorpore.integracao.LimiteAprovacaoDao; import br.com.centralit.citcorpore.integracao.LimiteAprovacaoProcessoDao; import br.com.centralit.citcorpore.integracao.ValorLimiteAprovacaoDao; import br.com.citframework.dto.IDto; import br.com.citframework.excecao.LogicException; import br.com.citframework.excecao.ServiceException; import br.com.citframework.integracao.TransactionControler; import br.com.citframework.integracao.TransactionControlerImpl; import br.com.citframework.service.CrudServiceImpl; public class LimiteAprovacaoServiceEjb extends CrudServiceImpl implements LimiteAprovacaoService { private LimiteAprovacaoDao dao; @Override protected LimiteAprovacaoDao getDao() { if (dao == null) { dao = new LimiteAprovacaoDao(); } return new LimiteAprovacaoDao(); } @Override protected void validaCreate(final Object arg0) throws Exception { this.validaUpdate(arg0); } @Override protected void validaUpdate(final Object arg0) throws Exception { final LimiteAprovacaoDTO limiteAprovacaoDto = (LimiteAprovacaoDTO) arg0; if (limiteAprovacaoDto.getIdProcessoNegocio() == null || limiteAprovacaoDto.getIdProcessoNegocio().length == 0) { throw new LogicException("N�o foi selecionado nenhum processo de neg�cio"); } if (limiteAprovacaoDto.getIdNivelAutoridade() == null || limiteAprovacaoDto.getIdNivelAutoridade().length == 0) { throw new LogicException("N�o foi selecionado nenhum n�vel de autoridade"); } } @Override public IDto create(final IDto model) throws ServiceException, LogicException { final LimiteAprovacaoDao limiteAprovacaoDao = new LimiteAprovacaoDao(); final LimiteAprovacaoProcessoDao limiteAprovacaoProcessoDao = new LimiteAprovacaoProcessoDao(); final LimiteAprovacaoAutoridadeDao limiteAprovacaoAutoridadeDao = new LimiteAprovacaoAutoridadeDao(); final ValorLimiteAprovacaoDao valorLimiteAprovacaoDao = new ValorLimiteAprovacaoDao(); final TransactionControler tc = new TransactionControlerImpl(limiteAprovacaoDao.getAliasDB()); try { this.validaCreate(model); limiteAprovacaoDao.setTransactionControler(tc); valorLimiteAprovacaoDao.setTransactionControler(tc); limiteAprovacaoProcessoDao.setTransactionControler(tc); limiteAprovacaoAutoridadeDao.setTransactionControler(tc); tc.start(); LimiteAprovacaoDTO limiteAprovacaoDto = (LimiteAprovacaoDTO) model; limiteAprovacaoDto = (LimiteAprovacaoDTO) limiteAprovacaoDao.create(limiteAprovacaoDto); this.atualizaValores(limiteAprovacaoDto, valorLimiteAprovacaoDao); this.atualizaProcessos(limiteAprovacaoDto, limiteAprovacaoProcessoDao); this.atualizaAutoridades(limiteAprovacaoDto, limiteAprovacaoAutoridadeDao); this.validaLimiteAprovacao(limiteAprovacaoDto, limiteAprovacaoProcessoDao); tc.commit(); tc.close(); } catch (final Exception e) { this.rollbackTransaction(tc, e); } return model; } private void atualizaProcessos(final LimiteAprovacaoDTO limiteAprovacaoDto, final LimiteAprovacaoProcessoDao limiteAprovacaoProcessoDao) throws Exception { limiteAprovacaoProcessoDao.deleteByIdLimiteAprovacao(limiteAprovacaoDto.getIdLimiteAprovacao()); for (int i = 0; i < limiteAprovacaoDto.getIdProcessoNegocio().length; i++) { final LimiteAprovacaoProcessoDTO limiteDto = new LimiteAprovacaoProcessoDTO(); limiteDto.setIdLimiteAprovacao(limiteAprovacaoDto.getIdLimiteAprovacao()); limiteDto.setIdProcessoNegocio(limiteAprovacaoDto.getIdProcessoNegocio()[i]); limiteAprovacaoProcessoDao.create(limiteDto); } } private void atualizaAutoridades(final LimiteAprovacaoDTO limiteAprovacaoDto, final LimiteAprovacaoAutoridadeDao limiteAprovacaoAutoridadeDao) throws Exception { limiteAprovacaoAutoridadeDao.deleteByIdLimiteAprovacao(limiteAprovacaoDto.getIdLimiteAprovacao()); for (int i = 0; i < limiteAprovacaoDto.getIdNivelAutoridade().length; i++) { final LimiteAprovacaoAutoridadeDTO limiteDto = new LimiteAprovacaoAutoridadeDTO(); limiteDto.setIdLimiteAprovacao(limiteAprovacaoDto.getIdLimiteAprovacao()); limiteDto.setIdNivelAutoridade(limiteAprovacaoDto.getIdNivelAutoridade()[i]); limiteAprovacaoAutoridadeDao.create(limiteDto); } } private void atualizaValores(final LimiteAprovacaoDTO limiteAprovacaoDto, final ValorLimiteAprovacaoDao valorLimiteAprovacaoDao) throws Exception { valorLimiteAprovacaoDao.deleteByIdLimiteAprovacao(limiteAprovacaoDto.getIdLimiteAprovacao()); if (limiteAprovacaoDto.getColValores() != null) { for (final ValorLimiteAprovacaoDTO valorDto : limiteAprovacaoDto.getColValores()) { valorDto.setIdLimiteAprovacao(limiteAprovacaoDto.getIdLimiteAprovacao()); valorLimiteAprovacaoDao.create(valorDto); } } } @Override public void update(final IDto model) throws ServiceException, LogicException { final LimiteAprovacaoDao limiteAprovacaoDao = new LimiteAprovacaoDao(); final LimiteAprovacaoProcessoDao limiteAprovacaoProcessoDao = new LimiteAprovacaoProcessoDao(); final LimiteAprovacaoAutoridadeDao limiteAprovacaoAutoridadeDao = new LimiteAprovacaoAutoridadeDao(); final ValorLimiteAprovacaoDao valorLimiteAprovacaoDao = new ValorLimiteAprovacaoDao(); final TransactionControler tc = new TransactionControlerImpl(limiteAprovacaoDao.getAliasDB()); try { this.validaUpdate(model); limiteAprovacaoDao.setTransactionControler(tc); valorLimiteAprovacaoDao.setTransactionControler(tc); limiteAprovacaoProcessoDao.setTransactionControler(tc); limiteAprovacaoAutoridadeDao.setTransactionControler(tc); tc.start(); final LimiteAprovacaoDTO limiteAprovacaoDto = (LimiteAprovacaoDTO) model; limiteAprovacaoDao.update(limiteAprovacaoDto); this.atualizaValores(limiteAprovacaoDto, valorLimiteAprovacaoDao); this.atualizaProcessos(limiteAprovacaoDto, limiteAprovacaoProcessoDao); this.atualizaAutoridades(limiteAprovacaoDto, limiteAprovacaoAutoridadeDao); this.validaLimiteAprovacao(limiteAprovacaoDto, limiteAprovacaoProcessoDao); tc.commit(); tc.close(); } catch (final Exception e) { this.rollbackTransaction(tc, e); } } private void validaLimiteAprovacao(final LimiteAprovacaoDTO limiteAprovacaoDto, final LimiteAprovacaoProcessoDao limiteAprovacaoProcessoDao) throws Exception { final Collection<LimiteAprovacaoProcessoDTO> colLimiteAprovacaoProcesso = limiteAprovacaoProcessoDao.findByIdLimiteAprovacao(limiteAprovacaoDto.getIdLimiteAprovacao()); for (final LimiteAprovacaoProcessoDTO limiteAprovacaoProcessoDto : colLimiteAprovacaoProcesso) { final Collection<LimiteAprovacaoProcessoDTO> colDuplicados = limiteAprovacaoProcessoDao.findDuplicados(limiteAprovacaoDto.getIdLimiteAprovacao(), limiteAprovacaoProcessoDto.getIdProcessoNegocio()); if (colDuplicados != null && colDuplicados.size() > 0) { throw new LogicException("Existe mais de um limite de aprova��o vinculado ao mesmo processo e autoridade"); } } } }