Subversion Repositories Integrator Subversion

Rev

Rev 346 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

package br.com.ec.repository.jpa;

import java.util.Date;
import java.util.List;

import javax.persistence.TypedQuery;

import org.springframework.stereotype.Repository;

import br.com.ec.core.util.DataUtils;
import br.com.ec.core.util.VerificadorUtil;
import br.com.ec.domain.dto.EntregaDTO;
import br.com.ec.domain.dto.ExtratoEntregasDTO;
import br.com.ec.domain.model.Pedido;
import br.com.ec.repository.PedidoRepository;
import br.com.ec.repository.SistemaAbstractRepository;

@Repository
public class PedidoRepositoryJpaImpl extends SistemaAbstractRepository<Pedido> implements PedidoRepository {

        @Override
        protected String getColunaOrdenadora() {
//              return "dataUltimaAlteracaoSituacao, dataPedido";
                return "dataPedido";
        }
       
        @Override
        public List<EntregaDTO> consultarEntregas(ExtratoEntregasDTO extratoEntregasDTO) {
                StringBuilder sql = new StringBuilder();
                sql.append("SELECT new br.com.ec.domain.dto.EntregaDTO(p.sequencial, p.dataPedido, p.dataEntrega, p.kilometragemEntrega) FROM Pedido p ");
                sql.append("WHERE p.dataEntrega >= :dataInicial AND p.dataEntrega <= :dataFinal ");
                sql.append("ORDER BY dataEntrega ");
                try {
                        TypedQuery<EntregaDTO> query = getEntityManager().createQuery(sql.toString(), EntregaDTO.class);
                        query.setParameter("dataInicial", DataUtils.getDataComHorarioMinimo(extratoEntregasDTO.getVigenciaDTO().getDataInicio()));
                        query.setParameter("dataFinal", DataUtils.getDataComHorarioMaximo(extratoEntregasDTO.getVigenciaDTO().getDataFim()));
                        return query.getResultList();
                } catch(Exception ex) {
                        ex.printStackTrace();
                        return null;
                }
        }
       
        @Override
        public Integer obterQuantidadePedidosPorSituacaoEePeriodo(String tipoPedido, String tipoSituacaoPedido, Date dataInicial, Date dataFinal) {
                StringBuilder sql = new StringBuilder();
                sql.append("SELECT COUNT(p) FROM Pedido p ");
                sql.append("WHERE p.tipoSituacao = :tipoSituacao ");
                if (VerificadorUtil.naoEstaNuloOuVazio(tipoPedido)) {
                        sql.append("AND p.tipoPedido = :tipoPedido ");
                }
                if (VerificadorUtil.naoEstaNulo(dataInicial)) {
                        sql.append("AND p.dataUltimaAlteracaoSituacao >= :dataInicial ");
                }
                sql.append("AND p.dataUltimaAlteracaoSituacao <= :dataFinal ");
                TypedQuery<Long> query = getEntityManager().createQuery(sql.toString(), Long.class);
                if (VerificadorUtil.naoEstaNulo(tipoPedido)) {
                        query.setParameter("tipoPedido", tipoPedido);
                }
                if (VerificadorUtil.naoEstaNulo(dataInicial)) {
                        query.setParameter("dataInicial", DataUtils.getDataComHorarioMinimo(dataInicial));
                }
                query.setParameter("dataFinal", DataUtils.getDataComHorarioMaximo(dataFinal));
                query.setParameter("tipoSituacao", tipoSituacaoPedido);
                return query.getSingleResult().intValue();
               
        }
       
