br.com.hslife.orcamento.repository.LancamentoContaRepository.java Source code

Java tutorial

Introduction

Here is the source code for br.com.hslife.orcamento.repository.LancamentoContaRepository.java

Source

/***
      
 Copyright (c) 2012 - 2020 Hrcules S. S. Jos
    
Este arquivo  parte do programa Oramento Domstico.
    
    
Oramento Domstico  um software livre; voc pode redistribui-lo e/ou 
    
modific-lo dentro dos termos da Licena Pblica Geral Menor GNU como 
    
publicada pela Fundao do Software Livre (FSF); na verso 2.1 da 
    
Licena.
    
    
Este programa  distribudo na esperana que possa ser til, 
    
mas SEM NENHUMA GARANTIA; sem uma garantia implcita de ADEQUAO a 
    
qualquer MERCADO ou APLICAO EM PARTICULAR. Veja a Licena Pblica 
    
Geral Menor GNU em portugus para maiores detalhes.
    
    
Voc deve ter recebido uma cpia da Licena Pblica Geral Menor GNU sob o 
    
nome de "LICENSE.TXT" junto com este programa, se no, acesse o site do
    
projeto no endereco https://github.com/herculeshssj/orcamento ou escreva 
    
para a Fundao do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, 
    
Boston, MA  02110-1301, USA.
    
    
Para mais informaes sobre o programa Oramento Domstico e seu autor entre  
    
em contato pelo e-mail herculeshssj@outlook.com, ou ainda escreva para 
    
Hrcules S. S. Jos, Av. Ministro Lafaeyte de Andrade, 1683 - Bl. 3 Apt 404, 
    
Marco II - Nova Iguau, RJ, Brasil.
      
***/

package br.com.hslife.orcamento.repository;

import java.math.BigInteger;
import java.util.Date;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

import br.com.hslife.orcamento.entity.Conta;
import br.com.hslife.orcamento.entity.LancamentoConta;
import br.com.hslife.orcamento.entity.LancamentoPeriodico;
import br.com.hslife.orcamento.entity.Usuario;
import br.com.hslife.orcamento.enumeration.StatusLancamento;
import br.com.hslife.orcamento.enumeration.StatusLancamentoConta;
import br.com.hslife.orcamento.enumeration.TipoConta;
import br.com.hslife.orcamento.enumeration.TipoLancamentoPeriodico;
import br.com.hslife.orcamento.model.CriterioBuscaLancamentoConta;

@Repository
public class LancamentoContaRepository extends AbstractCRUDRepository<LancamentoConta> {

    public LancamentoContaRepository() {
        super(new LancamentoConta());
    }

    @SuppressWarnings("unchecked")
    public List<LancamentoConta> findByCriterioBusca(CriterioBuscaLancamentoConta criterioBusca) {
        Criteria criteria = getSession().createCriteria(LancamentoConta.class, "lancamento")
                .createAlias("lancamento.conta", "con");

        for (Criterion criterion : criterioBusca.buildCriteria()) {
            criteria.add(criterion);

        }

        return criteria.setMaxResults(criterioBusca.getLimiteResultado()).addOrder(Order.asc("dataPagamento"))
                .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();
    }

    public LancamentoConta findLastLancamentoContaByConta(Conta conta) {
        Criteria criteria = getSession().createCriteria(LancamentoConta.class);
        criteria.add(Restrictions.ne("statusLancamentoConta", StatusLancamentoConta.QUITADO));
        criteria.add(Restrictions.eq("conta.id", conta.getId()));
        return (LancamentoConta) criteria.addOrder(Order.desc("dataPagamento")).setMaxResults(1).uniqueResult();
    }

    public LancamentoConta findByHash(String hash) {
        return (LancamentoConta) getQuery("FROM LancamentoConta lancamento WHERE lancamento.hashImportacao = :hash")
                .setString("hash", hash).setMaxResults(1).uniqueResult();
    }

    @SuppressWarnings("unchecked")
    public void deleteAllLancamentoContaAfterDateByConta(Date dataPagamento, Conta conta) {
        Query query = getQuery(
                "FROM LancamentoConta lancamento WHERE lancamento.conta.id = :idConta AND lancamento.dataPagamento > :data")
                        .setLong("idConta", conta.getId()).setDate("data", dataPagamento);

        // Itera o resultado apagando cada lanamento encontrado
        for (LancamentoConta l : (List<LancamentoConta>) query.list()) {
            this.delete(l);
        }
    }

    public boolean existsLinkageFaturaCartao(LancamentoConta lancamento) {
        boolean result = true;

        String sqlLancamento = "select count(*) from detalhefatura where idLancamento = " + lancamento.getId();

        Query queryLancamento = getSession().createSQLQuery(sqlLancamento);

        BigInteger queryResultLancamento = (BigInteger) queryLancamento.uniqueResult();

        if (queryResultLancamento.longValue() == 0) {
            return false;
        }

        return result;
    }

