Subversion Repositories Integrator Subversion

Rev

Rev 721 | 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.NoResultException;
import javax.persistence.Query;
import javax.persistence.TypedQuery;

import org.springframework.stereotype.Repository;

import br.com.ec.core.consulta.ParametrosConsulta;
import br.com.ec.core.util.VerificadorUtil;
import br.com.ec.domain.dto.FormaPagamentoDTO;
import br.com.ec.domain.dto.ParcelaDTO;
import br.com.ec.domain.dto.consulta.ParametrosConsultaLancamentosDTO;
import br.com.ec.domain.dto.consulta.ParametrosConsultaParcelasDTO;
import br.com.ec.domain.model.FormaPagamento;
import br.com.ec.domain.model.Parcela;
import br.com.ec.repository.ParcelaRepository;
import br.com.ec.repository.SistemaAbstractRepository;

@Repository
public class ParcelaRepositoryJpaImpl extends SistemaAbstractRepository<Parcela> implements ParcelaRepository {

        @Override
        protected String getColunaOrdenadora() {
                return "sequencial";
        }
       
        @Override
        protected void setarStringParametrosConsulta(StringBuilder sql, ParametrosConsulta<Parcela> parametrosConsulta) {
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta)) {
                        if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaLancamentosDTO)parametrosConsulta).getVigencia())) {
                                if (((ParametrosConsultaLancamentosDTO)parametrosConsulta).getVigencia().getSequencial().equals(new Long(-1))) {
                                        sql.append("AND e.conta.vigencia IS NULL ");
                                } else {
                                        sql.append("AND e.conta.vigencia.sequencial = :sequencialVigencia ");
                                }
                        }
                       
                        if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaLancamentosDTO) parametrosConsulta).getCentroDeCustos())) {
                                if (((ParametrosConsultaLancamentosDTO)parametrosConsulta).getCentroDeCustos().getSequencial().equals(new Long(-1))) {
                                        sql.append("AND e.conta.loja IS NULL ");
                                } else {
                                        sql.append("AND e.conta.loja.sequencial = :sequencialCentroDeCustos ");
                                }
                        }
                       
                        if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaLancamentosDTO)parametrosConsulta).getIndicadorDre())) {
                                sql.append("AND e.conta.categoria.indicadorDRE.codigo = :codigoIndicadorDre ");
                        } else if (((ParametrosConsultaLancamentosDTO)parametrosConsulta).getPagamentoRealizado()) {
                                if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaLancamentosDTO)parametrosConsulta).getDataInicialDoPeriodo()) &&
                                                VerificadorUtil.naoEstaNulo(((ParametrosConsultaLancamentosDTO)parametrosConsulta).getDataFinalDoPeriodo())) {
                                        sql.append("AND e.dataPagamento is not null ");
                                        sql.append("AND e.dataPagamento >= :dataInicial AND e.dataPagamento <= :dataFinal ");
                                }
                        } else {
                                sql.append("AND e.dataPagamento is null ");
                                if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaLancamentosDTO)parametrosConsulta).getDataVencimento())) {
                                        sql.append("AND e.dataVencimento = :dataVencimento ");
                                }
                                /*
                                if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaLancamentosDTO)parametrosConsulta).getTipoFormaDePagamento())) {
                                        if (((ParametrosConsultaLancamentosDTO)parametrosConsulta).getTipoFormaDePagamento().equals(TipoCartao.DEBITO.getValor())) {
                                                sql.append("AND e.conta.formaDePagamento.formaPagamento.codigo = 2 ");
                                        } else if (((ParametrosConsultaLancamentosDTO)parametrosConsulta).getTipoFormaDePagamento().equals(TipoCartao.CREDITO.getValor())) {
                                                sql.append("AND e.conta.formaDePagamento.formaPagamento.codigo in (3, 4, 5, 7, 8, 9, 10, 11, 12, 13) ");
                                        }
                                }
                                */

                        }
                        /*
                        if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaLancamentosDTO)parametrosConsulta).getContaBancaria())) {
                                sql.append("AND e.contaBancaria.sequencial = :sequencialContaBancaria ");
                        }
                        if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaLancamentosDTO)parametrosConsulta).getTipoBusca())) {
                                if (((ParametrosConsultaLancamentosDTO)parametrosConsulta).getTipoBusca().equals("R")) {
                                        sql.append("AND e.conta.tipoConta = 'R' ");
                                }
                                if (((ParametrosConsultaLancamentosDTO)parametrosConsulta).getTipoBusca().equals("P")) {
                                        sql.append("AND e.conta.tipoConta = 'P' ");
                                }
                        }
                       
                       
                       
                        if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaLancamentosDTO)parametrosConsulta).getCategoria())) {
                                sql.append("AND e.conta.categoria.sequencial = :sequencialCategoria ");
                        }
                       
                        if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaLancamentosDTO)parametrosConsulta).getFavorecido())) {
                                sql.append("AND e.conta.pessoa.sequencial = :sequencialPessoa ");
                        }
                       
                        if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaLancamentosDTO)parametrosConsulta).getFavorecido())) {
                                sql.append("AND e.conta.pessoa.sequencial = :sequencialPessoa ");
                        }
                        if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaLancamentosDTO)parametrosConsulta).getObservacao())) {
                                sql.append("AND upper(e.observacao) like upper(:observacao) ");
                        }
                       
                        if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaLancamentosDTO)parametrosConsulta).getOficial())) {
                                if (((ParametrosConsultaLancamentosDTO)parametrosConsulta).getOficial()) {
                                        sql.append("AND e.indicadorOficial IS TRUE ");
                                } else {
                                        sql.append("AND e.indicadorOficial IS FALSE ");
                                }
                        }
                         */

                }
        }
       
        @Override
        protected void setarQueryParametrosConsulta(Query query, ParametrosConsulta<Parcela> parametrosConsulta) {
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta)) {
                        if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaLancamentosDTO)parametrosConsulta).getVigencia())) {
                                if (!((ParametrosConsultaLancamentosDTO)parametrosConsulta).getVigencia().getSequencial().equals(new Long(-1))) {
                                        query.setParameter("sequencialVigencia", ((ParametrosConsultaLancamentosDTO) parametrosConsulta).getVigencia().getSequencial());
                                }
                        }
                       
                        if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaLancamentosDTO) parametrosConsulta).getCentroDeCustos())) {
                                if (!((ParametrosConsultaLancamentosDTO)parametrosConsulta).getCentroDeCustos().getSequencial().equals(new Long(-1))) {
                                        query.setParameter("sequencialCentroDeCustos", ((ParametrosConsultaLancamentosDTO) parametrosConsulta).getCentroDeCustos().getSequencial());
                                }
                        }
                       
                        if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaLancamentosDTO)parametrosConsulta).getIndicadorDre())) {
                                query.setParameter("codigoIndicadorDre", ((ParametrosConsultaLancamentosDTO) parametrosConsulta).getIndicadorDre().getCodigo());
                        }
                       
                        if (((ParametrosConsultaLancamentosDTO)parametrosConsulta).getPagamentoRealizado()) {
                                if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaLancamentosDTO)parametrosConsulta).getDataInicialDoPeriodo()) &&
                                                VerificadorUtil.naoEstaNulo(((ParametrosConsultaLancamentosDTO)parametrosConsulta).getDataFinalDoPeriodo())) {
                                        query.setParameter("dataInicial", ((ParametrosConsultaLancamentosDTO)parametrosConsulta).getDataInicialDoPeriodo());
                                        query.setParameter("dataFinal", ((ParametrosConsultaLancamentosDTO)parametrosConsulta).getDataFinalDoPeriodo());
                                }
                        } else if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaLancamentosDTO)parametrosConsulta).getDataVencimento())) {
                                query.setParameter("dataVencimento", ((ParametrosConsultaLancamentosDTO)parametrosConsulta).getDataVencimento());
                        }
                }
                /*
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta)) {
                        if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaLancamentosDTO)parametrosConsulta).getContaBancaria())) {
                                query.setParameter("sequencialContaBancaria", ((ParametrosConsultaLancamentosDTO)parametrosConsulta).getContaBancaria().getSequencial());
                        }
                        if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaLancamentosDTO)parametrosConsulta).getCategoria())) {
                                query.setParameter("sequencialCategoria", ((ParametrosConsultaLancamentosDTO) parametrosConsulta).getCategoria().getSequencial());
                        }
                       
                        if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaLancamentosDTO)parametrosConsulta).getFavorecido())) {
                                query.setParameter("sequencialPessoa", ((ParametrosConsultaLancamentosDTO) parametrosConsulta).getFavorecido().getSequencial());
                        }
                       
                        if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaLancamentosDTO)parametrosConsulta).getObservacao())) {
                                query.setParameter("observacao", "%" + ((ParametrosConsultaLancamentosDTO) parametrosConsulta).getObservacao() + "%");
                        }
                }
                */

        }
       
        @Override
        protected void setarStringParametrosConsultar(StringBuilder sql, Parcela parcela) {
                /*
                if (VerificadorUtil.naoEstaNulo(parcela)) {
                        if (VerificadorUtil.naoEstaNuloOuVazio(parcela.getConta())) {
                                if (VerificadorUtil.naoEstaNuloOuVazio(parcela.getConta().getSequencial())) {
                                        sql.append("AND e.conta.sequencial = :sequencialConta ");
                                }
                        }
                        if (VerificadorUtil.naoEstaNuloOuVazio(parcela.getIndicadorAtivo())) {
                                sql.append("AND e.indicadorAtivo = :indicadorAtivo ");
                        }
                }
                */

        }
       
        @Override
        protected void setarQueryParametrosConsultar(Query query, Parcela parcela) {
                /*
                if (VerificadorUtil.naoEstaNulo(parcela)) {
                        if (VerificadorUtil.naoEstaNuloOuVazio(parcela.getConta())) {
                                if (VerificadorUtil.naoEstaNuloOuVazio(parcela.getConta().getSequencial())) {
                                        query.setParameter("sequencialConta", parcela.getConta().getSequencial());
                                }
                        }
                        if (VerificadorUtil.naoEstaNuloOuVazio(parcela.getIndicadorAtivo())) {
                                query.setParameter("indicadorAtivo", parcela.getIndicadorAtivo());
                        }
                }
                */

        }
       
        @Override
        public List<ParcelaDTO> consultarParcelas(ParametrosConsultaParcelasDTO parametrosConsultaParcelasDTO) {
                StringBuilder sql = new StringBuilder();
                sql.append("SELECT new br.com.ec.domain.dto.ParcelaDTO(");
                sql.append(ParcelaDTO.CONSULTA_COMPLETA_DTO);
                sql.append(") FROM Parcela e ");
                sql.append("WHERE e.indicadorAtivo is true ");
                if (VerificadorUtil.naoEstaNulo(parametrosConsultaParcelasDTO.getTipoBusca())) {
                        sql.append("AND e.conta.tipoConta = :tipoConta ");
                }
                if (VerificadorUtil.naoEstaNulo(parametrosConsultaParcelasDTO.getSequencialCategoria())) {
                        sql.append("AND e.conta.categoria.sequencial = :sequencialCategoria ");
                }
                if (VerificadorUtil.naoEstaNulo(parametrosConsultaParcelasDTO.getSequencialContaBancaria())) {
                        sql.append("AND e.contaBancaria.sequencial = :sequencialContaBancaria ");
                }
                if (parametrosConsultaParcelasDTO.getPagamentoRealizado()) {
                        if (VerificadorUtil.naoEstaNulo(parametrosConsultaParcelasDTO.getDataInicial()) &&
                                        VerificadorUtil.naoEstaNulo(parametrosConsultaParcelasDTO.getDataFinal())) {
                                sql.append("AND e.dataPagamento is not null ");
                                sql.append("AND e.dataPagamento >= :dataInicial AND e.dataPagamento <= :dataFinal ");
                        }
                }
                sql.append("ORDER BY e.dataVencimento ");
                try {
                        TypedQuery<ParcelaDTO> query = getEntityManager().createQuery(sql.toString(), ParcelaDTO.class);
                        if (VerificadorUtil.naoEstaNulo(parametrosConsultaParcelasDTO.getTipoBusca())) {
                                query.setParameter("tipoConta", parametrosConsultaParcelasDTO.getTipoBusca());
                        }
                        if (VerificadorUtil.naoEstaNulo(parametrosConsultaParcelasDTO.getSequencialCategoria())) {
                                query.setParameter("sequencialCategoria", parametrosConsultaParcelasDTO.getSequencialCategoria());
                        }
                        if (VerificadorUtil.naoEstaNulo(parametrosConsultaParcelasDTO.getSequencialContaBancaria())) {
                                query.setParameter("sequencialContaBancaria", parametrosConsultaParcelasDTO.getSequencialContaBancaria());
                        }
                        if (parametrosConsultaParcelasDTO.getPagamentoRealizado()) {
                                if (VerificadorUtil.naoEstaNulo(parametrosConsultaParcelasDTO.getDataInicial()) &&
                                                VerificadorUtil.naoEstaNulo(parametrosConsultaParcelasDTO.getDataFinal())) {
                                        query.setParameter("dataInicial", parametrosConsultaParcelasDTO.getDataInicial());
                                        query.setParameter("dataFinal", parametrosConsultaParcelasDTO.getDataFinal());
                                }
                        }
                        return query.getResultList();
                } catch(Exception ex) {
                        ex.printStackTrace();
                        return null;
                }
        }
       
        @Override
        public List<ParcelaDTO> consultarParcelas(Long sequencialContaBancaria, Date dataRecebimento, List<FormaPagamentoDTO> formasDePagamento) {
                StringBuilder sql = new StringBuilder();
                sql.append("SELECT new br.com.ec.domain.dto.ParcelaDTO(");
                sql.append(ParcelaDTO.CONSULTA_SEM_CATEGORIA_DTO);
                sql.append(") FROM Parcela e ");
                sql.append("WHERE e.contaBancaria.sequencial = :sequencialContaBancaria ");
                sql.append("AND e.dataVencimento = :dataVencimento ");
                sql.append("AND (e.dataPagamento is null OR e.dataPagamento = :dataVencimento) ");
                sql.append(setarParametrosFormasDePagamento("e", formasDePagamento));
                sql.append("AND e.indicadorAtivo is true ");
                sql.append("ORDER BY e.dataVencimento ");
                try {
                        return getEntityManager().createQuery(sql.toString(), ParcelaDTO.class)
                                        .setParameter("sequencialContaBancaria", sequencialContaBancaria)
                                        .setParameter("dataVencimento", dataRecebimento)
                                        .getResultList();
                } catch(Exception ex) {
                        ex.printStackTrace();
                        return null;
                }
        }
       
        @Override
        public List<ParcelaDTO> consultarParcelas(Long sequencialContaBancaria, Date dataRecebimentoInicial, Date dataRecebimentoFinal, List<FormaPagamentoDTO> formasDePagamento) {
                StringBuilder sql = new StringBuilder();
                sql.append("SELECT new br.com.ec.domain.dto.ParcelaDTO(");
                sql.append(ParcelaDTO.CONSULTA_SEM_CATEGORIA_DTO);
                sql.append(") FROM Parcela e ");
                sql.append("WHERE e.contaBancaria.sequencial = :sequencialContaBancaria ");
                sql.append("AND e.dataVencimento >= :dataRecebimentoInicial AND e.dataVencimento <= :dataRecebimentoFinal ");
                sql.append("AND (e.dataPagamento is null OR ");
                sql.append("(e.dataPagamento >= :dataRecebimentoInicial AND e.dataPagamento <= :dataRecebimentoFinal)) ");
                sql.append(setarParametrosFormasDePagamento("e", formasDePagamento));
                sql.append("AND e.indicadorAtivo is true ");
                sql.append("ORDER BY e.dataVencimento ");
                try {
                        return getEntityManager().createQuery(sql.toString(), ParcelaDTO.class)
                                        .setParameter("sequencialContaBancaria", sequencialContaBancaria)
                                        .setParameter("dataRecebimentoInicial", dataRecebimentoInicial)
                                        .setParameter("dataRecebimentoFinal", dataRecebimentoFinal)
                                        .getResultList();
                } catch(Exception ex) {
                        ex.printStackTrace();
                        return null;
                }
        }
       
        @Override
        public List<ParcelaDTO> consultarParcelas(String sqlConsulta) {
                try {
                        return getEntityManager().createQuery(sqlConsulta, ParcelaDTO.class).getResultList();
                } catch(Exception ex) {
                        ex.printStackTrace();
                        return null;
                }
        }
       
        @Override
        public List<ParcelaDTO> consultarParcelasAReceber(Long sequencialContaBancaria, Date dataRecebimento, List<FormaPagamentoDTO> formasDePagamento) {
                StringBuilder sql = new StringBuilder();
                sql.append("SELECT new br.com.ec.domain.dto.ParcelaDTO(");
                sql.append(ParcelaDTO.CONSULTA_SEM_CATEGORIA_DTO);
                sql.append(") FROM Parcela e ");
                sql.append("WHERE e.contaBancaria.sequencial = :sequencialContaBancaria ");
                sql.append("AND e.dataVencimento = :dataVencimento ");
                sql.append(setarParametrosFormasDePagamento("e", formasDePagamento));
                sql.append("AND e.dataPagamento is null ");
                sql.append("AND e.indicadorAtivo is true ");
                sql.append("ORDER BY e.dataVencimento ");
                try {
                        return getEntityManager().createQuery(sql.toString(), ParcelaDTO.class)
                                        .setParameter("sequencialContaBancaria", sequencialContaBancaria)
                                        .setParameter("dataVencimento", dataRecebimento)
                                        .getResultList();
                } catch(Exception ex) {
                        ex.printStackTrace();
                        return null;
                }
        }
       
        @Override
        public List<ParcelaDTO> consultarParcelasRecebidas(Long sequencialContaBancaria, Date dataRecebimento, List<FormaPagamentoDTO> formasDePagamento) {
                StringBuilder sql = new StringBuilder();
                sql.append("SELECT new br.com.ec.domain.dto.ParcelaDTO(");
                sql.append(ParcelaDTO.CONSULTA_SEM_CATEGORIA_DTO);
                sql.append(") FROM Parcela e ");
                sql.append("WHERE e.contaBancaria.sequencial = :sequencialContaBancaria ");
                sql.append("AND e.dataPagamento = :dataPagamento ");
                sql.append("AND e.indicadorAtivo is true ");
                sql.append(setarParametrosFormasDePagamento("e", formasDePagamento));
                sql.append("ORDER BY e.dataVencimento ");
                try {
                        return getEntityManager().createQuery(sql.toString(), ParcelaDTO.class)
                                        .setParameter("sequencialContaBancaria", sequencialContaBancaria)
                                        .setParameter("dataPagamento", dataRecebimento)
                                        .getResultList();
                } catch(Exception ex) {
                        ex.printStackTrace();
                        return null;
                }
        }
       
        @Override
        public List<ParcelaDTO> consultarParcelasDaPessoaEeCategoriaEeVigencia(Long sequencialPessoa, Long sequencialCategoria, Long sequencialVigencia) {
                try {
                        StringBuilder jpql = new StringBuilder();
                        jpql.append("SELECT new br.com.ec.domain.dto.ParcelaDTO(");
                        jpql.append(ParcelaDTO.CONSULTA_SIMPLES_DTO);
//                      jpql.append("SELECT new br.com.ec.domain.dto.ParcelaDTO(p.sequencial, p.valor, p.dataPagamento, p.dataVencimento) ");
                        jpql.append(") FROM Parcela e " );
                        jpql.append("WHERE e.conta.pessoa.sequencial = :sequencialPessoa " );
                        jpql.append("AND e.conta.categoria.sequencial = :sequencialCategoria " );
                        jpql.append("AND e.conta.vigencia.sequencial = :sequencialVigencia " );
                        return getEntityManager().createQuery(jpql.toString(), br.com.ec.domain.dto.ParcelaDTO.class)
                                        .setParameter("sequencialPessoa", sequencialPessoa)
                                        .setParameter("sequencialCategoria", sequencialCategoria)
                                        .setParameter("sequencialVigencia", sequencialVigencia)
                                        .getResultList();
                } catch (NoResultException e) {
                        return null;
                }
        }
       
        private String setarParametrosFormasDePagamento(String nomeTabela, List<FormaPagamentoDTO> formasPagamento) {
                StringBuilder sql = new StringBuilder();
                if (VerificadorUtil.isListaComElementos(formasPagamento)) {
                        sql.append("AND ");
                        sql.append(nomeTabela);
                        sql.append(".formaPagamento.codigo IN (");
                        for (FormaPagamentoDTO formaPagamento : formasPagamento) {
                                sql.append(formaPagamento.getCodigo() + ",");
                        }
                        sql.append(") ");
                }
                return sql.toString().replace(",)", ")");
        }
       
        @Override
        public void conciliarParcelas(Date dataConciliacao, List<ParcelaDTO> parcelasSelecionadas) {
                StringBuilder sql = new StringBuilder();
                sql.append("UPDATE Parcela parcela SET parcela.dataPagamento = :dataPagamento, parcela.indicadorConciliado = true ");
                sql.append("WHERE parcela.sequencial IN (");
                StringBuilder sqlParcelas = new StringBuilder("");
                for (ParcelaDTO parcelaDTO : parcelasSelecionadas) {
                        sqlParcelas.append(parcelaDTO.getSequencial() + ",");
                }
                sqlParcelas.append(") ");
                sql.append(sqlParcelas.toString().replace(",)", ")"));
                try {
                        getEntityManager().createQuery(sql.toString())
                                .setParameter("dataPagamento", dataConciliacao)
                                .executeUpdate();
                        getEntityManager().flush();
                } catch(Exception ex) {
                        ex.printStackTrace();
                }
        }
       
        @Override
        public void alterarObservacao(Long sequencial, String observacao) {
                StringBuilder sql = new StringBuilder();
                sql.append("UPDATE Parcela p SET p.observacao = :observacao ");
                sql.append("WHERE p.sequencial = :sequencial ");
                try {
                        getEntityManager().createQuery(sql.toString())
                                .setParameter("sequencial", sequencial)
                                .setParameter("observacao", observacao)
                                .executeUpdate();
                        getEntityManager().flush();
                } catch(Exception ex) {
                        ex.printStackTrace();
                }
        }
       
        @Override
        public Double obterValorPassandoParametrosConsulta(ParametrosConsulta<Parcela> parametrosConsulta) {
                StringBuilder sql = new StringBuilder();
                sql.append("SELECT DISTINCT SUM(e.valor) FROM Parcela e ");
                sql.append("WHERE e.indicadorAtivo is true ");
                try {
                        setarStringParametrosConsulta(sql, parametrosConsulta);
                        TypedQuery<Double> query = getEntityManager().createQuery(sql.toString(), Double.class);
                        setarQueryParametrosConsulta(query, parametrosConsulta);
                        return query.getSingleResult();
                } catch(Exception ex) {
                        ex.printStackTrace();
                        return null;
                }
        }
       
        @Override
        public List<ParcelaDTO> consultarParcelasPassandoParametrosConsulta(ParametrosConsulta<Parcela> parametrosConsulta) {
                StringBuilder sql = new StringBuilder();
                sql.append("SELECT new br.com.ec.domain.dto.ParcelaDTO(");
                sql.append(ParcelaDTO.CONSULTA_COMPLETA_DTO);
                sql.append(") FROM Parcela e ");
//              sql.append("SELECT DISTINCT SUM(e.valor) FROM Parcela e ");
                sql.append("WHERE e.indicadorAtivo is true ");
                try {
                        setarStringParametrosConsulta(sql, parametrosConsulta);
                        TypedQuery<ParcelaDTO> query = getEntityManager().createQuery(sql.toString(), ParcelaDTO.class);
                        setarQueryParametrosConsulta(query, parametrosConsulta);
                        return query.getResultList();
                } catch(Exception ex) {
                        ex.printStackTrace();
                        return null;
                }
        }
       
        @Override
        public Boolean verificarPossuiParcelaEmAberta(Long sequencialConta, Long sequencialVenda) {
                StringBuilder sql = new StringBuilder();
                sql.append("SELECT COUNT(p) FROM Parcela p WHERE p.dataPagamento is null AND p.indicadorAtivo = true ");
                if (VerificadorUtil.naoEstaNulo(sequencialConta)) {
                        sql.append("AND p.conta.sequencial = :sequencialConta ");
                }
                if (VerificadorUtil.naoEstaNulo(sequencialVenda)) {
                        sql.append("AND p.conta.venda.sequencial = :sequencialVenda ");
                }
                TypedQuery<Long> query = getEntityManager().createQuery(sql.toString(), Long.class);
                if (VerificadorUtil.naoEstaNulo(sequencialConta)) {
                        query.setParameter("sequencialConta", sequencialConta);
                }
                if (VerificadorUtil.naoEstaNulo(sequencialVenda)) {
                        query.setParameter("sequencialVenda", sequencialVenda);
                }
                return query.getSingleResult().intValue() > 0;
        }
       
        @Override
        public List<Parcela> consultarParcelasDaConta(Long sequencialConta) {
                StringBuilder sql = new StringBuilder();
                sql.append("SELECT p FROM Parcela p WHERE p.indicadorAtivo = true ");
                sql.append("AND p.conta.sequencial = :sequencialConta ");
                return getEntityManager().createQuery(sql.toString(), Parcela.class).setParameter("sequencialConta", sequencialConta).getResultList();
        }
       
        @Override
        public void atualizarValorParcela(ParcelaDTO parcelaDTO) {
                StringBuilder sql = new StringBuilder();
                sql.append("UPDATE Parcela parcela SET parcela.valor = :valorNovo ");
                sql.append("WHERE parcela.sequencial = :sequencialParcela ");
                try {
                        getEntityManager().createQuery(sql.toString())
                                .setParameter("sequencialParcela", parcelaDTO.getSequencial())
                                .setParameter("valorNovo", parcelaDTO.getValor())
                                .executeUpdate();
                        getEntityManager().flush();
                } catch(Exception ex) {
                        ex.printStackTrace();
                }
        }
       
        @Override
        public void atualizarCentroDeCustos(Long sequencialConta, Long sequencialCentroDeCustos) {
                StringBuilder sql = new StringBuilder();
                sql.append("UPDATE Conta c SET c.loja.sequencial = :sequencialCentroDeCustos ");
                sql.append("WHERE c.sequencial = :sequencialConta ");
                try {
                        getEntityManager().createQuery(sql.toString())
                                .setParameter("sequencialCentroDeCustos", sequencialCentroDeCustos)
                                .setParameter("sequencialConta", sequencialConta)
                                .executeUpdate();
                        getEntityManager().flush();
                } catch(Exception ex) {
                        ex.printStackTrace();
                }
        }
       
        @Override
        public void efetivarConciliacaoAntecipacao(String sqlAtualizacaoParcelas) {
                try {
                        getEntityManager().createNativeQuery(sqlAtualizacaoParcelas).executeUpdate();
                        getEntityManager().flush();
                } catch(Exception ex) {
                        ex.printStackTrace();
                }
        }
       
        /*
        @Override
        public List<Parcela> consultarParcelas(ParametrosConsultaLancamentosDTO parametrosConsulta) {
                StringBuilder sql = new StringBuilder();
                sql.append("SELECT p FROM Parcela p ");
                sql.append("WHERE ((p.dataPagamento IS NOT NULL AND p.dataPagamento >= :dataInicial AND p.dataPagamento <= :dataFinal) ");
                sql.append("OR (p.dataPagamento IS NULL AND p.dataVencimento <= :dataFinal)) ");
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getTipoBusca())) {
                        sql.append("AND p.conta.tipoConta = :tipoConta ");
                }
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getCentroDeCustos())) {
                        if (parametrosConsulta.getCentroDeCustos().getSequencial().equals(new Long(-1))) {
                                sql.append("AND p.conta.loja IS NULL ");
                        } else {
                                sql.append("AND p.conta.loja.sequencial = :sequencialCentroDeCustos ");
                        }
                }
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getCategoria())) {
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getCategoria().getSequencial())) {
                                sql.append("AND p.conta.categoria.sequencial = :sequencialCategoria ");
                        } else {
                                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getCategoriaPai().getSequencial())) {
                                        sql.append("AND p.conta.categoria.sequencial = :sequencialCategoriaPai ");
                                } else {
                                        sql.append("AND p.conta.categoria IS NULL ");
                                }
                        }
                }
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getOficial())) {
                        if (parametrosConsulta.getOficial()) {
                                sql.append("AND p.indicadorOficial IS TRUE ");
                        } else {
                                sql.append("AND p.indicadorOficial IS FALSE ");
                        }
                }
                sql.append("ORDER BY p.dataVencimento ");
                try {
                        TypedQuery<Parcela> query = getEntityManager().createQuery(sql.toString(), Parcela.class)
                                .setParameter("dataInicial", parametrosConsulta.getDataInicial())
                                .setParameter("dataFinal", parametrosConsulta.getDataFinal());
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getTipoBusca())) {
                                query.setParameter("tipoConta", parametrosConsulta.getTipoBusca());
                        }
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getCentroDeCustos())) {
                                if (!parametrosConsulta.getCentroDeCustos().getSequencial().equals(new Long(-1))) {
                                        query.setParameter("sequencialCentroDeCustos", parametrosConsulta.getCentroDeCustos().getSequencial());
                                }
                        }
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getCategoria())) {
                                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getCategoria().getSequencial())) {
                                        query.setParameter("sequencialCategoria", parametrosConsulta.getCategoria().getSequencial());
                                } else {
                                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getCategoriaPai().getSequencial())) {
                                                query.setParameter("sequencialCategoriaPai", parametrosConsulta.getCategoriaPai().getSequencial());
                                        }
                                }
                        }
                        return query.getResultList();
                } catch(Exception ex) {
                        ex.printStackTrace();
                        return null;
                }
        }
       
        @Override
        public List<Parcela> consultarParcelasAVencer(Conta conta) {
                StringBuilder sql = new StringBuilder();
                sql.append("SELECT p FROM Parcela p ");
                sql.append("WHERE p.conta.sequencial = :sequencialConta ");
                sql.append("AND p.dataPagamento is null ");
                sql.append("ORDER BY p.sequencial ");
                try {
                        return getEntityManager().createQuery(sql.toString(), Parcela.class)
                                        .setParameter("sequencialConta", conta.getSequencial())
                                        .getResultList();
                } catch(Exception ex) {
                        ex.printStackTrace();
                        return null;
                }
        }
       
        @Override
        public List<Parcela> consultarParcelasRecebidas(Date dataRecebimento, TipoCartao tipoCartao) {
                StringBuilder sql = new StringBuilder();
                sql.append("SELECT p FROM Parcela p ");
                sql.append("WHERE p.dataVencimento = :dataVencimento ");
                sql.append("AND p.observacao like UPPER(:observacao) ");
                sql.append("AND p.dataPagamento is not null ");
                sql.append("ORDER BY p.dataVencimento ");
                try {
                        return getEntityManager().createQuery(sql.toString(), Parcela.class)
                                        .setParameter("dataVencimento", dataRecebimento)
                                        .setParameter("observacao", StringUtil.setarUpperCase("%" + tipoCartao.getDescricao() + "%"))
                                        .getResultList();
                } catch(Exception ex) {
                        ex.printStackTrace();
                        return null;
                }
        }
       
        @Override
        public List<Parcela> consultarPassandoParametrosConsulta(ParametrosConsulta<Parcela> parametrosConsulta,
                        Integer primeiroRegistro, Integer tamanhoPagina, String sortField, String sortOrder,
                        Map<String, Object> filters) {
                StringBuilder sql = new StringBuilder();
                sql.append("SELECT DISTINCT e FROM Parcela e ");
                sql.append("WHERE e.indicadorAtivo is true ");
                try {
                        setarStringParametrosConsulta(sql, parametrosConsulta);
                        sql.append("ORDER BY " + ((ParametrosConsultaLancamentosDTO)parametrosConsulta).getOrdenacao());
                        TypedQuery<Parcela> query = getEntityManager().createQuery(sql.toString(), Parcela.class);
                        setarQueryParametrosConsulta(query, parametrosConsulta);
                        return query.setFirstResult(primeiroRegistro).setMaxResults(tamanhoPagina).getResultList();
                } catch(Exception ex) {
                        ex.printStackTrace();
                        return null;
                }
        }
       
        @Override
        public List<Parcela> consultarParcelasDaVenda(Long sequencialVenda) {
                StringBuilder sql = new StringBuilder();
                sql.append("SELECT p FROM Parcela p ");
                sql.append("WHERE p.conta.venda.sequencial = :sequencialVenda ");
                sql.append("ORDER BY p.dataVencimento ");
                try {
                        return getEntityManager().createQuery(sql.toString(), Parcela.class).setParameter("sequencialVenda", sequencialVenda).getResultList();
                } catch(Exception ex) {
                        ex.printStackTrace();
                        return null;
                }
        }
       
        @Override
        public Boolean verificarPossuiParcelaAbertaParaPagamento(Conta conta) {
                StringBuilder sql = new StringBuilder();
                sql.append("SELECT COUNT(p) FROM Parcela p WHERE p.dataPagamento is null AND p.indicadorAtivo = true ");
                sql.append("AND p.conta.sequencial = :sequencialConta ");
                TypedQuery<Long> query = getEntityManager().createQuery(sql.toString(), Long.class);
                query.setParameter("sequencialConta", conta.getSequencial());
                return query.getSingleResult().intValue()>0;
        }
       
        @Override
        public Boolean verificarPossuiParcela(Venda venda) {
                StringBuilder sql = new StringBuilder();
                sql.append("SELECT COUNT(p) FROM Parcela p WHERE p.indicadorAtivo = true ");
                sql.append("AND p.conta.venda.sequencial = :sequencialVenda ");
                TypedQuery<Long> query = getEntityManager().createQuery(sql.toString(), Long.class);
                query.setParameter("sequencialVenda", venda.getSequencial());
                return query.getSingleResult().intValue()>0;
        }
       
       
        */

}