package br.com.centralit.citcorpore.negocio; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import br.com.centralit.citcorpore.bean.AvaliacaoColetaPrecoDTO; import br.com.centralit.citcorpore.bean.ColetaPrecoDTO; import br.com.centralit.citcorpore.bean.CotacaoDTO; import br.com.centralit.citcorpore.bean.CotacaoItemRequisicaoDTO; import br.com.centralit.citcorpore.bean.CriterioItemCotacaoDTO; import br.com.centralit.citcorpore.bean.FornecedorCotacaoDTO; import br.com.centralit.citcorpore.bean.FornecedorDTO; import br.com.centralit.citcorpore.bean.FornecedorProdutoDTO; import br.com.centralit.citcorpore.bean.HistoricoSituacaoCotacaoDTO; import br.com.centralit.citcorpore.bean.ItemCotacaoDTO; import br.com.centralit.citcorpore.bean.ItemPedidoCompraDTO; import br.com.centralit.citcorpore.bean.ItemRequisicaoProdutoDTO; import br.com.centralit.citcorpore.bean.PedidoCompraDTO; import br.com.centralit.citcorpore.bean.ProdutoDTO; import br.com.centralit.citcorpore.bean.UsuarioDTO; import br.com.centralit.citcorpore.integracao.AvaliacaoColetaPrecoDao; import br.com.centralit.citcorpore.integracao.ColetaPrecoDao; import br.com.centralit.citcorpore.integracao.CotacaoDao; import br.com.centralit.citcorpore.integracao.CotacaoItemRequisicaoDao; import br.com.centralit.citcorpore.integracao.CriterioItemCotacaoDao; import br.com.centralit.citcorpore.integracao.FornecedorCotacaoDao; import br.com.centralit.citcorpore.integracao.FornecedorDao; import br.com.centralit.citcorpore.integracao.FornecedorProdutoDao; import br.com.centralit.citcorpore.integracao.HistoricoSituacaoCotacaoDao; import br.com.centralit.citcorpore.integracao.ItemCotacaoDao; import br.com.centralit.citcorpore.integracao.ItemPedidoCompraDao; import br.com.centralit.citcorpore.integracao.ItemRequisicaoProdutoDao; import br.com.centralit.citcorpore.integracao.PedidoCompraDao; import br.com.centralit.citcorpore.integracao.ProdutoDao; import br.com.centralit.citcorpore.util.Enumerados.AcaoItemRequisicaoProduto; import br.com.centralit.citcorpore.util.Enumerados.ResultadoValidacao; import br.com.centralit.citcorpore.util.Enumerados.SituacaoCotacao; import br.com.centralit.citcorpore.util.Enumerados.SituacaoCotacaoItemRequisicao; import br.com.centralit.citcorpore.util.Enumerados.SituacaoItemRequisicaoProduto; import br.com.centralit.citcorpore.util.Enumerados.SituacaoPedidoCompra; 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.Reflexao; import br.com.citframework.util.UtilDatas; import br.com.citframework.util.UtilNumbersAndDecimals; public class CotacaoServiceEjb extends CrudServiceImpl implements CotacaoService { private CotacaoDao dao; @Override protected CotacaoDao getDao() { if (dao == null) { dao = new CotacaoDao(); } return dao; } @Override protected void validaCreate(final Object arg0) throws Exception { this.validaAtualizacao((CotacaoDTO) arg0); } @Override protected void validaUpdate(final Object arg0) throws Exception { this.validaAtualizacao((CotacaoDTO) arg0); } private void validaAtualizacao(final CotacaoDTO cotacaoDto) throws Exception { if (cotacaoDto.getDataFinalPrevista() != null && cotacaoDto.getDataFinalPrevista().compareTo(UtilDatas.getDataAtual()) < 0) { throw new LogicException("Data final previsao n�o pode ser menor que a data atual"); } } public void alteraSituacao(final UsuarioDTO usuarioDto, final Integer idCotacao, final SituacaoCotacao novaSituacao, final TransactionControler tc) throws Exception { final CotacaoDao cotacaoDao = new CotacaoDao(); CotacaoDTO cotacaoDto = new CotacaoDTO(); cotacaoDto.setIdCotacao(idCotacao); cotacaoDto = (CotacaoDTO) cotacaoDao.restore(cotacaoDto); cotacaoDao.setTransactionControler(tc); cotacaoDto.setSituacao(novaSituacao.name()); cotacaoDao.update(cotacaoDto); cotacaoDto.setUsuarioDto(usuarioDto); this.geraHistoricoSituacao(tc, cotacaoDto, novaSituacao); } private void geraHistoricoSituacao(final TransactionControler tc, final CotacaoDTO cotacaoDto, final SituacaoCotacao situacao) throws Exception { final HistoricoSituacaoCotacaoDTO historicoSituacaoCotacaoDto = new HistoricoSituacaoCotacaoDTO(); historicoSituacaoCotacaoDto.setIdCotacao(cotacaoDto.getIdCotacao()); historicoSituacaoCotacaoDto.setIdResponsavel(cotacaoDto.getUsuarioDto().getIdEmpregado()); historicoSituacaoCotacaoDto.setDataHora(UtilDatas.getDataHoraAtual()); historicoSituacaoCotacaoDto.setSituacao(situacao.name()); final HistoricoSituacaoCotacaoDao historicoSituacaoCotacaoDao = new HistoricoSituacaoCotacaoDao(); historicoSituacaoCotacaoDao.setTransactionControler(tc); historicoSituacaoCotacaoDao.create(historicoSituacaoCotacaoDto); } @Override public Collection findItensPendentesAprovacao(final CotacaoDTO cotacaoDto) throws Exception { return new CotacaoItemRequisicaoDao().findPendentesByIdCotacao(cotacaoDto.getIdCotacao()); } @Override public IDto create(final IDto model) throws ServiceException, LogicException { final CotacaoDao cotacaoDao = new CotacaoDao(); final TransactionControler tc = new TransactionControlerImpl(cotacaoDao.getAliasDB()); try { this.validaCreate(model); cotacaoDao.setTransactionControler(tc); tc.start(); CotacaoDTO cotacaoDto = (CotacaoDTO) model; cotacaoDto.setSituacao(SituacaoCotacao.EmAndamento.name()); cotacaoDto = (CotacaoDTO) cotacaoDao.create(cotacaoDto); this.geraHistoricoSituacao(tc, cotacaoDto, SituacaoCotacao.EmAndamento); tc.commit(); tc.close(); } catch (final Exception e) { this.rollbackTransaction(tc, e); } return model; } @Override public void encerra(CotacaoDTO cotacaoDto) throws Exception { final UsuarioDTO usuarioDto = cotacaoDto.getUsuarioDto(); cotacaoDto = (CotacaoDTO) this.getDao().restore(cotacaoDto); if (cotacaoDto == null) { throw new LogicException("Cota��o n�o encontrada"); } if (cotacaoDto.getSituacao().equals(SituacaoCotacao.Finalizada.name())) { throw new LogicException("Cota��o j� est� encerrada"); } if (cotacaoDto.getSituacao().equals(SituacaoCotacao.Cancelada.name())) { throw new LogicException("Cota��o est� cancelada"); } if (cotacaoDto.getSituacao().equals(SituacaoCotacao.Pedido.name())) { final Collection<ColetaPrecoDTO> colColetas = new ColetaPrecoDao().findHabilitadasByIdCotacao(cotacaoDto.getIdCotacao()); if (colColetas != null) { final ItemPedidoCompraDao itemPedidoDao = new ItemPedidoCompraDao(); for (final ColetaPrecoDTO coletaPrecoDto : colColetas) { final Collection<ItemPedidoCompraDTO> colItensPedido = itemPedidoDao.findByIdColetaPreco(coletaPrecoDto.getIdColetaPreco()); if (colItensPedido == null || colItensPedido.size() == 0) { throw new LogicException("Existe pelo menos um pedido de compra ainda n�o gerado"); } } } } else if (cotacaoDto.getSituacao().equals(SituacaoCotacao.Entrega.name())) { final Collection<PedidoCompraDTO> colPedidos = new PedidoCompraDao().findByIdCotacao(cotacaoDto.getIdCotacao()); if (colPedidos != null) { for (final PedidoCompraDTO pedidoDto : colPedidos) { if (!pedidoDto.getSituacao().equals(SituacaoPedidoCompra.Entregue.name())) { throw new LogicException("Existe pelo menos um pedido de compra ainda n�o entregue"); } } } } final CotacaoDao cotacaoDao = new CotacaoDao(); final TransactionControler tc = new TransactionControlerImpl(cotacaoDao.getAliasDB()); try { cotacaoDao.setTransactionControler(tc); tc.start(); cotacaoDto.setUsuarioDto(usuarioDto); if (cotacaoDto.getSituacao().equals(SituacaoCotacao.Publicada.name())) { this.reabreColetaPrecos(cotacaoDto, tc); } if (cotacaoDto.getSituacao().equals(SituacaoCotacao.EmAndamento.name())) { final Collection<ItemCotacaoDTO> colItens = new ItemCotacaoDao().findByIdCotacao(cotacaoDto.getIdCotacao()); if (colItens != null) { final ItemRequisicaoProdutoServiceEjb itemRequisicaoService = new ItemRequisicaoProdutoServiceEjb(); for (final ItemCotacaoDTO itemCotacaoDto : colItens) { itemRequisicaoService.desassociaItemCotacao(usuarioDto, itemCotacaoDto, AcaoItemRequisicaoProduto.EncerramentoCotacao, tc); } } } cotacaoDto.setSituacao(SituacaoCotacao.Finalizada.name()); cotacaoDao.update(cotacaoDto); this.geraHistoricoSituacao(tc, cotacaoDto, SituacaoCotacao.EmAndamento); tc.commit(); tc.close(); } catch (final Exception e) { this.rollbackTransaction(tc, e); } } @Override public ItemCotacaoDTO verificaInclusaoItensRequisicao(final String tipoCriacaoItem, final Collection<ItemRequisicaoProdutoDTO> colItensRequisicao) throws Exception { if (colItensRequisicao == null || colItensRequisicao.isEmpty()) { return null; } ItemCotacaoDTO itemCotacaoRef = null; if (tipoCriacaoItem != null && tipoCriacaoItem.equals("2") && colItensRequisicao.size() > 1) { Integer idProduto = null; for (final ItemRequisicaoProdutoDTO itemRequisicaoDto : colItensRequisicao) { if (itemRequisicaoDto.getIdProduto() == null) { continue; } if (itemCotacaoRef == null) { itemCotacaoRef = new ItemCotacaoDTO(); } Reflexao.copyPropertyValues(itemRequisicaoDto, itemCotacaoRef); if (idProduto == null) { idProduto = itemRequisicaoDto.getIdProduto(); } else if (itemRequisicaoDto.getIdProduto().intValue() != idProduto.intValue()) { throw new LogicException("Todos os itens de requisi��o deve estar associados ao mesmo produto"); } } if (itemCotacaoRef == null) { itemCotacaoRef = new ItemCotacaoDTO(); final ItemRequisicaoProdutoDTO item = (ItemRequisicaoProdutoDTO) ((List) colItensRequisicao).get(0); Reflexao.copyPropertyValues(item, itemCotacaoRef); } if (idProduto == null && colItensRequisicao.size() > 1) { itemCotacaoRef.setTipoIdentificacao("D"); } else { itemCotacaoRef.setTipoIdentificacao("S"); } } return itemCotacaoRef; } @Override public void incluiItensRequisicao(final UsuarioDTO usuarioDto, final Integer idCotacao, final ItemCotacaoDTO itemCotacaoRefDto, final String tipoCriacaoItem, final Collection<ItemRequisicaoProdutoDTO> colItensRequisicao) throws Exception { if (colItensRequisicao == null || colItensRequisicao.isEmpty()) { return; } final ItemCotacaoServiceEjb itemCotacaoService = new ItemCotacaoServiceEjb(); final TransactionControler tc = new TransactionControlerImpl(this.getDao().getAliasDB()); try { tc.start(); if (tipoCriacaoItem.equals("1") || colItensRequisicao.size() == 1) { for (final ItemRequisicaoProdutoDTO itemRequisicaoProdutoDto : colItensRequisicao) { final List<ItemRequisicaoProdutoDTO> itens = new ArrayList(); itens.add(itemRequisicaoProdutoDto); ItemCotacaoDTO itemCotacaoDto = new ItemCotacaoDTO(); Reflexao.copyPropertyValues(itemRequisicaoProdutoDto, itemCotacaoDto); itemCotacaoDto.setIdCotacao(idCotacao); itemCotacaoDto.setQuantidade(itemRequisicaoProdutoDto.getQtdeAprovada()); itemCotacaoDto = itemCotacaoService.create(usuarioDto, itemCotacaoDto, itens, tc); } } else { final List<ItemRequisicaoProdutoDTO> itens = new ArrayList(); ItemCotacaoDTO itemCotacaoDto = new ItemCotacaoDTO(); Reflexao.copyPropertyValues(itemCotacaoRefDto, itemCotacaoDto); itemCotacaoDto.setIdCotacao(idCotacao); double qtde = 0.0; Timestamp tsLimite = null; for (final ItemRequisicaoProdutoDTO itemRequisicaoProdutoDto : colItensRequisicao) { itens.add(itemRequisicaoProdutoDto); qtde += itemRequisicaoProdutoDto.getQtdeAprovada().doubleValue(); if (tsLimite == null) { tsLimite = itemRequisicaoProdutoDto.getDataHoraLimite(); } else if (itemRequisicaoProdutoDto.getDataHoraLimite() != null && itemRequisicaoProdutoDto.getDataHoraLimite().compareTo(tsLimite) < 0) { tsLimite = itemRequisicaoProdutoDto.getDataHoraLimite(); } } itemCotacaoDto.setQuantidade(qtde); itemCotacaoDto.setDataHoraLimite(tsLimite); itemCotacaoDto = itemCotacaoService.create(usuarioDto, itemCotacaoDto, itens, tc); } tc.commit(); tc.close(); } catch (final Exception e) { this.rollbackTransaction(tc, e); } } @Override public void incluiFornecedores(final CotacaoDTO cotacaoDto, final Collection<FornecedorDTO> colFornecedores) throws Exception { if (colFornecedores == null || colFornecedores.isEmpty()) { return; } final HashMap<String, Object> mapFornecedores = new HashMap(); final Collection<FornecedorCotacaoDTO> colFornecedorCotacao = new FornecedorCotacaoDao().findByIdCotacao(cotacaoDto.getIdCotacao()); if (colFornecedorCotacao != null) { for (final FornecedorCotacaoDTO fornecedorCotacaoDto : colFornecedorCotacao) { final FornecedorDTO fornecedorDto = new FornecedorDTO(); fornecedorDto.setIdFornecedor(fornecedorCotacaoDto.getIdFornecedor()); mapFornecedores.put("" + fornecedorCotacaoDto.getIdFornecedor(), fornecedorCotacaoDto); } } final FornecedorCotacaoDao fornecedorCotacaoDao = new FornecedorCotacaoDao(); final TransactionControler tc = new TransactionControlerImpl(fornecedorCotacaoDao.getAliasDB()); try { fornecedorCotacaoDao.setTransactionControler(tc); tc.start(); for (final FornecedorDTO fornecedorDto : colFornecedores) { if (mapFornecedores.get("" + fornecedorDto.getIdFornecedor()) != null) { continue; } final FornecedorCotacaoDTO fornecedorCotacaoDto = new FornecedorCotacaoDTO(); fornecedorCotacaoDto.setIdCotacao(cotacaoDto.getIdCotacao()); fornecedorCotacaoDto.setIdFornecedor(fornecedorDto.getIdFornecedor()); fornecedorCotacaoDao.create(fornecedorCotacaoDto); } tc.commit(); tc.close(); } catch (final Exception e) { this.rollbackTransaction(tc, e); } } @Override public Collection<FornecedorDTO> sugereFornecedores(final CotacaoDTO cotacaoDto) throws Exception { final Collection<ItemCotacaoDTO> colItens = new ItemCotacaoDao().findByIdCotacao(cotacaoDto.getIdCotacao()); if (colItens == null || colItens.isEmpty()) { return null; } final HashMap<String, Object> mapFornecedores = new HashMap(); final Collection<FornecedorCotacaoDTO> colFornecedorCotacao = new FornecedorCotacaoDao().findByIdCotacao(cotacaoDto.getIdCotacao()); if (colFornecedorCotacao != null) { for (final FornecedorCotacaoDTO fornecedorCotacaoDto : colFornecedorCotacao) { final FornecedorDTO fornecedorDto = new FornecedorDTO(); fornecedorDto.setIdFornecedor(fornecedorCotacaoDto.getIdFornecedor()); mapFornecedores.put("" + fornecedorCotacaoDto.getIdFornecedor(), fornecedorCotacaoDto); } } final AvaliacaoFornecedorServiceEjb avaliacaoFornecedorService = new AvaliacaoFornecedorServiceEjb(); final Collection<FornecedorDTO> result = new ArrayList(); final ProdutoDao produtoDao = new ProdutoDao(); final FornecedorDao fornecedorDao = new FornecedorDao(); final FornecedorProdutoDao fornecedorProdutoDao = new FornecedorProdutoDao(); for (final ItemCotacaoDTO itemCotacaoDto : colItens) { ProdutoDTO produtoDto = new ProdutoDTO(); produtoDto.setIdProduto(itemCotacaoDto.getIdProduto()); produtoDto = (ProdutoDTO) produtoDao.restore(produtoDto); if (produtoDto == null) { continue; } final Collection<FornecedorProdutoDTO> colFornecedores = fornecedorProdutoDao.findByIdTipoProduto(produtoDto.getIdTipoProduto()); if (colFornecedores == null || colFornecedores.isEmpty()) { continue; } for (final FornecedorProdutoDTO fornecedorProdutoDto : colFornecedores) { if (fornecedorProdutoDto.getDataFim() != null && fornecedorProdutoDto.getDataFim().compareTo(UtilDatas.getDataAtual()) < 0) { continue; } if (itemCotacaoDto.getExigeFornecedorQualificado() != null && itemCotacaoDto.getExigeFornecedorQualificado().equalsIgnoreCase("S")) { if (!avaliacaoFornecedorService.fornecedorQualificado(fornecedorProdutoDto.getIdFornecedor())) { continue; } } if (mapFornecedores.get("" + fornecedorProdutoDto.getIdFornecedor()) != null) { continue; } FornecedorDTO fornecedorDto = new FornecedorDTO(); fornecedorDto.setIdFornecedor(fornecedorProdutoDto.getIdFornecedor()); fornecedorDto = (FornecedorDTO) fornecedorDao.restore(fornecedorDto); if (fornecedorDto != null) { result.add(fornecedorDto); mapFornecedores.put("" + fornecedorProdutoDto.getIdFornecedor(), fornecedorDto); } } } return result; } private void classificaMenor(final List<ColetaPrecoDTO> colColetas) throws Exception { Collections.sort(colColetas, new Comparator<ColetaPrecoDTO>() { @Override public int compare(final ColetaPrecoDTO coleta1, final ColetaPrecoDTO coleta2) { int r = coleta1.getResultCriterios().compareTo(coleta2.getResultCriterios()); if (r == 0) { r = coleta2.getQuantidadeCotada().compareTo(coleta1.getQuantidadeCotada()); } return r; } }); } private void classificaResultado(final List<ColetaPrecoDTO> colColetas) throws Exception { Collections.sort(colColetas, new Comparator<ColetaPrecoDTO>() { @Override public int compare(final ColetaPrecoDTO coleta1, final ColetaPrecoDTO coleta2) { int r = coleta2.getResultCriterios().compareTo(coleta1.getResultCriterios()); if (r == 0) { r = coleta2.getQuantidadeCotada().compareTo(coleta1.getQuantidadeCotada()); } return r; } }); } @Override public void calculaResultado(final CotacaoDTO cotacaoDto) throws Exception { final Collection<ItemCotacaoDTO> colItens = new ItemCotacaoDao().findByIdCotacao(cotacaoDto.getIdCotacao()); if (colItens == null) { return; } final CotacaoDao cotacaoDao = new CotacaoDao(); cotacaoDao.restore(cotacaoDto); final ItemCotacaoDao itemCotacaoDao = new ItemCotacaoDao(); final ColetaPrecoDao coletaPrecoDao = new ColetaPrecoDao(); final AvaliacaoColetaPrecoDao avaliacaoColetaDao = new AvaliacaoColetaPrecoDao(); final CriterioItemCotacaoDao criterioItemCotacaoDao = new CriterioItemCotacaoDao(); final ItemCotacaoServiceEjb itemCotacaoService = new ItemCotacaoServiceEjb(); final TransactionControler tc = new TransactionControlerImpl(coletaPrecoDao.getAliasDB()); try { tc.start(); itemCotacaoDao.setTransactionControler(tc); coletaPrecoDao.setTransactionControler(tc); avaliacaoColetaDao.setTransactionControler(tc); cotacaoDao.setTransactionControler(tc); criterioItemCotacaoDao.setTransactionControler(tc); for (final ItemCotacaoDTO itemCotacaoDto : colItens) { final List<ColetaPrecoDTO> colColetas = (List<ColetaPrecoDTO>) coletaPrecoDao.findByIdItemCotacao(itemCotacaoDto.getIdItemCotacao()); if (colColetas != null) { double total = 0; for (final ColetaPrecoDTO coletaPrecoDto : colColetas) { double r = coletaPrecoDto.getPreco() + coletaPrecoDto.getValorAcrescimo() - coletaPrecoDto.getValorDesconto() + coletaPrecoDto.getValorFrete(); r = r * (1 + coletaPrecoDto.getTaxaJuros() / 100); coletaPrecoDto.setResultPreco(r / coletaPrecoDto.getQuantidadeCotada() * itemCotacaoDto.getPesoPreco()); coletaPrecoDto.setResultJuros(coletaPrecoDto.getTaxaJuros() * itemCotacaoDto.getPesoTaxaJuros()); coletaPrecoDto.setResultPrazoEntrega(coletaPrecoDto.getPrazoEntrega().intValue() * itemCotacaoDto.getPesoPrazoEntrega()); // Modificado uso do m�todo do // prazo de entrega para refletir // a mudan�a de tipo de double // para int final double resultCriterios = coletaPrecoDto.getResultPreco().doubleValue() + coletaPrecoDto.getResultJuros().doubleValue() + coletaPrecoDto.getResultPrazoEntrega().doubleValue(); coletaPrecoDto.setResultCriterios(resultCriterios); total += resultCriterios; } this.classificaMenor(colColetas); for (final ColetaPrecoDTO coletaPrecoDto : colColetas) { coletaPrecoDto.setResultCriterios(10 - coletaPrecoDto.getResultCriterios() / total * 10); coletaPrecoDto.setResultPrazoPagto(coletaPrecoDto.getPrazoMedioPagto() * itemCotacaoDto.getPesoPrazoPagto()); coletaPrecoDto.setResultGarantia(coletaPrecoDto.getPrazoGarantia().doubleValue() * itemCotacaoDto.getPesoPrazoGarantia()); double resultCriterios = coletaPrecoDto.getResultCriterios() + coletaPrecoDto.getResultPrazoPagto().doubleValue() + coletaPrecoDto.getResultGarantia().doubleValue(); final Collection<AvaliacaoColetaPrecoDTO> colAvaliacoes = avaliacaoColetaDao.findByIdColetaPreco(coletaPrecoDto.getIdColetaPreco()); if (colAvaliacoes != null) { for (final AvaliacaoColetaPrecoDTO avaliacaoColetaPrecoDto : colAvaliacoes) { CriterioItemCotacaoDTO criterioItemCotacaoDto = new CriterioItemCotacaoDTO(); criterioItemCotacaoDto.setIdItemCotacao(itemCotacaoDto.getIdItemCotacao()); criterioItemCotacaoDto.setIdCriterio(avaliacaoColetaPrecoDto.getIdCriterio()); criterioItemCotacaoDto = (CriterioItemCotacaoDTO) criterioItemCotacaoDao.restore(criterioItemCotacaoDto); if (criterioItemCotacaoDto != null) { resultCriterios += avaliacaoColetaPrecoDto.getAvaliacao() * criterioItemCotacaoDto.getPeso(); } } } coletaPrecoDto.setResultCriterios(resultCriterios); } this.classificaResultado(colColetas); ColetaPrecoDTO coletaAnteriorDto = null; double qtde = itemCotacaoDto.getQuantidade().doubleValue(); double pontuacao = 10; double primeiroResultado = 0; for (final ColetaPrecoDTO coletaPrecoDto : colColetas) { coletaPrecoDto.setIdJustifResultado(null); coletaPrecoDto.setComplemJustifResultado(null); coletaPrecoDto.setIdRespResultado(null); coletaPrecoDto.setQuantidadeCalculo(0.0); if (coletaAnteriorDto != null) { final double dif = coletaPrecoDto.getResultCriterios().doubleValue() / primeiroResultado; pontuacao = 10 * dif; } else { primeiroResultado = coletaPrecoDto.getResultCriterios().doubleValue(); } pontuacao = UtilNumbersAndDecimals.setRound(pontuacao, 4); coletaPrecoDto.setResultadoCalculo(ColetaPrecoDTO.RESULT_DESCLASSIFICADA); if (qtde > 0) { if (coletaAnteriorDto != null && pontuacao == coletaAnteriorDto.getPontuacao().doubleValue()) { // empate final double qtdeAux = qtde + coletaAnteriorDto.getQuantidadeCalculo().doubleValue(); if (qtdeAux > coletaPrecoDto.getQuantidadeCotada()) { coletaPrecoDto.setQuantidadeCalculo(coletaPrecoDto.getQuantidadeCotada()); } else { coletaPrecoDto.setQuantidadeCalculo(qtdeAux); } coletaAnteriorDto.setResultadoCalculo(ColetaPrecoDTO.RESULT_EMPATE); coletaPrecoDao.atualizaResultadoCalculo(coletaAnteriorDto); coletaAnteriorDto.setResultadoFinal(ColetaPrecoDTO.RESULT_EMPATE); coletaPrecoDao.atualizaResultadoFinal(coletaAnteriorDto); coletaPrecoDto.setResultadoCalculo(ColetaPrecoDTO.RESULT_EMPATE); } else { if (qtde > coletaPrecoDto.getQuantidadeCotada()) { qtde = qtde - coletaPrecoDto.getQuantidadeCotada(); coletaPrecoDto.setQuantidadeCalculo(coletaPrecoDto.getQuantidadeCotada()); } else { coletaPrecoDto.setQuantidadeCalculo(qtde); qtde = 0; } coletaPrecoDto.setResultadoCalculo(ColetaPrecoDTO.RESULT_MELHOR_COTACAO); } } coletaAnteriorDto = coletaPrecoDto; coletaPrecoDto.setPontuacao(pontuacao); coletaPrecoDao.atualizaResultadoCalculo(coletaPrecoDto); coletaPrecoDto.setResultadoFinal(coletaPrecoDto.getResultadoCalculo()); coletaPrecoDto.setQuantidadeCompra(coletaPrecoDto.getQuantidadeCalculo()); coletaPrecoDao.atualizaResultadoFinal(coletaPrecoDto); } } itemCotacaoService.valida(tc, itemCotacaoDto); itemCotacaoDao.update(itemCotacaoDto); } cotacaoDto.setSituacao(SituacaoCotacao.Calculada.name()); cotacaoDao.atualizaSituacao(cotacaoDto); this.geraHistoricoSituacao(tc, cotacaoDto, SituacaoCotacao.Calculada); tc.commit(); tc.close(); } catch (final Exception e) { this.rollbackTransaction(tc, e); } } public boolean todosItensValidos(final CotacaoDTO cotacaoDto) throws Exception { boolean bResult = true; final Collection<ItemCotacaoDTO> colItens = new ItemCotacaoDao().findByIdCotacao(cotacaoDto.getIdCotacao()); if (colItens != null) { for (final ItemCotacaoDTO itemCotacaoDto : colItens) { if (itemCotacaoDto.getResultadoValidacao() != null && itemCotacaoDto.getResultadoValidacao().equals(ResultadoValidacao.E.name())) { bResult = false; break; } } } return bResult; } @Override public void publicaResultado(final CotacaoDTO cotacaoDto) throws Exception { final boolean bValido = this.todosItensValidos(cotacaoDto); if (!bValido) { throw new LogicException("Resultado n�o pode ser publicado. Existe pelo menos um item de cota��o com problemas de valida��o"); } final CotacaoDao cotacaoDao = new CotacaoDao(); final CotacaoItemRequisicaoDao cotacaoItemRequisicaoDao = new CotacaoItemRequisicaoDao(); final TransactionControler tc = new TransactionControlerImpl(cotacaoDao.getAliasDB()); cotacaoDao.setTransactionControler(tc); cotacaoItemRequisicaoDao.setTransactionControler(tc); try { tc.start(); final Collection<ItemCotacaoDTO> colItensCotacao = new ItemCotacaoDao().findByIdCotacao(cotacaoDto.getIdCotacao()); if (colItensCotacao != null) { cotacaoItemRequisicaoDao.deleteByIdCotacao(cotacaoDto.getIdCotacao()); final ColetaPrecoDao coletaPrecoDao = new ColetaPrecoDao(); coletaPrecoDao.setTransactionControler(tc); final ItemRequisicaoProdutoDao itemRequisicaoDao = new ItemRequisicaoProdutoDao(); itemRequisicaoDao.setTransactionControler(tc); for (final ItemCotacaoDTO itemCotacaoDto : colItensCotacao) { final Collection<ItemRequisicaoProdutoDTO> colItensRequisicao = itemRequisicaoDao.findByIdItemCotacaoOrderQtde(itemCotacaoDto.getIdItemCotacao()); if (colItensRequisicao != null) { final ItemRequisicaoProdutoServiceEjb itemRequisicaoService = new ItemRequisicaoProdutoServiceEjb(); for (final ItemRequisicaoProdutoDTO itemRequisicaoDto : colItensRequisicao) { itemRequisicaoDto.setQtdeCotada(new Double(0.0)); itemRequisicaoDao.update(itemRequisicaoDto); } final Collection<ColetaPrecoDTO> colColetas = coletaPrecoDao.findHabilitadasByIdItemCotacao(itemCotacaoDto.getIdItemCotacao()); if (colColetas != null) { for (final ColetaPrecoDTO coletaPrecoDto : colColetas) { double qtdeAprovada = 0; double qtdeCompra = coletaPrecoDto.getQuantidadeCompra(); if (qtdeCompra == 0) { continue; } for (final ItemRequisicaoProdutoDTO itemRequisicaoDto : colItensRequisicao) { double qtdeItem = qtdeCompra; if (qtdeItem > itemRequisicaoDto.getQtdeAprovada().doubleValue() - itemRequisicaoDto.getQtdeCotada().doubleValue()) { qtdeItem = itemRequisicaoDto.getQtdeAprovada().doubleValue() - itemRequisicaoDto.getQtdeCotada().doubleValue(); } if (qtdeItem <= 0) { continue; } final CotacaoItemRequisicaoDTO cotacaoItemRequisicaoDto = new CotacaoItemRequisicaoDTO(); cotacaoItemRequisicaoDto.setIdColetaPreco(coletaPrecoDto.getIdColetaPreco()); cotacaoItemRequisicaoDto.setIdCotacao(cotacaoDto.getIdCotacao()); cotacaoItemRequisicaoDto.setIdItemRequisicaoProduto(itemRequisicaoDto.getIdItemRequisicaoProduto()); cotacaoItemRequisicaoDto.setIdSolicitacaoServico(itemRequisicaoDto.getIdSolicitacaoServico()); cotacaoItemRequisicaoDto.setQuantidade(qtdeItem); cotacaoItemRequisicaoDto.setQuantidadeEntregue(0.0); boolean bAprovado = itemRequisicaoDto.getAprovaCotacao() != null && itemRequisicaoDto.getAprovaCotacao().equals("N"); if (!bAprovado && itemRequisicaoDto.getValorAprovado() != null && itemRequisicaoDto.getValorAprovado().doubleValue() > 0) { final double valor = (coletaPrecoDto.getPreco() - coletaPrecoDto.getValorDesconto() + coletaPrecoDto.getValorAcrescimo()) / coletaPrecoDto.getQuantidadeCotada(); bAprovado = itemRequisicaoDto.getValorAprovado().doubleValue() >= valor; if (!bAprovado && itemRequisicaoDto.getPercVariacaoPreco() != null && itemRequisicaoDto.getPercVariacaoPreco().doubleValue() > 0) { final double perc = (valor / itemRequisicaoDto.getValorAprovado().doubleValue() - 1) * 100; bAprovado = perc <= itemRequisicaoDto.getPercVariacaoPreco().doubleValue(); } } if (bAprovado) { cotacaoItemRequisicaoDto.setSituacao(SituacaoCotacaoItemRequisicao.PreAprovado.name()); itemRequisicaoDto.setSituacao(SituacaoItemRequisicaoProduto.AguardandoPedido.name()); qtdeAprovada += qtdeItem; } else { cotacaoItemRequisicaoDto.setSituacao(SituacaoCotacaoItemRequisicao.AguardaAprovacao.name()); itemRequisicaoDto.setSituacao(SituacaoItemRequisicaoProduto.AguardandoAprovacaoCotacao.name()); } cotacaoItemRequisicaoDao.create(cotacaoItemRequisicaoDto); itemRequisicaoDto.setQtdeCotada(itemRequisicaoDto.getQtdeCotada().doubleValue() + qtdeItem); itemRequisicaoDao.update(itemRequisicaoDto); itemRequisicaoService.geraHistorico(tc, cotacaoDto.getUsuarioDto(), itemRequisicaoDto, AcaoItemRequisicaoProduto.Publicacao, "Publica��o dos resultados da cotacao No. " + cotacaoDto.getIdCotacao(), SituacaoItemRequisicaoProduto.valueOf(itemRequisicaoDto.getSituacao())); coletaPrecoDto.setQuantidadeAprovada(qtdeAprovada); coletaPrecoDao.update(coletaPrecoDto); qtdeCompra = qtdeCompra - qtdeItem; if (qtdeCompra == 0) { break; } } } } } } } cotacaoDto.setSituacao(SituacaoCotacao.Publicada.name()); cotacaoDao.atualizaSituacao(cotacaoDto); this.geraHistoricoSituacao(tc, cotacaoDto, SituacaoCotacao.Publicada); tc.commit(); tc.close(); } catch (final Exception e) { this.rollbackTransaction(tc, e); } } @Override public void reabreColetaPrecos(final CotacaoDTO cotacaoDto) throws Exception { final TransactionControler tc = new TransactionControlerImpl(this.getDao().getAliasDB()); try { tc.start(); this.reabreColetaPrecos(cotacaoDto, tc); tc.commit(); } catch (final Exception e) { tc.rollback(); } finally { tc.close(); } } public void reabreColetaPrecos(final CotacaoDTO cotacaoDto, final TransactionControler tc) throws Exception { final CotacaoDao cotacaoDao = new CotacaoDao(); final ColetaPrecoDao coletaPrecoDao = new ColetaPrecoDao(); final CotacaoItemRequisicaoDao cotacaoItemRequisicaoDao = new CotacaoItemRequisicaoDao(); final ItemRequisicaoProdutoDao itemRequisicaoDao = new ItemRequisicaoProdutoDao(); final ItemCotacaoDao itemCotacaoDao = new ItemCotacaoDao(); cotacaoDao.setTransactionControler(tc); coletaPrecoDao.setTransactionControler(tc); cotacaoItemRequisicaoDao.setTransactionControler(tc); itemRequisicaoDao.setTransactionControler(tc); itemCotacaoDao.setTransactionControler(tc); final Collection<ItemCotacaoDTO> colItens = itemCotacaoDao.findByIdCotacao(cotacaoDto.getIdCotacao()); if (colItens != null) { for (final ItemCotacaoDTO itemCotacaoDto : colItens) { final ExecucaoSolicitacaoService execucaoSolicitacaoService = new ExecucaoSolicitacaoServiceEjb(); final String loginUsuario = cotacaoDto.getUsuarioDto().getLogin(); final String motivo = "Reabertura das coletas de pre�os da cota��o"; final List<ColetaPrecoDTO> colColetas = (List<ColetaPrecoDTO>) coletaPrecoDao.findByIdItemCotacao(itemCotacaoDto.getIdItemCotacao()); if (colColetas != null) { new ItemRequisicaoProdutoServiceEjb(); for (final ColetaPrecoDTO coletaPrecoDto : colColetas) { coletaPrecoDto.setIdJustifResultado(null); coletaPrecoDto.setComplemJustifResultado(null); coletaPrecoDto.setIdRespResultado(null); coletaPrecoDto.setQuantidadeCalculo(null); coletaPrecoDto.setQuantidadeCompra(null); coletaPrecoDto.setQuantidadeAprovada(null); coletaPrecoDto.setQuantidadePedido(null); coletaPrecoDto.setResultadoCalculo(null); coletaPrecoDto.setResultadoFinal(null); coletaPrecoDto.setPontuacao(null); coletaPrecoDao.update(coletaPrecoDto); final Collection<CotacaoItemRequisicaoDTO> colItensCotacao = cotacaoItemRequisicaoDao.findByIdColetaPreco(coletaPrecoDto.getIdColetaPreco()); if (colItensCotacao != null) { for (final CotacaoItemRequisicaoDTO cotacaoItemRequisicaoDto : colItensCotacao) { if (cotacaoItemRequisicaoDto.getIdItemTrabalho() != null) { execucaoSolicitacaoService.cancelaTarefa(loginUsuario, cotacaoItemRequisicaoDto.getIdItemTrabalho(), motivo, tc); } // itemRequisicaoService.alteraSituacao(cotacaoDto.getUsuarioDto(), cotacaoItemRequisicaoDto.getIdItemRequisicaoProduto(), // SituacaoItemRequisicaoProduto.AguardandoPedido, "Cota��o No. "+cotacaoDto.getIdCotacao(), tc); cotacaoItemRequisicaoDao.delete(cotacaoItemRequisicaoDto); } } } } final Collection<ItemRequisicaoProdutoDTO> colItensRequisicao = itemRequisicaoDao.findByIdItemCotacao(itemCotacaoDto.getIdItemCotacao()); if (colItensRequisicao != null) { final ItemRequisicaoProdutoServiceEjb itemRequisicaoService = new ItemRequisicaoProdutoServiceEjb(); for (final ItemRequisicaoProdutoDTO itemRequisicaoDto : colItensRequisicao) { itemRequisicaoDto.setQtdeCotada(new Double(0.0)); itemRequisicaoDto.setSituacao(SituacaoItemRequisicaoProduto.AguardandoCotacao.name()); itemRequisicaoDao.update(itemRequisicaoDto); itemRequisicaoService.geraHistorico(tc, cotacaoDto.getUsuarioDto(), itemRequisicaoDto, AcaoItemRequisicaoProduto.Reabertura, "Reabertura das coletas de pre�o da cotacao No. " + cotacaoDto.getIdCotacao(), SituacaoItemRequisicaoProduto.valueOf(itemRequisicaoDto.getSituacao())); } } itemCotacaoDao.limpaMensagensValidacao(itemCotacaoDto); } } cotacaoDto.setSituacao(SituacaoCotacao.EmAndamento.name()); cotacaoDao.atualizaSituacao(cotacaoDto); this.geraHistoricoSituacao(tc, cotacaoDto, SituacaoCotacao.EmAndamento); } }