    public boolean existsLinkagePagamentoFaturaCartao(LancamentoConta lancamento) {
        boolean result = true;

        String sqlLancamento = "select count(*) from faturacartao where idLancamento = " + lancamento.getId();

        Query queryLancamento = getSession().createSQLQuery(sqlLancamento);

        BigInteger queryResultLancamento = (BigInteger) queryLancamento.uniqueResult();

        if (queryResultLancamento.longValue() == 0) {
            return false;
        }

        return result;
    }

    @SuppressWarnings("unchecked")
    public List<LancamentoConta> findPagosByLancamentoPeriodico(LancamentoPeriodico lancamento) {
        return getQuery(
                "FROM LancamentoConta pagamento WHERE pagamento.lancamentoPeriodico.id = :idLancamento AND pagamento.statusLancamentoConta = 'QUITADO' ORDER BY pagamento.dataVencimento DESC")
                        .setLong("idLancamento", lancamento.getId()).list();
    }

    @SuppressWarnings("unchecked")
    public List<LancamentoConta> findByLancamentoPeriodico(LancamentoPeriodico lancamento) {
        return getQuery(
                "FROM LancamentoConta pagamento WHERE pagamento.lancamentoPeriodico.id = :idLancamento ORDER BY pagamento.dataVencimento DESC")
                        .setLong("idLancamento", lancamento.getId()).list();
    }

    @SuppressWarnings("unchecked")
    public List<LancamentoConta> findNotPagosByLancamentoPeriodico(LancamentoPeriodico lancamento) {
        return getQuery(
                "FROM LancamentoConta pagamento WHERE pagamento.lancamentoPeriodico.id = :idLancamento AND pagamento.statusLancamentoConta <> 'QUITADO' ORDER BY pagamento.dataVencimento DESC")
                        .setLong("idLancamento", lancamento.getId()).list();
    }

    public LancamentoConta findLastGeneratedPagamentoPeriodo(LancamentoPeriodico lancamentoPeriodico) {
        return (LancamentoConta) getQuery(
                "FROM LancamentoConta pagamento WHERE pagamento.lancamentoPeriodico.id = :idLancamento ORDER BY pagamento.dataVencimento DESC")
                        .setLong("idLancamento", lancamentoPeriodico.getId()).setMaxResults(1).uniqueResult();
    }

    @SuppressWarnings("unchecked")
    public List<LancamentoConta> findAllPagamentosPagosActivedLancamentosByTipoLancamentoAndUsuario(
            TipoLancamentoPeriodico tipo, Usuario usuario) {
        return getQuery(
                "FROM LancamentoConta pagamento WHERE pagamento.lancamentoPeriodico.tipoLancamentoPeriodico = :tipo AND pagamento.lancamentoPeriodico.statusLancamento = :status AND pagamento.lancamentoPeriodico.usuario.id = :idUsuario AND pagamento.statusLancamentoConta = 'QUITADO' ORDER BY pagamento.dataVencimento DESC")
                        .setParameter("status", StatusLancamento.ATIVO).setParameter("tipo", tipo)
                        .setLong("idUsuario", usuario.getId()).list();
    }

    @SuppressWarnings("unchecked")
    public List<LancamentoConta> findPagamentosByLancamentoPeriodicoAndPago(LancamentoPeriodico lancamento,
            StatusLancamentoConta pago) {
        StringBuilder hql = new StringBuilder();
        hql.append("FROM LancamentoConta pagamento LEFT JOIN FETCH pagamento.faturaCartao WHERE ");
        if (pago != null) {
            hql.append("pagamento.statusLancamentoConta = :pago AND ");
        }

        hql.append("pagamento.lancamentoPeriodico.id = :idLancamento ORDER BY pagamento.dataVencimento DESC");

        Query hqlQuery = getQuery(hql.toString());
        if (pago != null) {
            hqlQuery.setParameter("pago", pago);
        }

        hqlQuery.setParameter("idLancamento", lancamento.getId());

        return hqlQuery.list();
    }

