package br.com.centralit.citcorpore.negocio; import java.util.Collection; import java.util.HashMap; import br.com.centralit.citcorpore.bean.ColetaPrecoDTO; import br.com.centralit.citcorpore.bean.CotacaoItemRequisicaoDTO; import br.com.centralit.citcorpore.bean.CriterioAvaliacaoDTO; import br.com.centralit.citcorpore.bean.EntregaItemRequisicaoDTO; import br.com.centralit.citcorpore.bean.InspecaoEntregaItemDTO; import br.com.centralit.citcorpore.bean.InspecaoPedidoCompraDTO; import br.com.centralit.citcorpore.bean.ItemPedidoCompraDTO; import br.com.centralit.citcorpore.bean.PedidoCompraDTO; import br.com.centralit.citcorpore.integracao.ColetaPrecoDao; import br.com.centralit.citcorpore.integracao.CotacaoItemRequisicaoDao; import br.com.centralit.citcorpore.integracao.CriterioAvaliacaoDao; import br.com.centralit.citcorpore.integracao.EntregaItemRequisicaoDao; import br.com.centralit.citcorpore.integracao.InspecaoEntregaItemDao; import br.com.centralit.citcorpore.integracao.InspecaoPedidoCompraDao; import br.com.centralit.citcorpore.integracao.ItemPedidoCompraDao; import br.com.centralit.citcorpore.integracao.PedidoCompraDao; import br.com.centralit.citcorpore.util.Enumerados.AcaoItemRequisicaoProduto; import br.com.centralit.citcorpore.util.Enumerados.SituacaoCotacao; import br.com.centralit.citcorpore.util.Enumerados.SituacaoEntregaItemRequisicao; import br.com.centralit.citcorpore.util.Enumerados.SituacaoItemRequisicaoProduto; import br.com.centralit.citcorpore.util.Enumerados.SituacaoPedidoCompra; import br.com.centralit.citged.bean.ControleGEDDTO; import br.com.centralit.citged.negocio.ControleGEDServiceBean; 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; import br.com.citframework.util.UtilDatas; public class PedidoCompraServiceEjb extends CrudServiceImpl implements PedidoCompraService { private PedidoCompraDao dao; protected PedidoCompraDao getDao() { if (dao == null) { dao = new PedidoCompraDao(); } return dao; } protected void validaCreate(Object arg0) throws Exception { validaPedido((PedidoCompraDTO) arg0); } private void validaPedido(PedidoCompraDTO pedidoCompraDto) throws Exception { if (pedidoCompraDto.getDataPedido() == null) throw new LogicException("Data do pedido n�o informada"); if (pedidoCompraDto.getColItens() == null || pedidoCompraDto.getColItens().size() == 0) throw new LogicException("N�o foi adicionado nenhum item ao pedido"); if (pedidoCompraDto.getDataPrevistaEntrega() != null && pedidoCompraDto.getDataPedido().compareTo(pedidoCompraDto.getDataPrevistaEntrega()) > 0) throw new LogicException("Data prevista da entrega deve ser maior ou igual � data do pedido"); if (pedidoCompraDto.getDataEntrega() != null && pedidoCompraDto.getDataPedido().compareTo(pedidoCompraDto.getDataEntrega()) > 0) throw new LogicException("Data da entrega deve ser maior ou igual � data do pedido"); if (pedidoCompraDto.getDataEntrega() != null && pedidoCompraDto.getDataEntrega().compareTo(UtilDatas.getDataAtual()) > 0) throw new LogicException("Data da entrega n�o pode ser maior que a data atual"); ColetaPrecoDao coletaPrecoDao = new ColetaPrecoDao(); HashMap<String, ColetaPrecoDTO> mapColetas = new HashMap(); for (ItemPedidoCompraDTO item : pedidoCompraDto.getColItens()) { ColetaPrecoDTO coletaPrecoDto = mapColetas.get(""+item.getIdColetaPreco()); if (coletaPrecoDto == null) { coletaPrecoDto = new ColetaPrecoDTO(); coletaPrecoDto.setIdColetaPreco(item.getIdColetaPreco()); coletaPrecoDto = (ColetaPrecoDTO) coletaPrecoDao.restore(coletaPrecoDto); mapColetas.put(""+item.getIdColetaPreco(), coletaPrecoDto); } double qtdePedido = 0; if (coletaPrecoDto.getQuantidadePedido() != null) qtdePedido = coletaPrecoDto.getQuantidadePedido(); coletaPrecoDto.setQuantidadePedido(qtdePedido + item.getQuantidade().doubleValue()); } for (ColetaPrecoDTO coletaPrecoDto: mapColetas.values()) { if (coletaPrecoDto.getQuantidadePedido().doubleValue() > coletaPrecoDto.getQuantidadeAprovada().doubleValue()) throw new LogicException("Quantidade pedida � maior que a quantidade aprovada na coleta de pre�o n�mero "+coletaPrecoDto.getIdColetaPreco()); } if (pedidoCompraDto.getSituacao().equals(SituacaoPedidoCompra.Entregue.name())) { if (pedidoCompraDto.getDataEntrega() == null) throw new LogicException("Data de entrega n�o informada"); }else{ pedidoCompraDto.setDataEntrega(null); } } protected void validaDelete(Object arg0) throws Exception {} protected void validaFind(Object arg0) throws Exception {} protected void validaUpdate(Object arg0) throws Exception { validaPedido((PedidoCompraDTO) arg0); } public Collection findByIdCotacao(Integer parm) throws Exception{ PedidoCompraDao dao = new PedidoCompraDao(); try{ return dao.findByIdCotacao(parm); } catch (Exception e) { throw new ServiceException(e); } } public Collection findEntreguesByIdCotacao(Integer parm) throws Exception{ PedidoCompraDao dao = new PedidoCompraDao(); try{ return dao.findEntreguesByIdCotacao(parm); } catch (Exception e) { throw new ServiceException(e); } } public void deleteByIdCotacao(Integer parm) throws Exception{ PedidoCompraDao dao = new PedidoCompraDao(); try{ dao.deleteByIdCotacao(parm); } catch (Exception e) { throw new ServiceException(e); } } private void atualizaAnexos(PedidoCompraDTO pedidoCompraDto, TransactionControler tc) throws Exception { new ControleGEDServiceBean().atualizaAnexos(pedidoCompraDto.getAnexos(), ControleGEDDTO.TABELA_PEDIDOCOMPRA, pedidoCompraDto.getIdPedido(), tc); } private void excluiItens(PedidoCompraDTO pedidoCompraDto, TransactionControler tc) throws Exception { ItemPedidoCompraDao itemPedidoCompraDao = new ItemPedidoCompraDao(); itemPedidoCompraDao.setTransactionControler(tc); Collection<ItemPedidoCompraDTO> colItens = itemPedidoCompraDao.findByIdPedido(pedidoCompraDto.getIdPedido()); if (colItens != null) { CotacaoItemRequisicaoDao cotacaoItemRequisicaoDao = new CotacaoItemRequisicaoDao(); cotacaoItemRequisicaoDao.setTransactionControler(tc); ItemRequisicaoProdutoServiceEjb itemRequisicaoService = new ItemRequisicaoProdutoServiceEjb(); for (ItemPedidoCompraDTO itemDto : colItens) { String complemento = "Exclus�o do pedido "; if (pedidoCompraDto.getNumeroPedido() != null) complemento += " No. " + pedidoCompraDto.getNumeroPedido(); complemento += ", Cota��o No. "+pedidoCompraDto.getIdCotacao(); Collection<CotacaoItemRequisicaoDTO> colItensRequisicao = cotacaoItemRequisicaoDao.findByIdColetaPreco(itemDto.getIdColetaPreco()); if (colItensRequisicao != null) { for (CotacaoItemRequisicaoDTO cotacaoItemRequisicaoDto : colItensRequisicao) { itemRequisicaoService.alteraSituacao(pedidoCompraDto.getUsuarioDto(), cotacaoItemRequisicaoDto.getIdItemRequisicaoProduto(), AcaoItemRequisicaoProduto.ExclusaoPedido, SituacaoItemRequisicaoProduto.AguardandoPedido, complemento, tc); } } itemPedidoCompraDao.delete(itemDto); } } } private void criaItens(PedidoCompraDTO pedidoCompraDto, TransactionControler tc) throws Exception { Collection<ItemPedidoCompraDTO> colItens = pedidoCompraDto.getColItens(); if (colItens != null) { CotacaoItemRequisicaoDao cotacaoItemRequisicaoDao = new CotacaoItemRequisicaoDao(); cotacaoItemRequisicaoDao.setTransactionControler(tc); ItemPedidoCompraDao itemPedidoCompraDao = new ItemPedidoCompraDao(); itemPedidoCompraDao.setTransactionControler(tc); String complemento = "Cota��o No. "+pedidoCompraDto.getIdCotacao(); if (pedidoCompraDto.getNumeroPedido() != null) complemento += ", Pedido No. " + pedidoCompraDto.getNumeroPedido(); ItemRequisicaoProdutoServiceEjb itemRequisicaoService = new ItemRequisicaoProdutoServiceEjb(); for (ItemPedidoCompraDTO itemDto : colItens) { itemDto.setIdPedido(pedidoCompraDto.getIdPedido()); itemPedidoCompraDao.create(itemDto); Collection<CotacaoItemRequisicaoDTO> colItensRequisicao = cotacaoItemRequisicaoDao.findByIdColetaPreco(itemDto.getIdColetaPreco()); if (colItensRequisicao != null) { for (CotacaoItemRequisicaoDTO cotacaoItemRequisicaoDto : colItensRequisicao) { itemRequisicaoService.alteraSituacao(pedidoCompraDto.getUsuarioDto(), cotacaoItemRequisicaoDto.getIdItemRequisicaoProduto(), AcaoItemRequisicaoProduto.Pedido, SituacaoItemRequisicaoProduto.AguardandoEntrega, complemento, tc); } } } } } @Override public IDto create(IDto model) throws ServiceException, LogicException { PedidoCompraDao pedidoCompraDao = new PedidoCompraDao(); TransactionControler tc = new TransactionControlerImpl(pedidoCompraDao.getAliasDB()); try{ validaCreate(model); pedidoCompraDao.setTransactionControler(tc); tc.start(); PedidoCompraDTO pedidoCompraDto = (PedidoCompraDTO) model; pedidoCompraDto = (PedidoCompraDTO) pedidoCompraDao.create(pedidoCompraDto); criaItens(pedidoCompraDto,tc); atualizaAnexos(pedidoCompraDto, tc); if (pedidoCompraDto.getSituacao().equals(SituacaoPedidoCompra.Entregue.name())) { criaEntregaItemRequisicao(pedidoCompraDto, tc); new CotacaoServiceEjb().alteraSituacao(pedidoCompraDto.getUsuarioDto(), pedidoCompraDto.getIdCotacao(), SituacaoCotacao.Entrega, tc); }else{ new CotacaoServiceEjb().alteraSituacao(pedidoCompraDto.getUsuarioDto(), pedidoCompraDto.getIdCotacao(), SituacaoCotacao.Pedido, tc); } tc.commit(); tc.close(); }catch(Exception e){ this.rollbackTransaction(tc, e); } return model; } @Override public void update(IDto model) throws ServiceException, LogicException { PedidoCompraDao pedidoCompraDao = new PedidoCompraDao(); TransactionControler tc = new TransactionControlerImpl(pedidoCompraDao.getAliasDB()); try{ validaUpdate(model); pedidoCompraDao.setTransactionControler(tc); tc.start(); PedidoCompraDTO pedidoCompraDto = (PedidoCompraDTO) model; pedidoCompraDao.update(pedidoCompraDto); excluiItens(pedidoCompraDto, tc); criaItens(pedidoCompraDto,tc); atualizaAnexos(pedidoCompraDto, tc); if (pedidoCompraDto.getSituacao().equals(SituacaoPedidoCompra.Entregue.name())) { criaEntregaItemRequisicao(pedidoCompraDto, tc); new CotacaoServiceEjb().alteraSituacao(pedidoCompraDto.getUsuarioDto(), pedidoCompraDto.getIdCotacao(), SituacaoCotacao.Entrega, tc); } tc.commit(); tc.close(); }catch(Exception e){ this.rollbackTransaction(tc, e); } } private void criaEntregaItemRequisicao(PedidoCompraDTO pedidoCompraDto, TransactionControler tc) throws Exception { EntregaItemRequisicaoDao entregaItemDao = new EntregaItemRequisicaoDao(); entregaItemDao.setTransactionControler(tc); entregaItemDao.deleteByIdPedido(pedidoCompraDto.getIdPedido()); Collection<ItemPedidoCompraDTO> colItens = pedidoCompraDto.getColItens(); if (colItens != null) { Collection<CriterioAvaliacaoDTO> colCriterios = new CriterioAvaliacaoDao().findByAplicavelAvaliacaoSolicitante(); CotacaoItemRequisicaoDao cotacaoItemDao = new CotacaoItemRequisicaoDao(); cotacaoItemDao.setTransactionControler(tc); for (ItemPedidoCompraDTO itemDto : colItens) { InspecaoEntregaItemDao inspecaoEntregaDao = new InspecaoEntregaItemDao(); inspecaoEntregaDao.setTransactionControler(tc); Collection<CotacaoItemRequisicaoDTO> colCotacaoItem = cotacaoItemDao.findByIdColetaPrecoOrderQtde(itemDto.getIdColetaPreco()); if (colCotacaoItem != null) { ItemRequisicaoProdutoServiceEjb itemRequisicaoService = new ItemRequisicaoProdutoServiceEjb(); double qtdePedido = itemDto.getQuantidade(); for (CotacaoItemRequisicaoDTO cotacaoItemDto : colCotacaoItem) { double qtde = cotacaoItemDto.getQuantidade().doubleValue() - cotacaoItemDto.getQuantidadeEntregue().doubleValue(); if (qtde > qtdePedido) qtde = qtdePedido; qtdePedido = qtdePedido - qtde; cotacaoItemDto.setQuantidadeEntregue(cotacaoItemDto.getQuantidadeEntregue().doubleValue() + qtde); cotacaoItemDao.update(cotacaoItemDto); EntregaItemRequisicaoDTO entregaDto = new EntregaItemRequisicaoDTO(); entregaDto.setIdColetaPreco(cotacaoItemDto.getIdColetaPreco()); entregaDto.setIdItemRequisicaoProduto(cotacaoItemDto.getIdItemRequisicaoProduto()); entregaDto.setIdPedido(pedidoCompraDto.getIdPedido()); entregaDto.setIdSolicitacaoServico(cotacaoItemDto.getIdSolicitacaoServico()); entregaDto.setQuantidadeEntregue(qtde); entregaDto.setSituacao(SituacaoEntregaItemRequisicao.Aguarda.name()); entregaDto = (EntregaItemRequisicaoDTO) entregaItemDao.create(entregaDto); String complemento = "Cota��o No. "+pedidoCompraDto.getIdCotacao(); if (pedidoCompraDto.getNumeroPedido() != null) complemento += ", Pedido No. " + pedidoCompraDto.getNumeroPedido(); itemRequisicaoService.alteraSituacao(pedidoCompraDto.getUsuarioDto(), cotacaoItemDto.getIdItemRequisicaoProduto(), AcaoItemRequisicaoProduto.Entrega, SituacaoItemRequisicaoProduto.AguardandoInspecao, complemento, tc); if (colCriterios != null) { for (CriterioAvaliacaoDTO criterioDto : colCriterios) { InspecaoEntregaItemDTO inspecaoDto = new InspecaoEntregaItemDTO(); inspecaoDto.setIdEntrega(entregaDto.getIdEntrega()); inspecaoDto.setIdCriterio(criterioDto.getIdCriterio()); inspecaoEntregaDao.create(inspecaoDto); } } if (qtdePedido <= 0) break; } } } } } @Override public void delete(IDto model) throws ServiceException, LogicException { PedidoCompraDao pedidoCompraDao = new PedidoCompraDao(); TransactionControler tc = new TransactionControlerImpl(pedidoCompraDao.getAliasDB()); try{ pedidoCompraDao.setTransactionControler(tc); tc.start(); PedidoCompraDTO pedidoCompraDto = (PedidoCompraDTO) model; excluiItens(pedidoCompraDto, tc); pedidoCompraDao.delete(pedidoCompraDto); Collection colPedidos = pedidoCompraDao.findByIdCotacao(pedidoCompraDto.getIdCotacao()); if (colPedidos == null || colPedidos.isEmpty()) { new CotacaoServiceEjb().alteraSituacao(pedidoCompraDto.getUsuarioDto(), pedidoCompraDto.getIdCotacao(), SituacaoCotacao.Publicada, tc); } tc.commit(); tc.close(); }catch(Exception e){ this.rollbackTransaction(tc, e); } } @Override public void atualizaEntrega(PedidoCompraDTO pedidoCompraDto) throws Exception { PedidoCompraDao pedidoCompraDao = new PedidoCompraDao(); PedidoCompraDTO pedidoAuxDto = (PedidoCompraDTO) pedidoCompraDao.restore(pedidoCompraDto); if (pedidoAuxDto.getSituacao().equals(SituacaoPedidoCompra.Entregue.name())) throw new Exception("Pedido j� foi entregue"); Collection<InspecaoPedidoCompraDTO> colInspecao = pedidoCompraDto.getColInspecao(); if (colInspecao == null) throw new Exception("Avalia��o do pedido nao informada"); InspecaoPedidoCompraDao inspecaoPedidoDao = new InspecaoPedidoCompraDao(); ItemPedidoCompraDao itemPedidoDao = new ItemPedidoCompraDao(); TransactionControler tc = null; try{ if (pedidoCompraDto.getDataEntrega() == null) throw new LogicException("Data de entrega n�o informada"); if (pedidoAuxDto.getDataPedido().compareTo(pedidoCompraDto.getDataEntrega()) > 0) throw new LogicException("Data da entrega deve ser maior ou igual � data do pedido"); if (pedidoCompraDto.getDataEntrega().compareTo(UtilDatas.getDataAtual()) > 0) throw new LogicException("Data da entrega n�o pode ser maior que a data atual"); tc = new TransactionControlerImpl(pedidoCompraDao.getAliasDB()); pedidoCompraDao.setTransactionControler(tc); inspecaoPedidoDao.setTransactionControler(tc); itemPedidoDao.setTransactionControler(tc); tc.start(); pedidoAuxDto.setSituacao(SituacaoPedidoCompra.Entregue.name()); pedidoAuxDto.setDataEntrega(pedidoCompraDto.getDataEntrega()); pedidoAuxDto.setIdentificacaoEntrega(pedidoCompraDto.getIdentificacaoEntrega()); pedidoAuxDto.setObservacoes(pedidoCompraDto.getObservacoes()); pedidoCompraDao.update(pedidoAuxDto); inspecaoPedidoDao.deleteByIdPedido(pedidoCompraDto.getIdPedido()); for (InspecaoPedidoCompraDTO inspecaoDto : colInspecao) { if (inspecaoDto.getAvaliacao() == null || inspecaoDto.getAvaliacao().trim().length() == 0) throw new Exception("Avalia��o n�o informada"); inspecaoDto.setIdResponsavel(pedidoCompraDto.getUsuarioDto().getIdEmpregado()); inspecaoDto.setDataHoraInspecao(UtilDatas.getDataHoraAtual()); inspecaoDto.setIdPedido(pedidoCompraDto.getIdPedido()); inspecaoPedidoDao.create(inspecaoDto); } pedidoAuxDto.setUsuarioDto(pedidoCompraDto.getUsuarioDto()); pedidoAuxDto.setColItens(itemPedidoDao.findByIdPedido(pedidoAuxDto.getIdPedido())); criaEntregaItemRequisicao(pedidoAuxDto, tc); new CotacaoServiceEjb().alteraSituacao(pedidoCompraDto.getUsuarioDto(), pedidoCompraDto.getIdCotacao(), SituacaoCotacao.Entrega, tc); tc.commit(); tc.close(); }catch(Exception e){ this.rollbackTransaction(tc, e); } } }