        /*
        @Override
        protected void setarStringParametrosConsulta(StringBuilder sql, ParametrosConsulta<Pedido> parametros) {
                if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaPedidoDTO)parametros).getEntidade())) {
                        if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaPedidoDTO)parametros).getEntidade().getSequencial())) {
                                sql.append("AND e.sequencial = :sequencial ");
                        } else {
                                if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaPedidoDTO)parametros).getEntidade().getContatoCliente())) {
                                        sql.append("AND (");
                                        sql.append(sqlConsultarSemAcento("e.contatoCliente") + " LIKE upper(:contatoCliente) ");
                                        sql.append("OR EXISTS (SELECT c FROM Cliente c WHERE c.sequencial = e.cliente.sequencial AND ( ");
                                        sql.append(sqlConsultarSemAcento("e.cliente.nome") + " LIKE upper(:contatoCliente) OR ");
                                        sql.append("e.cliente.telefone LIKE upper(:contatoCliente) OR e.cliente.contato LIKE upper(:contatoCliente)))");
                                        sql.append(") ");
                                }
                                if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaPedidoDTO)parametros).getEntidade().getTipoSituacao())) {
                                        sql.append("AND e.tipoSituacao = :tipoSituacao ");
                                }
                                if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaPedidoDTO)parametros).getEntidade().getLoja())) {
                                        sql.append("AND e.loja.sequencial = :sequencialLoja ");
                                }
                                if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaPedidoDTO)parametros).getEntidade().getObservacao())) {
                                        sql.append("AND ");
                                        sql.append(sqlConsultarSemAcento("e.observacao"));
                                        sql.append(" LIKE upper(:observacaoPedido) ");
                                }
                                if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaPedidoDTO)parametros).getEntidade().getModelo())) {
                                        sql.append("AND e.modelo.sequencial = :sequencialModelo ");
                                }
                                if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaPedidoDTO)parametros).getEntidade().getTipoPedido())) {
                                        sql.append("AND e.tipoPedido = :tipoPedido ");
                                }
                                if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaPedidoDTO)parametros).getAtendido())) {
                                        if (((ParametrosConsultaPedidoDTO)parametros).getAtendido()) {
                                                sql.append("AND e.tipoSituacao IN (" + TipoSituacaoPedido.tipoSituacoesAtendidos() + ") ");
                                        } else {
                                                sql.append("AND e.tipoSituacao NOT IN (" + TipoSituacaoPedido.tipoSituacoesAtendidos() + ") ");
                                        }
                                }
                                if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaPedidoDTO)parametros).getValidos())) {
                                        if (((ParametrosConsultaPedidoDTO)parametros).getValidos()) {
                                                sql.append("AND e.tipoSituacao != '" + TipoSituacaoPedido.INVALIDO.getValor() + "' ");
                                        }
                                }
                                if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaPedidoDTO)parametros).getCompraSolicitada())) {
                                        if (((ParametrosConsultaPedidoDTO)parametros).getCompraSolicitada()) {
                                                sql.append("AND e.dataSolicitadoParaComprar != NULL ");
                                        } else {
                                                sql.append("AND e.dataSolicitadoParaComprar IS NULL ");
                                        }
                                }
                        }
                }
                if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaPedidoDTO)parametros).getPessoa())) {
                        sql.append("AND e.usuarioPedido.pessoa.sequencial = :sequencialPessoa ");
                }
                if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaPedidoDTO)parametros).getDataInicial())
                                && VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaPedidoDTO)parametros).getDataFinal())) {
                        sql.append("AND e.dataPedido >= :dataInicial ");
                        sql.append("AND e.dataPedido <= :dataFinal ");
                }
        }
       
        @Override
        protected void setarQueryParametrosConsulta(Query query, ParametrosConsulta<Pedido> parametros) {
                if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaPedidoDTO)parametros).getEntidade())) {
                        if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaPedidoDTO)parametros).getEntidade().getSequencial())) {
                                query.setParameter("sequencial", ((ParametrosConsultaPedidoDTO)parametros).getEntidade().getSequencial());
                        } else {
                                if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaPedidoDTO)parametros).getEntidade().getContatoCliente())) {
                                        query.setParameter("contatoCliente", "%" + removerAcentuacao(((ParametrosConsultaPedidoDTO)parametros).getEntidade().getContatoCliente()) + "%");
                                }
                                if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaPedidoDTO)parametros).getEntidade().getTipoSituacao())) {
                                        query.setParameter("tipoSituacao", ((ParametrosConsultaPedidoDTO)parametros).getEntidade().getTipoSituacao());
                                }
                                if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaPedidoDTO)parametros).getEntidade().getTipoPedido())) {
                                        query.setParameter("tipoPedido", ((ParametrosConsultaPedidoDTO)parametros).getEntidade().getTipoPedido());
                                }
                                if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaPedidoDTO)parametros).getEntidade().getLoja())) {
                                        query.setParameter("sequencialLoja", ((ParametrosConsultaPedidoDTO)parametros).getEntidade().getSequencialDaLoja());                    }
                                if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaPedidoDTO)parametros).getEntidade().getObservacao())) {
                                        query.setParameter("observacaoPedido", "%" + removerAcentuacao(((ParametrosConsultaPedidoDTO)parametros).getEntidade().getObservacao()) + "%");
                                }
                                if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaPedidoDTO)parametros).getEntidade().getModelo())) {
                                        query.setParameter("sequencialModelo", ((ParametrosConsultaPedidoDTO)parametros).getEntidade().getSequencialDoModelo());
                                }
                        }
                }
                if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaPedidoDTO)parametros).getPessoa())) {
                        query.setParameter("sequencialPessoa", ((ParametrosConsultaPedidoDTO)parametros).getPessoa().getSequencial());
                }
                if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaPedidoDTO)parametros).getDataInicial())
                                && VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaPedidoDTO)parametros).getDataFinal())) {
                        Date dataInicial = DataUtils.getDataComHorarioMinimo(((ParametrosConsultaPedidoDTO)parametros).getDataInicial());
                        Date dataFinal = DataUtils.getDataComHorarioMaximo(((ParametrosConsultaPedidoDTO)parametros).getDataFinal());
                        query.setParameter("dataInicial", dataInicial);
                        query.setParameter("dataFinal", dataFinal);
                }
        }
       
        @Override
        protected void setarStringParametrosConsultar(StringBuilder sql, Pedido pedido) {
                if (VerificadorUtil.naoEstaNuloOuVazio(pedido)) {
                        if (VerificadorUtil.naoEstaNuloOuVazio(pedido.getTipoSituacao())) {
                                sql.append("AND e.tipoSituacao = :tipoSituacao ");
                        }
                        if (VerificadorUtil.naoEstaNuloOuVazio(pedido.getTipoPedido())) {
                                sql.append("AND e.tipoPedido = :tipoPedido ");
                        }
                        if (VerificadorUtil.naoEstaNuloOuVazio(pedido.getLoja())) {
                                sql.append("AND e.loja.sequencial = :sequencialLoja ");
                        }
                        if (VerificadorUtil.naoEstaNuloOuVazio(pedido.getObservacao())) {
                                sql.append("AND ");
                                sql.append(sqlConsultarSemAcento("e.observacao"));
                                sql.append(" like upper(:observacaoPedido) ");
                        }
                        if (VerificadorUtil.naoEstaNuloOuVazio(pedido.getModelo())) {
                                sql.append("AND e.modelo.sequencial = :sequencialModelo ");
                        }
                }
        }
       
        @Override
        protected void setarQueryParametrosConsultar(Query query, Pedido pedido) {
                if (VerificadorUtil.naoEstaNuloOuVazio(pedido)) {
                        if (VerificadorUtil.naoEstaNuloOuVazio(pedido.getTipoSituacao())) {
                                query.setParameter("tipoSituacao", pedido.getTipoSituacao());
                        }
                        if (VerificadorUtil.naoEstaNuloOuVazio(pedido.getTipoPedido())) {
                                query.setParameter("tipoPedido", pedido.getTipoPedido());
                        }
                        if (VerificadorUtil.naoEstaNuloOuVazio(pedido.getLoja())) {
                                query.setParameter("sequencialLoja", pedido.getSequencialDaLoja());                     }
                        if (VerificadorUtil.naoEstaNuloOuVazio(pedido.getObservacao())) {
                                query.setParameter("observacaoPedido", "%" + removerAcentuacao(pedido.getObservacao()) + "%");
                        }
                        if (VerificadorUtil.naoEstaNuloOuVazio(pedido.getModelo())) {
                                query.setParameter("sequencialModelo", pedido.getSequencialDoModelo());
                        }
                }
        }
       
        @Override
        public Pedido consultarPedidoCompleto(Pedido pedido) {
                StringBuilder jpql = new StringBuilder();
                try {
                        jpql.append("SELECT p FROM Pedido p ");
                        jpql.append("LEFT JOIN FETCH p.historico h ");
                        jpql.append("WHERE p = :pedido");
                        return getEntityManager().createQuery(jpql.toString(), Pedido.class).setParameter("pedido", pedido).getSingleResult();
                } catch (NoResultException e) {
                        return null;
                }
        }
       
        @Override
        public Pedido consultarPedidoCompletoDaVenda(Venda venda) {
                StringBuilder jpql = new StringBuilder();
                try {
                        jpql.append("SELECT p FROM Pedido p ");
                        jpql.append("LEFT JOIN FETCH p.historico h ");
                        jpql.append("WHERE p.venda = :venda");
                        return getEntityManager().createQuery(jpql.toString(), Pedido.class).setParameter("venda", venda).getSingleResult();
                } catch (NoResultException e) {
                        return null;
                }
        }
       
        @Override
        public List<RankingPedidoDTO> consultarRankingPedidosNaoAtendidos(String generoPedidos, Date dataInicial, Date dataFinal) {
                StringBuilder sql = new StringBuilder();
                sql.append("SELECT new br.com.ec.domain.dto.RankingPedidoDTO(p.modelo, COUNT(p.modelo)) FROM Pedido p ");
                sql.append("WHERE p.dataPedido >= :dataInicial AND p.dataPedido <= :dataFinal ");
                sql.append("AND p.tipoSituacao not in (" + TipoSituacaoPedido.tipoSituacoesAtendidos() + ") ");
                if (VerificadorUtil.naoEstaNuloOuVazio(generoPedidos)) {
                        sql.append("AND p.genero = :genero ");
                }
                sql.append("GROUP BY p.modelo ");
                sql.append("ORDER BY COUNT(p.modelo) DESC ");
                try {
                        TypedQuery<RankingPedidoDTO> query = getEntityManager().createQuery(sql.toString(), RankingPedidoDTO.class);
                        query.setParameter("dataInicial", DataUtils.getDataComHorarioMinimo(dataInicial));
                        query.setParameter("dataFinal", DataUtils.getDataComHorarioMaximo(dataFinal));
                        if (VerificadorUtil.naoEstaNulo(generoPedidos)) {
                                query.setParameter("genero", generoPedidos);
                        }
                        return query.getResultList();
                } catch(Exception ex) {
                        ex.printStackTrace();
                        return null;
                }
        }
       
        @Override
        public List<RankingPedidoDTO> consultarRankingPedidos(String generoPedidos, Date dataInicial, Date dataFinal) {
                StringBuilder sql = new StringBuilder();
                sql.append("SELECT new br.com.ec.domain.dto.RankingPedidoDTO(p.modelo, COUNT(p.modelo)) FROM Pedido p ");
                sql.append("WHERE p.dataPedido >= :dataInicial AND p.dataPedido <= :dataFinal ");
                if (VerificadorUtil.naoEstaNuloOuVazio(generoPedidos)) {
                        sql.append("AND p.genero = :genero ");
                }
                sql.append("GROUP BY p.modelo ");
                sql.append("ORDER BY COUNT(p.modelo) DESC ");
                try {
                        TypedQuery<RankingPedidoDTO> query = getEntityManager().createQuery(sql.toString(), RankingPedidoDTO.class);
                        if (VerificadorUtil.naoEstaNulo(generoPedidos)) {
                                query.setParameter("genero", generoPedidos);
                        }
                        query.setParameter("dataInicial", DataUtils.getDataComHorarioMinimo(dataInicial));
                        query.setParameter("dataFinal", DataUtils.getDataComHorarioMaximo(dataFinal));
                        return query.getResultList();
                } catch(Exception ex) {
                        ex.printStackTrace();
                        return null;
                }
        }
       
        @Override
        public Integer obterQuantidadePedidosPorSituacao(String tipoPedido, String tipoSituacaoPedido) {
                StringBuilder sql = new StringBuilder();
                sql.append("SELECT COUNT(p) FROM Pedido p ");
                sql.append("WHERE p.tipoSituacao = :tipoSituacao ");
                if (VerificadorUtil.naoEstaNuloOuVazio(tipoPedido)) {
                        sql.append("AND p.tipoPedido = :tipoPedido ");
                }
                TypedQuery<Long> query = getEntityManager().createQuery(sql.toString(), Long.class);
                if (VerificadorUtil.naoEstaNulo(tipoPedido)) {
                        query.setParameter("tipoPedido", tipoPedido);
                }
                query.setParameter("tipoSituacao", tipoSituacaoPedido);
                return query.getSingleResult().intValue();
        }
       
        @Override
        public void excluirHistoricosDoPedido(Pedido pedido) {
                StringBuilder sql = new StringBuilder();
                sql.append("DELETE FROM PedidoHistorico ph ");
                sql.append("WHERE ph.pedido = :pedido ");
                try {
                        getEntityManager().createQuery(sql.toString())
                                .setParameter("pedido", pedido)
                                .executeUpdate();
                        getEntityManager().flush();
                } catch(Exception ex) {
                        ex.printStackTrace();
                }
        }
       
        @Override
        public void solicitarEntrarEmContatoCasoExistaPedidoParaLojaSolicitante(Loja lojaEntrada, Produto produto) {
                StringBuilder sql = new StringBuilder();
                sql.append("UPDATE Pedido ppc SET ppc.usuarioAtendimento = null, ppc.dataUltimaAlteracaoSituacao = now(), ppc.tipoSituacao = '" + TipoSituacaoPedido.ENTRAR_EM_CONTATO.getValor() + "' ");
                sql.append("WHERE ppc.loja = :lojaEntrada ");
                sql.append("AND ppc.tipoSituacao NOT IN (" + TipoSituacaoPedido.tipoSituacoesNaoPendentes() + ") ");
                sql.append("AND ppc in (SELECT pp.pedido FROM PedidoProduto pp WHERE pp.pedido = ppc AND pp.produto = :produto) ");
                try {
                        getEntityManager().createQuery(sql.toString())
                                .setParameter("lojaEntrada", lojaEntrada)
                                .setParameter("produto", produto)
                                .executeUpdate();
                        getEntityManager().flush();
                } catch(Exception ex) {
                        ex.printStackTrace();
                }
        }
       
        @Override
        public List<PedidoProduto> consultarPedidosNaoAtendidos(Produto produto) {
                StringBuilder sql = new StringBuilder();
                try {
                        sql.append("SELECT pp FROM PedidoProduto pp ");
                        sql.append("WHERE pp.produto.sequencial = :sequencialProduto ");
                        sql.append("AND pp.pedido.tipoSituacao NOT IN (" + TipoSituacaoPedido.tipoSituacoesAtendidos() + ") ");
                        TypedQuery<PedidoProduto> query = getEntityManager().createQuery(sql.toString(), PedidoProduto.class);
                        query.setParameter("sequencialProduto", produto.getSequencial());
                        return query.getResultList();
                } catch(Exception ex) {
                        ex.printStackTrace();
                        return null;
                }
        }
       
        @Override
        public List<Pedido> consultarPedidosDoCliente(Cliente cliente) {
                StringBuilder sql = new StringBuilder();
                try {
                        sql.append("SELECT p FROM Pedido p ");
                        sql.append("WHERE p.cliente = :cliente ");
                        TypedQuery<Pedido> query = getEntityManager().createQuery(sql.toString(), Pedido.class);
                        query.setParameter("cliente", cliente);
                        return query.getResultList();
                } catch(Exception ex) {
                        ex.printStackTrace();
                        return null;
                }
        }
       
        @Override
        public List<Pedido> consultarPedidosDoProdutoOuModeloPendentes(Produto produto) {
                StringBuilder sql = new StringBuilder();
                try {
                        sql.append("SELECT p FROM Pedido p ");
                        sql.append("WHERE p.tipoPedido = '" + TipoPedido.RESERVA.getValor() + "' ");
                        sql.append("AND p.tipoSituacao NOT IN (" + TipoSituacaoPedido.tipoSituacoesNaoPendentes() + ") ");
                        sql.append("AND ((p.modelo.sequencial = :modeloProduto ");
                        sql.append("AND (p.tipoProduto = :tipoProduto OR p.tipoProduto IS NULL) ");
                        if (!produto.getGenero().equals(TipoGenero.UNISSEX.getValor())) {
                                sql.append("AND (p.genero = :generoProduto OR p.genero IS NULL)) ");
                        } else {
                                sql.append(") ");
                        }
                        sql.append("OR p in (SELECT pp.pedido FROM PedidoProduto pp WHERE pp.pedido = p AND pp.produto.sequencial = :sequencialProduto)) ");
                       
                        TypedQuery<Pedido> query = getEntityManager().createQuery(sql.toString(), Pedido.class);
                        query.setParameter("modeloProduto", produto.getSequencialDoModelo());
                        query.setParameter("tipoProduto", produto.getTipo());
                        if (!produto.getGenero().equals(TipoGenero.UNISSEX.getValor())) {
                                query.setParameter("generoProduto", produto.getGenero());
                        }
                        query.setParameter("sequencialProduto", produto.getSequencial());
                        return query.getResultList();
                } catch(Exception ex) {
                        ex.printStackTrace();
                        return null;
                }
        }
        */

}