    @SuppressWarnings("unchecked")
    public List<LancamentoConta> findPagamentosByTipoLancamentoAndUsuarioAndPago(TipoLancamentoPeriodico tipo,
            Usuario usuario, StatusLancamentoConta pago) {
        StringBuilder hql = new StringBuilder();
        hql.append("FROM LancamentoConta pagamento LEFT JOIN FETCH pagamento.faturaCartao WHERE ");
        if (pago != null) {
            hql.append("pagamento.statusLancamentoConta = :pago AND ");
        }
        if (tipo != null) {
            hql.append("pagamento.lancamentoPeriodico.tipoLancamentoPeriodico = :tipo AND ");
        }

        hql.append("pagamento.lancamentoPeriodico.usuario.id = :idUsuario ORDER BY pagamento.dataVencimento DESC");

        Query hqlQuery = getQuery(hql.toString());
        if (pago != null) {
            hqlQuery.setParameter("pago", pago);
        }
        if (tipo != null) {
            hqlQuery.setParameter("tipo", tipo);
        }

        hqlQuery.setParameter("idUsuario", usuario.getId());

        return hqlQuery.list();
    }

    @SuppressWarnings("unchecked")
    public List<LancamentoConta> findPagamentosByTipoLancamentoAndContaAndPago(TipoLancamentoPeriodico tipo,
            Conta conta, StatusLancamentoConta pago) {
        StringBuilder hql = new StringBuilder();
        hql.append("FROM LancamentoConta pagamento LEFT JOIN FETCH pagamento.faturaCartao WHERE ");
        if (pago != null) {
            hql.append("pagamento.statusLancamentoConta = :pago AND ");
        }
        if (tipo != null) {
            hql.append("pagamento.lancamentoPeriodico.tipoLancamentoPeriodico = :tipo AND ");
        }

        hql.append("pagamento.lancamentoPeriodico.conta.id = :idConta ORDER BY pagamento.dataVencimento DESC");

        Query hqlQuery = getQuery(hql.toString());
        if (pago != null) {
            hqlQuery.setParameter("pago", pago);
        }
        if (tipo != null) {
            hqlQuery.setParameter("tipo", tipo);
        }

        hqlQuery.setParameter("idConta", conta.getId());

        return hqlQuery.list();
    }

    @SuppressWarnings("unchecked")
    public List<LancamentoConta> findPagamentosByTipoLancamentoAndTipoContaAndPago(TipoLancamentoPeriodico tipo,
            TipoConta tipoConta, StatusLancamentoConta pago) {
        StringBuilder hql = new StringBuilder();
        hql.append("FROM LancamentoConta pagamento LEFT JOIN FETCH pagamento.faturaCartao WHERE ");
        if (pago != null) {
            hql.append("pagamento.statusLancamentoConta = :pago AND ");
        }
        if (tipo != null) {
            hql.append("pagamento.lancamentoPeriodico.tipoLancamentoPeriodico = :tipo AND ");
        }

        hql.append(
                "pagamento.lancamentoPeriodico.conta.tipoConta = :tipoConta ORDER BY pagamento.dataVencimento DESC");

        Query hqlQuery = getQuery(hql.toString());
        if (pago != null) {
            hqlQuery.setParameter("pago", pago);
        }
        if (tipo != null) {
            hqlQuery.setParameter("tipo", tipo);
        }

        hqlQuery.setParameter("tipoConta", tipoConta);

        return hqlQuery.list();
    }

    public LancamentoConta findLancamentoByParcelaAndLancamentoPeriodico(int parcela,
            LancamentoPeriodico lancamentoPeriodico) {
        return (LancamentoConta) getQuery(
                "FROM LancamentoConta lancamento WHERE lancamento.parcela = :parcela AND lancamento.lancamentoPeriodico.id = :idLancamento")
                        .setInteger("parcela", parcela).setLong("idLancamento", lancamentoPeriodico.getId())
                        .uniqueResult();
    }

    public LancamentoConta findLancamentoByPeriodoAndAnoAndLancamentoPeriodico(int periodo, int ano,
            LancamentoPeriodico lancamentoPeriodico) {
        return (LancamentoConta) getQuery(
                "FROM LancamentoConta lancamento WHERE lancamento.periodo = :periodo AND lancamento.ano = :ano AND lancamento.lancamentoPeriodico.id = :idLancamento")
                        .setInteger("periodo", periodo).setInteger("ano", ano)
                        .setLong("idLancamento", lancamentoPeriodico.getId()).setMaxResults(1).uniqueResult();
    }

    @SuppressWarnings("unchecked")
    public List<LancamentoConta> findAllWithoutFatura(Conta conta) {
        return getQuery(
                "FROM LancamentoConta lancamento WHERE lancamento.conta.id = :idConta AND lancamento.faturaCartao IS NULL")
                        .setLong("idConta", conta.getId()).list();
    }

    @SuppressWarnings("unchecked")
    public List<LancamentoConta> findByDescricaoAndUsuario(String descricao, Usuario usuarioLogado) {
        return getQuery("FROM LancamentoConta lancamento WHERE lancamento.descricao LIKE '%" + descricao
                + "%' AND lancamento.conta.usuario.id = :idUsuario").setLong("idUsuario", usuarioLogado.getId())
                        .list();
    }
}