gcom.atendimentopublico.RepositorioAtendimentoPublicoHBM.java Source code

Java tutorial

Introduction

Here is the source code for gcom.atendimentopublico.RepositorioAtendimentoPublicoHBM.java

Source

/*
 * Copyright (C) 2007-2007 the GSAN - Sistema Integrado de Gesto de Servios de
 * Saneamento This file is part of GSAN, an integrated service management system
 * for Sanitation GSAN is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by the Free
 * Software Foundation; either version 2 of the License. GSAN is distributed in
 * the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
 * the GNU General Public License for more details. You should have received a
 * copy of the GNU General Public License along with this program; if not, write
 * to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
 * MA 02111-1307, USA
 */
/*
 * GSAN - Sistema Integrado de Gesto de Servios de Saneamento Copyright (C)
 * <2007> Adriano Britto Siqueira Alexandre Santos Cabral Ana Carolina Alves
 * Breda Ana Maria Andrade Cavalcante Aryed Lins de Arajo Bruno Leonardo
 * Rodrigues Barros Carlos Elmano Rodrigues Ferreira Cludio de Andrade Lira
 * Denys Guimares Guenes Tavares Eduardo Breckenfeld da Rosa Borges Fabola
 * Gomes de Arajo Flvio Leonardo Cavalcanti Cordeiro Francisco do Nascimento
 * Jnior Homero Sampaio Cavalcanti Ivan Srgio da Silva Jnior Jos Edmar de
 * Siqueira Jos Thiago Tenrio Lopes Kssia Regina Silvestre de Albuquerque
 * Leonardo Luiz Vieira da Silva Mrcio Roberto Batista da Silva Maria de Ftima
 * Sampaio Leite Micaela Maria Coelho de Arajo Nelson Mendona de Carvalho
 * Newton Morais e Silva Pedro Alexandre Santos da Silva Filho Rafael Corra
 * Lima e Silva Rafael Francisco Pinto Rafael Koury Monteiro Rafael Palermo de
 * Arajo Raphael Veras Rossiter Roberto Sobreira Barbalho Rodrigo Avellar
 * Silveira Rosana Carvalho Barbosa Svio Luiz de Andrade Cavalcante Tai Mu Shih
 * Thiago Augusto Souza do Nascimento Tiago Moreno Rodrigues Vivianne Barbosa
 * Sousa Este programa  software livre; voc pode redistribu-lo e/ou
 * modific-lo sob os termos de Licena Pblica Geral GNU, conforme publicada
 * pela Free Software Foundation; verso 2 da Licena. Este programa 
 * distribudo na expectativa de ser til, mas SEM QUALQUER GARANTIA; sem mesmo
 * a garantia implcita de COMERCIALIZAO ou de ADEQUAO A QUALQUER PROPSITO
 * EM PARTICULAR. Consulte a Licena Pblica Geral GNU para obter mais detalhes.
 * Voc deve ter recebido uma cpia da Licena Pblica Geral GNU junto com este
 * programa; se no, escreva para Free Software Foundation, Inc., 59 Temple
 * Place, Suite 330, Boston, MA 02111-1307, USA.
 */

package gcom.atendimentopublico;

import gcom.atendimentopublico.ligacaoagua.LigacaoAgua;
import gcom.atendimentopublico.ligacaoagua.LigacaoAguaSituacao;
import gcom.atendimentopublico.ordemservico.FiscalizacaoSituacao;
import gcom.atendimentopublico.ordemservico.FiscalizacaoSituacaoServicoACobrar;
import gcom.atendimentopublico.ordemservico.OrdemServico;
import gcom.atendimentopublico.ordemservico.OrdemServicoProgramacao;
import gcom.atendimentopublico.ordemservico.OsReferidaRetornoTipo;
import gcom.atendimentopublico.ordemservico.ServicoCobrancaValor;
import gcom.atendimentopublico.ordemservico.ServicoTipo;
import gcom.atendimentopublico.ordemservico.bean.ObterValorDebitoHelper;
import gcom.atendimentopublico.registroatendimento.RegistroAtendimento;
import gcom.cadastro.cliente.Cliente;
import gcom.cadastro.cliente.ClienteImovel;
import gcom.cadastro.cliente.ClienteRelacaoTipo;
import gcom.cadastro.geografico.Municipio;
import gcom.cadastro.imovel.Imovel;
import gcom.cadastro.imovel.ImovelSuprimido;
import gcom.cadastro.localidade.GerenciaRegional;
import gcom.cadastro.localidade.UnidadeNegocio;
import gcom.cobranca.CobrancaAcaoAtividadeComandoFiscalizacaoSituacao;
import gcom.faturamento.autoinfracao.AutosInfracao;
import gcom.faturamento.debito.DebitoTipo;
import gcom.gui.atendimentopublico.registroatendimento.FiltrarAcompanhamentoRegistroAtendimentoHelper;
import gcom.gui.relatorio.atendimentopublico.FiltrarRelatorioAcompanhamentoBoletimMedicaoHelper;
import gcom.gui.relatorio.atendimentopublico.FiltrarRelatorioOSSituacaoHelper;
import gcom.micromedicao.hidrometro.HidrometroCapacidade;
import gcom.micromedicao.hidrometro.HidrometroInstalacaoHistorico;
import gcom.micromedicao.hidrometro.HidrometroSituacao;
import gcom.relatorio.atendimentopublico.ordemservico.FiltrarRelatorioReligacaoClientesInadiplentesHelper;
import gcom.util.CollectionUtil;
import gcom.util.ConstantesSistema;
import gcom.util.ControladorException;
import gcom.util.ErroRepositorioException;
import gcom.util.HibernateUtil;
import gcom.util.Util;

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;

/**
 * < <Descrio da Classe>>
 * 
 * @author Administrador
 */
public class RepositorioAtendimentoPublicoHBM implements IRepositorioAtendimentoPublico {

    private static IRepositorioAtendimentoPublico instancia;

    /**
     * Construtor da classe RepositorioMicromedicaoHBM
     */
    private RepositorioAtendimentoPublicoHBM() {
    }

    /**
     * Retorna o valor de instancia
     * 
     * @return O valor de instancia
     */
    public static IRepositorioAtendimentoPublico getInstancia() {
        if (instancia == null) {
            instancia = new RepositorioAtendimentoPublicoHBM();
        }
        return instancia;
    }

    /**
     * [UC-0355] - Efetuar Corte de Liga de gua [SB001] Atualizar Ligao -
     * (corte de ligao de gua) gua- os campos LAGU_DTCORTE e
     * LAGU_NNSELOCORTE e LAGU_ TMULTIMAALTERACAO
     * 
     * @param imovel
     *            Descrio do parmetro
     * @exception ErroRepositorioExceptions
     *                Descrio da exceo
     * @author Leandro Cavalcanti
     * @date 10/07/2006
     * @param imovel
     * @param idLigacaoAguaSituacao
     * @throws ErroRepositorioException
     */
    public void atualizarLigacaoAgua(Integer idImovel, Integer idLigacaoAguaSituacao, Integer numeroSeloCorte)
            throws ErroRepositorioException {
        Session session = HibernateUtil.getSession();
        String update;
        try {
            // Atualizar os campos LAST_ID, LAGU_DTCORTE, LAGU_NNSELOCORTE e
            // LAGU_ TMULTIMAALTERACAO
            update = "update gcom.atendimentopublico.ligacaoagua.LigacaoAgua set " + "lagu_id = :idligacaoAgua ,"
                    + "lagu_dtcorte = :dataExecOrdServico, " + "lagu_nnselocorte = :numeroSeloCorte, "
                    + "lagu_tmultimaalteracao = :datahoracorrente " + "where lagu_id = :imovelId";
            session.createQuery(update).setInteger("idligacaoAgua", idLigacaoAguaSituacao.intValue())
                    .setDate("dataExecOrdServico", new Date())
                    .setInteger("numeroSeloCorte", numeroSeloCorte.intValue())
                    .setInteger("imovelId", idImovel.intValue()).setDate("datahoracorrente", new Date())
                    .executeUpdate();
        } catch (HibernateException e) {
            e.printStackTrace();
            throw new ErroRepositorioException("Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
            // session.close();
        }
    }

    /**
     * [UC-0355] - Efetuar Corte de Liga de gua [SB001] Atualizar Hidrometro -
     * (corte de ligao de gua) Atualizar os campos hidi_nnleituracorte e
     * hidi_tmultimaalteracao de HidrometroInstalacaoHistorico
     * 
     * @param imovel
     *            Descrio do parmetro
     * @exception ErroRepositorioExceptions
     *                Descrio da exceo
     * @author Leandro Cavalcanti
     * @date 10/07/2006
     * @param imovel
     * @param idLigacaoAguaSituacao
     * @throws ErroRepositorioException
     */
    public void atualizarHidrometroLIgacaoAgua(Integer imovelId, Integer numeroLeituraCorte)
            throws ErroRepositorioException {
        Session session = HibernateUtil.getSession();
        String update;
        try {
            update = "update gcom.micromedicao.hidrometro.HidrometroInstalacaoHistorico set "
                    + "hidi_nnleituracorte = :numCorte, hidi_tmultimaalteracao = :datahoracorrente "
                    + "where imov_id = :imovelId";
            session.createQuery(update).setInteger("numCorte", numeroLeituraCorte.intValue())
                    .setInteger("imovelId", imovelId.intValue()).setDate("datahoracorrente", new Date())
                    .executeUpdate();
        } catch (HibernateException e) {
            e.printStackTrace();
            throw new ErroRepositorioException("Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
            // session.close();
        }
    }

    /**
     * [UC-0362] - Efetuar Instalao de Hidrmetro [SB002] Atualizar Ligao de
     * gua Atualizar os campos hidi_id e lagu_tmultimaalteracao de LigacaoAgua
     * 
     * @exception ErroRepositorioExceptions
     *                Descrio da exceo
     * @author Ana Maria
     * @date 13/07/2006
     * @param idLigacaoAgua
     * @param idHidrometroInstalacaoHistorico
     * @throws ErroRepositorioException
     */
    public void atualizarHidrometroInstalacaoHistoricoLigacaoAgua(Integer idLigacaoAgua,
            Integer idHidrometroInstalacaoHistorico) throws ErroRepositorioException {
        Session session = HibernateUtil.getSession();
        String update = null;
        try {
            if (idHidrometroInstalacaoHistorico != null && !idHidrometroInstalacaoHistorico.equals("")) {
                update = "update gcom.atendimentopublico.ligacaoagua.LigacaoAgua set "
                        + "hidi_id = :idHidrometroInstalacaoHistorico, lagu_tmultimaalteracao = :datahoracorrente "
                        + "where lagu_id = :idLigacaoAgua";
                session.createQuery(update)
                        .setInteger("idHidrometroInstalacaoHistorico", idHidrometroInstalacaoHistorico.intValue())
                        .setTimestamp("datahoracorrente", new Date())
                        .setInteger("idLigacaoAgua", idLigacaoAgua.intValue()).executeUpdate();
            } else {
                update = "update gcom.atendimentopublico.ligacaoagua.LigacaoAgua set "
                        + "hidi_id = null, lagu_tmultimaalteracao = :datahoracorrente "
                        + "where lagu_id = :idLigacaoAgua";
                session.createQuery(update).setTimestamp("datahoracorrente", new Date())
                        .setInteger("idLigacaoAgua", idLigacaoAgua.intValue()).executeUpdate();
            }
        } catch (HibernateException e) {
            e.printStackTrace();
            throw new ErroRepositorioException("Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
    }

    /**
     * [UC-0362] - Efetuar Instalao de Hidrmetro [SB002] Atualizar Imvel
     * Atualizar os campos hidi_id e imov_tmultimaalteracao de Imovel
     * 
     * @exception ErroRepositorioExceptions
     *                Descrio da exceo
     * @author Ana Maria
     * @date 13/07/2006
     * @param idImovel
     * @param idHidrometroInstalacaoHistorico
     * @throws ErroRepositorioException
     */
    public void atualizarHidrometroIntalacaoHistoricoImovel(Integer idImovel,
            Integer idHidrometroInstalacaoHistorico, Integer idPocoTipo) throws ErroRepositorioException {
        Session session = HibernateUtil.getSession();
        String update = null;
        try {
            if (idHidrometroInstalacaoHistorico != null && !idHidrometroInstalacaoHistorico.equals("")) {

                if (idPocoTipo != null) {

                    update = "update gcom.cadastro.imovel.Imovel set "
                            + "hidi_id = :idHidrometroInstalacaoHistorico, imov_tmultimaalteracao = :datahoracorrente, poco_id = :idPocoTipo "
                            + "where imov_id = :idImovel";
                    session.createQuery(update)
                            .setInteger("idHidrometroInstalacaoHistorico",
                                    idHidrometroInstalacaoHistorico.intValue())
                            .setTimestamp("datahoracorrente", new Date())
                            .setInteger("idImovel", idImovel.intValue()).setInteger("idPocoTipo", idPocoTipo)
                            .executeUpdate();
                } else {

                    update = "update gcom.cadastro.imovel.Imovel set "
                            + "hidi_id = :idHidrometroInstalacaoHistorico, imov_tmultimaalteracao = :datahoracorrente, poco_id = null "
                            + "where imov_id = :idImovel";
                    session.createQuery(update)
                            .setInteger("idHidrometroInstalacaoHistorico",
                                    idHidrometroInstalacaoHistorico.intValue())
                            .setTimestamp("datahoracorrente", new Date())
                            .setInteger("idImovel", idImovel.intValue()).executeUpdate();
                }
            } else {
                update = "update gcom.cadastro.imovel.Imovel set "
                        + "hidi_id = null, imov_tmultimaalteracao = :datahoracorrente, poco_id = null "
                        + "where imov_id = :idImovel";
                session.createQuery(update).setTimestamp("datahoracorrente", new Date())
                        .setInteger("idImovel", idImovel.intValue()).executeUpdate();
            }
        } catch (HibernateException e) {
            e.printStackTrace();
            throw new ErroRepositorioException("Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
    }

    /**
     * [UC-0362] - Efetuar Instalao de Hidrmetro [SB003] Atualizar Hidrmetro
     * Atualizar o campo hisi_id
     * 
     * @exception ErroRepositorioExceptions
     *                Descrio da exceo
     * @author Ana Maria
     * @date 17/07/2006
     * @throws ErroRepositorioException
     */
    public void atualizarSituacaoHidrometro(Integer idHidrometro, Integer situacaoHidrometro)
            throws ErroRepositorioException {
        Session session = HibernateUtil.getSession();
        String update = null;
        try {
            update = "update gcom.micromedicao.hidrometro.Hidrometro set "
                    + "hist_id = :idSituacaoHidrometro, hidr_tmultimaalteracao = :datahoracorrente "
                    + "where hidr_id = :numeroHidrometro";
            session.createQuery(update).setInteger("idSituacaoHidrometro", situacaoHidrometro)
                    .setTimestamp("datahoracorrente", new Date())
                    .setInteger("numeroHidrometro", idHidrometro.intValue()).executeUpdate();
        } catch (HibernateException e) {
            e.printStackTrace();
            throw new ErroRepositorioException("Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
    }

    /**
     * [UC-0362] - Efetuar Instalao de Hidrmetro [SB003] Atualizar Hidrmetro
     * Atualizar o campo hisi_id
     * 
     * @exception ErroRepositorioExceptions
     *                Descrio da exceo
     * @author Ana Maria
     * @date 17/07/2006
     * @throws ErroRepositorioException
     */
    public void atualizarLocalArmazanagemHidrometro(Integer idHidrometro, Integer localArmazanagemHidrometro)
            throws ErroRepositorioException {
        Session session = HibernateUtil.getSession();
        String update = null;
        try {
            update = "update gcom.micromedicao.hidrometro.Hidrometro set "
                    + "hila_id = :localArmazanagemHidrometro " + "where hidr_id = :numeroHidrometro";
            session.createQuery(update).setInteger("localArmazanagemHidrometro", localArmazanagemHidrometro)
                    .setInteger("numeroHidrometro", idHidrometro.intValue()).executeUpdate();
        } catch (HibernateException e) {
            e.printStackTrace();
            throw new ErroRepositorioException("Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
    }

    /**
     * Substituicao de hidrometro
     */
    public void atualizarSubstituicaoHidrometroInstalacoHistorico(
            HidrometroInstalacaoHistorico hidrometroSubstituicaoHistorico) throws ErroRepositorioException {
        Session session = HibernateUtil.getSession();
        try {
            if (hidrometroSubstituicaoHistorico.getNumeroLeituraRetirada() != null) {
                String sql = "update gcom.micromedicao.hidrometro.HidrometroInstalacaoHistorico "
                        + "set hidi_dtretiradahidrometro = :dataRetirada "
                        + ", hidi_nnleituraretiradahidrometro = :numeroLeituraRetirada "
                        + ", hidi_tmultimaalteracao = :data "
                        + ", hidi_icinstalacaosubstituicao =:indicadorSubstituicao" + " where hidi_id = :id ";
                session.createQuery(sql).setDate("dataRetirada", hidrometroSubstituicaoHistorico.getDataRetirada())
                        .setInteger("numeroLeituraRetirada",
                                hidrometroSubstituicaoHistorico.getNumeroLeituraRetirada())
                        .setTimestamp("data", new Date()).setInteger("id", hidrometroSubstituicaoHistorico.getId())
                        .setShort("indicadorSubstituicao", new Short("2")).executeUpdate();
            } else {
                String sql = "update gcom.micromedicao.hidrometro.HidrometroInstalacaoHistorico "
                        + "set hidi_dtretiradahidrometro = :dataRetirada " + ", hidi_tmultimaalteracao = :data "
                        + ", hidi_icinstalacaosubstituicao =:indicadorSubstituicao" + " where hidi_id = :id ";
                session.createQuery(sql).setDate("dataRetirada", hidrometroSubstituicaoHistorico.getDataRetirada())
                        .setTimestamp("data", new Date()).setInteger("id", hidrometroSubstituicaoHistorico.getId())
                        .setShort("indicadorSubstituicao", new Short("2")).executeUpdate();
            }
        } catch (HibernateException e) {
            throw new ErroRepositorioException("Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
    }

    /**
     * [UC-0362] - Efetuar Instalao de Hidrmetro [SB003] Atualizar Hidrmetro
     * Atualizar o campo hisi_id
     * 
     * @exception ErroRepositorioExceptions
     *                Descrio da exceo
     * @author Ana Maria
     * @date 17/07/2006
     * @throws ErroRepositorioException
     */
    public void atualizarHidrometroInstalacoHistorico(HidrometroInstalacaoHistorico hidrometroSubstituicaoHistorico)
            throws ErroRepositorioException {
        Session session = HibernateUtil.getSession();
        try {
            if (hidrometroSubstituicaoHistorico.getNumeroLeituraRetirada() != null) {
                String sql = "update gcom.micromedicao.hidrometro.HidrometroInstalacaoHistorico "
                        + "set hidi_dtretiradahidrometro = :dataRetirada "
                        + ", hidi_nnleitretiradahidmt = :numeroLeituraRetirada "
                        + ", hidi_tmultimaalteracao = :data " + ", usur_idretirada = :idUsuarioRetirada "
                        + "where hidi_id = :id ";
                session.createQuery(sql).setDate("dataRetirada", hidrometroSubstituicaoHistorico.getDataRetirada())
                        .setInteger("numeroLeituraRetirada",
                                hidrometroSubstituicaoHistorico.getNumeroLeituraRetirada())
                        .setTimestamp("data", new Date()).setInteger("id", hidrometroSubstituicaoHistorico.getId())
                        .setInteger("idUsuarioRetirada",
                                hidrometroSubstituicaoHistorico.getUsuarioRetirada().getId())
                        .executeUpdate();
            } else {
                String sql = "update gcom.micromedicao.hidrometro.HidrometroInstalacaoHistorico "
                        + "set hidi_dtretiradahidrometro = :dataRetirada " + ", hidi_tmultimaalteracao = :data "
                        + "where hidi_id = :id ";
                session.createQuery(sql).setDate("dataRetirada", hidrometroSubstituicaoHistorico.getDataRetirada())
                        .setTimestamp("data", new Date()).setInteger("id", hidrometroSubstituicaoHistorico.getId())
                        .executeUpdate();
            }
        } catch (HibernateException e) {
            throw new ErroRepositorioException("Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
    }

    /**
     * [UC0396] - Inserir Tipo de retorno da OS Referida [FS0005] Validar
     * indicador de deferimento
     * 
     * @author lms
     * @date 31/07/2006
     * @throws ErroRepositorioException
     */
    public int consultarTotalIndicadorDeferimentoAtivoPorServicoTipoReferencia(
            OsReferidaRetornoTipo osReferidaRetornoTipo) throws ErroRepositorioException {
        Session session = HibernateUtil.getSession();
        String select = null;
        try {
            select = "select count(*) from gcom.atendimentopublico.ordemservico.OsReferidaRetornoTipo o where "
                    + "o.indicadorDeferimento = " + ConstantesSistema.INDICADOR_USO_ATIVO + " and "
                    + "o.indicadorUso = " + ConstantesSistema.INDICADOR_USO_ATIVO + " and "
                    + "o.servicoTipoReferencia.id = :idServicoTipoReferencia";
            return ((Integer) session.createQuery(select)
                    .setInteger("idServicoTipoReferencia", osReferidaRetornoTipo.getServicoTipoReferencia().getId())
                    .uniqueResult()).intValue();
        } catch (HibernateException e) {
            e.printStackTrace();
            throw new ErroRepositorioException("Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
    }

    /**
     * [UC0463] Atualizar Consumo Mnimo da Ligao de gua
     * 
     * @author Leonardo Regis
     * @date 30/08/2006
     * @param ligacaoAgua
     * @exception ErroRepositorioExceptions
     */
    public void atualizarConsumoMinimoLigacaoAgua(LigacaoAgua ligacaoAgua) throws ErroRepositorioException {
        Session session = HibernateUtil.getSession();
        String update;
        try {
            update = "update LigacaoAgua set " + "numeroConsumoMinimoAgua = :consumoMinimo, "
                    + "ultimaAlteracao = :dataCorrente " + "where id = :ligacaoAguaId";
            session.createQuery(update).setInteger("consumoMinimo", ligacaoAgua.getNumeroConsumoMinimoAgua())
                    .setTimestamp("dataCorrente", ligacaoAgua.getUltimaAlteracao())
                    .setInteger("ligacaoAguaId", ligacaoAgua.getId()).executeUpdate();
        } catch (HibernateException e) {
            e.printStackTrace();
            throw new ErroRepositorioException("Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
    }

    /**
     * [UC0475] Obter Valor do Dbito Verificar existncia de hidrmetro na
     * ligao de gua.
     * 
     * @author Leonardo Regis
     * @date 09/09/2006
     * @param imovelId
     * @return existencia de hidrometro ou no
     * @throws ErroRepositorioException
     */
    public boolean verificarExistenciaHidrometroEmLigacaoAgua(Integer imovelId) throws ErroRepositorioException {
        Session session = HibernateUtil.getSession();
        String consulta;
        boolean retorno = false;
        Collection<HidrometroInstalacaoHistorico> retornoConsulta = new ArrayList();
        try {
            consulta = "SELECT la.hidrometroInstalacaoHistorico " + "FROM LigacaoAgua la "
                    + "where la.id = :imovelId";
            retornoConsulta = (Collection<HidrometroInstalacaoHistorico>) session.createQuery(consulta)
                    .setInteger("imovelId", imovelId).list();
            if (retornoConsulta != null && !retornoConsulta.isEmpty()) {
                retorno = true;
            }
        } catch (HibernateException e) {
            e.printStackTrace();
            throw new ErroRepositorioException("Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
        return retorno;
    }

    /**
     * [UC0475] Obter Valor do Dbito Verificar existncia de hidrmetro no
     * imvel.
     * 
     * @author Leonardo Regis
     * @date 09/09/2006
     * @param imovelId
     * @return existencia de hidrometro ou no
     * @throws ErroRepositorioException
     */
    public boolean verificarExistenciaHidrometroEmImovel(Integer imovelId) throws ErroRepositorioException {
        Session session = HibernateUtil.getSession();
        String consulta;
        boolean retorno = false;
        Collection<HidrometroInstalacaoHistorico> retornoConsulta = new ArrayList();
        try {
            consulta = "SELECT i.hidrometroInstalacaoHistorico " + "FROM Imovel i " + "where i.id = :imovelId";
            retornoConsulta = (Collection<HidrometroInstalacaoHistorico>) session.createQuery(consulta)
                    .setInteger("imovelId", imovelId).list();
            if (retornoConsulta != null && !retornoConsulta.isEmpty()) {
                retorno = true;
            }
        } catch (HibernateException e) {
            e.printStackTrace();
            throw new ErroRepositorioException("Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
        return retorno;
    }

    /**
     * [UC0475] Obter Valor do Dbito Obter Capacidade de Hidrmetro pela
     * Ligao de gua.
     * 
     * @author Leonardo Regis
     * @date 09/09/2006
     * @param imovelId
     * @return existencia de hidrometro ou no
     * @throws ErroRepositorioException
     */
    public HidrometroCapacidade obterHidrometroCapacidadeEmLigacaoAgua(Integer imovelId)
            throws ErroRepositorioException {
        Session session = HibernateUtil.getSession();
        String consulta;
        HidrometroCapacidade retornoConsulta = null;
        try {
            consulta = "SELECT h.hidrometroCapacidade " + "FROM LigacaoAgua la "
                    + "INNER JOIN la.hidrometroInstalacaoHistorico hih " + "INNER JOIN hih.hidrometro h "
                    + "INNER JOIN h.hidrometroCapacidade hc " + "where la.id = :imovelId";
            retornoConsulta = (HidrometroCapacidade) session.createQuery(consulta).setInteger("imovelId", imovelId)
                    .setMaxResults(1).uniqueResult();
        } catch (HibernateException e) {
            e.printStackTrace();
            throw new ErroRepositorioException("Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
        return retornoConsulta;
    }

    /**
     * [UC0475] Obter Valor do Dbito Obter Capacidade de Hidrmetro pelo
     * Imvel.
     * 
     * @author Leonardo Regis
     * @date 09/09/2006
     * @param imovelId
     * @return existencia de hidrometro ou no
     * @throws ErroRepositorioException
     */
    public HidrometroCapacidade obterHidrometroCapacidadeEmImovel(Integer imovelId)
            throws ErroRepositorioException {
        Session session = HibernateUtil.getSession();
        String consulta;
        HidrometroCapacidade retornoConsulta = null;
        try {
            consulta = "SELECT h.hidrometroCapacidade " + "FROM Imovel i "
                    + "INNER JOIN i.hidrometroInstalacaoHistorico hih " + "INNER JOIN hih.hidrometro h "
                    + "INNER JOIN h.hidrometroCapacidade hc " + "where i.id = :imovelId";
            retornoConsulta = (HidrometroCapacidade) session.createQuery(consulta).setInteger("imovelId", imovelId)
                    .setMaxResults(1).uniqueResult();
        } catch (HibernateException e) {
            e.printStackTrace();
            throw new ErroRepositorioException("Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
        return retornoConsulta;
    }

    /**
    * [UC0475] Obter Valor do Dbito Obter Valor do Debito pelos parmtros
    * passados.
    *
    * @author Leonardo Regis
    * @date 09/09/2006
    * @param obterValorDebitoHelper
    * @return o valor do dbito
    * @throws ErroRepositorioException
    */
    public BigDecimal obterValorDebito(ObterValorDebitoHelper params) throws ErroRepositorioException {

        Session session = HibernateUtil.getSession();
        String consulta;
        BigDecimal retornoConsulta = null;

        try {

            consulta = "SELECT scv.valor" + " FROM ServicoCobrancaValor scv"
                    + " where scv.servicoTipo.id = :servicoTipoId" + " and scv.dataVigenciaInicial <= :dataAtual"
                    + " and scv.dataVigenciaFinal >= :dataAtual"
                    + " and scv.indicadorMedido = :indicadorMedido AND ("
                    + " (scv.imovelPerfil.id = :imovelPerfilid OR scv.imovelPerfil.id is null) AND"
                    + " (scv.hidrometroCapacidade = :hidrometroCapacidade"
                    + " OR scv.hidrometroCapacidade is null) AND"
                    + " (scv.categoria = :categoria OR scv.categoria is null) AND"
                    + " (scv.subCategoria = :subCategoria OR scv.subCategoria is null) AND"
                    + " (scv.quantidadeEconomiasInicial <= :quantidadeEconomias"
                    + " OR scv.quantidadeEconomiasInicial is null) AND"
                    + " (scv.quantidadeEconomiasFinal >= :quantidadeEconomias OR scv.quantidadeEconomiasFinal is null))"
                    + " ORDER BY scv.imovelPerfil,scv.hidrometroCapacidade,scv.categoria,scv.subCategoria";

            retornoConsulta = (BigDecimal) session.createQuery(consulta)
                    .setInteger("servicoTipoId", params.getServicoTipo().getId()).setDate("dataAtual", new Date())
                    .setShort("indicadorMedido", params.getSituacaoMedicao())
                    .setInteger("imovelPerfilid",
                            params.getImovelPerfil() != null ? params.getImovelPerfil().getId() : 0)
                    .setInteger("hidrometroCapacidade",
                            params.getHidrometroCapacidade() != null ? params.getHidrometroCapacidade().getId() : 0)
                    .setInteger("categoria", params.getCategoria() != null ? params.getCategoria().getId() : 0)
                    .setInteger("subCategoria",
                            params.getSubcategoria() != null ? params.getSubcategoria().getId() : 0)
                    .setInteger("quantidadeEconomias",
                            params.getQuantidadeEconomia() != null ? params.getQuantidadeEconomia() : 0)
                    .setMaxResults(1).uniqueResult();

            if (retornoConsulta == null) {

                consulta = "SELECT st.valor " + "FROM ServicoTipo st " + "where st.id = :servicoTipoId ";

                retornoConsulta = (BigDecimal) session.createQuery(consulta)
                        .setInteger("servicoTipoId", params.getServicoTipo().getId()).setMaxResults(1)
                        .uniqueResult();
            }

        } catch (HibernateException e) {
            e.printStackTrace();
            throw new ErroRepositorioException("Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
        return retornoConsulta;
    }

    /**
     * Mtodo que retorna o nmero do hidrmetro da ligao de gua
     * 
     * @author Ana Maria
     * @date 12/09/2006
     * @param idImovel
     * @return
     * @throws ControladorException
     */
    public String pesquisarNumeroHidrometroLigacaoAgua(Integer idLigacaoAgua) throws ErroRepositorioException {
        String retorno = "";
        Session session = HibernateUtil.getSession();
        String consulta;
        try {
            consulta = " select hidr.numero" + " from LigacaoAgua lagu"
                    + " inner join lagu.hidrometroInstalacaoHistorico hidi" + " inner join hidi.hidrometro hidr"
                    + " where lagu.id = :idLigacaoAgua";
            retorno = (String) session.createQuery(consulta).setInteger("idLigacaoAgua", idLigacaoAgua)
                    .setMaxResults(1).uniqueResult();
        } catch (HibernateException e) {
            throw new ErroRepositorioException("Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
        return retorno;
    }

    /**
     * Mtodo que retorna o tipo da ligao de gua, a data do corte da ligao
     * de gua e a data da Religao
     * 
     * @author Ana Maria, Raphael Rossiter
     * @date 18/08/2006, 03/01/2008
     * @param idLigacaoAgua
     * @throws ErroRepositorioException
     */
    public Object[] pesquisarDadosLigacaoAgua(Integer idLigacaoAgua) throws ErroRepositorioException {
        Object[] retorno = null;
        Session session = HibernateUtil.getSession();
        String consulta = "";
        try {
            consulta = "select lagu.corteTipo.id, lagu.dataCorteAdministrativo, lagu.dataReligacao,"
                    + " lagu.dataCorte, lagu.dataSupressao" + " from LigacaoAgua lagu"
                    + " where lagu.id = :idLigacaoAgua";
            retorno = (Object[]) session.createQuery(consulta).setInteger("idLigacaoAgua", idLigacaoAgua)
                    .setMaxResults(1).uniqueResult();
        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
        return retorno;
    }

    /**
     * Consulta os dados das ordens de servio para a gerao do relatrio
     * 
     * @author Rafael Corra, Vivianne Sousa
     * @created 07/10/2006, 09/03/2007
     * @return
     * @throws ErroRepositorioException
     */
    public Collection pesquisarOrdemServicoProgramacaoRelatorio(Integer idEquipe, Date dataRoteiro)
            throws ErroRepositorioException {
        Collection retorno = null;
        Session session = HibernateUtil.getSession();
        String consulta = null;
        try {
            if (dataRoteiro != null) {
                consulta = "SELECT ospg.nnSequencialProgramacao, ra.id, " + "orse.id, svtp.id, orse.observacao "
                        + "FROM OrdemServicoProgramacao ospg " + "INNER JOIN ospg.ordemServico orse "
                        + "INNER JOIN ospg.equipe equipe " + "INNER JOIN ospg.programacaoRoteiro progRot "
                        + "INNER JOIN orse.servicoTipo svtp " + "LEFT JOIN orse.registroAtendimento ra "
                        + "WHERE equipe.id = :idEquipe " + "AND progRot.dataRoteiro = :dataRoteiro "
                        + "AND orse.indicadorProgramada = :programada "
                        + "AND (ospg.indicadorAtivo = :indicadorAtivo "
                        + "OR (ospg.indicadorAtivo = :indicadorAtivoNao AND ospg.situacaoFechamento = :situacaoFechamento )) "
                        + "ORDER BY ospg.nnSequencialProgramacao ";
                retorno = session.createQuery(consulta).setInteger("idEquipe", idEquipe)
                        .setTimestamp("dataRoteiro", dataRoteiro)
                        .setShort("indicadorAtivo", OrdemServicoProgramacao.INDICADOR_ATIVO)
                        .setShort("indicadorAtivoNao", OrdemServicoProgramacao.INDICADOR_ATIVO_NAO)
                        .setShort("situacaoFechamento", OrdemServicoProgramacao.SITUACAO_FECHAMENTO)
                        .setShort("programada", ConstantesSistema.INDICADOR_USO_ATIVO).list();
            } else {
                consulta = "select ospg.nnSequencialProgramacao, ra.id, " + "orse.id, svtp.id, orse.observacao "
                        + "from OrdemServicoProgramacao ospg " + "inner join ospg.ordemServico orse "
                        + "inner join ospg.equipe equipe " + "left join orse.registroAtendimento ra "
                        + "inner join orse.servicoTipo svtp " + "where equipe.id = :idEquipe"
                        + "AND orse.indicadorProgramada = :programada "
                        + "AND (ospg.indicadorAtivo = :indicadorAtivo "
                        + "OR (ospg.indicadorAtivo = :indicadorAtivoNao AND ospg.situacaoFechamento = :situacaoFechamento )) "
                        + "ORDER BY ospg.nnSequencialProgramacao ";
                retorno = session.createQuery(consulta).setInteger("idEquipe", idEquipe)
                        .setShort("indicadorAtivo", OrdemServicoProgramacao.INDICADOR_ATIVO)
                        .setShort("indicadorAtivoNao", OrdemServicoProgramacao.INDICADOR_ATIVO_NAO)
                        .setShort("situacaoFechamento", OrdemServicoProgramacao.SITUACAO_FECHAMENTO)
                        .setShort("programada", ConstantesSistema.INDICADOR_USO_ATIVO).list();
            }
        } catch (HibernateException e) {
            // levanta a exceo para a prxima camada
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            // fecha a sesso
            HibernateUtil.closeSession(session);
        }
        return retorno;
    }

    /**
     * [UC0404] Manter Especificao da Situao do Imovel Este caso de uso
     * remove a especificao e os critrio [SB0002] Remover Especificao da
     * situacao
     * 
     * @author Rafael Pinto
     * @created 08/11/2006
     * @throws ControladorException
     *             Controlador Exception
     */
    public void removerEspecificacaoSituacaoImovelCriterio(String[] idsEspecificacaoSituacaoImovel)
            throws ErroRepositorioException {
        String remocao = null;
        Session session = HibernateUtil.getSession();
        try {
            remocao = "delete EspecificacaoImovSitCriterio " + "where esim_id IN(:ids)";
            session.createQuery(remocao).setParameterList("ids", idsEspecificacaoSituacaoImovel).executeUpdate();
        } catch (HibernateException e) {
            // levanta a exceo para a prxima camada
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            // fecha a sesso
            HibernateUtil.closeSession(session);
        }
    }

    /**
     * Pesquisa todos os ids das situaes de ligao de gua. [UC0564 - Gerar
     * Resumo das Instalaes de Hidrmetros]
     * 
     * @author Pedro Alexandre
     * @date 25/04/2007
     * @return
     * @throws ErroRepositorioException
     */
    public Collection<Integer> pesquisarTodosIdsSituacaoLigacaoAgua() throws ErroRepositorioException {
        Collection<Integer> retorno = null;
        Session session = HibernateUtil.getSession();
        String consulta = "";
        try {
            consulta = "select last.id from LigacaoAguaSituacao last";
            retorno = session.createQuery(consulta).list();
        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
        return retorno;
    }

    /**
     * Pesquisa todos os ids das situaes de ligao de esgoto. [UC0564 - Gerar
     * Resumo das Instalaes de Hidrmetros]
     * 
     * @author Pedro Alexandre
     * @date 25/04/2007
     * @return
     * @throws ErroRepositorioException
     */
    public Collection<Integer> pesquisarTodosIdsSituacaoLigacaoEsgoto() throws ErroRepositorioException {
        Collection<Integer> retorno = null;
        Session session = HibernateUtil.getSession();
        String consulta = "";
        try {
            consulta = "select lest.id from LigacaoEsgotoSituacao lest";
            retorno = session.createQuery(consulta).list();
        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
        return retorno;
    }

    /**
     * Este cso de uso permite efetuar a ligao de gua e eventualmente a
     * instalao de hidrmetro, sem informao de RA sendo chamado direto pelo
     * menu. [UC0579] - Efetuar Ligao de gua com Intalao de Hidrmetro
     * 
     * @author Flvio Leonardo
     * @date 25/04/2007
     * @param idImovel
     * @return
     * @throws ErroRepositorioException
     */
    public Collection pesquisarEfetuarLigacaoAguaHidrometroSemRA(Integer idImovel) throws ErroRepositorioException {
        Collection retorno = null;
        Session session = HibernateUtil.getSession();
        try {
            String hql = "select imovel.id," // 0
                    + " cliente.nome,"// 1
                    + " cliente.cpf,"// 2
                    + " cliente.cnpj,"// 3
                    + " ligacaoAguaSituacao.descricao,"// 4
                    + " ligacaoEsgotoSituacao.descricao,"// 5
                    + " imovel.indicadorExclusao,"// 6
                    + " quadra.indicadorRedeAgua,"// 7
                    + " ligacaoAguaSituacao.id,"// 8
                    + " ligacaoEsgotoSituacao.id"// 9
                    + " from ClienteImovel clienteImovel" + " inner join clienteImovel.imovel imovel"
                    + " inner join clienteImovel.cliente cliente"
                    + " inner join imovel.ligacaoAguaSituacao ligacaoAguaSituacao"
                    + " inner join imovel.ligacaoEsgotoSituacao ligacaoEsgotoSituacao"
                    + " inner join imovel.quadra quadra" + " where imovel.id = :idImovel"
                    + " and clienteImovel.clienteRelacaoTipo.id = :relacaoTipo"
                    + " and clienteImovel.dataFimRelacao is null";
            retorno = session.createQuery(hql).setInteger("idImovel", idImovel)
                    .setInteger("relacaoTipo", new Integer(ClienteRelacaoTipo.USUARIO)).setMaxResults(1).list();
        } catch (HibernateException e) {
            // levanta a exceo para a prxima camada
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            // fecha a sesso
            HibernateUtil.closeSession(session);
        }
        return retorno;
    }

    /**
     * [UC0XXX] Gerar Contrato de Prestao de Servio
     * 
     * @author Rafael Corra
     * @date 03/05/2007
     * @throws ErroRepositorioException
     */
    public Collection obterDadosContratoPrestacaoServico(Integer idImovel) throws ErroRepositorioException {
        Session session = HibernateUtil.getSession();
        String consulta;
        Collection retorno = null;
        try {
            /*
             * consulta = "SELECT clie.clie_nmcliente as nomeCliente,
             * unidNeg.uneg_nmabreviado as nomeUnidadeNegocio, " // 0, 1 +
             * "clieResponsavel.clie_nmcliente as nomeResponsavel,
             * clieResponsavel.clie_nncpf as cpfResponsavel, " // 2, 3 +
             * "clieResponsavel.clie_nnrg as rgResponsavel, clie.clie_nncpf as
             * cpfCliente, clie.clie_nnrg as rgCliente, " // 4, // 5, 6 +
             * "clie.clie_id as idCliente, clieResponsavel.clie_id as
             * idResponsavel, imov.cstf_id as consumoTarifa, " // 7, // 8, 9 +
             * "municipio.muni_nmmunicipio as nomeMunicipio " // 10 + "FROM
             * cadastro.imovel imov " + "INNER JOIN cadastro.localidade loc " +
             * "on loc.loca_id = imov.loca_id " + "LEFT OUTER JOIN
             * cadastro.bairro bairro " + "on loc.bair_id = bairro.bair_id " +
             * "LEFT OUTER JOIN cadastro.municipio municipio " + "on
             * bairro.muni_id = municipio.muni_id " // + "INNER JOIN
             * cadastro.gerencia_regional greg " // + "on greg.greg_id =
             * loc.greg_id " + "INNER JOIN cadastro.unidade_negocio unidNeg " +
             * "on unidNeg.uneg_id = loc.uneg_id " + "INNER JOIN
             * cadastro.cliente_imovel clieImov " + "on clieImov.imov_id =
             * imov.imov_id and clieImov.crtp_id = " +
             * ClienteRelacaoTipo.USUARIO.toString() + "and
             * clieImov.clim_dtrelacaofim is null " + "INNER JOIN
             * cadastro.cliente clie " + "on clie.clie_id = clieImov.clie_id " +
             * "LEFT OUTER JOIN cadastro.cliente clieResponsavel " + "on
             * clieResponsavel.clie_id = unidNeg.clie_id " + "where imov.imov_id =
             * :idImovel";
             */

            consulta = "SELECT loc.loca_nmlocalidade as nomeLocalidade, "// 0
                    + "clieResponsavel.clie_nmcliente as nomeResponsavel, " // 1
                    + "clieResponsavel.clie_nncpf as cpfResponsavel, " // 2
                    + "clieResponsavel.clie_nnrg as rgResponsavel, " //3
                    + "clieResponsavel.clie_id as idResponsavel, " //4
                    + "imov.cstf_id as consumoTarifa, " // 5
                    + "municipio.muni_nmmunicipio as nomeMunicipio " //6
                    //+ "clie.clie_nncpf as cpfCliente, " //5
                    //+ "clie.clie_nnrg as rgCliente, " // 6
                    //+ "clie.clie_id as idCliente, " // 7
                    //+ "clieResponsavel.clie_id as idResponsavel, " //8
                    //+ "imov.cstf_id as consumoTarifa, " // 9
                    //+ "municipio.muni_nmmunicipio as nomeMunicipio " // 10
                    + "FROM cadastro.imovel imov " + "INNER JOIN cadastro.localidade loc "
                    + "on loc.loca_id = imov.loca_id " + "LEFT OUTER JOIN cadastro.bairro bairro "
                    + "on loc.bair_id = bairro.bair_id " + "LEFT OUTER JOIN cadastro.municipio municipio "
                    + "on bairro.muni_id = municipio.muni_id "
                    // + "INNER JOIN cadastro.gerencia_regional greg "
                    // + "on greg.greg_id = loc.greg_id "
                    /*+ "INNER JOIN cadastro.unidade_negocio unidNeg "
                    + "on unidNeg.uneg_id = loc.uneg_id "*/
                    /*+ "INNER JOIN cadastro.cliente_imovel clieImov "
                    + "on clieImov.imov_id = imov.imov_id and clieImov.crtp_id = "
                    + ClienteRelacaoTipo.USUARIO.toString()
                    + "and clieImov.clim_dtrelacaofim is null "*/
                    /*+ "INNER JOIN cadastro.cliente clie "
                    + "on clie.clie_id = clieImov.clie_id "*/
                    + "LEFT OUTER JOIN cadastro.cliente clieResponsavel "
                    + "on clieResponsavel.clie_id = loc.clie_id " + "where imov.imov_id = :idImovel";

            retorno = (Collection) session.createSQLQuery(consulta)
                    /*.addScalar(
                    "nomeCliente", Hibernate.STRING)*/.addScalar("nomeLocalidade", Hibernate.STRING)
                    .addScalar("nomeResponsavel", Hibernate.STRING).addScalar("cpfResponsavel", Hibernate.STRING)
                    .addScalar("rgResponsavel",
                            Hibernate.STRING)/*.addScalar("cpfCliente",
                                             Hibernate.STRING).addScalar("rgCliente", Hibernate.STRING)*/
                    /*.addScalar("idCliente", Hibernate.INTEGER)*/.addScalar("idResponsavel", Hibernate.INTEGER)
                    .addScalar("consumoTarifa", Hibernate.INTEGER).addScalar("nomeMunicipio", Hibernate.STRING)
                    .setInteger("idImovel", idImovel).list();
        } catch (HibernateException e) {
            e.printStackTrace();
            throw new ErroRepositorioException("Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
        return retorno;
    }

    /**
    * [UC0582] - Emitir Boletim de Cadastro Obtm os dados necessrio da
    * ligao de gua, de esgoto e do hidrmetro instalado na ligao de gua
    * 
    * @author Rafael Corra
    * @date 17/05/2007
    * @throws ErroRepositorioException
    */
    public Object[] obterDadosLigacaoAguaEsgoto(Integer idImovel) throws ErroRepositorioException {
        Session session = HibernateUtil.getSession();
        String consulta;
        Object[] retorno = null;
        try {
            consulta = "SELECT lagu.lagd_id as diametroLigAgua, lagu.lagm_id as materialLigAgua, "
                    + " lesg.legd_id as diametroLigEsgoto, lesg.legm_id as materialLigEsgoto, "
                    + " hidrInstHist.hidi_nnleitinstalacaohidmt as leituraInicial, hidr.hicp_id as capacidade, "
                    + " hidr.himc_id as marca, hidrInstHist.hili_id as localInstalacao, hidrInstHist.hipr_id as protecao, "
                    + " hidrInstHist.hidi_iccavalete as cavalete, hidr.hidr_nnhidrometro as numeroHidrometro "
                    + " FROM cadastro.imovel imov "
                    + " LEFT OUTER JOIN atendimentopublico.ligacao_agua lagu on lagu.lagu_id = imov.imov_id "
                    + " LEFT OUTER JOIN micromedicao.hidrometro_inst_hist hidrInstHist on hidrInstHist.hidi_id = lagu.hidi_id "
                    + " LEFT OUTER JOIN micromedicao.hidrometro hidr on hidr.hidr_id = hidrInstHist.hidr_id "
                    + " LEFT OUTER JOIN atendimentopublico.ligacao_esgoto lesg on lesg.lesg_id = imov.imov_id "
                    + " WHERE imov.imov_id = :idImovel";

            retorno = (Object[]) session.createSQLQuery(consulta).addScalar("diametroLigAgua", Hibernate.INTEGER)
                    .addScalar("materialLigAgua", Hibernate.INTEGER)
                    .addScalar("diametroLigEsgoto", Hibernate.INTEGER)
                    .addScalar("materialLigEsgoto", Hibernate.INTEGER)
                    .addScalar("leituraInicial", Hibernate.INTEGER).addScalar("capacidade", Hibernate.INTEGER)
                    .addScalar("marca", Hibernate.INTEGER).addScalar("localInstalacao", Hibernate.INTEGER)
                    .addScalar("protecao", Hibernate.INTEGER).addScalar("cavalete", Hibernate.SHORT)
                    .addScalar("numeroHidrometro", Hibernate.STRING).setInteger("idImovel", idImovel)
                    .setMaxResults(1).uniqueResult();

        } catch (HibernateException e) {
            e.printStackTrace();
            throw new ErroRepositorioException("Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
        return retorno;
    }

    public void atualizarImovelLigacaoAguaInstalacaoHidrometroSemRA(Integer idImovel, Integer idHidrometro)
            throws ErroRepositorioException {
        Session session = HibernateUtil.getSession();
        try {
            if (idImovel != null) {
                String hql = "update gcom.cadastro.imovel.Imovel set "
                        + "last_id = :situacao, imov_tmultimaalteracao = :ultimaAlteracao "
                        + "where imov_id = :idImovel";
                session.createQuery(hql).setInteger("situacao", LigacaoAguaSituacao.LIGADO)
                        .setTimestamp("ultimaAlteracao", new Date()).setInteger("idImovel", idImovel)
                        .executeUpdate();
            }
            if (idHidrometro != null) {
                String hql2 = "update gcom.micromedicao.hidrometro.Hidrometro set "
                        + "hist_id = :situacao, hidr_tmultimaalteracao = :ultimaAlteracao "
                        + "where hidr_id = :idHidrometro";
                session.createQuery(hql2).setInteger("situacao", HidrometroSituacao.INSTALADO)
                        .setTimestamp("ultimaAlteracao", new Date()).setInteger("idHidrometro", idHidrometro)
                        .executeUpdate();
            }
        } catch (HibernateException e) {
            // levanta a exceo para a prxima camada
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            // fecha a sesso
            HibernateUtil.closeSession(session);
        }
    }

    //*********************************************************
    //****************CONTRATO PESSOA JURIDICA*****************
    public Cliente pesquisaClienteContrato(Integer idCliente) throws ErroRepositorioException {
        Cliente retorno = null;
        Session session = HibernateUtil.getSession();
        String consulta = "";
        try {
            consulta = "from Cliente cliente" + " left join fetch cliente.profissao profissao"
                    + " inner join fetch cliente.clienteTipo clienteTipo" + " where cliente.id = :idCliente";
            retorno = (Cliente) session.createQuery(consulta).setInteger("idCliente", idCliente).uniqueResult();
        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
        return retorno;
    }

    public ClienteImovel pesquisarDadosContratoJuridica(Integer idImovel) throws ErroRepositorioException {
        ClienteImovel retorno = null;
        Session session = HibernateUtil.getSession();
        String consulta = "";
        try {
            consulta = "from ClienteImovel clienteImovel" + " inner join fetch clienteImovel.cliente cliente"
                    + " inner join fetch clienteImovel.imovel imovel"
                    + " inner join fetch cliente.clienteTipo clienteTipo"
                    + " inner join fetch clienteTipo.esferaPoder esferaPoder" + " where imovel.id = " + idImovel
                    + " and clienteImovel.clienteRelacaoTipo.id = " + ClienteRelacaoTipo.USUARIO;
            retorno = (ClienteImovel) session.createQuery(consulta).setMaxResults(1).uniqueResult();
        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
        return retorno;
    }

    public String pesquisarMunicipio(Integer idImovel) throws ErroRepositorioException {
        String retorno = null;
        Session session = HibernateUtil.getSession();
        String consulta = "";
        try {
            consulta = "select municipio.nome from  Imovel imovel"
                    + " inner join fetch imovel.localidade localidade"
                    + " inner join fetch localidade.logradouroBairro logradouro"
                    + " inner join fetch logradouro.bairro bairro" + " inner join fetch bairro.municipio municipio"
                    + " where imovel.id = :idImovel";
            retorno = (String) session.createQuery(consulta).setInteger("idImovel", idImovel).uniqueResult();
        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
        return retorno;
    }

    //**********************************************************************************
    /**
        
     * [UC0482]Emitir 2 Via de Conta
        
     *obter numero do hidrmetro na ligao de gua.
        
     * 
        
     * @author Vivianne Sousa
        
     * @date 11/09/2007
        
     * 
        
     * @param imovelId
        
     * @return existencia de hidrometro ou no
        
     * @throws ErroRepositorioException
        
     */
    public String obterNumeroHidrometroEmLigacaoAgua(Integer imovelId) throws ErroRepositorioException {
        Session session = HibernateUtil.getSession();
        String consulta;
        String retornoConsulta = null;
        try {
            consulta = "SELECT hidr.numero " + "FROM LigacaoAgua la "
                    + "inner join la.hidrometroInstalacaoHistorico hidi " + "inner join hidi.hidrometro hidr "
                    + "where la.id = :imovelId ";
            retornoConsulta = (String) session.createQuery(consulta).setInteger("imovelId", imovelId)
                    .uniqueResult();
        } catch (HibernateException e) {
            e.printStackTrace();
            throw new ErroRepositorioException("Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
        return retornoConsulta;
    }

    /**
     * 
     * [UC0738] Retorna as informaes para o relatrio de certido negativa
     * 
     * @param imo
     * 
     * @return
     * 
     * @throws ErroRepositorioException
     * 
     */
    public Collection<Object[]> pesquisarRelatorioCertidaoNegativa(Imovel imo) throws ErroRepositorioException {

        Session session = HibernateUtil.getSession();

        String consulta;

        Collection retornoConsulta = null;

        try {

            consulta = " select \n" +
            // 0
                    "   cli.nome, \n" +
                    // 1
                    "   imo.id, \n" +
                    // 2
                    "   loc.id, \n" +
                    // 3
                    "   sc.codigo, \n" +
                    // 4
                    "   qua.numeroQuadra, \n" +
                    // 5
                    "   imo.lote, \n" +
                    // 6
                    "   imo.subLote, \n" +
                    // 7
                    "   imo.quantidadeEconomias, \n" +
                    // 8
                    "   ip.descricao, \n" +
                    // 9
                    "   las.descricao, \n" +
                    // 10
                    "   les.descricao, \n" +
                    // 11
                    "   pt.descricao, \n" +
                    // 12
                    "   sp.nomeAbreviadoEmpresa, \n" +
                    // 13
                    "   sp.nomeEmpresa, \n" +
                    // 14
                    "   sp.cnpjEmpresa, \n" +
                    // 15
                    "   loc.descricao, \n" +
                    // 16
                    "   coalesce( ltp.descricao, '' ) || ' ' || coalesce( ltt.descricao, '' ) || ' ' || coalesce( log.nome, '' ) as logradouro, \n"
                    +
                    // 17
                    "   sp.numeroImovel, \n" +
                    // 18
                    "   sp.complementoEndereco, \n" +
                    // 19
                    "   er.descricaoAbreviada, \n" +
                    // 20
                    "   bai.nome, \n" +
                    // 21
                    "   cep.codigo, \n" +
                    // 22
                    "   sp.nomeSiteEmpresa, \n" +
                    // 23
                    "   sp.numero0800Empresa, \n" +
                    // 24
                    "   sp.inscricaoEstadual, \n" +
                    // 25
                    "   imo.areaConstruida, \n" +
                    // 26
                    "   areaConstruidaFaixa, \n" +
                    // 27
                    "   hidr.numero, \n " +
                    // 28
                    " unidNeg.nome, \n" +
                    // 29
                    " cli.cpf, \n" +
                    //30
                    " cli.cnpj, \n" +
                    //31
                    " cliTipo.indicadorPessoaFisicaJuridica \n"

                    + " from \n" + "   ClienteImovel ci \n" + "   inner join ci.clienteRelacaoTipo crt \n"
                    + "   inner join ci.cliente cli \n" + "   inner join cli.clienteTipo cliTipo \n"
                    + "   inner join ci.imovel imo \n" + "   inner join imo.localidade loc \n"
                    + "   inner join loc.unidadeNegocio unidNeg \n" + "   inner join imo.setorComercial sc \n"
                    + "   inner join imo.quadra qua \n" + "   inner join imo.imovelPerfil ip \n"
                    + "   inner join imo.ligacaoAguaSituacao las \n"
                    + "   inner join imo.ligacaoEsgotoSituacao les  \n" + "   left join imo.pocoTipo pt,  \n"
                    + "   SistemaParametro sp \n"
                    //                    + "   left join sp.logradouro log \n"
                    + "   left join sp.logradouroCep logradouroCep " + "   left join logradouroCep.logradouro log "
                    + "   left join log.logradouroTipo ltp \n" + "   left join log.logradouroTitulo ltt \n"
                    + "   left join sp.enderecoReferencia er \n"
                    //                    + "   left join sp.bairro bai \n"
                    + "left join sp.logradouroBairro logradouroBairro "
                    + "left join logradouroBairro.bairro bai \n "
                    //                    + "   left join sp.cep cep \n"
                    + "   left join logradouroCep.cep cep "
                    + "   left join imo.areaConstruidaFaixa areaConstruidaFaixa \n"
                    + "   left join imo.ligacaoAgua lagu \n"
                    + "   left join lagu.hidrometroInstalacaoHistorico hidInsHist "
                    + "   left join hidInsHist.hidrometro hidr " + " where  \n" + "   crt.id = 2 and \n"
                    + "   ci.dataFimRelacao is null and \n " + "   imo.id = :idImovel \n";

            retornoConsulta = session.createQuery(consulta).setInteger("idImovel", imo.getId()).list();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }

        return retornoConsulta;
    }

    /**
     * Pesquisa os dados necessrios para a gerao do relatrio
     * 
     * [UC0864] Gerar Certido Negativa por Cliente
     * 
     * @return
     * 
     * @throws ErroRepositorioException
     */
    public Collection<Object[]> pesquisarRelatorioCertidaoNegativaCliente(Collection<Integer> idsClientes)
            throws ErroRepositorioException {

        Session session = HibernateUtil.getSession();

        String consulta;

        Collection<Object[]> retorno = null;

        try {

            consulta = " SELECT DISTINCT clie.clie_id as idClienteResponsavel, " // 0
                    + " clieImov.imov_id as idImovel, " //1
                    + " ligAguaSit.last_dsabreviado as situacaoLigacaoAgua, " //2
                    + " clie.clie_nncpf as cpf, " //3
                    + " clie.clie_nncnpj as cnpj,  " //4
                    + " clieTipo.cltp_icpessoafisicajuridica as incicadorCpfCnpj " //5
                    + " FROM cadastro.cliente clie " + " INNER JOIN cadastro.cliente_tipo clieTipo "
                    + " on clieTipo.cltp_id = clie.cltp_id " + " INNER JOIN cadastro.cliente_imovel clieImov "
                    + " on clieImov.clie_id = clie.clie_id and clieImov.clim_dtrelacaofim is null "
                    + " INNER JOIN cadastro.imovel imov " + " on imov.imov_id = clieImov.imov_id "
                    + " INNER JOIN atendimentopublico.ligacao_agua_situacao ligAguaSit "
                    + " on ligAguaSit.last_id = imov.last_id " + " WHERE clie.clie_id in (:idsClientes)";

            retorno = session.createSQLQuery(consulta).addScalar("idClienteResponsavel", Hibernate.INTEGER)
                    .addScalar("idImovel", Hibernate.INTEGER).addScalar("situacaoLigacaoAgua", Hibernate.STRING)
                    .addScalar("cpf", Hibernate.STRING).addScalar("cnpj", Hibernate.STRING)
                    .addScalar("incicadorCpfCnpj", Hibernate.SHORT).setParameterList("idsClientes", idsClientes)
                    .list();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }

        return retorno;
    }

    /**
    * [UC0541] Emitir 2a Via Conta Internet
    *
    * [FS0004] - Cliente no associado ao documento
    *
    * @author Raphael Rossiter
    * @date 21/10/2008
    *
    * @param idImovel
    * @param cpf
    * @return Collection
    * @throws ErroRepositorioException
    */
    public Collection pesquisarClienteAssociadoImovelComCPF(Integer idImovel, String cpf)
            throws ErroRepositorioException {

        Collection retorno = null;
        Session session = HibernateUtil.getSession();
        String consulta = null;

        try {
            consulta = "SELECT cliente " + "FROM ClienteImovel clienteImovel "
                    + "INNER JOIN clienteImovel.cliente cliente " + "INNER JOIN clienteImovel.imovel imovel "
                    + "WHERE imovel.id = :idImovel " + "AND clienteImovel.dataFimRelacao IS NULL "
                    + "AND cliente.cpf = :cpf ";

            retorno = session.createQuery(consulta).setInteger("idImovel", idImovel.intValue())
                    .setString("cpf", cpf.trim()).list();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }

        return retorno;

    }

    /**
     * [UC0541] Emitir 2a Via Conta Internet
     *
     * [FS0004] - Cliente no associado ao documento
     *
     * @author Raphael Rossiter
     * @date 21/10/2008
     *
     * @param idImovel
     * @param cnpj
     * @return Collection
     * @throws ErroRepositorioException
     */
    public Collection pesquisarClienteAssociadoImovelComCNPJ(Integer idImovel, String cnpj)
            throws ErroRepositorioException {

        Collection retorno = null;
        Session session = HibernateUtil.getSession();
        String consulta = null;

        try {
            consulta = "SELECT cliente " + "FROM ClienteImovel clienteImovel "
                    + "INNER JOIN clienteImovel.cliente cliente " + "INNER JOIN clienteImovel.imovel imovel "
                    + "WHERE imovel.id = :idImovel " + "AND clienteImovel.dataFimRelacao IS NULL "
                    + "AND cliente.cnpj = :cnpj ";

            retorno = session.createQuery(consulta).setInteger("idImovel", idImovel.intValue())
                    .setString("cnpj", cnpj.trim()).list();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }

        return retorno;

    }

    /**
     * [UC0482] Emitir 2a Via Conta
     *
     * [FS0002] - Cliente sem documento
     *
     * @author Raphael Rossiter
     * @date 24/10/2008
     *
     * @param idImovel
     * @return Collection
     * @throws ErroRepositorioException
     */
    public Collection pesquisarClienteAssociadoImovelComDocumentoInformado(Integer idImovel)
            throws ErroRepositorioException {

        Collection retorno = null;
        Session session = HibernateUtil.getSession();
        String consulta = null;

        try {
            consulta = "SELECT cliente " + "FROM ClienteImovel clienteImovel "
                    + "INNER JOIN clienteImovel.cliente cliente " + "INNER JOIN clienteImovel.imovel imovel "
                    + "WHERE imovel.id = :idImovel " + "AND clienteImovel.dataFimRelacao IS NULL "
                    + "AND (cliente.cpf IS NOT NULL OR cliente.cnpj IS NOT NULL)";

            retorno = session.createQuery(consulta).setInteger("idImovel", idImovel.intValue()).list();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }

        return retorno;

    }

    /**
     * [UC0150] Retificar Conta
     * @author Vivianne Sousa
     * @date 26/11/2008
     */
    public BigDecimal obterPercentualAguaConsumidaColetadaImovel(Integer idImovel) throws ErroRepositorioException {

        Session session = HibernateUtil.getSession();
        String consulta;
        BigDecimal retornoConsulta = null;

        try {
            consulta = "SELECT le.percentualAguaConsumidaColetada " + "FROM LigacaoEsgoto le "
                    + "where le.id = :idImovel ";

            retornoConsulta = (BigDecimal) session.createQuery(consulta).setInteger("idImovel", idImovel)
                    .setMaxResults(1).uniqueResult();

        } catch (HibernateException e) {
            e.printStackTrace();
            throw new ErroRepositorioException("Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
        return retornoConsulta;
    }

    /**
     * [UC0XXX] Gerar Contrato de Prestao de Servio
     * 
     * @author Rafael Corra
     * @date 03/05/2007
     * @throws ErroRepositorioException
     */
    public Collection obterDadosUnidadeNegocioeInformacoesResponsavel(Integer idImovel)
            throws ErroRepositorioException {
        Session session = HibernateUtil.getSession();
        String consulta;
        Collection retorno = null;
        try {

            consulta = "SELECT unidNeg.uneg_nmabreviado as nomeUnidadeNegocio, " // 0
                    + "clieResponsavel.clie_nmcliente as nomeResponsavel, " // 1 
                    + "clieResponsavel.clie_nncpf as cpfResponsavel, " // 2
                    + "clieResponsavel.clie_nnrg as rgResponsavel, " // 3
                    /*+ "clie.clie_nncpf as cpfCliente, " // 5
                    + "clie.clie_nnrg as rgCliente, " // 6 
                    + "clie.clie_id as idCliente, "  //7*/
                    + "clieResponsavel.clie_id as idResponsavel, " // 4 
                    + "imov.cstf_id as consumoTarifa, " // 5
                    + "municipio.muni_nmmunicipio as nomeMunicipio " // 6
                    + "FROM cadastro.imovel imov " + "INNER JOIN cadastro.localidade loc "
                    + "on loc.loca_id = imov.loca_id " + "LEFT OUTER JOIN cadastro.bairro bairro "
                    + "on loc.bair_id = bairro.bair_id " + "LEFT OUTER JOIN cadastro.municipio municipio "
                    + "on bairro.muni_id = municipio.muni_id "
                    // + "INNER JOIN cadastro.gerencia_regional greg "
                    // + "on greg.greg_id = loc.greg_id "
                    + "INNER JOIN cadastro.unidade_negocio unidNeg " + "on unidNeg.uneg_id = loc.uneg_id "
                    /*+ "INNER JOIN cadastro.cliente_imovel clieImov "
                    + "on clieImov.imov_id = imov.imov_id and clieImov.crtp_id = "
                    + ClienteRelacaoTipo.USUARIO.toString()
                    + "and clieImov.clim_dtrelacaofim is null "
                    + "INNER JOIN cadastro.cliente clie "
                    + "on clie.clie_id = clieImov.clie_id "*/
                    + "LEFT OUTER JOIN cadastro.cliente clieResponsavel "
                    + "on clieResponsavel.clie_id = unidNeg.clie_id " + "where imov.imov_id = :idImovel";

            retorno = (Collection) session.createSQLQuery(consulta).addScalar("nomeCliente", Hibernate.STRING)
                    .addScalar("nomeUnidadeNegocio", Hibernate.STRING)
                    .addScalar("nomeResponsavel", Hibernate.STRING).addScalar("cpfResponsavel", Hibernate.STRING)
                    .addScalar("rgResponsavel", Hibernate.STRING).addScalar("cpfCliente", Hibernate.STRING)
                    .addScalar("rgCliente", Hibernate.STRING).addScalar("idCliente", Hibernate.INTEGER)
                    .addScalar("idResponsavel", Hibernate.INTEGER).addScalar("consumoTarifa", Hibernate.INTEGER)
                    .addScalar("nomeMunicipio", Hibernate.STRING).setInteger("idImovel", idImovel).list();
        } catch (HibernateException e) {
            e.printStackTrace();
            throw new ErroRepositorioException("Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
        return retorno;
    }

    /**
    * [UC0898] Atualizar Autos de Infrao com prazo de Recurso Vencido
    * 
    * @author Svio Luiz
    * @date 08/05/2009
    */
    public Collection<AutosInfracao> pesquisarAutoInfracaoRecursoVencido(Integer idSituacaoAutoInfracao,
            Date prazoEntregaRecursoVencido) throws ErroRepositorioException {

        Session session = HibernateUtil.getSession();
        String consulta;
        Collection retornoConsulta = null;

        try {
            consulta = "SELECT ai " + "FROM AutosInfracao ai " + "INNER JOIN ai.fiscalizacaoSituacao fs "
                    + "INNER JOIN ai.autoInfracaoSituacao ais "
                    + "where ais.id = :idAutoInfracaoSituacao and  ai.dataEmissao < :prazoEntregaRecursoVencido";

            retornoConsulta = session.createQuery(consulta)
                    .setInteger("idAutoInfracaoSituacao", idSituacaoAutoInfracao)
                    .setDate("prazoEntregaRecursoVencido", prazoEntregaRecursoVencido).list();

        } catch (HibernateException e) {
            e.printStackTrace();
            throw new ErroRepositorioException("Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
        return retornoConsulta;
    }

    /**
    * [UC0898] Atualizar Autos de Infrao com prazo de Recurso Vencido
    * 
    * [SB0001] Atualizar Autos Infrao
    * 
    * @author Svio Luiz
    * @date 08/05/2009
    */
    public void atualizarAutosInfracao(Collection idsAutosInfracao, Integer idSituacaoAutoInfracao)
            throws ErroRepositorioException {
        Session session = HibernateUtil.getSession();

        String update;
        try {
            update = "update AutosInfracao set " + "aist_id = :idSituacaoAutoInfracao,"
                    + "auif_tmultimaalteracao = :datahoracorrente " + "where auif_id in (:idsAutosInfracao)";
            session.createQuery(update).setInteger("idSituacaoAutoInfracao", idSituacaoAutoInfracao)
                    .setParameterList("idsAutosInfracao", idsAutosInfracao).setDate("datahoracorrente", new Date())
                    .executeUpdate();
        } catch (HibernateException e) {
            e.printStackTrace();
            throw new ErroRepositorioException("Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
    }

    /**
    * [UC0898] Atualizar Autos de Infrao com prazo de Recurso Vencido
    * 
    * @author Svio Luiz
    * @date 08/05/2009
    */
    public Collection<FiscalizacaoSituacaoServicoACobrar> pesquisarFiscalizacaoSituacaoServicoACobrar(
            Integer idFiscalizacaoSituacao) throws ErroRepositorioException {

        Session session = HibernateUtil.getSession();
        String consulta;
        Collection<Object[]> retornoConsulta = null;

        Collection<FiscalizacaoSituacaoServicoACobrar> collFiscalizacaoSituacaoSAC = null;

        try {
            consulta = "SELECT fssc.consumoCalculo, "//0
                    + "fs.indicadorAtualizacaoAutosInfracao, "//1
                    + "dt.valorSugerido, "//2
                    + "fssc.numeroVezesServicoCalculadoValor, "//3
                    + "dt.id, "//4
                    + "fs.id, "//5
                    + "fssc.indicadorMultaInfracao "//6
                    + "FROM FiscalizacaoSituacaoServicoACobrar fssc " + "INNER JOIN fssc.fiscalizacaoSituacao fs "
                    + "INNER JOIN fssc.debitoTipo dt " + "where fs.id = :idFiscalizacaoSituacao";

            retornoConsulta = session.createQuery(consulta)
                    .setInteger("idFiscalizacaoSituacao", idFiscalizacaoSituacao).list();

            collFiscalizacaoSituacaoSAC = new ArrayList();
            if (retornoConsulta != null && !retornoConsulta.isEmpty()) {
                for (Object[] parmsFiscalizacao : retornoConsulta) {
                    FiscalizacaoSituacaoServicoACobrar fiscalizacaoSituacaoServicoACobrar = new FiscalizacaoSituacaoServicoACobrar();
                    if (parmsFiscalizacao != null) {
                        //consumo do calculo
                        if (parmsFiscalizacao[0] != null) {
                            fiscalizacaoSituacaoServicoACobrar.setConsumoCalculo((Short) parmsFiscalizacao[0]);
                        }
                        // indicador de multa de infrao
                        if (parmsFiscalizacao[6] != null) {
                            fiscalizacaoSituacaoServicoACobrar
                                    .setIndicadorMultaInfracao((Short) parmsFiscalizacao[6]);
                        }
                        //id da situao do auto
                        if (parmsFiscalizacao[5] != null) {
                            FiscalizacaoSituacao fiscalizacaoSituacao = new FiscalizacaoSituacao();
                            fiscalizacaoSituacao.setId((Integer) parmsFiscalizacao[5]);
                            // Inidicador atualizao autos infrao
                            if (parmsFiscalizacao[1] != null) {
                                fiscalizacaoSituacao
                                        .setIndicadorAtualizacaoAutosInfracao((Short) parmsFiscalizacao[1]);
                                fiscalizacaoSituacaoServicoACobrar.setFiscalizacaoSituacao(fiscalizacaoSituacao);
                            }
                        }
                        //valor sugerido do dbito tipo
                        if (parmsFiscalizacao[4] != null) {
                            DebitoTipo debitoTipo = new DebitoTipo();
                            debitoTipo.setId((Integer) parmsFiscalizacao[4]);
                            if (parmsFiscalizacao[2] != null) {
                                debitoTipo.setValorSugerido((BigDecimal) parmsFiscalizacao[2]);
                            }
                            fiscalizacaoSituacaoServicoACobrar.setDebitoTipo(debitoTipo);
                        }
                        //nmero de vezes de clculo de valor
                        if (parmsFiscalizacao[3] != null) {
                            fiscalizacaoSituacaoServicoACobrar
                                    .setNumeroVezesServicoCalculadoValor((Short) parmsFiscalizacao[3]);
                        }

                        collFiscalizacaoSituacaoSAC.add(fiscalizacaoSituacaoServicoACobrar);
                    }
                }
            }

        } catch (HibernateException e) {
            e.printStackTrace();
            throw new ErroRepositorioException("Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
        return collFiscalizacaoSituacaoSAC;
    }

    /**
    * [UC0996] Emitir Ordem de Fiscalizao para imveis suprimidos
    * 
    * @author Hugo Amorim
    * @date 08/03/2010
    * @param idFuncionalidadeIniciada
    * @param usuarioLogado
    * @param setorComercial
    */
    public Collection<Object[]> pesquisarImoveisBatchEmitirOrdemFiscalizacao(Integer idSetorComercial, Date data,
            Integer quantidadeInicio, Integer quantidadeMaxima) throws ErroRepositorioException {

        Session session = HibernateUtil.getSession();

        String consulta;

        Collection<Object[]> retorno = null;

        try {

            consulta = "SELECT i.imov_id as imovel," + " iper_dsimovelperfil as perfil,"
                    + " i.loca_id as idLocalida," + " sc.stcm_id as idSetor,"
                    + " sc.stcm_cdsetorcomercial as codSetor," + " q.qdra_id as idQuadra,"
                    + " q.qdra_nnquadra as numeroQuadra," + " imov_nnlote as lote," + " imov_nnsublote as subLote,"
                    + " imov_tmultimaalteracao as ultimaAlteracao," + " last.last_id as ligacaoAguaSituacao,"
                    + " last.last_dsligacaoaguasituacao as desLigacaoAguaSituacao,"
                    + " lest.lest_id as ligacaoEsgotoSituacao,"
                    + " lest.lest_dsligacaoesgotosituacao as descLigacaoEsgotoSituacao,"
                    + " lagu.lagu_dtcorte as dataCorte," + " clie_nmcliente as nomeCliente," + " clie_nncpf as cpf,"
                    + " clie_nncnpj as cnpj," + " clie_nnrg as rg," + " cfon_nnfone as fone,"
                    + " cfon_nnfoneramal as ramal," + " fnet_dsfonetipo as foneTipo,"
                    + " lagu_dtsupressaoagua as dataSupressao," + " r.ftgr_id as faturamentoGrupo,"
                    + " lesg.lesg_nnconsumominimoesgoto as consumoMinimo" + " FROM cadastro.imovel i"
                    + " INNER JOIN cadastro.setor_comercial sc on sc.stcm_id = i.stcm_id"
                    + " INNER JOIN cadastro.quadra q on q.qdra_id = i.qdra_id"
                    + " INNER JOIN micromedicao.rota r on r.rota_id = q.rota_id"
                    + " INNER JOIN atendimentopublico.ligacao_agua lagu on lagu.lagu_id = i.imov_id"
                    + " LEFT JOIN atendimentopublico.ligacao_esgoto lesg on lesg.lesg_id = i.imov_id"
                    + " INNER JOIN atendimentopublico.ligacao_esgoto_situacao lest on lest.lest_id = i.lest_id"
                    + " INNER JOIN cadastro.imovel_perfil ip on ip.iper_id = i.iper_id"
                    + " INNER JOIN atendimentopublico.ligacao_agua_situacao last on last.last_id = i.last_id"
                    + " INNER JOIN cadastro.cliente_imovel cliImov on cliImov.imov_id = i.imov_id"
                    + " INNER JOIN cadastro.cliente cli on cli.clie_id = cliImov.clie_id"
                    + " LEFT JOIN cadastro.cliente_fone cf on cf.clie_id = cli.clie_id AND cfon_icfonepadrao  = :icFonePadrao"
                    + " LEFT JOIN cadastro.fone_tipo ft on ft.fnet_id = cf.fnet_id"
                    + " LEFT JOIN atendimentopublico.ordem_servico os on os.imov_id = i.imov_id and orse_cdsituacao = :osSituacao "
                    + " AND os.svtp_id = (SELECT svtp_id FROM atendimentopublico.servico_tipo WHERE svtp_nncodigoconstante = :servicoTipoFisc ) "
                    + " WHERE i.last_id in (:ligacoesAguaSituacao)" + " AND i.imov_icexclusao = :indicador"
                    + " AND lagu_dtsupressaoagua < :data"
                    + " AND cliImov.crtp_id = :clienteRelacaoTipo and clim_dtrelacaofim is null"
                    + " AND i.imov_id not in "
                    + "(SELECT imov_id FROM atendimentopublico.ordem_servico WHERE svtp_id = "
                    + "(SELECT svtp_id FROM atendimentopublico.servico_tipo WHERE svtp_nncodigoconstante = :servicoTipoFisc ) "
                    + "and orse_cdsituacao != :osSituacao  ) " + " AND i.stcm_id = :idSetor"
                    + " ORDER BY i.loca_id,sc.stcm_cdsetorcomercial,q.qdra_nnquadra,imov_nnlote,imov_nnsublote";

            Collection ligacoesAguaSituacao = new ArrayList<Integer>();

            ligacoesAguaSituacao.add(LigacaoAguaSituacao.SUPRIMIDO);
            ligacoesAguaSituacao.add(LigacaoAguaSituacao.SUPR_PARC);
            ligacoesAguaSituacao.add(LigacaoAguaSituacao.SUPR_PARC_PEDIDO);

            retorno = session.createSQLQuery(consulta).addScalar("imovel", Hibernate.INTEGER)
                    .addScalar("perfil", Hibernate.STRING).addScalar("idLocalida", Hibernate.INTEGER)
                    .addScalar("idSetor", Hibernate.INTEGER).addScalar("codSetor", Hibernate.INTEGER)
                    .addScalar("idQuadra", Hibernate.INTEGER).addScalar("numeroQuadra", Hibernate.INTEGER)
                    .addScalar("lote", Hibernate.SHORT).addScalar("subLote", Hibernate.SHORT)
                    .addScalar("ultimaAlteracao", Hibernate.TIMESTAMP)
                    .addScalar("ligacaoAguaSituacao", Hibernate.INTEGER)
                    .addScalar("desLigacaoAguaSituacao", Hibernate.STRING)
                    .addScalar("ligacaoEsgotoSituacao", Hibernate.INTEGER)
                    .addScalar("descLigacaoEsgotoSituacao", Hibernate.STRING).addScalar("dataCorte", Hibernate.DATE)
                    .addScalar("nomeCliente", Hibernate.STRING).addScalar("cpf", Hibernate.STRING)
                    .addScalar("cnpj", Hibernate.STRING).addScalar("rg", Hibernate.STRING)
                    .addScalar("fone", Hibernate.STRING).addScalar("ramal", Hibernate.STRING)
                    .addScalar("foneTipo", Hibernate.STRING).addScalar("dataSupressao", Hibernate.DATE)
                    .addScalar("faturamentoGrupo", Hibernate.INTEGER).addScalar("consumoMinimo", Hibernate.INTEGER)
                    .setParameterList("ligacoesAguaSituacao", ligacoesAguaSituacao)
                    .setShort("osSituacao", OrdemServico.SITUACAO_ENCERRADO)
                    .setInteger("servicoTipoFisc", ServicoTipo.TIPO_ORDEM_SERVICO_FISCALIZACAO)
                    .setShort("indicador", ConstantesSistema.INDICADOR_USO_DESATIVO)
                    .setShort("icFonePadrao", ConstantesSistema.SIM).setDate("data", data)
                    .setShort("clienteRelacaoTipo", ClienteRelacaoTipo.USUARIO)
                    .setInteger("idSetor", idSetorComercial).setFirstResult(quantidadeInicio)
                    .setMaxResults(quantidadeMaxima).list();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }

        return retorno;
    }

    /**
    * [UC0996] Emitir Ordem de Fiscalizao para imveis suprimidos
    * 
    *    Inseri objeto na base do tipo ImovelSuprimido
    * 
    * @author Hugo Amorim
    * @date 08/03/2010
    * @param idFuncionalidadeIniciada
    * @param usuarioLogado
    * @param setorComercial
    */
    public void inserirImovelSuprimido(ImovelSuprimido imovelSuprimido) throws ErroRepositorioException {
        Session session = HibernateUtil.getSession();
        Connection con = null;
        Statement stmt = null;
        con = session.connection();
        try {
            stmt = con.createStatement();

            String insert = " INSERT INTO cadastro.imoveis_suprimidos("
                    + " imsu_id, orse_id, imsu_dstxtgerado, imsu_tmexecucao,"
                    + " imsu_tmultimaalteracao, loca_id, stcm_cdsetorcomercial, stcm_id,"
                    + " qdra_id, imsu_nnlote, imsu_nnsublote, qdra_nnquadra)"
                    + " VALUES (nextval('cadastro.sequence_imoveis_suprimidos')" + " ,"
                    + imovelSuprimido.getOrdemServico().getId() + " ,'" + imovelSuprimido.getLinhaTxt() + "'"
                    + " ,'" + imovelSuprimido.getDataExecucao() + "'" + " , now()" + " ,"
                    + imovelSuprimido.getIdLocalidade() + " ," + imovelSuprimido.getCodigoSetorComercial() + " ,"
                    + imovelSuprimido.getIdSetorComercial() + " ," + imovelSuprimido.getIdQuadra() + " ,"
                    + imovelSuprimido.getNumeroLote() + " ," + imovelSuprimido.getNumeroSubLote() + " ,"
                    + imovelSuprimido.getNumeroQuadra() + ")";

            stmt.executeUpdate(insert);

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } catch (SQLException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
    }

    /**
    * [UC0996] Emitir Ordem de Fiscalizao para imveis suprimidos
    * 
    *    Pesquisas linhas do txt
    * 
    * @author Hugo Amorim
    * @date 08/03/2010
    * @param idFuncionalidadeIniciada
    * @param usuarioLogado
    * @param setorComercial
    */
    public Collection<ImovelSuprimido> pesquisarDadosEmitirArquivoTextoDeOrdemFiscalizacao(Integer quantidadeInicio,
            Integer quantidadeMaxima) throws ErroRepositorioException {

        Session session = HibernateUtil.getSession();
        Collection retorno = null;
        String consulta;

        try {
            consulta = //"SELECT linhaTxt "
                    "FROM ImovelSuprimido  "
                            + " ORDER BY idLocalidade,codigoSetorComercial,numeroQuadra,numeroLote,numeroSubLote ";

            retorno = session.createQuery(consulta).setFirstResult(quantidadeInicio).setMaxResults(quantidadeMaxima)
                    .list();

        } catch (HibernateException e) {
            e.printStackTrace();
            throw new ErroRepositorioException("Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
        return retorno;
    }

    /**
    * [SB0002]  Replicar os servios existentes para uma nova vigncia e valor.
    * Pesquisa a ltima vigncia de cada tipo servio, e retorna uma coleo. 
    * 
    * @author Josenildo Neves
    * @date 03/02/2010
    */
    public Collection<ServicoCobrancaValor> pesquisarServicoCobrancaValorUltimaVigencia(Integer numeroPagina)
            throws ErroRepositorioException {

        Collection retorno = null;

        Session session = HibernateUtil.getSession();
        String consulta;

        try {
            consulta = "select " + "* " + "from atendimentopublico.servico_cobranca_valor scv, " + "(select "
                    + "svtp_id as id, " + "max(scbv_dtvigenciafinal) as data "
                    + "from atendimentopublico.servico_cobranca_valor " + "group by " + "svtp_id) sc " + "where "
                    + "scv.svtp_id = id and " + "scv.scbv_dtvigenciafinal = sc.data";

            retorno = session.createSQLQuery(consulta).addScalar("scbv_id", Hibernate.INTEGER)
                    .addScalar("svtp_id", Hibernate.INTEGER).addScalar("iper_id", Hibernate.INTEGER)
                    .addScalar("hicp_id", Hibernate.INTEGER).addScalar("scbv_vlservico", Hibernate.BIG_DECIMAL)
                    .addScalar("scbv_icmedido", Hibernate.SHORT).addScalar("scbv_tmultimaalteracao", Hibernate.DATE)
                    .addScalar("scat_id", Hibernate.INTEGER).addScalar("scbv_dtvigenciainicial", Hibernate.DATE)
                    .addScalar("scbv_dtvigenciafinal", Hibernate.DATE)
                    .addScalar("scbv_qteconomiasinicial", Hibernate.INTEGER)
                    .addScalar("scbv_qteconomiasfinal", Hibernate.INTEGER)
                    .addScalar("scbv_icconsideraeconomias", Hibernate.SHORT).addScalar("catg_id", Hibernate.INTEGER)
                    .setFirstResult(10 * numeroPagina).setMaxResults(10).list();

        } catch (HibernateException e) {
            // levanta a exceo para a prxima camada
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            // fecha a sesso
            HibernateUtil.closeSession(session);
        }

        return retorno;
    }

    /**
     [SB0002]  Replicar os servios existentes para uma nova vigncia e valor.
     * Pesquisa a ltima vigncia de cada tipo servio, e retorna o total.   
     * 
     * @author Josenildo Neves
     * @date 03/02/2010
     */
    public Integer pesquisarServicoCobrancaValorUltimaVigenciaTotal() throws ErroRepositorioException {

        Integer retorno = null;

        Session session = HibernateUtil.getSession();
        String consulta;

        try {
            consulta = "select " + "* " + "from atendimentopublico.servico_cobranca_valor scv, " + "(select "
                    + "svtp_id as id, " + "max(scbv_dtvigenciafinal) as data "
                    + "from atendimentopublico.servico_cobranca_valor " + "group by " + "svtp_id) sc " + "where "
                    + "scv.svtp_id = id and " + "scv.scbv_dtvigenciafinal = sc.data";

            retorno = session.createSQLQuery(consulta).addScalar("scbv_id", Hibernate.INTEGER)
                    .addScalar("svtp_id", Hibernate.INTEGER).addScalar("iper_id", Hibernate.INTEGER)
                    .addScalar("hicp_id", Hibernate.INTEGER).addScalar("scbv_vlservico", Hibernate.DOUBLE)
                    .addScalar("scbv_icmedido", Hibernate.SHORT).addScalar("scbv_tmultimaalteracao", Hibernate.DATE)
                    .addScalar("scbv_dtvigenciainicial", Hibernate.DATE)
                    .addScalar("scbv_dtvigenciafinal", Hibernate.DATE).addScalar("scat_id", Hibernate.INTEGER)
                    .addScalar("scbv_qteconomiasinicial", Hibernate.INTEGER)
                    .addScalar("scbv_qteconomiasfinal", Hibernate.INTEGER)
                    .addScalar("scbv_icconsideraeconomias", Hibernate.SHORT).list().size();

        } catch (HibernateException e) {
            // levanta a exceo para a prxima camada
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            // fecha a sesso
            HibernateUtil.closeSession(session);
        }

        return retorno;
    }

    /**
     * [SB0002]  Replicar os Valores de Cobrana de Servio existentes para uma nova vigncia e valor.
     * Pesquisa a ltima vigncia de cada tipo Cobrana, e retorna uma coleo.   
     * 
     * @author Hugo Leonardo   
     * @date 14/04/2010
     */
    public Collection<ServicoCobrancaValor> replicarServicoCobrancaValorUltimaVigencia(String[] selecionados)
            throws ErroRepositorioException {

        Collection retorno = null;

        Session session = HibernateUtil.getSession();
        String consulta;

        try {
            consulta = " select * " + " from atendimentopublico.servico_cobranca_valor scv, "
                    + " (select svtp_id as id, " + " max(scbv_dtvigenciafinal) as data "
                    + " from atendimentopublico.servico_cobranca_valor " + " group by svtp_id) sc "
                    + " where scv.svtp_id = id " + " and scv.scbv_dtvigenciafinal = sc.data "
                    + " and scv.scbv_id in (:selecionados)";

            retorno = session.createSQLQuery(consulta).addScalar("scbv_id", Hibernate.INTEGER)
                    .addScalar("svtp_id", Hibernate.INTEGER).addScalar("iper_id", Hibernate.INTEGER)
                    .addScalar("hicp_id", Hibernate.INTEGER).addScalar("scbv_vlservico", Hibernate.BIG_DECIMAL)
                    .addScalar("scbv_icmedido", Hibernate.SHORT).addScalar("scbv_tmultimaalteracao", Hibernate.DATE)
                    .addScalar("scat_id", Hibernate.INTEGER).addScalar("scbv_dtvigenciainicial", Hibernate.DATE)
                    .addScalar("scbv_dtvigenciafinal", Hibernate.DATE)
                    .addScalar("scbv_qteconomiasinicial", Hibernate.INTEGER)
                    .addScalar("scbv_qteconomiasfinal", Hibernate.INTEGER)
                    .addScalar("scbv_icconsideraeconomias", Hibernate.SHORT)
                    .setParameterList("selecionados", selecionados).list();

        } catch (HibernateException e) {
            // levanta a exceo para a prxima camada
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            // fecha a sesso
            HibernateUtil.closeSession(session);
        }

        return retorno;
    }

    /**
     * [UC0391] Inserir valor cobrana Servio.
     * 
     * Verificar se existe vigncia j cadastrada para o Servio Tipo.
     * 
     * @author Hugo Leonardo
     * @param dataVigenciaInicial
     * @param dataVigenciaFinal
     * @param idServicoTipo
     * @param opcao
     * @throws ErroRepositorioException
     * @data 03/05/2010
     * 
     * return String
     * 
     * @see Caso a opcao = 1 - verifica as situaes de inserir e atualizar Servio Tipo.
     * @see Caso a opcao = 2 - verifica a situao de retificar Servio Tipo.
     */
    public String verificarExistenciaVigenciaServicoTipo(String dataVigenciaInicial, String dataVigenciaFinal,
            Integer idServicoTipo) throws ErroRepositorioException {

        String retorno = "";

        Session session = HibernateUtil.getSession();

        String consulta = "";

        consulta += " select svtp_id as cont " + " from atendimentopublico.servico_cobranca_valor "
                + " where ((scbv_dtvigenciainicial <= :dataInicial " + " or scbv_dtvigenciainicial <= :dataFinal) "
                + " and scbv_dtvigenciafinal >= :dataFinal ) " + " and svtp_id = :idServicoTipo";

        try {
            retorno = (String) session.createSQLQuery(consulta).addScalar("cont", Hibernate.STRING)
                    .setInteger("idServicoTipo", idServicoTipo)
                    .setDate("dataInicial", Util.converteStringParaDate(dataVigenciaInicial))
                    .setDate("dataFinal", Util.converteStringParaDate(dataVigenciaFinal)).setMaxResults(1)
                    .uniqueResult();

        } catch (HibernateException e) {
            // levanta a exceo para a prxima camada
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            // fecha a sesso
            HibernateUtil.closeSession(session);
        }

        return retorno;
    }

    /**
     * [UC0366] Inserir Registro de Atendimento
     *  [SB0034]  Verificar RA de urgncia
     * 
     * Verifica se o Registro de Atendimento tem o nivel selecionado como Urgncia
     * 
     * @author Daniel Alves
     * @param  ID do Registro de Atendimento 
     * @throws ErroRepositorioException
     * @data   03/06/2010
     * 
     * 
     */
    public Integer verificarRegistroAtendimentoUrgencia(Integer idRegistroAtendimento)
            throws ErroRepositorioException {

        Integer retorno = 0;

        Session session = HibernateUtil.getSession();

        String consulta = "";

        consulta += "SELECT COUNT(*) AS contador "
                + "FROM gcom.atendimentopublico.registroatendimento.RegistroAtendimento ra "
                + "INNER JOIN ra.solicitacaoTipoEspecificacao step " + "WHERE ra.id = :registroAtendimento "
                + "AND step.indicadorUrgencia = 1";

        try {
            retorno = (Integer) session.createQuery(consulta)
                    .setInteger("registroAtendimento", idRegistroAtendimento).setMaxResults(1).uniqueResult();

        } catch (HibernateException e) {
            // levanta a exceo para a prxima camada
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            // fecha a sesso
            HibernateUtil.closeSession(session);
        }

        return retorno;
    }

    /**
     * [UC0366] Inserir Registro de Atendimento
     *  [SB0034]  Verificar RA de urgncia
     *  
     * Pesquisar os Usurios da Unidade relacionada a RA, na tabela "VisualizacaoRaUrgencia" 
     * 
     * @author Daniel Alves
     * @param  ID do Registro de Atendimento 
     * @throws ErroRepositorioException
     * @data   03/06/2010 
     * 
     */
    public Collection pesquisarUsuarioVisualizacaoRaUrgencia(Integer idRegistroAtendimento)
            throws ErroRepositorioException {

        Session session = HibernateUtil.getSession();

        Collection retorno = null;

        int quantidadeRA = verificarRegistroAtendimentoUrgencia(idRegistroAtendimento);

        if (quantidadeRA > 0) {

            String consulta = "";

            consulta += "SELECT ra.id, usuario.id, 2, 2 "
                    + "FROM gcom.atendimentopublico.registroatendimento.RegistroAtendimento ra "
                    + "INNER JOIN ra.unidadeAtual unidade, " + "gcom.seguranca.acesso.usuario.Usuario usuario "
                    + "WHERE usuario.unidadeOrganizacional.id = unidade.id " + "AND ra.id = :registroAtendimento ";

            try {

                retorno = (Collection) session.createQuery(consulta)
                        .setInteger("registroAtendimento", idRegistroAtendimento).list();

            } catch (HibernateException e) {
                // levanta a exceo para a prxima camada
                throw new ErroRepositorioException(e, "Erro no Hibernate");
            } finally {
                // fecha a sesso
                HibernateUtil.closeSession(session);
            }

        }
        return retorno;
    }

    /**
     * [UC0503] Tramitar Conjunto Registro Atendimento    * 
     *  [SB0004]  Verificar RA de urgncia
     *  
     * Retorna um ou todos usurios da unidade relacionada a RA, 
     *  da tabela "VisualizacaoRaUrgencia" 
     * 
     * @author Daniel Alves
     * @param  ID do Registro de Atendimento, ID da Unidade, ID do Usurio 
     * @throws ErroRepositorioException
     * @data   04/06/2010
     * 
     */
    public Collection pesquisarVisualizacaoRaUrgencia(Integer idRegistroAtendimento, Integer idUnidade,
            Integer idUsuario) throws ErroRepositorioException {

        Session session = HibernateUtil.getSession();

        Collection retorno = null;

        //valor padro, usado para entrar no if quando nao houver RA informada 
        int quantidadeRA = 1;

        if (idRegistroAtendimento != null) {
            quantidadeRA = verificarRegistroAtendimentoUrgencia(idRegistroAtendimento);
        }

        if (quantidadeRA > 0) {

            String consulta = "";

            consulta += "SELECT vrau.registroAtendimento.id, vrau.usuario.id, 2, 2, vrau.id "
                    + "FROM gcom.atendimentopublico.registroatendimento.VisualizacaoRegistroAtendimentoUrgencia vrau "
                    + "INNER JOIN vrau.usuario usuario ";

            if (idRegistroAtendimento != null) {
                consulta += "WHERE vrau.registroAtendimento.id = " + idRegistroAtendimento + " ";
            } else {
                consulta += "WHERE ";
            }

            if (idUnidade != null) {
                consulta += "usuario.unidadeOrganizacional.id = " + idUnidade + " AND ";

            } else if (idUsuario != null) {
                consulta += "usuario.id = " + idUsuario + " AND ";

            }

            //remove o ltimo AND
            consulta = Util.removerUltimosCaracteres(consulta, 4);

            try {

                retorno = (Collection) session.createQuery(consulta).list();

            } catch (HibernateException e) {
                // levanta a exceo para a prxima camada
                throw new ErroRepositorioException(e, "Erro no Hibernate");
            } finally {
                // fecha a sesso
                HibernateUtil.closeSession(session);
            }

        }
        return retorno;
    }

    /**
     * [UC0503] Tramitar Conjunto Registro Atendimento    * 
     *  [SB0004]  Verificar RA de urgncia
     * 
     * Verifica se o Registro de Atendimento j est relacionado a uma Unidade informada.
     * 
     * @author Daniel Alves
     * @param  ID do Registro de Atendimento 
     * @throws ErroRepositorioException
     * @data   05/06/2010
     * 
     */
    public Integer verificarUsuariosRegistroAtendimentoUrgencia(Integer idRegistroAtendimento, Integer idUnidade)
            throws ErroRepositorioException {

        Integer retorno = 0;

        Session session = HibernateUtil.getSession();

        String consulta = "";

        consulta += "SELECT COUNT(*) as contador "
                + "FROM gcom.atendimentopublico.registroatendimento.VisualizacaoRegistroAtendimentoUrgencia vrau "
                + "INNER JOIN vrau.usuario usuario " + "WHERE vrau.registroAtendimento.id = :registroAtendimento "
                + "AND usuario.unidadeOrganizacional.id = " + idUnidade + " ";

        try {
            retorno = (Integer) session.createQuery(consulta)
                    .setInteger("registroAtendimento", idRegistroAtendimento).setMaxResults(1).uniqueResult();

        } catch (HibernateException e) {
            // levanta a exceo para a prxima camada
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            // fecha a sesso
            HibernateUtil.closeSession(session);
        }

        return retorno;
    }

    /**    
     * [UC1028] Exibir Registro Atendimento Urgncia
     *  
     * Verifica se o Usuario possui algum Registro de Atendimento urgente.
     * 
     * @author Daniel Alves
     * @param  ID do Registro de Atendimento 
     * @throws ErroRepositorioException
     * @data   07/06/2010
     *      
     */
    public Collection verificarUsuarioRegistroAtendimentoUrgencia(Integer idUsuario)
            throws ErroRepositorioException {

        Collection retorno = null;

        Session session = HibernateUtil.getSession();

        String consulta = "";

        consulta += "SELECT DISTINCT(vrau.indicadorReiteracao) as indicador "
                + "FROM gcom.atendimentopublico.registroatendimento.VisualizacaoRegistroAtendimentoUrgencia vrau "
                + "INNER JOIN vrau.registroAtendimento rgat " + "WHERE vrau.usuario.id = :idUsuario "
                + "AND vrau.indicadorTramite = 2 " + "AND vrau.indicadorVisualizacao = 2 ";
        //       "AND rgat.parecerEncerramento is null " +
        //       "AND rgat.dataEncerramento is null ";      

        //      consulta +="SELECT COUNT(*) as contador " +
        //                 "FROM gcom.atendimentopublico.registroatendimento.VisualizacaoRegistroAtendimentoUrgencia vrau " +                 
        //                "WHERE vrau.usuario.id = :idUsuario " +
        //                "AND vrau.indicadorTramite = 2 " +
        //                "AND vrau.indicadorVisualizacao = 2 ";      

        try {
            retorno = (Collection) session.createQuery(consulta).setInteger("idUsuario", idUsuario).list();

        } catch (HibernateException e) {
            // levanta a exceo para a prxima camada
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            // fecha a sesso
            HibernateUtil.closeSession(session);
        }

        return retorno;
    }

    /**  
     * Atualiza um ou vrios campos da tabela "VisualizacaoRaUrgencia" 
     * 
     * @author Daniel Alves
     * @param  ID do Registro de Atendimento, ID da Unidade, ID do Usurio, indicador Tramite e indicador Visualizacao 
     * @throws ErroRepositorioException
     * @data   10/06/2010
     * 
     */
    public void atualizarUsuarioRegistroAtendimentoUrgencia(Integer idRegistroAtendimento, String idUsuarios,
            Integer idUsuario, Integer indicadorTramite, Integer indicadorVisualizacao)
            throws ErroRepositorioException {
        Session session = HibernateUtil.getSession();
        String update;
        try {

            update = "UPDATE gcom.atendimentopublico.registroatendimento.VisualizacaoRegistroAtendimentoUrgencia vrau set ";

            if (indicadorTramite != null) {
                update += "vrau.indicadorTramite = " + indicadorTramite + ", ";
            }

            if (indicadorVisualizacao != null) {
                update += "vrau.indicadorVisualizacao = " + indicadorVisualizacao + ", ";
            }

            update += "vrau.ultimaAlteracao = :ultimaAlteracao " + "WHERE ";

            if (idRegistroAtendimento != null) {
                update += "vrau.registroAtendimento.id = " + idRegistroAtendimento + " AND ";
            }

            if (idUsuario != null) {
                update += "vrau.usuario.id = " + idUsuario + " AND ";
            }

            if (idUsuarios != null) {

                update += "vrau.usuario.id IN( " + idUsuarios + " ) AND ";
            }

            update = Util.removerUltimosCaracteres(update, 4);

            session.createQuery(update).setDate("ultimaAlteracao", new Date()).executeUpdate();

        } catch (HibernateException e) {
            e.printStackTrace();
            throw new ErroRepositorioException("Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
            // session.close();
        }
    }

    /**
      * 
      * 
      * @author Arthur Carvalho
      * @date 19/06/2010
      * @param obterValorDebitoHelper
      * @return o valor do dbito
      * @throws ErroRepositorioException
      */
    public BigDecimal obterValorDebitoHidrometroCapacidade(ObterValorDebitoHelper params)
            throws ErroRepositorioException {

        Session session = HibernateUtil.getSession();
        String consulta;
        BigDecimal retornoConsulta = null;
        Query query = null;

        try {

            consulta = "SELECT scv.valor " + "FROM ServicoCobrancaValor scv "
                    + "where scv.servicoTipo.id = :servicoTipoId " + "and scv.imovelPerfil.id = :imovelPerfilId "
                    + "and scv.dataVigenciaInicial <= :dataAtual " + "and scv.dataVigenciaFinal >= :dataAtual ";

            if (params.getSituacaoMedicao() != null) {
                consulta += "and scv.indicadorMedido = :situacaoMedicao ";
            }
            if (params.getHidrometroCapacidade() != null) {
                consulta += "and scv.hidrometroCapacidade.id = :hidrometroCapacidadeId ";
            }

            consulta += " ORDER BY scv.dataVigenciaFinal DESC ";

            query = session.createQuery(consulta).setInteger("imovelPerfilId", params.getImovelPerfil().getId())
                    .setInteger("servicoTipoId", params.getServicoTipo().getId()).setDate("dataAtual", new Date());

            if (params.getSituacaoMedicao() != null) {
                query.setShort("situacaoMedicao", params.getSituacaoMedicao());
            }
            if (params.getHidrometroCapacidade() != null) {
                query.setInteger("hidrometroCapacidadeId", params.getHidrometroCapacidade().getId());
            }

            retornoConsulta = (BigDecimal) query.setMaxResults(1).uniqueResult();
            if (retornoConsulta == null) {

                consulta = "SELECT scv.valor " + "FROM ServicoCobrancaValor scv "
                        + "where scv.servicoTipo.id = :servicoTipoId "
                        + "and scv.imovelPerfil.id = :imovelPerfilId "
                        + "and scv.dataVigenciaInicial <= :dataAtual " + "and scv.dataVigenciaFinal >= :dataAtual ";

                if (params.getSituacaoMedicao() != null) {
                    consulta += "and scv.indicadorMedido = :situacaoMedicao ";
                }

                consulta += " ORDER BY scv.dataVigenciaFinal DESC ";

                query = session.createQuery(consulta).setInteger("imovelPerfilId", params.getImovelPerfil().getId())
                        .setInteger("servicoTipoId", params.getServicoTipo().getId())
                        .setDate("dataAtual", new Date());

                if (params.getSituacaoMedicao() != null) {
                    query.setShort("situacaoMedicao", params.getSituacaoMedicao());
                }

                retornoConsulta = (BigDecimal) query.setMaxResults(1).uniqueResult();

                if (retornoConsulta == null) {
                    consulta = "SELECT scv.valor " + "FROM ServicoCobrancaValor scv "
                            + "where scv.servicoTipo.id = :servicoTipoId "
                            + "and scv.dataVigenciaInicial <= :dataAtual "
                            + "and scv.dataVigenciaFinal >= :dataAtual ";

                    if (params.getSituacaoMedicao() != null) {
                        consulta += "and scv.indicadorMedido = :situacaoMedicao ";
                    }
                    if (params.getHidrometroCapacidade() != null) {
                        consulta += "and scv.hidrometroCapacidade.id = :hidrometroCapacidadeId ";
                    }
                    consulta += " ORDER BY scv.dataVigenciaFinal DESC ";

                    query = session.createQuery(consulta)
                            .setInteger("servicoTipoId", params.getServicoTipo().getId())
                            .setDate("dataAtual", new Date());

                    if (params.getSituacaoMedicao() != null) {
                        query.setShort("situacaoMedicao", params.getSituacaoMedicao());
                    }
                    if (params.getHidrometroCapacidade() != null) {
                        query.setInteger("hidrometroCapacidadeId", params.getHidrometroCapacidade().getId());
                    }

                    retornoConsulta = (BigDecimal) query.setMaxResults(1).uniqueResult();

                    if (retornoConsulta == null) {
                        consulta = "SELECT st.valor " + "FROM ServicoTipo st " + "where st.id = :servicoTipoId ";
                        retornoConsulta = (BigDecimal) session.createQuery(consulta)
                                .setInteger("servicoTipoId", params.getServicoTipo().getId()).setMaxResults(1)
                                .uniqueResult();
                    }

                }

            }
        } catch (HibernateException e) {
            e.printStackTrace();
            throw new ErroRepositorioException("Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
        return retornoConsulta;
    }

    /**
    * [UC0251] Gerar Atividade de Ao de Cobrana
    * 
    * @author Hugo Amorim
    * @date 15/07/2010
    */
    public Collection<CobrancaAcaoAtividadeComandoFiscalizacaoSituacao> pesquisarCobrancaAcaoAtividadeComandoFiscalizacaoSituacao(
            Integer idComando, Collection idsSituacos) throws ErroRepositorioException {

        Session session = HibernateUtil.getSession();
        Collection retorno = null;
        String consulta;

        try {
            consulta = "FROM CobrancaAcaoAtividadeComandoFiscalizacaoSituacao"
                    + " INNER JOIN FETCH cobAcaoFisc.fiscalizacaoSituacao fiscSit"
                    + " WHERE cobrancaAcaoAtividadeComando.id = :idComando" + " AND fiscSit.id in ( :idsSituacos )";

            retorno = session.createQuery(consulta).setInteger("idComando", idComando)
                    .setParameterList("idsSituacos", idsSituacos).list();

        } catch (HibernateException e) {
            e.printStackTrace();
            throw new ErroRepositorioException("Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
        return retorno;
    }

    /**
     * [UC1056] Gerar Relatrio de Acompanhamento dos Registros de Atendimento
     * 
     * @author Hugo Leonardo, Diogo Peixoto
     * @date 28/09/2010, 26/04/2011
     * 
     * @param FiltrarAcompanhamentoRegistroAtendimentoHelper
     * @return Collection
     * @throws ErroRepositorioException
     */
    public Collection pesquisarRelatorioAcompanhamentoRAAnalitico(
            FiltrarAcompanhamentoRegistroAtendimentoHelper helper) throws ErroRepositorioException {

        Collection retorno = null;
        String consulta = "";
        Query query = null;
        Session session = HibernateUtil.getSession();
        String groupByMunicipio = "";
        String orderBy = " rau.unidadeOrganizacional ";

        if (!Util.isVazioOrNulo(helper.getMunicipiosAssociados())) {
            groupByMunicipio = " GROUP BY munRA.nome, munRA.id,  rau.unidadeOrganizacional.id, step.descricao, ra.registroAtendimento, "
                    + " ra.dataEncerramento, ra.dataEncerramento, ame.descricao, rau.unidadeOrganizacional.descricao, ame.id, ra.id ";
            orderBy = " munRA.nome ";
        }

        try {
            consulta += this.montarSelectRelatorioAcompanhamentoAnalitico(helper)
                    + this.montarFromRelatorioAcompanhamentoAnalitico(helper)
                    + " where ra.unidadeAtual = uni.id and ";

            if (Util.verificarNaoVazio(helper.getIdUnidadeAtendimento())) {
                consulta += " rau.unidadeOrganizacional = :unidade  and " + " rau.atendimentoRelacaoTipo = 1 and ";
            }

            if (!Util.isVazioOrNulo(helper.getMunicipiosAssociados())) {
                consulta += " (munRA.id IN (:municipios) or munImo.id IN (:municipios)) and ";
            }

            if (!Util.isVazioOrNulo(helper.getIdsMotivoEncerramentoSelecionados())) {

                consulta += " ame.id in (:motivo) and ";
            }

            if (helper.getPeriodoAtendimentoInicial() != null && helper.getPeriodoAtendimentoFinal() != null) {

                consulta += " (ra.registroAtendimento between :dtAtendimentoIncial and :dtAtendimentoFinal) and ";
            }

            if (helper.getPeriodoEncerramentoInicial() != null && helper.getPeriodoEncerramentoFinal() != null) {
                consulta += " (ra.dataEncerramento between :dtEncerramentoIncial and :dtEncerramentoFinal) and ";
            }

            if (Util.verificarNaoVazio(helper.getSituacaoRA())) {
                consulta += " ra.codigoSituacao = :situacao and ";
            }

            if (Util.verificarNaoVazio(helper.getSituacaoRA()) && helper.getSituacaoRA().equals("0")
                    && Util.verificarNaoVazio(helper.getSituacaoRAAbertos())
                    && helper.getSituacaoRAAbertos().equals("1")) {

                consulta += " (ra.dataPrevistaAtual >= :dtCorrente "
                        + " or ra.dataPrevistaOriginal >= :dtCorrente) and ";

            } else if (Util.verificarNaoVazio(helper.getSituacaoRA()) && helper.getSituacaoRA().equals("0")
                    && Util.verificarNaoVazio(helper.getSituacaoRAAbertos())
                    && helper.getSituacaoRAAbertos().equals("0")) {

                consulta += " (ra.dataPrevistaAtual < :dtCorrente "
                        + " or ra.dataPrevistaOriginal < :dtCorrente) and ";
            }

            // remove o ltimo AND
            consulta = Util.removerUltimosCaracteres(consulta, 4);
            consulta += groupByMunicipio;
            consulta += " ORDER BY " + orderBy;

            query = (Query) session.createQuery(consulta);

            if (Util.verificarNaoVazio(helper.getIdUnidadeAtendimento())) {

                query.setString("unidade", helper.getIdUnidadeAtendimento().toString());
            }

            if (!Util.isVazioOrNulo(helper.getMunicipiosAssociados())) {
                query.setParameterList("municipios", helper.getMunicipiosAssociados());
            }

            if (!Util.isVazioOrNulo(helper.getIdsMotivoEncerramentoSelecionados())) {

                query.setParameterList("motivo", helper.getIdsMotivoEncerramentoSelecionados());
            }

            if (helper.getPeriodoAtendimentoInicial() != null && helper.getPeriodoAtendimentoFinal() != null) {

                query.setDate("dtAtendimentoIncial",
                        Util.formatarDataInicial(helper.getPeriodoAtendimentoInicial()));
                query.setDate("dtAtendimentoFinal", Util.formatarDataFinal(helper.getPeriodoAtendimentoFinal()));
            }

            if (helper.getPeriodoEncerramentoInicial() != null && helper.getPeriodoEncerramentoFinal() != null) {

                query.setDate("dtEncerramentoIncial",
                        Util.formatarDataInicial(helper.getPeriodoEncerramentoInicial()));
                query.setDate("dtEncerramentoFinal", Util.formatarDataFinal(helper.getPeriodoEncerramentoFinal()));
            }

            if (Util.verificarNaoVazio(helper.getSituacaoRA()) && helper.getSituacaoRA().equals("0")
                    && Util.verificarNaoVazio(helper.getSituacaoRAAbertos())
                    && (helper.getSituacaoRAAbertos().equals("0") || helper.getSituacaoRAAbertos().equals("1"))) {

                query.setDate("dtCorrente", new Date());
            }

            if (Util.verificarNaoVazio(helper.getSituacaoRA()) && helper.getSituacaoRA().equals("0")) {

                query.setShort("situacao", RegistroAtendimento.SITUACAO_PENDENTE);
            } else if (Util.verificarNaoVazio(helper.getSituacaoRA()) && helper.getSituacaoRA().equals("1")) {

                query.setShort("situacao", RegistroAtendimento.SITUACAO_ENCERRADO);
            }

            retorno = query.list();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }

        return retorno;
    }

    /**
     * [UC1056] Gerar Relatrio de Acompanhamento dos Registros de Atendimento
     * Mtodo auxiliar para gerar o select HQL do relatrio em questo 
     * @author Diogo Peixoto
     * @date 28/04/2011
     * 
     * @param FiltrarAcompanhamentoRegistroAtendimentoHelper
     * @return String
     * @throws ErroRepositorioException
     */
    private String montarSelectRelatorioAcompanhamentoAnalitico(
            FiltrarAcompanhamentoRegistroAtendimentoHelper helper) {
        StringBuilder sb = new StringBuilder();
        sb.append(" SELECT DISTINCT (ra.id), ");
        sb.append(" rau.unidadeOrganizacional.id, ");
        sb.append(" step.descricao, ");
        sb.append(" ra.registroAtendimento, ");
        sb.append(" ra.dataEncerramento, ");
        sb.append(" ame.descricao, ");
        sb.append(" rau.unidadeOrganizacional.descricao, ");
        sb.append(" ame.id ");
        if (!Util.isVazioOrNulo(helper.getMunicipiosAssociados())) {
            sb.append(", munRA.nome ");
            sb.append(", munRA.id ");
        }
        return sb.toString();
    }

    /**
     * [UC1056] Gerar Relatrio de Acompanhamento dos Registros de Atendimento
     * Mtodo auxiliar para gerar o select HQL do relatrio em questo 
     * @author Diogo Peixoto
     * @date 28/04/2011
     * 
     * @param FiltrarAcompanhamentoRegistroAtendimentoHelper
     * @return String
     * @throws ErroRepositorioException
     */
    private String montarFromRelatorioAcompanhamentoAnalitico(
            FiltrarAcompanhamentoRegistroAtendimentoHelper helper) {
        StringBuilder sb = new StringBuilder();
        sb.append(" from gcom.atendimentopublico.registroatendimento.RegistroAtendimento ra ");
        sb.append(" inner join ra.solicitacaoTipoEspecificacao step ");
        sb.append(" left join ra.atendimentoMotivoEncerramento ame ");
        sb.append(" inner join ra.registroAtendimentoUnidades rau ");
        sb.append(" inner join rau.unidadeOrganizacional uni ");
        sb.append(" left join ra.imovel imov ");
        sb.append(" left join imov.localidade locImo ");
        sb.append(" left join locImo.municipio munImo ");
        if (!Util.isVazioOrNulo(helper.getMunicipiosAssociados())) {
            sb.append(" inner join ra.localidade locRA ");
            sb.append(" inner join locRA.municipio munRA ");
        } else {
            sb.append(" left join ra.localidade locRA ");
            sb.append(" left join locRA.municipio munRA ");
        }
        return sb.toString();
    }

    /**
     * [UC1056] Gerar Relatrio de Acompanhamento dos Registros de Atendimento
     * 
     * @author Hugo Leonardo, Diogo Peixoto
     * @date 30/09/2010, 26/04/2011
     * 
     * @param FiltrarAcompanhamentoRegistroAtendimentoHelper
     * @return Integer
     * @throws ErroRepositorioException
     */
    public Integer countPesquisarRelatorioAcompanhamentoRAAnalitico(
            FiltrarAcompanhamentoRegistroAtendimentoHelper helper) throws ErroRepositorioException {

        Integer retorno = 0;
        String consulta = "";
        Query query = null;
        Session session = HibernateUtil.getSession();

        try {
            consulta += " select count(distinct ra.id) " //0 
                    + " from gcom.atendimentopublico.registroatendimento.RegistroAtendimento ra "
                    + " inner join ra.solicitacaoTipoEspecificacao step "
                    + " left join ra.atendimentoMotivoEncerramento ame ";

            consulta += " inner join ra.registroAtendimentoUnidades rau "
                    + " inner join rau.unidadeOrganizacional uni " + " left join ra.localidade locRA "
                    + " left join locRA.municipio munRA " + " left join ra.imovel imov "
                    + " left join imov.localidade locImo " + " left join locImo.municipio munImo "

                    + " where ra.unidadeAtual = uni.id and ";

            if (Util.verificarNaoVazio(helper.getIdUnidadeAtendimento())) {

                consulta += " rau.unidadeOrganizacional = :unidade  and " + " rau.atendimentoRelacaoTipo = 1 and ";
            }

            if (!Util.isVazioOrNulo(helper.getMunicipiosAssociados())) {
                consulta += " (munRA.id IN (:municipios) or munImo.id IN (:municipios)) and ";
            }

            if (!Util.isVazioOrNulo(helper.getIdsMotivoEncerramentoSelecionados())) {

                consulta += " ame.id in (:motivo) and ";
            }

            if (helper.getPeriodoAtendimentoInicial() != null && helper.getPeriodoAtendimentoFinal() != null) {

                consulta += " (ra.registroAtendimento between :dtAtendimentoIncial and :dtAtendimentoFinal) and ";
            }

            if (helper.getPeriodoEncerramentoInicial() != null && helper.getPeriodoEncerramentoFinal() != null) {

                consulta += " (ra.dataEncerramento between :dtEncerramentoIncial and :dtEncerramentoFinal) and ";
            }

            if (Util.verificarNaoVazio(helper.getSituacaoRA())) {

                consulta += " ra.codigoSituacao = :situacao and ";
            }

            if (Util.verificarNaoVazio(helper.getSituacaoRA()) && helper.getSituacaoRA().equals("0")
                    && Util.verificarNaoVazio(helper.getSituacaoRAAbertos())
                    && helper.getSituacaoRAAbertos().equals("1")) {

                consulta += " (ra.dataPrevistaAtual >= :dtCorrente "
                        + " or ra.dataPrevistaOriginal >= :dtCorrente) and ";
            } else if (Util.verificarNaoVazio(helper.getSituacaoRA()) && helper.getSituacaoRA().equals("0")
                    && Util.verificarNaoVazio(helper.getSituacaoRAAbertos())
                    && helper.getSituacaoRAAbertos().equals("0")) {

                consulta += " (ra.dataPrevistaAtual < :dtCorrente "
                        + " or ra.dataPrevistaOriginal < :dtCorrente) and ";
            }

            // remove o ltimo AND
            consulta = Util.removerUltimosCaracteres(consulta, 4);

            query = (Query) session.createQuery(consulta);

            if (Util.verificarNaoVazio(helper.getIdUnidadeAtendimento())) {

                query.setString("unidade", helper.getIdUnidadeAtendimento().toString());
            }

            if (!Util.isVazioOrNulo(helper.getMunicipiosAssociados())) {
                query.setParameterList("municipios", helper.getMunicipiosAssociados());
            }

            if (!Util.isVazioOrNulo(helper.getIdsMotivoEncerramentoSelecionados())) {

                query.setParameterList("motivo", helper.getIdsMotivoEncerramentoSelecionados());
            }

            if (helper.getPeriodoAtendimentoInicial() != null && helper.getPeriodoAtendimentoFinal() != null) {

                query.setDate("dtAtendimentoIncial",
                        Util.formatarDataInicial(helper.getPeriodoAtendimentoInicial()));
                query.setDate("dtAtendimentoFinal", Util.formatarDataFinal(helper.getPeriodoAtendimentoFinal()));
            }

            if (helper.getPeriodoEncerramentoInicial() != null && helper.getPeriodoEncerramentoFinal() != null) {

                query.setDate("dtEncerramentoIncial",
                        Util.formatarDataInicial(helper.getPeriodoEncerramentoInicial()));
                query.setDate("dtEncerramentoFinal", Util.formatarDataFinal(helper.getPeriodoEncerramentoFinal()));
            }

            if (Util.verificarNaoVazio(helper.getSituacaoRA()) && helper.getSituacaoRA().equals("0")
                    && Util.verificarNaoVazio(helper.getSituacaoRAAbertos())
                    && (helper.getSituacaoRAAbertos().equals("0") || helper.getSituacaoRAAbertos().equals("1"))) {

                query.setDate("dtCorrente", new Date());
            }

            if (Util.verificarNaoVazio(helper.getSituacaoRA()) && helper.getSituacaoRA().equals("0")) {

                query.setShort("situacao", RegistroAtendimento.SITUACAO_PENDENTE);

            } else if (Util.verificarNaoVazio(helper.getSituacaoRA()) && helper.getSituacaoRA().equals("1")) {

                query.setShort("situacao", RegistroAtendimento.SITUACAO_ENCERRADO);
            }

            retorno = (Integer) query.setMaxResults(1).uniqueResult();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }

        return retorno;
    }

    /**
     * [UC1056] Gerar Relatrio de Acompanhamento dos Registros de Atendimento
     * 
     * @author Hugo Leonardo, Diogo Peixoto
     * @date 01/10/2010, 28/04/2011
     * 
     * @param FiltrarAcompanhamentoRegistroAtendimentoHelper
     * @return Collection
     * @throws ErroRepositorioException
     */
    public Collection pesquisarRelatorioAcompanhamentoRASinteticoAberto(
            FiltrarAcompanhamentoRegistroAtendimentoHelper helper) throws ErroRepositorioException {

        Collection retorno = null;
        String consulta = "";
        Query query = null;
        Session session = HibernateUtil.getSession();
        String joinMunicipio = "";

        if (!Util.isVazioOrNulo(helper.getMunicipiosAssociados())
                && (helper.getIdUnidadeAtendimento() == null || helper.getIdUnidadeAtendimento().equals(""))) {
            consulta += " select rau.unidadeOrganizacional.descricao, " + " muni.nome, " + " count(distinct ra.id) "
                    + " from gcom.atendimentopublico.registroatendimento.RegistroAtendimento ra "
                    + " inner join ra.solicitacaoTipoEspecificacao step "
                    + " left join ra.atendimentoMotivoEncerramento ame ";

            consulta += " inner join ra.localidade loc " + " inner join loc.municipio muni ";
        } else {

            consulta += " select rau.unidadeOrganizacional.descricao, ";
            if (!Util.isVazioOrNulo(helper.getMunicipiosAssociados())) {
                consulta += " muni.nome, ";
                joinMunicipio = " inner join ra.localidade loc " + " inner join loc.municipio muni ";
            }
            consulta += " count(distinct ra.id) "
                    + " from gcom.atendimentopublico.registroatendimento.RegistroAtendimento ra "
                    + " inner join ra.solicitacaoTipoEspecificacao step "
                    + " left join ra.atendimentoMotivoEncerramento ame ";
        }
        consulta += joinMunicipio + " inner join ra.registroAtendimentoUnidades rau "
                + " inner join rau.unidadeOrganizacional uni " + " where ra.unidadeAtual = uni.id and ";

        try {
            if (Util.verificarNaoVazio(helper.getIdUnidadeAtendimento())) {

                consulta += " rau.unidadeOrganizacional = :unidade  and " + " rau.atendimentoRelacaoTipo = 1 and ";
            }

            if (!Util.isVazioOrNulo(helper.getIdsMotivoEncerramentoSelecionados())) {

                consulta += " ame.id in (:motivo) and ";
            }

            if (!Util.isVazioOrNulo(helper.getMunicipiosAssociados())) {

                consulta += " muni.id in (:municipios) and ";
            }

            if (helper.getPeriodoAtendimentoInicial() != null && helper.getPeriodoAtendimentoFinal() != null) {

                consulta += " (ra.registroAtendimento between :dtAtendimentoIncial and :dtAtendimentoFinal) and ";
            }

            if (helper.getPeriodoEncerramentoInicial() != null && helper.getPeriodoEncerramentoFinal() != null) {

                consulta += " (ra.dataEncerramento between :dtEncerramentoIncial and :dtEncerramentoFinal) and ";
            }

            if (Util.verificarNaoVazio(helper.getSituacaoRA())) {

                consulta += " ra.codigoSituacao = :situacao and ";
            }

            if (Util.verificarNaoVazio(helper.getSituacaoRA()) && helper.getSituacaoRA().equals("0")
                    && Util.verificarNaoVazio(helper.getSituacaoRAAbertos())
                    && helper.getSituacaoRAAbertos().equals("1")) {

                consulta += " (ra.dataPrevistaAtual >= :dtCorrente "
                        + " or ra.dataPrevistaOriginal >= :dtCorrente) and ";
            } else if (Util.verificarNaoVazio(helper.getSituacaoRA()) && helper.getSituacaoRA().equals("0")
                    && Util.verificarNaoVazio(helper.getSituacaoRAAbertos())
                    && helper.getSituacaoRAAbertos().equals("0")) {

                consulta += " (ra.dataPrevistaAtual < :dtCorrente "
                        + " or ra.dataPrevistaOriginal < :dtCorrente) and ";
            }

            // remove o ltimo AND
            consulta = Util.removerUltimosCaracteres(consulta, 4);

            if (!Util.isVazioOrNulo(helper.getMunicipiosAssociados())
                    && (helper.getIdUnidadeAtendimento() == null || helper.getIdUnidadeAtendimento().equals(""))) {

                consulta += " GROUP BY muni.nome, rau.unidadeOrganizacional.descricao "
                        + " ORDER BY muni.nome, rau.unidadeOrganizacional.descricao  ";
            } else {
                String groupBy = " GROUP BY ";
                String orderBy = " ORDER BY ";
                if (!Util.isVazioOrNulo(helper.getMunicipiosAssociados())) {
                    groupBy += " muni.nome, ";
                    orderBy += " muni.nome, ";
                }
                groupBy += " rau.unidadeOrganizacional.descricao ";
                orderBy += " rau.unidadeOrganizacional.descricao ";
                consulta += groupBy + orderBy;
            }

            query = (Query) session.createQuery(consulta);

            if (Util.verificarNaoVazio(helper.getIdUnidadeAtendimento())) {

                query.setString("unidade", helper.getIdUnidadeAtendimento().toString());
            }

            if (!Util.isVazioOrNulo(helper.getIdsMotivoEncerramentoSelecionados())) {

                query.setParameterList("motivo", helper.getIdsMotivoEncerramentoSelecionados());
            }

            if (!Util.isVazioOrNulo(helper.getMunicipiosAssociados())) {

                query.setParameterList("municipios", helper.getMunicipiosAssociados());
            }

            if (helper.getPeriodoAtendimentoInicial() != null && helper.getPeriodoAtendimentoFinal() != null) {

                query.setDate("dtAtendimentoIncial",
                        Util.formatarDataInicial(helper.getPeriodoAtendimentoInicial()));
                query.setDate("dtAtendimentoFinal", Util.formatarDataFinal(helper.getPeriodoAtendimentoFinal()));
            }

            if (helper.getPeriodoEncerramentoInicial() != null && helper.getPeriodoEncerramentoFinal() != null) {

                query.setDate("dtEncerramentoIncial",
                        Util.formatarDataInicial(helper.getPeriodoEncerramentoInicial()));
                query.setDate("dtEncerramentoFinal", Util.formatarDataFinal(helper.getPeriodoEncerramentoFinal()));
            }

            if (Util.verificarNaoVazio(helper.getSituacaoRA()) && helper.getSituacaoRA().equals("0")
                    && Util.verificarNaoVazio(helper.getSituacaoRAAbertos())
                    && (helper.getSituacaoRAAbertos().equals("0") || helper.getSituacaoRAAbertos().equals("1"))) {

                query.setDate("dtCorrente", new Date());
            }

            if (Util.verificarNaoVazio(helper.getSituacaoRA()) && helper.getSituacaoRA().equals("0")) {

                query.setShort("situacao", RegistroAtendimento.SITUACAO_PENDENTE);
            } else if (Util.verificarNaoVazio(helper.getSituacaoRA()) && helper.getSituacaoRA().equals("1")) {

                query.setShort("situacao", RegistroAtendimento.SITUACAO_ENCERRADO);
            }

            retorno = query.list();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }

        return retorno;
    }

    /**
     * [UC1056] Gerar Relatrio de Acompanhamento dos Registros de Atendimento
     * 
     * @author Hugo Leonardo, Diogo Peixoto
     * @date 01/10/2010, 28/04/2011
     * 
     * @param FiltrarAcompanhamentoRegistroAtendimentoHelper
     * @return Collection
     * @throws ErroRepositorioException
     */
    public Collection pesquisarRelatorioAcompanhamentoRASinteticoEncerrado(
            FiltrarAcompanhamentoRegistroAtendimentoHelper helper) throws ErroRepositorioException {

        Collection retorno = null;
        String consulta = "";
        Query query = null;
        Session session = HibernateUtil.getSession();

        String selectMunicipio = "";
        String joinMunicipio = "";
        if (!Util.isVazioOrNulo(helper.getMunicipiosAssociados())) {
            selectMunicipio = ", muni.nome";
            joinMunicipio = " inner join ra.localidade loc inner join loc.municipio muni ";
        }

        try {
            consulta += " select rau.unidadeOrganizacional.descricao, ame.descricao, " + " count(distinct ra.id) "
                    + selectMunicipio + " from gcom.atendimentopublico.registroatendimento.RegistroAtendimento ra "
                    + " inner join ra.solicitacaoTipoEspecificacao step "
                    + " left join ra.atendimentoMotivoEncerramento ame ";

            consulta += " inner join ra.registroAtendimentoUnidades rau "
                    + " inner join rau.unidadeOrganizacional uni " + joinMunicipio
                    + " where ra.unidadeAtual = uni.id and ";

            if (Util.verificarNaoVazio(helper.getIdUnidadeAtendimento())) {

                consulta += " rau.unidadeOrganizacional = :unidade  and " + " rau.atendimentoRelacaoTipo = 1 and ";
            }

            if (!Util.isVazioOrNulo(helper.getIdsMotivoEncerramentoSelecionados())) {
                consulta += " ame.id in (:motivo) and ";
            }

            if (!Util.isVazioOrNulo(helper.getMunicipiosAssociados())) {
                consulta += " muni.id in (:municipios) and ";
            }

            if (helper.getPeriodoAtendimentoInicial() != null && helper.getPeriodoAtendimentoFinal() != null) {

                consulta += " (ra.registroAtendimento between :dtAtendimentoIncial and :dtAtendimentoFinal) and ";
            }

            if (helper.getPeriodoEncerramentoInicial() != null && helper.getPeriodoEncerramentoFinal() != null) {

                consulta += " (ra.dataEncerramento between :dtEncerramentoIncial and :dtEncerramentoFinal) and ";
            }

            if (Util.verificarNaoVazio(helper.getSituacaoRA())) {

                consulta += " ra.codigoSituacao = :situacao and ";
            }

            if (Util.verificarNaoVazio(helper.getSituacaoRA()) && helper.getSituacaoRA().equals("0")
                    && Util.verificarNaoVazio(helper.getSituacaoRAAbertos())
                    && helper.getSituacaoRAAbertos().equals("1")) {

                consulta += " (ra.dataPrevistaAtual >= :dtCorrente "
                        + " or ra.dataPrevistaOriginal >= :dtCorrente) and ";
            } else if (Util.verificarNaoVazio(helper.getSituacaoRA()) && helper.getSituacaoRA().equals("0")
                    && Util.verificarNaoVazio(helper.getSituacaoRAAbertos())
                    && helper.getSituacaoRAAbertos().equals("0")) {

                consulta += " (ra.dataPrevistaAtual < :dtCorrente "
                        + " or ra.dataPrevistaOriginal < :dtCorrente) and ";
            }

            // remove o ltimo AND
            consulta = Util.removerUltimosCaracteres(consulta, 4);

            if (!Util.isVazioOrNulo(helper.getMunicipiosAssociados())
                    && (helper.getIdUnidadeAtendimento() == null || helper.getIdUnidadeAtendimento().equals(""))) {

                consulta += " GROUP BY muni.nome, rau.unidadeOrganizacional.descricao, ame.descricao "
                        + " ORDER BY muni.nome, rau.unidadeOrganizacional.descricao, ame.descricao ";
            } else {
                String groupBy = " GROUP BY ";
                String orderBy = " ORDER BY ";
                if (!Util.isVazioOrNulo(helper.getMunicipiosAssociados())) {
                    groupBy += " muni.nome, ";
                    orderBy += " muni.nome, ";
                }
                groupBy += " rau.unidadeOrganizacional.descricao, ame.descricao ";
                orderBy += " rau.unidadeOrganizacional.descricao, ame.descricao ";
                consulta += groupBy + orderBy;
            }

            query = (Query) session.createQuery(consulta);

            if (Util.verificarNaoVazio(helper.getIdUnidadeAtendimento())) {
                query.setString("unidade", helper.getIdUnidadeAtendimento().toString());
            }

            if (!Util.isVazioOrNulo(helper.getIdsMotivoEncerramentoSelecionados())) {
                query.setParameterList("motivo", helper.getIdsMotivoEncerramentoSelecionados());
            }

            if (!Util.isVazioOrNulo(helper.getMunicipiosAssociados())) {
                query.setParameterList("municipios", helper.getMunicipiosAssociados());
            }

            if (helper.getPeriodoAtendimentoInicial() != null && helper.getPeriodoAtendimentoFinal() != null) {

                query.setDate("dtAtendimentoIncial",
                        Util.formatarDataInicial(helper.getPeriodoAtendimentoInicial()));
                query.setDate("dtAtendimentoFinal", Util.formatarDataFinal(helper.getPeriodoAtendimentoFinal()));
            }

            if (helper.getPeriodoEncerramentoInicial() != null && helper.getPeriodoEncerramentoFinal() != null) {

                query.setDate("dtEncerramentoIncial",
                        Util.formatarDataInicial(helper.getPeriodoEncerramentoInicial()));
                query.setDate("dtEncerramentoFinal", Util.formatarDataFinal(helper.getPeriodoEncerramentoFinal()));
            }

            if (Util.verificarNaoVazio(helper.getSituacaoRA()) && helper.getSituacaoRA().equals("0")
                    && Util.verificarNaoVazio(helper.getSituacaoRAAbertos())
                    && (helper.getSituacaoRAAbertos().equals("0") || helper.getSituacaoRAAbertos().equals("1"))) {

                query.setDate("dtCorrente", new Date());
            }

            if (Util.verificarNaoVazio(helper.getSituacaoRA()) && helper.getSituacaoRA().equals("0")) {

                query.setShort("situacao", RegistroAtendimento.SITUACAO_PENDENTE);
            } else if (Util.verificarNaoVazio(helper.getSituacaoRA()) && helper.getSituacaoRA().equals("1")) {

                query.setShort("situacao", RegistroAtendimento.SITUACAO_ENCERRADO);
            }

            retorno = query.list();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }

        return retorno;
    }

    /**
     * [UC1107] Manter Custo de Pavimento por Repavimentadora
      * 
      * @author Hugo Leonardo
      * @date 27/12/2010
      * 
      * @param idRepavimentadora, idPavimento, indicadorPavimento: 1-Rua, 2-Calada
      * @return boolean
     */
    public boolean verificaRemoverCustoPavimentoPorRepavimentadora(Integer idRepavimentadora, Integer idPavimento,
            Integer indicadorPavimento) throws ErroRepositorioException {

        // Cria uma sesso com o hibernate
        Session session = HibernateUtil.getSession();

        // Retorno Consulta
        boolean retorno = false;

        // Cria a varivel que vai conter o hql
        String consulta = "";

        try {

            if (indicadorPavimento == 1) {
                consulta += " SELECT ospv.id "
                        + " FROM OrdemServicoPavimento ospv, UnidadeRepavimentadoraCustoPavimentoRua urr1, UnidadeRepavimentadoraCustoPavimentoRua urr2 "
                        + " INNER JOIN ospv.ordemServico os"
                        + " WHERE ospv.unidadeRepavimentadora.id = :repavimentadora "
                        + " AND ((urr1.pavimentoRua.id = ospv.pavimentoRua.id and ospv.pavimentoRuaRetorno is null and urr1.pavimentoRua.id = :pavimento and urr1.unidadeRepavimentadora.id = :repavimentadora) "
                        + " OR (urr2.pavimentoRua.id = ospv.pavimentoRuaRetorno.id and ospv.pavimentoRuaRetorno is not null and urr2.pavimentoRua.id = :pavimento and urr2.unidadeRepavimentadora.id = :repavimentadora)) "
                        + " AND ( " + "    ( " + "    os.dataEncerramento >= urr1.dataVigenciaInicial "
                        + "    AND   os.dataEncerramento <= urr1.dataVigenciaFinal "
                        + "    AND urr1.dataVigenciaFinal is not null "
                        + "    AND ospv.pavimentoRuaRetorno is null " + "    ) " + " OR ( "
                        + "     os.dataEncerramento >= urr1.dataVigenciaInicial"
                        + "     AND urr1.dataVigenciaFinal is null" + "     AND ospv.pavimentoRuaRetorno is null"
                        + "     )" + " OR ( " + "     os.dataEncerramento >= urr2.dataVigenciaInicial"
                        + "     AND   os.dataEncerramento <= urr2.dataVigenciaFinal"
                        + "    AND urr2.dataVigenciaFinal is not null "
                        + "     AND ospv.pavimentoRuaRetorno is not null" + "    ) " + " OR ( "
                        + "    os.dataEncerramento >= urr2.dataVigenciaInicial "
                        + "    AND urr2.dataVigenciaFinal is null "
                        + "    AND ospv.pavimentoRuaRetorno is not null " + "    ) " + " ) ";
            } else {

                consulta += " SELECT ospv.id "
                        + " FROM OrdemServicoPavimento ospv, UnidadeRepavimentadoraCustoPavimentoCalcada urr1, UnidadeRepavimentadoraCustoPavimentoCalcada urr2 "
                        + " INNER JOIN ospv.ordemServico os"
                        + " WHERE ospv.unidadeRepavimentadora.id = :repavimentadora "
                        + " AND ((urr1.pavimentoCalcada.id = ospv.pavimentoCalcada.id and ospv.pavimentoCalcadaRetorno is null and urr1.pavimentoCalcada.id = :pavimento and urr1.unidadeRepavimentadora.id = :repavimentadora) "
                        + " OR (urr2.pavimentoCalcada.id = ospv.pavimentoCalcadaRetorno.id and ospv.pavimentoCalcadaRetorno is not null and urr2.pavimentoCalcada.id = :pavimento and urr2.unidadeRepavimentadora.id = :repavimentadora)) "
                        + " AND ( " + "    ( " + "    os.dataEncerramento >= urr1.dataVigenciaInicial "
                        + "    AND   os.dataEncerramento <= urr1.dataVigenciaFinal "
                        + "    AND urr1.dataVigenciaFinal is not null "
                        + "    AND ospv.pavimentoCalcadaRetorno is null " + "    ) " + " OR ( "
                        + "     os.dataEncerramento >= urr1.dataVigenciaInicial"
                        + "     AND urr1.dataVigenciaFinal is null"
                        + "     AND ospv.pavimentoCalcadaRetorno is null" + "     )" + " OR ( "
                        + "     os.dataEncerramento >= urr2.dataVigenciaInicial"
                        + "     AND   os.dataEncerramento <= urr2.dataVigenciaFinal"
                        + "    AND urr2.dataVigenciaFinal is not null "
                        + "     AND ospv.pavimentoCalcadaRetorno is not null" + "    ) " + " OR ( "
                        + "    os.dataEncerramento >= urr2.dataVigenciaInicial "
                        + "    AND urr2.dataVigenciaFinal is null "
                        + "    AND ospv.pavimentoCalcadaRetorno is not null " + "    ) " + " ) ";

            }

            Integer idRetorno = (Integer) session.createQuery(consulta)
                    .setInteger("repavimentadora", idRepavimentadora).setInteger("pavimento", idPavimento)
                    .setMaxResults(1).uniqueResult();

            if (idRetorno != null) {
                retorno = true;
            }

            // Erro no hibernate
        } catch (HibernateException e) {
            // Levanta a exceo para a prxima camada
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            // Fecha a sesso com o hibernate
            HibernateUtil.closeSession(session);
        }

        return retorno;
    }

    /**
     * [UC1107] Manter Custo de Pavimento por Repavimentadora
      * 
      * @author Hugo Leonardo
      * @date 28/12/2010
      * 
      * @param id, idRepavimentadora, idPavimento, dataInicio, dataFinal, indicadorPavimento: 1-Rua, 2-Calada
      * @return Integer
      * 
      * @see Caso retorne resultado: return 0.
      * 
      * @see Caso o indicadorPavimento = 1 e dataFinal = null: return 1.
     * @see Caso o indicadorPavimento = 1 e dataFinal != null: return 2.
     * 
     * @see Caso o indicadorPavimento = 2 e dataFinal = null: return 3.
     * @see Caso o indicadorPavimento = 2 e dataFinal != null: return 4.
     */
    public Integer verificaAtualizarCustoPavimentoPorRepavimentadora(Integer idAtualizacao,
            Integer idRepavimentadora, Integer idPavimento, Date dataInicio, Date dataFinal,
            Integer indicadorPavimento, Integer tipo) throws ErroRepositorioException {

        // Cria uma sesso com o hibernate
        Session session = HibernateUtil.getSession();

        // Retorno Consulta
        Integer retorno = 0;
        Integer idRetorno = null;

        // Cria a varivel que vai conter o hql
        String consulta = "";

        try {

            if (indicadorPavimento == 1) {
                consulta += " select urr1.id " + " from UnidadeRepavimentadoraCustoPavimentoRua urr1 "
                        + " where urr1.unidadeRepavimentadora.id = :repavimentadora "
                        + " and urr1.pavimentoRua.id = :pavimento " + " and urr1.id <> :idAtu and ( ";

                if (tipo == 1) {

                    consulta += " urr1.dataVigenciaFinal is null and "
                            + "  coalesce(urr1.dataVigenciaFinal, to_date('9999-12-31','YYYY/MM/DD')) >= :dtInicio and "
                            + "  urr1.dataVigenciaInicial <= :dtFinal and ";

                    consulta = Util.removerUltimosCaracteres(consulta, 4) + ")";
                } else {

                    consulta += " urr1.dataVigenciaFinal is not null and "
                            + "    coalesce(urr1.dataVigenciaFinal, to_date('9999-12-31','YYYY/MM/DD')) >= :dtInicio and "
                            + "    urr1.dataVigenciaInicial <= :dtFinal " + " or ( urr1.dataVigenciaFinal is null "
                            + "      or coalesce(urr1.dataVigenciaFinal, to_date('9999-12-31','YYYY/MM/DD')) >= :dtInicio ) "
                            + " and urr1.dataVigenciaInicial <= :dtFinal) ";
                }

            } else {

                consulta += " select urr1.id " + " from UnidadeRepavimentadoraCustoPavimentoCalcada urr1 "
                        + " where urr1.unidadeRepavimentadora.id = :repavimentadora "
                        + " and urr1.pavimentoCalcada.id = :pavimento " + " and urr1.id <> :idAtu and ( ";

                if (tipo == 1) {

                    consulta += " urr1.dataVigenciaFinal is null and "
                            + " coalesce(urr1.dataVigenciaFinal, to_date('9999-12-31','YYYY/MM/DD')) >= :dtInicio and "
                            + " urr1.dataVigenciaInicial <= :dtFinal and ";

                    consulta = Util.removerUltimosCaracteres(consulta, 4) + ")";

                } else {
                    consulta += " urr1.dataVigenciaFinal is not null and "
                            + "    coalesce(urr1.dataVigenciaFinal, to_date('9999-12-31','YYYY/MM/DD')) >= :dtInicio and "
                            + "     urr1.dataVigenciaInicial <= :dtFinal " + " or ( urr1.dataVigenciaFinal is null "
                            + "      or coalesce(urr1.dataVigenciaFinal, to_date('9999-12-31','YYYY/MM/DD')) >= :dtInicio ) "
                            + " and   urr1.dataVigenciaInicial <= :dtFinal) ";
                }

            }

            if (indicadorPavimento == 1) {
                if (tipo == 1) {

                    idRetorno = (Integer) session.createQuery(consulta).setInteger("idAtu", idAtualizacao)
                            .setInteger("repavimentadora", idRepavimentadora).setInteger("pavimento", idPavimento)
                            .setDate("dtInicio", dataInicio).setDate("dtFinal", dataFinal).setMaxResults(1)
                            .uniqueResult();

                    if (idRetorno != null) {
                        retorno = 1;
                    }
                } else {

                    idRetorno = (Integer) session.createQuery(consulta).setInteger("idAtu", idAtualizacao)
                            .setInteger("repavimentadora", idRepavimentadora).setInteger("pavimento", idPavimento)
                            .setDate("dtInicio", dataInicio).setDate("dtFinal", dataFinal).setMaxResults(1)
                            .uniqueResult();

                    if (idRetorno != null) {
                        retorno = 2;
                    }
                }
            } else {
                if (tipo == 1) {

                    idRetorno = (Integer) session.createQuery(consulta).setInteger("idAtu", idAtualizacao)
                            .setInteger("repavimentadora", idRepavimentadora).setInteger("pavimento", idPavimento)
                            .setDate("dtInicio", dataInicio).setDate("dtFinal", dataFinal).setMaxResults(1)
                            .uniqueResult();

                    if (idRetorno != null) {
                        retorno = 3;
                    }
                } else {

                    idRetorno = (Integer) session.createQuery(consulta).setInteger("idAtu", idAtualizacao)
                            .setInteger("repavimentadora", idRepavimentadora).setInteger("pavimento", idPavimento)
                            .setDate("dtInicio", dataInicio).setDate("dtFinal", dataFinal).setMaxResults(1)
                            .uniqueResult();

                    if (idRetorno != null) {
                        retorno = 4;
                    }
                }
            }

            // Erro no hibernate
        } catch (HibernateException e) {
            // Levanta a exceo para a prxima camada
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            // Fecha a sesso com o hibernate
            HibernateUtil.closeSession(session);
        }

        return retorno;
    }

    /**
     * [UC1107] Manter Custo de Pavimento por Repavimentadora
      * 
      *       [FS0010] Verificar se existem dias sem valor
      * 
      * @author Hugo Leonardo
      * @date 11/01/2011
      * 
      * @param id, idRepavimentadora, idPavimento, dataInicio, dataFinal, indicadorPavimento: 1-Rua, 2-Calada
      * @return Integer
     * 
     * VerificarExistenciDiasSemValor
     */
    public Integer verificarExistenciDiasSemValorCustoPavimentoPorRepavimentadora(Integer idAtualizacao,
            Integer idRepavimentadora, Integer idPavimento, Date dataInicio, Date dataFinal,
            Integer indicadorPavimento, Integer tipo) throws ErroRepositorioException {

        // Cria uma sesso com o hibernate
        Session session = HibernateUtil.getSession();

        // Retorno Consulta
        Integer retorno = 0;
        Integer idRetorno = null;

        // Cria a varivel que vai conter o hql
        String consulta = "";

        try {

            if (indicadorPavimento == 1) {

                if (tipo == 1) {

                    consulta += " select urr1.id " + " from UnidadeRepavimentadoraCustoPavimentoRua urr1 "
                            + " where urr1.unidadeRepavimentadora.id = :repavimentadora "
                            + " and urr1.pavimentoRua.id = :pavimento " + " and urr1.id <> :idAtu " + " and ( "
                            + "    urr1.id =( " + "          select r.id "
                            + "          from UnidadeRepavimentadoraCustoPavimentoRua r "
                            + "          where r.unidadeRepavimentadora.id = :repavimentadora "
                            + "          and r.pavimentoRua.id = :pavimento " + "          and r.id <> :idAtu "
                            + "          and r.dataVigenciaFinal = ( "
                            + "                   select max(r2.dataVigenciaFinal) "
                            + "                   from UnidadeRepavimentadoraCustoPavimentoRua r2 "
                            + "                   where r2.unidadeRepavimentadora.id = :repavimentadora "
                            + "                   and r2.pavimentoRua.id = :pavimento "
                            + "                   and r2.id <> :idAtu "
                            + "                   and coalesce(r2.dataVigenciaFinal, to_date('9999-12-31','YYYY/MM/DD')) = :dtInicio "
                            + "          ) " + "    ) " + " ) "
                            + " and coalesce(urr1.dataVigenciaFinal, to_date('9999-12-31','YYYY/MM/DD')) = :dtInicio ";

                } else if (tipo == 2) {

                    consulta += " select urr1.id " + " from UnidadeRepavimentadoraCustoPavimentoRua urr1 "
                            + " where urr1.unidadeRepavimentadora.id = :repavimentadora "
                            + " and urr1.pavimentoRua.id = :pavimento " + " and urr1.id <> :idAtu " + " and ( "
                            + "    urr1.id = ( " + "          select r3.id "
                            + "          from UnidadeRepavimentadoraCustoPavimentoRua r3 "
                            + "          where r3.unidadeRepavimentadora.id = :repavimentadora "
                            + "          and r3.pavimentoRua.id = :pavimento " + "          and r3.id <> :idAtu "
                            + "          and r3.dataVigenciaInicial = ( "
                            + "                   select max(r4.dataVigenciaInicial) "
                            + "                   from UnidadeRepavimentadoraCustoPavimentoRua r4 "
                            + "                   where r4.unidadeRepavimentadora.id = :repavimentadora "
                            + "                   and r4.pavimentoRua.id = :pavimento "
                            + "                   and r4.id <> :idAtu "
                            + "                   and coalesce(r4.dataVigenciaInicial, to_date('9999-12-31','YYYY/MM/DD')) = :dtFinal "
                            + "          ) " + "    ) " + "    and urr1.dataVigenciaInicial = :dtFinal " + " ) ";

                } else {

                    consulta += " select urr1.id " + " from UnidadeRepavimentadoraCustoPavimentoRua urr1 "
                            + " where urr1.unidadeRepavimentadora.id = :repavimentadora "
                            + " and urr1.pavimentoRua.id = :pavimento " + " and urr1.id <> :idAtu "
                            + " and urr1.dataVigenciaInicial > :dtInicio ";
                }

            } else {

                if (tipo == 1) {

                    consulta += " select urr1.id " + " from UnidadeRepavimentadoraCustoPavimentoCalcada urr1 "
                            + " where urr1.unidadeRepavimentadora.id = :repavimentadora "
                            + " and urr1.pavimentoCalcada.id = :pavimento " + " and urr1.id <> :idAtu " + " and ( "
                            + "    urr1.id = ( " + "          select r.id "
                            + "          from UnidadeRepavimentadoraCustoPavimentoCalcada r "
                            + "          where r.unidadeRepavimentadora.id = :repavimentadora "
                            + "          and r.pavimentoCalcada.id = :pavimento " + "          and r.id <> :idAtu "
                            + "          and r.dataVigenciaFinal = ( "
                            + "                   select max(r2.dataVigenciaFinal) "
                            + "                   from UnidadeRepavimentadoraCustoPavimentoCalcada r2 "
                            + "                   where r2.unidadeRepavimentadora.id = :repavimentadora "
                            + "                   and r2.pavimentoCalcada.id = :pavimento "
                            + "                   and r2.id <> :idAtu "
                            + "                   and coalesce(r2.dataVigenciaFinal, to_date('9999-12-31','YYYY/MM/DD')) = :dtInicio "
                            + "          ) " + "    ) " + " ) "
                            + " and coalesce(urr1.dataVigenciaFinal, to_date('9999-12-31','YYYY/MM/DD')) = :dtInicio ";

                } else if (tipo == 2) {

                    consulta += " select urr1.id " + " from UnidadeRepavimentadoraCustoPavimentoCalcada urr1 "
                            + " where urr1.unidadeRepavimentadora.id = :repavimentadora "
                            + " and urr1.pavimentoCalcada.id = :pavimento " + " and urr1.id <> :idAtu " + " and ( "
                            + "    urr1.id = ( " + "          select r.id "
                            + "          from UnidadeRepavimentadoraCustoPavimentoCalcada r "
                            + "          where r.unidadeRepavimentadora.id = :repavimentadora "
                            + "          and r.pavimentoCalcada.id = :pavimento " + "          and r.id <> :idAtu "
                            + "          and r.dataVigenciaInicial = ( "
                            + "                   select max(r2.dataVigenciaInicial) "
                            + "                   from UnidadeRepavimentadoraCustoPavimentoCalcada r2 "
                            + "                   where r2.unidadeRepavimentadora.id = :repavimentadora "
                            + "                   and r2.pavimentoCalcada.id = :pavimento "
                            + "                   and r2.id <> :idAtu "
                            + "                   and coalesce(r2.dataVigenciaInicial, to_date('9999-12-31','YYYY/MM/DD')) = :dtFinal "
                            + "          ) " + "    ) " + "    and urr1.dataVigenciaInicial = :dtFinal " + " ) ";

                } else {

                    consulta += " select urr1.id " + " from UnidadeRepavimentadoraCustoPavimentoCalcada urr1 "
                            + " where urr1.unidadeRepavimentadora.id = :repavimentadora "
                            + " and urr1.pavimentoCalcada.id = :pavimento " + " and urr1.id <> :idAtu "
                            + " and urr1.dataVigenciaInicial > :dtInicio ";

                }
            }

            if (indicadorPavimento == 1) {

                if (tipo == 1) {

                    idRetorno = (Integer) session.createQuery(consulta).setInteger("idAtu", idAtualizacao)
                            .setInteger("repavimentadora", idRepavimentadora).setInteger("pavimento", idPavimento)
                            .setDate("dtInicio", dataInicio).setMaxResults(1).uniqueResult();

                    if (idRetorno == null) {
                        retorno = 1;
                    } else {
                        retorno = 0;
                    }
                } else if (tipo == 2) {

                    idRetorno = (Integer) session.createQuery(consulta).setInteger("idAtu", idAtualizacao)
                            .setInteger("repavimentadora", idRepavimentadora).setInteger("pavimento", idPavimento)
                            .setDate("dtFinal", dataFinal).setMaxResults(1).uniqueResult();

                    if (idRetorno == null) {
                        retorno = 2;
                    } else {
                        retorno = 0;
                    }
                } else {

                    idRetorno = (Integer) session.createQuery(consulta).setInteger("idAtu", idAtualizacao)
                            .setInteger("repavimentadora", idRepavimentadora).setInteger("pavimento", idPavimento)
                            .setDate("dtInicio", Util.adicionarNumeroDiasDeUmaData(dataInicio, 0)).setMaxResults(1)
                            .uniqueResult();

                    if (idRetorno == null) {
                        retorno = 0;
                    } else {
                        retorno = 3;
                    }
                }

            } else {

                if (tipo == 1) {

                    idRetorno = (Integer) session.createQuery(consulta).setInteger("idAtu", idAtualizacao)
                            .setInteger("repavimentadora", idRepavimentadora).setInteger("pavimento", idPavimento)
                            .setDate("dtInicio", dataInicio).setMaxResults(1).uniqueResult();

                    if (idRetorno == null) {
                        retorno = 4;
                    } else {
                        retorno = 0;
                    }
                } else if (tipo == 2) {

                    idRetorno = (Integer) session.createQuery(consulta).setInteger("idAtu", idAtualizacao)
                            .setInteger("repavimentadora", idRepavimentadora).setInteger("pavimento", idPavimento)
                            .setDate("dtFinal", dataFinal).setMaxResults(1).uniqueResult();

                    if (idRetorno != null) {
                        retorno = 5;
                    } else {
                        retorno = 0;
                    }
                } else {
                    idRetorno = (Integer) session.createQuery(consulta).setInteger("idAtu", idAtualizacao)
                            .setInteger("repavimentadora", idRepavimentadora).setInteger("pavimento", idPavimento)
                            .setDate("dtInicio", Util.adicionarNumeroDiasDeUmaData(dataInicio, -1)).setMaxResults(1)
                            .uniqueResult();

                    if (idRetorno == null) {
                        retorno = 0;
                    } else {
                        retorno = 6;
                    }
                }
            }

            // Erro no hibernate
        } catch (HibernateException e) {
            // Levanta a exceo para a prxima camada
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            // Fecha a sesso com o hibernate
            HibernateUtil.closeSession(session);
        }

        return retorno;
    }

    /**
      * [UC0412] Manter Tipo de Servio
      * 
      * @author Vivianne Sousa
      * @created 07/01/2011
      */
    public void removerServicoTipoBoletim(Integer idServicoTipo) throws ErroRepositorioException {
        String remocao = null;
        Session session = HibernateUtil.getSession();
        try {
            remocao = "delete ServicoTipoBoletim " + "where svtp_id = :idServicoTipo ";
            session.createQuery(remocao).setInteger("idServicoTipo", idServicoTipo).executeUpdate();
        } catch (HibernateException e) {
            // levanta a exceo para a prxima camada
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            // fecha a sesso
            HibernateUtil.closeSession(session);
        }
    }

    /**
    * [UC1120] Gerar Relatrio de religao de clientes inadimplentes.
    *
    * @author Hugo Leonardo
    * @date 25/01/2011
    *
    * @throws ErroRepositorioException
    */
    public Collection pesquisarRelatorioReligacaoClientesInadiplentesOS(
            FiltrarRelatorioReligacaoClientesInadiplentesHelper relatorioHelper) throws ErroRepositorioException {

        Collection retorno = null;

        Session session = HibernateUtil.getSession();
        String consulta = "";
        Query query = null;
        Map parameters = new HashMap();

        try {

            if (relatorioHelper.getEscolhaRelatorio() == 1) {

                consulta = " select distinct (os.id), os.imovel.id, os.dataEncerramento " + " from OrdemServico os "
                        + " inner join os.imovel imo " + " inner join os.ordemServicoUnidades orseunid "
                        + " inner join os.servicoTipo servtipo " + " inner join imo.localidade loca ";
            } else if (relatorioHelper.getEscolhaRelatorio() == 2) {

                consulta = " select os.imovel.id, count(os.imovel.id) " + " from OrdemServico os "
                        + " inner join os.imovel imo " + " inner join os.servicoTipo servtipo "
                        + " inner join imo.localidade loca ";
            } else if (relatorioHelper.getEscolhaRelatorio() == 3 || relatorioHelper.getEscolhaRelatorio() == 4) {
                /*
                consulta = " select os.imovel.id, "
                       + " orseunid.usuario.id, "
                       + " count(os.imovel.id), "
                       + " count (orseunid.usuario.id) "
                + " from OrdemServico os "
                + " inner join os.imovel imo "
                + " inner join os.ordemServicoUnidades orseunid "
                       + " inner join os.servicoTipo servtipo "
                       + " inner join imo.localidade loca ";
                */

                consulta = " select orseunid.usuario.id " + " from OrdemServico os " + " inner join os.imovel imo "
                        + " inner join os.ordemServicoUnidades orseunid " + " inner join os.servicoTipo servtipo "
                        + " inner join imo.localidade loca ";
            } else if (relatorioHelper.getEscolhaRelatorio() == 5) {

                consulta = " select os.imovel.id, " + " orseunid.usuario.id, " + " clieimo.cliente.id, "
                        + " count(os.imovel.id), " + " count (orseunid.usuario.id), "
                        + " count (clieimo.cliente.id) " + " from OrdemServico os " + " inner join os.imovel imo "
                        + " inner join imo.clienteImoveis clieimo "
                        + " inner join os.ordemServicoUnidades orseunid " + " inner join os.servicoTipo servtipo "
                        + " inner join imo.localidade loca ";
            }

            // Gerncia Regional
            if (relatorioHelper.getGerenciaRegional() != null) {

                consulta += " inner join loca.gerenciaRegional gereg ";
            }

            // Unidade Negcio
            if (relatorioHelper.getUnidadeNegocio() != null) {

                consulta += " inner join loca.unidadeNegocio unineg ";
            }

            // Setor Comercial
            if (relatorioHelper.getSetorComercial() != null) {

                consulta += " inner join imo.setorComercial setcom ";
            }

            // Cliente
            if (relatorioHelper.getCliente() != null && relatorioHelper.getEscolhaRelatorio() != 5) {

                consulta += " inner join imo.clienteImoveis clieimo ";
            }

            // Usurio
            if (relatorioHelper.getUsuario() != null) {

                consulta += " inner join orseunid.usuario usua ";
            }

            consulta += " where 1=1 ";

            if (relatorioHelper.getEscolhaRelatorio() == 1) {
                if (relatorioHelper.getDataInicioEncerramento() != null
                        && relatorioHelper.getDataFimEncerramento() != null) {

                    consulta += " and os.dataEncerramento between :dataInicialEncerramento and :dataFinalEncerramento ";

                    parameters.put("dataInicialEncerramento", relatorioHelper.getDataInicioEncerramento());
                    parameters.put("dataFinalEncerramento", relatorioHelper.getDataFimEncerramento());
                }
            } else {

                consulta += " and os.dataEncerramento between :dataInicialEncerramento and :dataFinalEncerramento ";

                parameters.put("dataInicialEncerramento", relatorioHelper.getDataInicioRecorrencia());
                parameters.put("dataFinalEncerramento", relatorioHelper.getDataFimRecorrencia());
            }

            consulta += " and os.situacao = 2 " + " and servtipo.constanteFuncionalidadeTipoServico = 243 ";

            if (relatorioHelper.getEscolhaRelatorio() == 1) {

                consulta += " and orseunid.atendimentoRelacaoTipo in (1, 3) ";
            } else if (relatorioHelper.getEscolhaRelatorio() == 2) {

                //consulta += " and orseunid.atendimentoRelacaoTipo in (1, 3) ";
            } else if (relatorioHelper.getEscolhaRelatorio() == 3) {

                consulta += " and orseunid.atendimentoRelacaoTipo = 1 ";
            } else if (relatorioHelper.getEscolhaRelatorio() == 4) {

                consulta += " and orseunid.atendimentoRelacaoTipo = 3 ";
            } else if (relatorioHelper.getEscolhaRelatorio() == 5) {

                consulta += " and orseunid.atendimentoRelacaoTipo = 3 " + " and clieimo.clienteRelacaoTipo.id = 2 "
                        + " and clieimo.dataFimRelacao is null ";
            }

            // Gerncia Regional
            if (relatorioHelper.getGerenciaRegional() != null) {

                consulta += " and gereg.id = :gerencia ";
                parameters.put("gerencia", relatorioHelper.getGerenciaRegional());
            }

            // Unidade Negcio
            if (relatorioHelper.getUnidadeNegocio() != null) {

                consulta += " and unineg.id = :unidade ";
                parameters.put("unidade", relatorioHelper.getUnidadeNegocio());
            }

            // Localidade
            if (relatorioHelper.getLocalidade() != null) {

                consulta += " and loca.id = :localidade ";
                parameters.put("localidade", relatorioHelper.getLocalidade());
            }

            // Setor Comercial
            if (relatorioHelper.getSetorComercial() != null) {

                consulta += " and setcom.id = :setor ";
                parameters.put("setor", relatorioHelper.getSetorComercial());
            }

            // Cliente
            if (relatorioHelper.getCliente() != null) {

                consulta += " and clieimo.clie.id = :cliente ";
                parameters.put("cliente", relatorioHelper.getCliente());
            }

            // Usurio
            if (relatorioHelper.getUsuario() != null) {

                consulta += " and usua.id = :usuario ";
                parameters.put("usuario", relatorioHelper.getUsuario());
            }

            if (relatorioHelper.getEscolhaRelatorio() == 1) {

                consulta += " order by os.imovel, os.id ";
            } else if (relatorioHelper.getEscolhaRelatorio() == 2) {

                consulta += " group by os.imovel.id " + " having count(os.imovel.id) > 1 "
                        + " order by os.imovel.id ";
            } else if (relatorioHelper.getEscolhaRelatorio() == 3 || relatorioHelper.getEscolhaRelatorio() == 4) {
                /*
                consulta += " group by os.imovel.id, orseunid.usuario.id "
                + " having count(os.imovel.id) > 1 and count(orseunid.usuario.id) > 1 " 
                + " order by os.imovel.id ";
                */

                consulta += " group by orseunid.usuario.id " + " having count(orseunid.usuario.id) > 1 "
                        + " order by orseunid.usuario.id ";
            } else if (relatorioHelper.getEscolhaRelatorio() == 5) {

                consulta += " group by os.imovel.id, orseunid.usuario.id, clieimo.cliente.id "
                        + " having count(os.imovel.id) > 1 and count(orseunid.usuario.id) > 1 "
                        + " and count(clieimo.cliente.id) > 1 " + " order by os.imovel.id ";
            }

            query = session.createQuery(consulta);

            //ITERA OS PARAMETROS E COLOCA 
            // OS MESMOS NA QUERY
            Set set = parameters.keySet();
            Iterator iterMap = set.iterator();
            while (iterMap.hasNext()) {
                String key = (String) iterMap.next();
                if (parameters.get(key) instanceof Set) {
                    Set setList = (HashSet) parameters.get(key);
                    query.setParameterList(key, setList);
                } else if (parameters.get(key) instanceof Collection) {
                    Collection collection = (ArrayList) parameters.get(key);
                    query.setParameterList(key, collection);
                } else if (parameters.get(key) instanceof Date) {
                    Date data = (Date) parameters.get(key);
                    query.setTimestamp(key, data);
                } else {
                    query.setParameter(key, parameters.get(key));
                }
            }

            retorno = query.list();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }

        return retorno;
    }

    /**
     * [UC1120] Gerar Relatrio de religao de clientes inadimplentes.
     *
     * @author Hugo Leonardo
     * @date 28/01/2011
     * 
     * @see opcao = 1 - pagamento
     * @see opcao = 2 - historico
     *
     * @throws ErroRepositorioException
     */
    public Collection pesquisarRelatorioReligacaoClientesInadiplentes(Integer os, Integer imovel,
            Date dataEncerramentoOS, Integer tipo) throws ErroRepositorioException {

        Collection retorno = null;

        Session session = HibernateUtil.getSession();
        String consulta = "";

        try {

            if (tipo == 1) {

                consulta = " SELECT contas11_.cnta_id as conta " + " FROM faturamento.conta contas11_ "
                        + " WHERE contas11_.imov_id = :imovel "
                        + " AND ( contas11_.dcst_idatual IN ( 0 , 1 , 2 ) ) "
                        + " AND contas11_.cnta_dtvencimentoconta <= :dataEncerramentoOS " + " AND ( "
                        + "    EXISTS ( " + "       SELECT pag1.pgmt_id "
                        + "       FROM arrecadacao.pagamento pag1 "
                        + "       WHERE pag1.cnta_id = contas11_.cnta_id "
                        + "       AND pag1.pgmt_dtpagamento > :dataEncerramentoOS " + "       ) " + "   OR "
                        + "     NOT EXISTS ( " + "       SELECT pag.pgmt_id "
                        + "       FROM arrecadacao.pagamento pag " + "       WHERE pag.cnta_id = contas11_.cnta_id "
                        + "     ) " + " ) " + " order by contas11_.cnta_id ";
            } else {

                consulta = " SELECT contas11_.cnta_id as conta " + " FROM faturamento.conta_historico contas11_ "
                        + " WHERE contas11_.imov_id = :imovel "
                        + " AND ( contas11_.dcst_idatual IN ( 0 , 1 , 2 ) ) "
                        + " AND contas11_.cnhi_dtvencimentoconta <= :dataEncerramentoOS " + " AND ( "
                        + "    EXISTS ( " + "       SELECT pag1.pghi_id "
                        + "       FROM arrecadacao.pagamento_historico pag1 "
                        + "       WHERE pag1.cnta_id = contas11_.cnta_id "
                        + "       AND pag1.pghi_dtpagamento > :dataEncerramentoOS " + "       ) " + " ) "
                        + " order by contas11_.cnta_id ";
            }

            retorno = session.createSQLQuery(consulta).addScalar("conta", Hibernate.INTEGER)
                    .setInteger("imovel", imovel).setDate("dataEncerramentoOS", dataEncerramentoOS).list();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }

        return retorno;
    }

    /**
     * [UC1120] Gerar Relatrio de religao de clientes inadimplentes.
     *
     * @author Hugo Leonardo
     * @date 31/01/2011
     *
     * @throws ErroRepositorioException
     */
    public Collection<OrdemServico> pesquisarRelatorioReligacaoClientesInadiplentes(Collection<Integer> idsOS)
            throws ErroRepositorioException {

        Session session = HibernateUtil.getSession();
        String consulta = "";

        Collection<OrdemServico> retornoConsulta = new ArrayList();

        try {

            consulta = " SELECT os " + " FROM OrdemServico os " + " inner join fetch os.imovel imo "
                    + " WHERE os.id in (:idsOS) " + " ORDER BY imo.id ";

            if (idsOS.size() > 999) {

                System.out.println("## TAMANHO TOTAL = " + idsOS.size());

                List<List<Integer>> particoes = CollectionUtil.particao((List<Integer>) idsOS, 999);

                int qtdQuebras = 999;
                int indice = idsOS.size() / qtdQuebras;
                if (idsOS.size() % qtdQuebras != 0) {
                    indice++;
                }

                System.out.println("## QUANTIDADE PARTIES = " + indice);

                for (int i = 0; i < indice; i++) {

                    System.out
                            .println("## TAMANHO PARTIO DE INDICE  " + indice + " = " + particoes.get(i).size());

                    Collection<OrdemServico> retornoConsultaParte = null;

                    retornoConsultaParte = session.createQuery(consulta).setParameterList("idsOS", particoes.get(i))
                            .list();

                    retornoConsulta.addAll(retornoConsultaParte);

                }
            } else {
                retornoConsulta = session.createQuery(consulta).setParameterList("idsOS", idsOS).list();
            }

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }

        return retornoConsulta;
    }

    /**
     * [UC1120] Gerar Relatrio de religao de clientes inadimplentes
     *
     * @author Hugo Leonardo
     * @date 01/02/2011
     *
     * @throws ErroRepositorioException
     */
    public Collection pesquisarRelatorioReligacaoClientesInadiplentesRecorrentes(Integer imovel,
            FiltrarRelatorioReligacaoClientesInadiplentesHelper relatorioHelper) throws ErroRepositorioException {

        Collection retorno = null;

        Session session = HibernateUtil.getSession();
        String consulta = "";
        Query query = null;
        Map parameters = new HashMap();

        try {

            consulta = " select distinct (os.id) " + " from OrdemServico os " + " inner join os.imovel imo "
                    + " inner join os.ordemServicoUnidades orseunid " + " inner join os.servicoTipo servtipo "
                    + " inner join imo.localidade loca ";

            // Gerncia Regional
            if (relatorioHelper.getGerenciaRegional() != null) {

                consulta += " inner join loca.gerenciaRegional gereg ";
            }

            // Unidade Negcio
            if (relatorioHelper.getUnidadeNegocio() != null) {

                consulta += " inner join loca.unidadeNegocio unineg ";
            }

            // Setor Comercial
            if (relatorioHelper.getSetorComercial() != null) {

                consulta += " inner join imo.setorComercial setcom ";
            }

            // Cliente
            if (relatorioHelper.getCliente() != null) {

                consulta += " inner join imo.clienteImoveis clieimo ";
            }

            // Usurio
            if (relatorioHelper.getUsuario() != null) {

                consulta += " inner join orseunid.usuario usua ";
            }

            consulta += " where imo.id = :imovel ";
            parameters.put("imovel", imovel);

            if (relatorioHelper.getEscolhaRelatorio() == 1) {

                if (relatorioHelper.getDataInicioEncerramento() != null
                        && relatorioHelper.getDataFimEncerramento() != null) {

                    consulta += " and os.dataEncerramento between :dataInicialEncerramento and :dataFinalEncerramento ";

                    parameters.put("dataInicialEncerramento", relatorioHelper.getDataInicioEncerramento());
                    parameters.put("dataFinalEncerramento", relatorioHelper.getDataFimEncerramento());
                }
            } else {

                if (relatorioHelper.getDataInicioRecorrencia() != null
                        && relatorioHelper.getDataFimRecorrencia() != null) {

                    consulta += " and os.dataEncerramento between :dataInicialRecorrencia and :dataFinalRecorrencia ";

                    parameters.put("dataInicialRecorrencia", relatorioHelper.getDataInicioRecorrencia());
                    parameters.put("dataFinalRecorrencia", relatorioHelper.getDataFimRecorrencia());
                }
            }

            consulta += " and os.situacao = 2 " + " and servtipo.constanteFuncionalidadeTipoServico = 243 "
                    + " and orseunid.atendimentoRelacaoTipo.id in (1, 3) ";

            // Gerncia Regional
            if (relatorioHelper.getGerenciaRegional() != null) {

                consulta += " and gereg.id = :gerencia ";
                parameters.put("gerencia", relatorioHelper.getGerenciaRegional());
            }

            // Unidade Negcio
            if (relatorioHelper.getUnidadeNegocio() != null) {

                consulta += " and unineg.id = :unidade ";
                parameters.put("unidade", relatorioHelper.getUnidadeNegocio());
            }

            // Localidade
            if (relatorioHelper.getLocalidade() != null) {

                consulta += " and loca.id = :localidade ";
                parameters.put("localidade", relatorioHelper.getLocalidade());
            }

            // Setor Comercial
            if (relatorioHelper.getSetorComercial() != null) {

                consulta += " and setcom.id = :setor ";
                parameters.put("setor", relatorioHelper.getSetorComercial());
            }

            // Cliente
            if (relatorioHelper.getCliente() != null) {

                consulta += " and clieimo.cliente.id = :cliente ";
                parameters.put("cliente", relatorioHelper.getCliente());
            }

            // Usurio
            if (relatorioHelper.getUsuario() != null) {

                consulta += " and usua.id = :usuario ";
                parameters.put("usuario", relatorioHelper.getUsuario());
            }

            consulta += " order by os.id ";

            query = session.createQuery(consulta);

            //ITERA OS PARAMETROS E COLOCA 
            // OS MESMOS NA QUERY
            Set set = parameters.keySet();
            Iterator iterMap = set.iterator();
            while (iterMap.hasNext()) {
                String key = (String) iterMap.next();
                if (parameters.get(key) instanceof Set) {
                    Set setList = (HashSet) parameters.get(key);
                    query.setParameterList(key, setList);
                } else if (parameters.get(key) instanceof Collection) {
                    Collection collection = (ArrayList) parameters.get(key);
                    query.setParameterList(key, collection);
                } else if (parameters.get(key) instanceof Date) {
                    Date data = (Date) parameters.get(key);
                    query.setTimestamp(key, data);
                } else {
                    query.setParameter(key, parameters.get(key));
                }
            }

            retorno = query.list();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }

        return retorno;
    }

    /**
     * [UC1120] Gerar Relatrio de religao de clientes inadimplentes.
     *
     * @author Hugo Leonardo
     * @date 09/02/2011
     *
     * @throws ErroRepositorioException
     */
    public Collection pesquisarRelatorioReligacaoClientesInadiplentesDatasOS(
            FiltrarRelatorioReligacaoClientesInadiplentesHelper relatorioHelper, Integer imovel)
            throws ErroRepositorioException {

        Collection<Object[]> retorno = null;

        Session session = HibernateUtil.getSession();
        String consulta = "";
        Query query = null;
        Map parameters = new HashMap();

        try {

            consulta = " select distinct(os.dataEncerramento), os.id " + " from OrdemServico os "
                    + " inner join os.imovel imo " + " inner join os.ordemServicoUnidades orseunid "
                    + " inner join os.servicoTipo servtipo " + " inner join imo.localidade loca ";

            // Gerncia Regional
            if (relatorioHelper.getGerenciaRegional() != null) {

                consulta += " inner join loca.gerenciaRegional gereg ";
            }

            // Unidade Negcio
            if (relatorioHelper.getUnidadeNegocio() != null) {

                consulta += " inner join loca.unidadeNegocio unineg ";
            }

            // Setor Comercial
            if (relatorioHelper.getSetorComercial() != null) {

                consulta += " inner join imo.setorComercial setcom ";
            }

            // Cliente
            if (relatorioHelper.getCliente() != null) {

                consulta += " inner join imo.clienteImoveis clieimo ";
            }

            // Usurio
            if (relatorioHelper.getUsuario() != null) {

                consulta += " inner join orseunid.usuario usua ";
            }

            consulta += " where imo.id = :imovel "
                    + " and os.dataEncerramento between :dataInicialEncerramento and :dataFinalEncerramento ";

            parameters.put("imovel", imovel);
            parameters.put("dataInicialEncerramento", relatorioHelper.getDataInicioRecorrencia());
            parameters.put("dataFinalEncerramento", relatorioHelper.getDataFimRecorrencia());

            consulta += " and os.situacao = 2 " + " and servtipo.constanteFuncionalidadeTipoServico = 243 "
                    + " and orseunid.atendimentoRelacaoTipo in (1,3) ";

            // Gerncia Regional
            if (relatorioHelper.getGerenciaRegional() != null) {

                consulta += " and gereg.id = :gerencia ";
                parameters.put("gerencia", relatorioHelper.getGerenciaRegional());
            }

            // Unidade Negcio
            if (relatorioHelper.getUnidadeNegocio() != null) {

                consulta += " and unineg.id = :unidade ";
                parameters.put("unidade", relatorioHelper.getUnidadeNegocio());
            }

            // Localidade
            if (relatorioHelper.getLocalidade() != null) {

                consulta += " and loca.id = :localidade ";
                parameters.put("localidade", relatorioHelper.getLocalidade());
            }

            // Setor Comercial
            if (relatorioHelper.getSetorComercial() != null) {

                consulta += " and setcom.id = :setor ";
                parameters.put("setor", relatorioHelper.getSetorComercial());
            }

            // Cliente
            if (relatorioHelper.getCliente() != null) {

                consulta += " and clieimo.cliente.id = :cliente ";
                parameters.put("cliente", relatorioHelper.getCliente());
            }

            // Usurio
            if (relatorioHelper.getUsuario() != null) {

                consulta += " and usua.id = :usuario ";
                parameters.put("usuario", relatorioHelper.getUsuario());
            }

            consulta += " order by os.dataEncerramento ";

            query = session.createQuery(consulta);

            //ITERA OS PARAMETROS E COLOCA 
            // OS MESMOS NA QUERY
            Set set = parameters.keySet();
            Iterator iterMap = set.iterator();
            while (iterMap.hasNext()) {
                String key = (String) iterMap.next();
                if (parameters.get(key) instanceof Set) {
                    Set setList = (HashSet) parameters.get(key);
                    query.setParameterList(key, setList);
                } else if (parameters.get(key) instanceof Collection) {
                    Collection collection = (ArrayList) parameters.get(key);
                    query.setParameterList(key, collection);
                } else if (parameters.get(key) instanceof Date) {
                    Date data = (Date) parameters.get(key);
                    query.setTimestamp(key, data);
                } else {
                    query.setParameter(key, parameters.get(key));
                }
            }

            retorno = query.list();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }

        return retorno;
    }

    /**
     * [UC1120] Gerar Relatrio de religao de clientes inadimplentes
     *
     * @author Hugo Leonardo
     * @date 16/02/2011
     *
     * @throws ErroRepositorioException
     */
    public Collection pesquisarRecorrenciaPorUsuarioQueAbriuOuEncerrouOS(Integer usuario,
            FiltrarRelatorioReligacaoClientesInadiplentesHelper relatorioHelper) throws ErroRepositorioException {

        Collection retorno = null;

        Session session = HibernateUtil.getSession();
        String consulta = "";
        Query query = null;
        Map parameters = new HashMap();

        try {

            consulta = " select os.id, imo.id, os.dataEncerramento " + " from OrdemServico os "
                    + " inner join os.imovel imo " + " inner join os.ordemServicoUnidades orseunid "
                    + " inner join os.servicoTipo servtipo " + " inner join imo.localidade loca ";

            // Gerncia Regional
            if (relatorioHelper.getGerenciaRegional() != null) {

                consulta += " inner join loca.gerenciaRegional gereg ";
            }

            // Unidade Negcio
            if (relatorioHelper.getUnidadeNegocio() != null) {

                consulta += " inner join loca.unidadeNegocio unineg ";
            }

            // Setor Comercial
            if (relatorioHelper.getSetorComercial() != null) {

                consulta += " inner join imo.setorComercial setcom ";
            }

            // Cliente
            if (relatorioHelper.getCliente() != null) {

                consulta += " inner join imo.clienteImoveis clieimo ";
            }

            // Usurio
            if (relatorioHelper.getUsuario() != null) {

                //consulta +=" inner join orseunid.usuario usua ";
            }

            consulta += " where orseunid.usuario.id = :usuario ";
            parameters.put("usuario", usuario);

            if (relatorioHelper.getEscolhaRelatorio() == 1) {

                if (relatorioHelper.getDataInicioEncerramento() != null
                        && relatorioHelper.getDataFimEncerramento() != null) {

                    consulta += " and os.dataEncerramento between :dataInicialEncerramento and :dataFinalEncerramento ";

                    parameters.put("dataInicialEncerramento", relatorioHelper.getDataInicioEncerramento());
                    parameters.put("dataFinalEncerramento", relatorioHelper.getDataFimEncerramento());
                }
            } else {

                if (relatorioHelper.getDataInicioRecorrencia() != null
                        && relatorioHelper.getDataFimRecorrencia() != null) {

                    consulta += " and os.dataEncerramento between :dataInicialRecorrencia and :dataFinalRecorrencia ";

                    parameters.put("dataInicialRecorrencia", relatorioHelper.getDataInicioRecorrencia());
                    parameters.put("dataFinalRecorrencia", relatorioHelper.getDataFimRecorrencia());
                }
            }

            consulta += " and os.situacao = 2 " + " and servtipo.constanteFuncionalidadeTipoServico = 243 ";

            if (relatorioHelper.getEscolhaRelatorio() == 3) {

                consulta += " and orseunid.atendimentoRelacaoTipo.id = 1 ";
            } else if (relatorioHelper.getEscolhaRelatorio() == 4) {

                consulta += " and orseunid.atendimentoRelacaoTipo.id = 3 ";
            }

            // Gerncia Regional
            if (relatorioHelper.getGerenciaRegional() != null) {

                consulta += " and gereg.id = :gerencia ";
                parameters.put("gerencia", relatorioHelper.getGerenciaRegional());
            }

            // Unidade Negcio
            if (relatorioHelper.getUnidadeNegocio() != null) {

                consulta += " and unineg.id = :unidade ";
                parameters.put("unidade", relatorioHelper.getUnidadeNegocio());
            }

            // Localidade
            if (relatorioHelper.getLocalidade() != null) {

                consulta += " and loca.id = :localidade ";
                parameters.put("localidade", relatorioHelper.getLocalidade());
            }

            // Setor Comercial
            if (relatorioHelper.getSetorComercial() != null) {

                consulta += " and setcom.id = :setor ";
                parameters.put("setor", relatorioHelper.getSetorComercial());
            }

            // Cliente
            if (relatorioHelper.getCliente() != null) {

                consulta += " and clieimo.cliente.id = :cliente ";
                parameters.put("cliente", relatorioHelper.getCliente());
            }

            // Usurio
            if (relatorioHelper.getUsuario() != null) {

                consulta += " and orseunid.usuario.id = :usuario ";
                parameters.put("usuario", relatorioHelper.getUsuario());
            }

            consulta += " order by os.id ";

            query = session.createQuery(consulta);

            //ITERA OS PARAMETROS E COLOCA 
            // OS MESMOS NA QUERY
            Set set = parameters.keySet();
            Iterator iterMap = set.iterator();
            while (iterMap.hasNext()) {
                String key = (String) iterMap.next();
                if (parameters.get(key) instanceof Set) {
                    Set setList = (HashSet) parameters.get(key);
                    query.setParameterList(key, setList);
                } else if (parameters.get(key) instanceof Collection) {
                    Collection collection = (ArrayList) parameters.get(key);
                    query.setParameterList(key, collection);
                } else if (parameters.get(key) instanceof Date) {
                    Date data = (Date) parameters.get(key);
                    query.setTimestamp(key, data);
                } else {
                    query.setParameter(key, parameters.get(key));
                }
            }

            retorno = query.list();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }

        return retorno;
    }

    /**
      * Obtm a coleo de perfis de tipo de servio para OS.
      * 
      * @author Hugo Azevedo
      * @date 22/06/2011
      * 
      * @throws ControladorException
      */
    public Collection obterColecaoTipoOSgerada() throws ErroRepositorioException {

        Session session = HibernateUtil.getSession();
        String consulta = "";
        Collection retorno = null;

        consulta = "SELECT st.id, st.descricao " + " FROM ServicoTipo st "
                + " WHERE st.indicadorEmpresaCobranca = :indicador";

        try {

            retorno = session.createQuery(consulta).setInteger("indicador", ConstantesSistema.INDICADOR_USO_ATIVO)
                    .list();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }

        return retorno;

    }

    /**
     * 
     * [UC1186] Gerar Relatrio Ordem de Servio Cobrana p/Resultado
     * 
      * Obtm a coleo de OS a partir dos parmetros passados pela funcionalidade de Acompanhamento de Cobrana por Resultado.
      * 
      * @author Hugo Azevedo
      * @date 27/06/2011
      * 
      * @throws ErroRepositorioException
      */

    public Collection obterColecaoImovelOSCobrancaResultado(String[] categoriaImovel, String[] perfilImovel,
            String[] gerenciaRegional, String[] unidadeNegocio, String idLocalidadeInicial,
            String idLocalidadeFinal, String idSetorComercialInicial, String idSetorComercialFinal,
            String idQuadraInicial, String idQuadraFinal, String tipoServico, String comando)
            throws ErroRepositorioException {

        Session sessao = HibernateUtil.getSession();
        String consulta = "";
        Collection retorno = null;

        consulta = "select distinct imcon.id, grc.id, grc.nome, unc.id, unc.nome "
                + "from EmpresaCobrancaConta emcobco "
                //+ "inner join fetch emcobco.contaGeral cong "
                // + "inner join fetch cong.conta con "
                + "inner join emcobco.imovel imcon " + "inner join imcon.imovelSubcategorias imconsubc "
                + "inner join imconsubc.comp_id.subcategoria subcc " + "inner join subcc.categoria catc "
                + "inner join imcon.imovelPerfil ipc " + "inner join imcon.localidade locc "
                + "inner join locc.gerenciaRegional grc " + "inner join locc.unidadeNegocio unc "
                + "inner join imcon.setorComercial scc " + "inner join imcon.quadra qc "
                /*+ "inner join cong.contaHistorico conh "
                + "inner join conh.imovel imconh "
                + "inner join imconh.imovelSubcategorias imconhsubch "
                + "inner join imconhsubch.comp_id.subcategoria subcch  "
                + "inner join subcch.categoria catch "
                + "inner join imconh.imovelPerfil ipch "   
                + "inner join imconh.localidade locch "
                + "inner join locch.gerenciaRegional grch "
                + "inner join locch.unidadeNegocio unch "
                + "inner join imconh.setorComercial scch "
                + "inner join imconh.quadra qch "*/
                + "where emcobco.comandoEmpresaCobrancaConta = :comando  and imcon.indicadorExclusao = :indicadorExclusao ";

        //Coleo de categorias
        if (categoriaImovel != null && categoriaImovel.length > 0) {
            consulta += "and catc.id in ( :categoria ) ";
        }

        //Coleo de perfis do imvel
        if (perfilImovel != null && perfilImovel.length > 0) {
            consulta += "and ipc.id in ( :perfil ) ";

        }

        //Coleo de gerncias regionais
        if (gerenciaRegional != null && gerenciaRegional.length > 0) {
            consulta += "and grc.id in ( :gerenciaR ) ";

        }

        //Coleo de unidades de negcio
        if (unidadeNegocio != null && unidadeNegocio.length > 0) {
            consulta += "and unc.id in ( :unidadeN ) ";

        }

        //Localidade inicial e final
        if (idLocalidadeInicial != null && !"".equals(idLocalidadeInicial) && idLocalidadeFinal != null
                && !"".equals(idLocalidadeFinal)) {
            consulta += "and locc.id between :localidadeI AND :localidadeF ";
        }

        //Setor comercial inicial e final
        if (idSetorComercialInicial != null && !"".equals(idSetorComercialInicial) && idSetorComercialFinal != null
                && !"".equals(idSetorComercialFinal)) {
            consulta += "and scc between :setorI AND :setorF ";

        }

        //Quadra inicial e final
        if (idQuadraInicial != null && !"".equals(idQuadraInicial) && idQuadraFinal != null
                && !"".equals(idQuadraFinal)) {

            consulta += "and qc between :quadraI AND :quadraF ";

        }

        //Criando a query
        Query query = sessao.createQuery(consulta);

        //Inserindo os parmetros nos seus respectivos campos
        query.setString("comando", comando).setInteger("indicadorExclusao",
                ConstantesSistema.INDICADOR_IMOVEL_ATIVO);
        if (categoriaImovel != null && categoriaImovel.length > 0)
            query.setParameterList("categoria", categoriaImovel);
        if (perfilImovel != null && perfilImovel.length > 0)
            query.setParameterList("perfil", perfilImovel);
        if (gerenciaRegional != null && gerenciaRegional.length > 0)
            query.setParameterList("gerenciaR", gerenciaRegional);
        if (unidadeNegocio != null && unidadeNegocio.length > 0)
            query.setParameterList("unidadeN", unidadeNegocio);
        if (idLocalidadeInicial != null && !"".equals(idLocalidadeInicial) && idLocalidadeFinal != null
                && !"".equals(idLocalidadeFinal))
            query.setInteger("localidadeI", new Integer(idLocalidadeInicial)).setInteger("localidadeF",
                    new Integer(idLocalidadeFinal));
        if (idSetorComercialInicial != null && !"".equals(idSetorComercialInicial) && idSetorComercialFinal != null
                && !"".equals(idSetorComercialFinal))
            query.setInteger("setorI", new Integer(idSetorComercialInicial)).setInteger("setorF",
                    new Integer(idSetorComercialFinal));
        if (idQuadraInicial != null && !"".equals(idQuadraInicial) && idQuadraFinal != null
                && !"".equals(idQuadraFinal))
            query.setInteger("quadraI", new Integer(idQuadraInicial)).setInteger("quadraF",
                    new Integer(idQuadraFinal));

        try {
            retorno = query.list();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(sessao);
        }

        return retorno;

    }

    /**
     * [UC1182] Recepcionar Arquivo TXT Encerramento OS Cobrana
     * 
     * Consulta chamada pelo "[FS0008  Validar Motivo Encerramento]" 
     * 
     * @author Mariana Victor
     * @data 20/06/2011
     */
    public Boolean verificarAtendimentoMotivoEncerramento(Integer idMotivoEncerramento)
            throws ErroRepositorioException {

        Integer retorno = null;
        Session session = HibernateUtil.getSession();
        String consulta;

        try {
            consulta = " SELECT count(*) AS quantidade " //0
                    + "  FROM atendimentopublico.atend_motivo_encmt " + "  WHERE amen_id = :idMotivoEncerramento ";

            retorno = (Integer) session.createSQLQuery(consulta).addScalar("quantidade", Hibernate.INTEGER)
                    .setInteger("idMotivoEncerramento", idMotivoEncerramento).setMaxResults(1).uniqueResult();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }

        if (retorno != null && retorno.compareTo(new Integer(0)) > 0) {
            return true;
        }

        return false;

    }

    /**
     * [UC1177] Gerar Relatrio de Ordens de Servio por Situao
     * 
     * Mtodo auxiliar utilizado para montar toda a estrutura SELECT do relatrio
     * de ordem de servico por situao. No SELECT, pode haver uma parmetro para ser
     * passado na query (caso a situao da OS seja diferente de 8 (TODAS as OS).
     * 
     * As colunas resultantes para o relatrio analtico so:
     * 
     * (numeroOS, INTEGER)
     * (matriculaImovel, INTEGER)
     * (tipoServico, STRING)
     * (dataEncerramento, DATE)
     * (naoCobrada, STRING)
     * (valorConsumoFraudado, BIG_DECIMAL)
     * (numeroOS, INTEGER)
     * (valorMulta, BIG_DECIMAL)
     * (motivoEncerramento, STRING)
     * (retornoFiscalizacao, STRING)
     * (parecerEncerramento, STRING)
     * (situacaoOS, STRING)
     * 
     * As colunas resultantes para o relatrio sinttico so:
     * 
     * (tipoServico, STRING)
     * (motivoEncerramento, STRING)
     * (retornoFiscalizacao, STRING)
     * (situacaoOS, STRING)
     * (quantidade, Integer)
     * 
     * @author Diogo Peixoto
     * @date 02/08/2011
     * 
     * @return String
     */
    private String filtrarRelatorioOSSituacaoSelect(FiltrarRelatorioOSSituacaoHelper helper, boolean boletimGerado,
            boolean unionFiscalizadas, String situacao) {
        StringBuilder sb = new StringBuilder();

        if (helper.getOpcaoRelatorio().equals("1")) {
            sb.append("SELECT ");
            sb.append("orse.orse_id AS numeroOS, "); //0 - Nmero Ordem Servio
            sb.append("imov.imov_id AS matriculaImovel, "); //1 - Matrcula do Imvel
            sb.append("svtp.svtp_dsservicotipo AS tipoServico, "); //2 - Tipo de Servio
            sb.append("orse.orse_tmencerramento AS dataEncerramento, "); //3 - Data Encerramento
            sb.append("(CASE WHEN ((SELECT COUNT(*) ");
            sb.append("FROM atendimentopublico.ordem_servico orse2 ");
            sb.append(
                    "INNER JOIN atendimentopublico.fiscaliz_sit_serv_a_cob fzstSit ON fzstSit.fzst_id = orse2.fzst_id ");
            sb.append("WHERE NOT EXISTS (SELECT dbtCo.imov_id ");
            sb.append("FROM faturamento.debito_a_cobrar dbtCo ");
            sb.append(
                    "WHERE dbtCo.imov_id = orse2.imov_id AND dbtCo.dbtp_id = fzstSit.dbtp_id AND dbtCo.dbac_tmatudebito = orse2.orse_tmencerramento) ");
            sb.append("AND NOT EXISTS (SELECT dbtHist.imov_id ");
            sb.append("FROM faturamento.deb_a_cobrar_hist dbtHist ");
            sb.append(
                    "WHERE dbtHist.imov_id = orse2.imov_id AND dbtHist.dbtp_id = fzstSit.dbtp_id AND dbtHist.dahi_tmatudebito = orse2.orse_tmencerramento) ");
            sb.append("AND orse2.orse_id = orse.orse_id) > 0) THEN '*' ");
            sb.append("ELSE '' END) AS naoCobrada, ");//4 - No Cobrada Automaticamente
            sb.append("((SELECT dbac.dbac_vldebito AS valorConsumoFraudado ");
            sb.append("FROM faturamento.debito_a_cobrar dbac ");
            sb.append("INNER JOIN faturamento.debito_tipo dbtp ON dbac.dbtp_id = dbtp.dbtp_id ");
            sb.append(
                    "WHERE dbac.imov_id = imov.imov_id AND dbac.dbac_tmatudebito = orse.orse_tmencerramento AND dbtp.dbtp_nncodigoconstante = 206) ");
            sb.append("UNION ");
            sb.append("(SELECT dbach.dahi_vldebito AS valorConsumoFraudado ");
            sb.append("FROM faturamento.deb_a_cobrar_hist dbach ");
            sb.append("INNER JOIN faturamento.debito_tipo dbtp ON dbach.dbtp_id = dbtp.dbtp_id ");
            sb.append(
                    "WHERE dbach.imov_id = imov.imov_id AND dbach.dahi_tmatudebito = orse.orse_tmencerramento AND dbtp.dbtp_nncodigoconstante = 206)) ");
            sb.append("AS valorConsumoFraudado, ");//5 - Valor do Consumo Fraudado
            sb.append("((SELECT dbac.dbac_vldebito AS valorMulta ");
            sb.append("FROM faturamento.debito_a_cobrar dbac ");
            sb.append("INNER JOIN faturamento.debito_tipo dbtp ON dbac.dbtp_id = dbtp.dbtp_id ");
            sb.append(
                    "WHERE dbac.imov_id = imov.imov_id AND dbac.dbac_tmatudebito = orse.orse_tmencerramento AND dbtp.dbtp_nncodigoconstante = 205) ");
            sb.append("UNION ");
            sb.append("(SELECT dbach.dahi_vldebito AS valorMulta ");
            sb.append("FROM faturamento.deb_a_cobrar_hist dbach ");
            sb.append("INNER JOIN faturamento.debito_tipo dbtp ON dbach.dbtp_id = dbtp.dbtp_id ");
            sb.append(
                    "WHERE dbach.imov_id = imov.imov_id AND dbach.dahi_tmatudebito = orse.orse_tmencerramento AND dbtp.dbtp_nncodigoconstante = 205)) ");
            sb.append("AS valorMulta, ");//6 - Valor da Multa
            sb.append("encmt.amen_dsmotivoencerramento AS motivoEncerramento, ");//7 - Motivo Encerramento
            sb.append("fzst.fzst_dsfiscalizacaosituacao AS retornoFiscalizacao, ");//8 - Retorno de Fiscaliza
            sb.append("orse.orse_dsparecerencerramento AS parecerEncerramento ");//9 - Parecer Encerramento
        } else {
            if (!unionFiscalizadas) {
                sb.append("SELECT ");
                if (helper.getSituacaoOS().equals("8") || helper.getSituacaoOS().equals("13")) {
                    sb.append("temp.numeroOS, ");
                }
                sb.append("temp.tipoServico, ");//1 Tipo de Servio
                sb.append("temp.motivoEncerramento, ");//2 - Motivo Encerramento
                sb.append("temp.retornoFiscalizacao, ");//3 - Retorno de Fiscalizao
                //Caso a situao seja todas, pegar do parmetro a situao da os
                if (helper.getSituacaoOS().equals("8")) {
                    sb.append(situacao);
                } else {
                    sb.append("temp.situacaoOS, ");
                } //4 - Situao da Ordem de Servio
                sb.append("SUM(temp.quantidade) AS quantidade ");//5 - Quantidade de OS por tipo/motivo/retorno
                sb.append("FROM (");
            }
            sb.append("SELECT ");
            sb.append("orse.orse_id AS numeroOS, ");
            sb.append("svtp.svtp_dsservicotipo AS tipoServico, ");
            sb.append("encmt.amen_dsmotivoencerramento AS motivoEncerramento, ");
            sb.append("fzst.fzst_dsfiscalizacaosituacao AS retornoFiscalizacao, ");
            if (helper.getSituacaoOS().equals("13")) {
                sb.append(situacao);
            }
            sb.append("1 AS quantidade ");
        }

        /*Se a situao da OS for diferente de TODAS, os registros encontrados sero
         * da situao passada no filtro.
         */
        if (!helper.getSituacaoOS().equals("8") && !helper.getSituacaoOS().equals("13")) {
            sb.append(", :situacaoOS AS situacaoOS ");//10 - Situao da Ordem de Servio
        }
        return sb.toString();
    }

    /**
     * [UC1177] Gerar Relatrio de Ordens de Servio por Situao
     * 
     * O segundo parmetro (boletimGerado)  um booleano que
     * indica se para um dado grupo de cobrana e um ms referencia
     * foi gerado um boletim de medio.
     * 
     * @author Diogo Peixoto
     * @date 09/06/2011
     * 
     * @param FiltrarRelatorioOSSituacaoHelper
     * @param boletimGerado
     * @return Collection<FiltrarRelatorioOSSituacaoHelper>
     * @throws ErroRepositorioException
     */
    public Collection<Object[]> filtrarRelatorioOSSituacao(FiltrarRelatorioOSSituacaoHelper helper,
            boolean boletimGerado) throws ErroRepositorioException {
        Collection<Object[]> relatorios = new ArrayList<Object[]>();

        /*
         * Esse mtodo pesquisa as ordens de servio por situao. O helper do parmetro
         * possui a situao da os com os seguintes valores:
         * 
         * 1 Descontadas
         * 2 Encerradas
         * 3 Executadas
         * 4 Fiscalizadas
         * 5 Justificadas
         * 6 Penalizadas por Fiscalizao
         * 7 Penalizadas por Decurso de Prazo
         * 8 Todas
          * 9 Encerradas com Execuo
         * 10 Encerradas por Decurso de Prazo
         * 11 Pendentes
         * 12 Fiscalizadas Boletim No Gerado
         * 13 Todas Boletim No Gerado
         * 
         */
        Session session = HibernateUtil.getSession();
        String consulta = "";
        Map<String, Object> parameters = new HashMap<String, Object>();
        StringBuilder sb = new StringBuilder();
        StringBuilder sbParametrosOpcionais = new StringBuilder();
        String clausulaWhere = "";
        String groupBy = "";
        String orderBy = "";

        try {
            if (!helper.getSituacaoOS().equals("2") && !helper.getSituacaoOS().equals("4")
                    && !helper.getSituacaoOS().equals("8") && !helper.getSituacaoOS().equals("13")) {
                sb.append(this.filtrarRelatorioOSSituacaoSelect(helper, boletimGerado, false, null));
                sb.append("FROM atendimentopublico.ordem_servico orse ");
            }

            //Descontadas
            if (helper.getSituacaoOS().equals("1")) {
                sb.append(this.filtrarRelatorioOSSituacaoDescontadas());
                parameters.put("situacaoOS", "DESCONTADAS");

                //Executadas
            } else if (helper.getSituacaoOS().equals("3")) {
                sb.append(this.filtrarRelatorioOSSituacaoExecutadas());
                parameters.put("situacaoOS", "EXECUTADAS");

                //Justificadas
            } else if (helper.getSituacaoOS().equals("5")) {
                sb.append(this.filtrarRelatorioOSSituacaoJustificadas());
                parameters.put("situacaoOS", "JUSTIFICADAS");

                //Penalizadas por fiscalizao   
            } else if (helper.getSituacaoOS().equals("6")) {
                sb.append(this.filtrarRelatorioOSSituacaoPenalizadaFiscalizacao());
                parameters.put("situacaoOS", "PENALIZADAS POR FISCALIZAO");

                //Penalizadas por Decurso de Prazo
            } else if (helper.getSituacaoOS().equals("7")) {
                sb.append(this.filtrarRelatorioOSSituacaoPenalizadaDecursoPrazo());
                parameters.put("situacaoOS", "PENALIZADAS POR DECURSO DE PRAZO");

                //Encerradas com Execuo
            } else if (helper.getSituacaoOS().equals("9")) {
                sb.append(this.filtrarRelatorioOSSituacaoBoletimNaoGerado());
                clausulaWhere += " AND orse.orse_cdsituacao = 2 AND orse.amen_id != 32 AND encmt.amen_icexecucao = 1 ";
                parameters.put("situacaoOS", "ENCERRADAS COM EXECUO");

                //Pendentes
            } else if (helper.getSituacaoOS().equals("11")) {
                sb.append(this.filtrarRelatorioOSSituacaoBoletimNaoGerado());
                clausulaWhere += " AND orse.orse_cdsituacao = 1 ";
                parameters.put("situacaoOS", "PENDENTES");

                //Fiscalizadas Boletim No Gerado   
            } else if (helper.getSituacaoOS().equals("12")) {
                sb.append(this.filtrarRelatorioOSSituacaoBoletimNaoGerado());
                sb.append(
                        "INNER JOIN atendimentopublico.ordem_servico orseRef ON orseRef.orse_idreferencia = orse.orse_id ");
                parameters.put("situacaoOS", "FISCALIZADAS");

                //Encerradas com decurso de prazo
            } else if (helper.getSituacaoOS().equals("10")) {
                sb.append(this.filtrarRelatorioOSSituacaoBoletimNaoGerado());
                clausulaWhere += " AND orse.orse_cdsituacao = 2 AND orse.amen_id = 32 ";
                parameters.put("situacaoOS", "ENCERRADAS COM DECURSO DE PRAZO");
            }

            if (helper.getOpcaoOSCobranca() != null
                    && helper.getOpcaoOSCobranca().equalsIgnoreCase("naoCobradasAutomaticamente")) {
                sbParametrosOpcionais.append(
                        "INNER JOIN atendimentopublico.fiscaliz_sit_serv_a_cob fiscACobrar ON orse.fzst_id = fiscACobrar.fzst_id ");
                clausulaWhere += " AND NOT EXISTS (SELECT dbtCo.imov_id ";
                clausulaWhere += "FROM faturamento.debito_a_cobrar dbtCo ";
                clausulaWhere += "WHERE dbtCo.imov_id = orse.imov_id AND dbtCo.dbtp_id = fiscACobrar.dbtp_id AND dbtCo.dbac_tmatudebito = orse.orse_tmencerramento) ";
                clausulaWhere += " AND NOT EXISTS (SELECT dbtHist.imov_id ";
                clausulaWhere += " FROM faturamento.deb_a_cobrar_hist dbtHist ";
                clausulaWhere += " WHERE dbtHist.imov_id = orse.imov_id AND dbtHist.dbtp_id = fiscACobrar.dbtp_id AND dbtHist.dahi_tmatudebito = orse.orse_tmencerramento) ";
            }

            if (helper.getServicoTipo() != null) {
                clausulaWhere += " AND orse.svtp_id = :servicoTipo ";
                parameters.put("servicoTipo", helper.getServicoTipo().getId());
            }

            boolean existeLocalidade;
            existeLocalidade = (helper.getLocalidade() != null ? existeLocalidade = true : false);
            // Localidade
            if (existeLocalidade) {
                sbParametrosOpcionais.append("INNER JOIN cadastro.localidade loca ON loca.loca_id = imov.loca_id ");
                clausulaWhere += " AND loca.loca_id = :idLocalidade ";
                parameters.put("idLocalidade", helper.getLocalidade().getId());
            }

            if (helper.getEloPolo() != null) {
                // Elo Polo
                if (!existeLocalidade) {
                    sbParametrosOpcionais
                            .append("INNER JOIN cadastro.localidade loca ON loca.loca_id = imov.loca_id ");
                    existeLocalidade = true;
                }
                clausulaWhere += " AND loca.loca_cdelo = :idEloPolo ";
                parameters.put("idEloPolo", helper.getEloPolo().getId());
            }

            // Gerncia Regional
            GerenciaRegional gerencia = helper.getGerenciaRegional();
            if (gerencia != null) {
                if (existeLocalidade) {
                    sbParametrosOpcionais
                            .append("INNER JOIN cadastro.gerencia_regional ger ON ger.greg_id = loca.greg_id ");
                } else {
                    sbParametrosOpcionais
                            .append("INNER JOIN cadastro.localidade loca ON loca.loca_id = imov.loca_id ");
                    sbParametrosOpcionais
                            .append("INNER JOIN cadastro.gerencia_regional ger ON ger.greg_id = loca.greg_id ");
                    existeLocalidade = true;
                }
                clausulaWhere += " AND ger.greg_id = :idGerencia ";
                parameters.put("idGerencia", gerencia.getId());
            }

            // Unidade Negcio
            UnidadeNegocio unidade = helper.getUnidadeNegocio();
            if (unidade != null) {
                if (existeLocalidade) {
                    sbParametrosOpcionais
                            .append("INNER JOIN cadastro.unidade_negocio uni ON uni.uneg_id = loca.uneg_id ");
                } else {
                    sbParametrosOpcionais
                            .append("INNER JOIN cadastro.localidade loca ON loca.loca_id = imov.loca_id ");
                    sbParametrosOpcionais
                            .append("INNER JOIN cadastro.unidade_negocio uni ON uni.uneg_id = loca.uneg_id ");
                }
                clausulaWhere += " AND uni.uneg_id = :idUnidade ";
                parameters.put("idUnidade", unidade.getId());
            }

            // Setor Comercial
            if (helper.getSetorComercial() != null) {
                sbParametrosOpcionais
                        .append("INNER JOIN cadastro.setor_comercial setor ON setor.stcm_id = imov.stcm_id ");
                clausulaWhere += " AND setor.stcm_id = :idSetor ";
                parameters.put("idSetor", helper.getSetorComercial().getId());
            }

            // Quadra
            if (helper.getQuadra() != null) {
                sbParametrosOpcionais.append("INNER JOIN cadastro.quadra quadra ON quadra.qdra_id = imov.qdra_id ");
                clausulaWhere += " AND quadra.qdra_id = :idQuadra ";
                parameters.put("idQuadra", helper.getQuadra().getId());
            }

            if (helper.getSituacaoOS().equals("2")) {
                if (helper.getOpcaoRelatorio().equals("1")) {
                    sb.append("SELECT DISTINCT aux.numeroOS, ");
                    sb.append("aux.matriculaImovel, ");
                    sb.append("aux.tipoServico, ");
                    sb.append("aux.dataEncerramento, ");
                    sb.append("aux.naoCobrada, ");
                    sb.append("aux.valorConsumoFraudado, ");
                    sb.append("aux.valorMulta, ");
                    sb.append("aux.motivoEncerramento, ");
                    sb.append("aux.retornoFiscalizacao, ");
                    sb.append("aux.parecerEncerramento, ");
                    sb.append("aux.situacaoOS ");
                } else if (helper.getOpcaoRelatorio().equals("2")) {
                    sb.append("SELECT DISTINCT aux.tipoServico, ");
                    sb.append("aux.motivoEncerramento, ");
                    sb.append("aux.retornoFiscalizacao, ");
                    sb.append("aux.situacaoOS AS situacaoOS, ");
                    sb.append("SUM(aux.quantidade) AS quantidade ");
                }
                sb.append("FROM (");
                sb.append(this.filtrarRelatorioOSSituacaoSelect(helper, boletimGerado, true, null));
                sb.append("FROM atendimentopublico.ordem_servico orse ");
                sb.append(this.filtrarRelatorioOSSituacaoExecutadas());
                sb.append(sbParametrosOpcionais.toString());
                if (!clausulaWhere.trim().equals("")) {
                    sb.append(" WHERE ");
                    clausulaWhere = clausulaWhere.replaceFirst("AND", "");
                    sb.append(clausulaWhere);
                }
                sb.append(" UNION ALL ");
                sb.append(this.filtrarRelatorioOSSituacaoSelect(helper, boletimGerado, true, null));
                sb.append("FROM atendimentopublico.ordem_servico orse ");
                sb.append(this.filtrarRelatorioOSSituacaoJustificadas());
                sb.append(sbParametrosOpcionais.toString());
                if (!clausulaWhere.trim().equals("")) {
                    sb.append(" WHERE ");
                    clausulaWhere = clausulaWhere.replaceFirst("AND", "");
                    sb.append(clausulaWhere);
                }
                sb.append(") aux");
                parameters.put("situacaoOS", "ENCERRADAS");
            } else if (helper.getSituacaoOS().equals("4")) {
                sb.append(this.filtrarRelatorioOSSituacaoSelect(helper, boletimGerado, false, null));
                sb.append("FROM atendimentopublico.ordem_servico orse ");
                sb.append(this.filtrarRelatorioOSSituacaoFiscalizadas(helper, boletimGerado,
                        sbParametrosOpcionais.toString(), clausulaWhere));
                parameters.put("situacaoOS", "FISCALIZADAS");
            } else if (helper.getSituacaoOS().equals("8") || helper.getSituacaoOS().equals("13")) {
                sb.append(this.filtrarRelatorioOSSituacaoTodas(helper, boletimGerado,
                        sbParametrosOpcionais.toString(), clausulaWhere));
            } else {
                sb.append(sbParametrosOpcionais.toString());
            }

            if (!clausulaWhere.equals("") && !helper.getSituacaoOS().equals("2")
                    && !helper.getSituacaoOS().equals("4") && !helper.getSituacaoOS().equals("8")
                    && !helper.getSituacaoOS().equals("13")) {
                /*
                 * Este trecho do cdigo retira o primeiro AND da clusula where e adiciona espao em branco
                 * na ltima comparao para no dar erro na query.
                 * Ex: 'WHERE AND os.orse_id' => 'WHERE os.orse_id '
                 */
                sb.append("WHERE ");
                clausulaWhere = clausulaWhere.trim();
                clausulaWhere = clausulaWhere.replaceFirst("AND", "");
                clausulaWhere += " ";
                sb.append(clausulaWhere);
            }

            //Caso seja o relatrio sinttico
            if (helper.getOpcaoRelatorio().equals("2") && !helper.getSituacaoOS().equals("8")
                    && !helper.getSituacaoOS().equals("13")) {
                groupBy += " GROUP BY tipoServico, motivoEncerramento, retornoFiscalizacao, situacaoOS ";
                orderBy += " ORDER BY tipoServico, motivoEncerramento, retornoFiscalizacao ";

                if (!helper.getSituacaoOS().equals("2")) {
                    sb.append(") temp");
                }
            }

            sb.append(groupBy);
            sb.append(orderBy);

            consulta = sb.toString();
            SQLQuery sqlQuery = session.createSQLQuery(consulta);
            sqlQuery.setInteger("amReferencia", helper.getDataReferencia());
            sqlQuery.setInteger("cobrancaGrupoID", helper.getIdGrupoCobranca());

            if (helper.getOpcaoRelatorio().equalsIgnoreCase("1")) {
                sqlQuery = sqlQuery.addScalar("numeroOS", Hibernate.INTEGER)
                        .addScalar("matriculaImovel", Hibernate.INTEGER).addScalar("tipoServico", Hibernate.STRING)
                        .addScalar("dataEncerramento", Hibernate.DATE).addScalar("naoCobrada", Hibernate.STRING)
                        .addScalar("valorConsumoFraudado", Hibernate.BIG_DECIMAL)
                        .addScalar("valorMulta", Hibernate.BIG_DECIMAL)
                        .addScalar("motivoEncerramento", Hibernate.STRING)
                        .addScalar("retornoFiscalizacao", Hibernate.STRING)
                        .addScalar("parecerEncerramento", Hibernate.STRING)
                        .addScalar("situacaoOS", Hibernate.STRING);
            } else {

                sqlQuery = sqlQuery.addScalar("tipoServico", Hibernate.STRING)
                        .addScalar("motivoEncerramento", Hibernate.STRING)
                        .addScalar("retornoFiscalizacao", Hibernate.STRING)
                        .addScalar("situacaoOS", Hibernate.STRING).addScalar("quantidade", Hibernate.INTEGER);
            }

            //ITERA OS PARAMETROS E COLOCA 
            // OS MESMOS NA QUERY
            Set<String> set = parameters.keySet();
            Iterator<String> iterMap = set.iterator();
            while (iterMap.hasNext()) {
                String key = iterMap.next();
                sqlQuery.setParameter(key, parameters.get(key));
            }
            relatorios = sqlQuery.list();
        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
        return relatorios;
    }

    private String filtrarRelatorioOSSituacaoTodas(FiltrarRelatorioOSSituacaoHelper filtro, boolean boletimGerado,
            String joins, String where) {

        StringBuilder sb = new StringBuilder();

        if (boletimGerado) {

            if (filtro.getOpcaoRelatorio().equals("1")) {
                sb.append("SELECT aux4.numeroOS AS numeroOS, ");
                sb.append("aux4.matriculaImovel AS matriculaImovel, ");
                sb.append("aux4.tipoServico AS tipoServico, ");
                sb.append("aux4.dataEncerramento AS dataEncerramento, ");
                sb.append("aux4.naoCobrada AS naoCobrada, ");
                sb.append("aux4.valorConsumoFraudado AS valorConsumoFraudado, ");
                sb.append("aux4.valorMulta AS valorMulta, ");
                sb.append("aux4.motivoEncerramento AS motivoEncerramento, ");
                sb.append("aux4.retornoFiscalizacao AS retornoFiscalizacao, ");
                sb.append("aux4.parecerEncerramento, ");
                sb.append("aux4.SITUACAO AS situacaoOS ");
                sb.append("FROM (");
                sb.append("SELECT aux3.numeroOS, ");
                sb.append("aux3.matriculaImovel, ");
                sb.append("aux3.tipoServico, ");
                sb.append("aux3.dataEncerramento, ");
                sb.append("aux3.naoCobrada, ");
                sb.append("aux3.valorConsumoFraudado, ");
                sb.append("aux3.valorMulta, ");
                sb.append("aux3.motivoEncerramento, ");
                sb.append("aux3.retornoFiscalizacao, ");
                sb.append("aux3.parecerEncerramento, ");
                sb.append("min(aux3.Situacao) as SITUACAO ");
                sb.append("FROM (");
                sb.append("SELECT aux.numeroOS, ");
                sb.append("aux.matriculaImovel, ");
                sb.append("aux.tipoServico, ");
                sb.append("aux.dataEncerramento, ");
                sb.append("aux.naoCobrada, ");
                sb.append("aux.valorConsumoFraudado, ");
                sb.append("aux.valorMulta, ");
                sb.append("aux.motivoEncerramento, ");
                sb.append("aux.retornoFiscalizacao, ");
                sb.append("aux.parecerEncerramento, ");
                sb.append("1 AS SITUACAO ");
                sb.append("FROM (");
                sb.append(this.filtrarRelatorioOSSituacaoSelect(filtro, boletimGerado, false, null));
                sb.append("FROM atendimentopublico.ordem_servico orse ");
                sb.append(this.filtrarRelatorioOSSituacaoFiscalizadas(filtro, boletimGerado, joins, where));
                sb.append(") aux ");
                sb.append("UNION ALL ");
                sb.append(this.filtrarRelatorioOSSituacaoSelect(filtro, boletimGerado, false, null));
                sb.append(", 2 AS SITUACAO ");
                sb.append("FROM atendimentopublico.ordem_servico orse ");
                sb.append(this.filtrarRelatorioOSSituacaoDescontadas());
                sb.append(joins);
                String whereTratado = "";
                if (!where.trim().equals("")) {
                    sb.append("WHERE ");
                    whereTratado = where.trim();
                    whereTratado = whereTratado.replaceFirst("AND", "");
                    whereTratado += " ";
                }
                sb.append(whereTratado);

                sb.append(" UNION ALL ");
                sb.append(this.filtrarRelatorioOSSituacaoSelect(filtro, boletimGerado, false, null));
                sb.append(", 3 AS SITUACAO ");
                sb.append("FROM atendimentopublico.ordem_servico orse ");
                sb.append(this.filtrarRelatorioOSSituacaoExecutadas());
                sb.append(joins);
                whereTratado = "";
                if (!where.trim().equals("")) {
                    sb.append("WHERE ");
                    whereTratado = where.trim();
                    whereTratado = whereTratado.replaceFirst("AND", "");
                    whereTratado += " ";
                }
                sb.append(whereTratado);

                sb.append(" UNION ALL ");
                sb.append(this.filtrarRelatorioOSSituacaoSelect(filtro, boletimGerado, false, null));
                sb.append(", 4 AS SITUACAO ");
                sb.append("FROM atendimentopublico.ordem_servico orse ");
                sb.append(this.filtrarRelatorioOSSituacaoJustificadas());
                sb.append(joins);
                whereTratado = "";
                if (!where.trim().equals("")) {
                    sb.append("WHERE ");
                    whereTratado = where.trim();
                    whereTratado = whereTratado.replaceFirst("AND", "");
                    whereTratado += " ";
                }
                sb.append(whereTratado);

                sb.append(" UNION ALL ");
                sb.append(this.filtrarRelatorioOSSituacaoSelect(filtro, boletimGerado, false, null));
                sb.append(", 5 AS SITUACAO ");
                sb.append("FROM atendimentopublico.ordem_servico orse ");
                sb.append(this.filtrarRelatorioOSSituacaoPenalizadaFiscalizacao());
                sb.append(joins);
                whereTratado = "";
                if (!where.trim().equals("")) {
                    sb.append("WHERE ");
                    whereTratado = where.trim();
                    whereTratado = whereTratado.replaceFirst("AND", "");
                    whereTratado += " ";
                }
                sb.append(whereTratado);

                sb.append(" UNION ALL ");
                sb.append(this.filtrarRelatorioOSSituacaoSelect(filtro, boletimGerado, false, null));
                sb.append(", 6 AS SITUACAO ");
                sb.append("FROM atendimentopublico.ordem_servico orse ");
                sb.append(this.filtrarRelatorioOSSituacaoPenalizadaDecursoPrazo());
                sb.append(joins);
                whereTratado = "";
                if (!where.trim().equals("")) {
                    sb.append("WHERE ");
                    whereTratado = where.trim();
                    whereTratado = whereTratado.replaceFirst("AND", "");
                    whereTratado += " ";
                }
                sb.append(whereTratado);

                sb.append(") aux3 ");
                sb.append("GROUP BY 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ");
                sb.append("ORDER BY 11, 2 ");
                sb.append(") aux4 ");
                sb.append("ORDER BY 11, 1 ");
            } else if (filtro.getOpcaoRelatorio().equals("2")) {
                sb.append("SELECT ");
                if (filtro.getSituacaoOS().equals("8") || filtro.getSituacaoOS().equals("13")) {
                    sb.append("aux4.numeroOS, ");
                }
                sb.append("aux4.tipoServico AS tipoServico,  ");
                sb.append("aux4.motivoEncerramento AS motivoEncerramento, ");
                sb.append("aux4.retornoFiscalizacao AS retornoFiscalizacao, ");
                sb.append("aux4.situacaoOS AS situacaoOS, ");
                sb.append("aux4.quantidade AS quantidade ");
                sb.append("FROM( ");
                sb.append("SELECT aux3.numeroOS, ");
                sb.append("aux3.tipoServico, ");
                sb.append("aux3.motivoEncerramento, ");
                sb.append("aux3.retornoFiscalizacao, ");
                sb.append("min(aux3.situacaoOS) as situacaoOS, ");
                sb.append("aux3.quantidade AS quantidade ");
                sb.append("FROM( ");
                sb.append(this.filtrarRelatorioOSSituacaoSelect(filtro, boletimGerado, false, "1 AS situacaoOS, "));
                sb.append("FROM atendimentopublico.ordem_servico orse ");
                sb.append(this.filtrarRelatorioOSSituacaoFiscalizadas(filtro, boletimGerado, joins, where));
                sb.append(") temp ");
                sb.append("GROUP BY numeroOS, tipoServico, motivoEncerramento, retornoFiscalizacao  ");

                sb.append(" UNION ALL ");

                sb.append(this.filtrarRelatorioOSSituacaoSelect(filtro, boletimGerado, false, "2 AS situacaoOS, "));
                sb.append("FROM atendimentopublico.ordem_servico orse ");
                sb.append(this.filtrarRelatorioOSSituacaoDescontadas());
                sb.append(joins);
                String whereTratado = "";
                if (!where.trim().equals("")) {
                    sb.append("WHERE ");
                    whereTratado = where.trim();
                    whereTratado = whereTratado.replaceFirst("AND", "");
                    whereTratado += " ";
                }
                sb.append(whereTratado);
                sb.append(") temp ");
                sb.append("GROUP BY numeroOS, tipoServico, motivoEncerramento, retornoFiscalizacao  ");

                sb.append(" UNION ALL ");

                sb.append(this.filtrarRelatorioOSSituacaoSelect(filtro, boletimGerado, false, "3 AS situacaoOS, "));
                sb.append("FROM atendimentopublico.ordem_servico orse ");
                sb.append(this.filtrarRelatorioOSSituacaoExecutadas());
                sb.append(joins);
                whereTratado = "";
                if (!where.trim().equals("")) {
                    sb.append("WHERE ");
                    whereTratado = where.trim();
                    whereTratado = whereTratado.replaceFirst("AND", "");
                    whereTratado += " ";
                }
                sb.append(whereTratado);
                sb.append(") temp ");
                sb.append("GROUP BY numeroOS, tipoServico, motivoEncerramento, retornoFiscalizacao  ");

                sb.append(" UNION ALL ");

                sb.append(this.filtrarRelatorioOSSituacaoSelect(filtro, boletimGerado, false, "4 AS situacaoOS, "));
                sb.append("FROM atendimentopublico.ordem_servico orse ");
                sb.append(this.filtrarRelatorioOSSituacaoJustificadas());
                sb.append(joins);
                whereTratado = "";
                if (!where.trim().equals("")) {
                    sb.append("WHERE ");
                    whereTratado = where.trim();
                    whereTratado = whereTratado.replaceFirst("AND", "");
                    whereTratado += " ";
                }
                sb.append(whereTratado);
                sb.append(") temp ");
                sb.append("GROUP BY numeroOS, tipoServico, motivoEncerramento, retornoFiscalizacao  ");

                sb.append(" UNION ALL ");

                sb.append(this.filtrarRelatorioOSSituacaoSelect(filtro, boletimGerado, false, "5 AS situacaoOS, "));
                sb.append("FROM atendimentopublico.ordem_servico orse ");
                sb.append(this.filtrarRelatorioOSSituacaoPenalizadaFiscalizacao());
                sb.append(joins);
                whereTratado = "";
                if (!where.trim().equals("")) {
                    sb.append("WHERE ");
                    whereTratado = where.trim();
                    whereTratado = whereTratado.replaceFirst("AND", "");
                    whereTratado += " ";
                }
                sb.append(whereTratado);
                sb.append(") temp ");
                sb.append("GROUP BY numeroOS, tipoServico, motivoEncerramento, retornoFiscalizacao  ");

                sb.append(" UNION ALL ");

                sb.append(this.filtrarRelatorioOSSituacaoSelect(filtro, boletimGerado, false, "6 AS situacaoOS, "));
                sb.append("FROM atendimentopublico.ordem_servico orse ");
                sb.append(this.filtrarRelatorioOSSituacaoPenalizadaDecursoPrazo());
                sb.append(joins);
                whereTratado = "";
                if (!where.trim().equals("")) {
                    sb.append("WHERE ");
                    whereTratado = where.trim();
                    whereTratado = whereTratado.replaceFirst("AND", "");
                    whereTratado += " ";
                }
                sb.append(whereTratado);
                sb.append(") temp ");
                sb.append("GROUP BY numeroOS, tipoServico, motivoEncerramento, retornoFiscalizacao  ");

                sb.append(") aux3 ");
                if (filtro.getSituacaoOS().equals("8") || filtro.getSituacaoOS().equals("13")) {
                    sb.append("GROUP BY 1, 2, 3, 4, 6 ");
                    sb.append("ORDER BY 1, 2 ");
                    sb.append(") aux4 ");
                    sb.append("ORDER BY 5, 2, 3, 4 ");
                } else {
                    sb.append("GROUP BY 1, 2, 3, 5 ");
                    sb.append("ORDER BY 1, 2 ");
                    sb.append(") aux4 ");
                    sb.append("ORDER BY 4, 1, 2, 3, 5");
                }
            }
        } else {
            if (filtro.getOpcaoRelatorio().equals("1")) {
                sb.append("SELECT aux4.numeroOS, ");
                sb.append("aux4.matriculaImovel, ");
                sb.append("aux4.tipoServico, ");
                sb.append("aux4.dataEncerramento, ");
                sb.append("aux4.naoCobrada, ");
                sb.append("aux4.valorConsumoFraudado, ");
                sb.append("aux4.valorMulta, ");
                sb.append("aux4.motivoEncerramento, ");
                sb.append("aux4.retornoFiscalizacao, ");
                sb.append("aux4.parecerEncerramento, ");
                sb.append("aux4.SITUACAO AS situacaoOS ");
                sb.append("FROM (");
                sb.append("SELECT ");
                sb.append("aux3.numeroOS, ");
                sb.append("aux3.matriculaImovel, ");
                sb.append("aux3.tipoServico, ");
                sb.append("aux3.dataEncerramento, ");
                sb.append("aux3.naoCobrada, ");
                sb.append("aux3.valorConsumoFraudado, ");
                sb.append("aux3.valorMulta, ");
                sb.append("aux3.motivoEncerramento, ");
                sb.append("aux3.retornoFiscalizacao, ");
                sb.append("aux3.parecerEncerramento, ");
                sb.append("min(aux3.situacaoOS) as SITUACAO ");
                sb.append("FROM (");
                sb.append(this.filtrarRelatorioOSSituacaoSelect(filtro, boletimGerado, false, null));
                sb.append(", 7 AS situacaoOS ");
                sb.append("FROM atendimentopublico.ordem_servico orse ");
                sb.append(this.filtrarRelatorioOSSituacaoBoletimNaoGerado());
                sb.append(
                        "INNER JOIN atendimentopublico.ordem_servico orseRef ON orseRef.orse_idreferencia = orse.orse_id ");
                sb.append(joins);
                String whereTratado = "";
                if (!where.trim().equals("")) {
                    sb.append("WHERE ");
                    whereTratado = where.trim();
                    whereTratado = whereTratado.replaceFirst("AND", "");
                    whereTratado += " ";
                }
                sb.append(whereTratado);

                sb.append(" UNION ALL ");

                sb.append(this.filtrarRelatorioOSSituacaoSelect(filtro, boletimGerado, false, null));
                sb.append(", 8 AS situacaoOS ");
                sb.append("FROM atendimentopublico.ordem_servico orse ");
                sb.append(this.filtrarRelatorioOSSituacaoBoletimNaoGerado());
                sb.append(joins);
                sb.append("WHERE orse.orse_cdsituacao = 2 AND orse.amen_id != 32 AND encmt.amen_icexecucao = 1 ");
                sb.append(where);

                sb.append(" UNION ALL ");

                sb.append(this.filtrarRelatorioOSSituacaoSelect(filtro, boletimGerado, false, null));
                sb.append(", 9 AS situacaoOS ");
                sb.append("FROM atendimentopublico.ordem_servico orse ");
                sb.append(this.filtrarRelatorioOSSituacaoBoletimNaoGerado());
                sb.append(joins);
                sb.append("WHERE orse.orse_cdsituacao = 1 ");
                sb.append(where);

                sb.append(" UNION ALL ");

                sb.append(this.filtrarRelatorioOSSituacaoSelect(filtro, boletimGerado, false, null));
                sb.append(", 10 AS situacaoOS ");
                sb.append("FROM atendimentopublico.ordem_servico orse ");
                sb.append(this.filtrarRelatorioOSSituacaoBoletimNaoGerado());
                sb.append(joins);
                sb.append("WHERE orse.orse_cdsituacao = 2 AND orse.amen_id = 32 ");
                sb.append(where);

                sb.append(") aux3 ");
                sb.append("GROUP BY 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ");
                sb.append("ORDER BY 1, 2 ");
                sb.append(") aux4 ORDER   BY 11, 1 ");

            } else if (filtro.getOpcaoRelatorio().equals("2")) {
                sb.append("SELECT ");
                if (filtro.getSituacaoOS().equals("8") || filtro.getSituacaoOS().equals("13")) {
                    sb.append("aux4.numeroOS, ");
                }
                sb.append("aux4.tipoServico, ");
                sb.append("aux4.motivoEncerramento, ");
                sb.append("aux4.retornoFiscalizacao, ");
                sb.append("aux4.SITUACAO AS situacaoOS, ");
                sb.append("aux4.quantidade AS quantidade ");
                sb.append("FROM (");
                sb.append("SELECT ");
                sb.append("aux3.numeroOS, ");
                sb.append("aux3.tipoServico, ");
                sb.append("aux3.motivoEncerramento, ");
                sb.append("aux3.retornoFiscalizacao, ");
                sb.append("min(aux3.situacaoOS) AS SITUACAO, ");
                sb.append("aux3.quantidade AS quantidade ");
                sb.append("FROM (");
                sb.append(this.filtrarRelatorioOSSituacaoSelect(filtro, boletimGerado, true, " 7 AS situacaoOS, "));
                sb.append("FROM atendimentopublico.ordem_servico orse ");
                sb.append(this.filtrarRelatorioOSSituacaoBoletimNaoGerado());
                sb.append(
                        "INNER JOIN atendimentopublico.ordem_servico orseRef ON orseRef.orse_idreferencia = orse.orse_id ");
                sb.append(joins);
                String whereTratado = "";
                if (!where.trim().equals("")) {
                    whereTratado = where.trim();
                    whereTratado = whereTratado.replaceFirst("AND", "");
                    sb.append("WHERE ");
                    whereTratado += " ";
                }
                sb.append(whereTratado);

                sb.append(" UNION ALL ");

                sb.append(this.filtrarRelatorioOSSituacaoSelect(filtro, boletimGerado, true, " 8 AS situacaoOS, "));
                sb.append("FROM atendimentopublico.ordem_servico orse ");
                sb.append(this.filtrarRelatorioOSSituacaoBoletimNaoGerado());
                sb.append(joins);
                sb.append("WHERE orse.orse_cdsituacao = 2 AND orse.amen_id != 32 AND encmt.amen_icexecucao = 1 ");
                sb.append(where);

                sb.append(" UNION ALL ");

                sb.append(this.filtrarRelatorioOSSituacaoSelect(filtro, boletimGerado, true, " 9 AS situacaoOS, "));
                sb.append("FROM atendimentopublico.ordem_servico orse ");
                sb.append(this.filtrarRelatorioOSSituacaoBoletimNaoGerado());
                sb.append(joins);
                sb.append("WHERE orse.orse_cdsituacao = 1 ");
                sb.append(where);

                sb.append(" UNION ALL ");

                sb.append(
                        this.filtrarRelatorioOSSituacaoSelect(filtro, boletimGerado, true, " 10 AS situacaoOS, "));
                sb.append("FROM atendimentopublico.ordem_servico orse ");
                sb.append(this.filtrarRelatorioOSSituacaoBoletimNaoGerado());
                sb.append(joins);
                sb.append("WHERE orse.orse_cdsituacao = 2 AND orse.amen_id = 32 ");
                sb.append(where);

                if (filtro.getSituacaoOS().equals("8") || filtro.getSituacaoOS().equals("13")) {
                    sb.append(") aux3 GROUP BY 1, 2, 3, 4, 6 ");
                    sb.append(") aux4 ORDER BY 5, 2, 3, 4, 1 ");
                } else {
                    sb.append(") aux3 GROUP BY 1, 2, 3 ");

                    sb.append(") aux4 ORDER BY 4, 1, 2, 3 ");
                }
            }
        }

        return sb.toString();
    }

    /**
     * [UC1177] Gerar Relatrio de Ordens de Servio por Situao
     * 
     * Mtodo auxiliar para a gerao do relatrio de ordem de servio
     * por situao.
     * 
     * @return String
     */
    private String filtrarRelatorioOSSituacaoDescontadas() {
        StringBuilder sb = new StringBuilder();
        sb.append("INNER JOIN cobranca.cobr_boletim_desc desco ON desco.orse_id = orse.orse_id ");
        sb.append("INNER JOIN cobranca.cobr_boletim_medicao medicao ON desco.cobm_id = medicao.cobm_id AND ");
        sb.append("medicao.cbgr_id = :cobrancaGrupoID AND medicao.cobm_amreferencia = :amReferencia ");
        sb.append("INNER JOIN cadastro.imovel imov ON orse.imov_id = imov.imov_id ");
        sb.append("LEFT OUTER JOIN atendimentopublico.servico_tipo svtp ON svtp.svtp_id = orse.svtp_id ");
        sb.append("LEFT OUTER JOIN atendimentopublico.atend_motivo_encmt encmt ON encmt.amen_id = orse.amen_id ");
        sb.append("LEFT OUTER JOIN atendimentopublico.fiscalizacao_situacao fzst ON fzst.fzst_id = orse.fzst_id ");

        return sb.toString();
    }

    /**
     * [UC1177] Gerar Relatrio de Ordens de Servio por Situao
     * 
     * Mtodo auxiliar para a gerao do relatrio de ordem de servio
     * por situao.
     * 
     * @return String
     */
    private String filtrarRelatorioOSSituacaoExecutadas() {
        StringBuilder sb = new StringBuilder();
        sb.append("INNER JOIN cobranca.cobr_boletim_exec execu ON execu.orse_id = orse.orse_id ");
        sb.append("INNER JOIN cobranca.cobr_boletim_medicao medicao ON execu.cobm_id = medicao.cobm_id AND ");
        sb.append("medicao.cbgr_id = :cobrancaGrupoID AND medicao.cobm_amreferencia = :amReferencia ");
        sb.append("INNER JOIN cadastro.imovel imov ON orse.imov_id = imov.imov_id ");
        sb.append("LEFT OUTER JOIN atendimentopublico.servico_tipo svtp ON svtp.svtp_id = orse.svtp_id ");
        sb.append("LEFT OUTER JOIN atendimentopublico.atend_motivo_encmt encmt ON encmt.amen_id = orse.amen_id ");
        sb.append("LEFT OUTER JOIN atendimentopublico.fiscalizacao_situacao fzst ON fzst.fzst_id = orse.fzst_id ");

        return sb.toString();
    }

    /**
     * [UC1177] Gerar Relatrio de Ordens de Servio por Situao
     * 
     * Mtodo auxiliar para a gerao do relatrio de ordem de servio
     * por situao.
     * 
     * @return String
     */
    private String filtrarRelatorioOSSituacaoJustificadas() {
        StringBuilder sb = new StringBuilder();
        sb.append(
                "INNER JOIN cobranca.cobranca_documento cbdo ON cbdo.cbdo_id = orse.cbdo_id AND orse.orse_cdsituacao = 2 ");
        sb.append("INNER JOIN cobranca.cobranca_acao_ativ_crg caac ON caac.caac_id = cbdo.caac_id ");
        sb.append("INNER JOIN cobranca.cobranca_acao_cronograma cbcr ON cbcr.cbcr_id = caac.cbcr_id ");
        sb.append(
                "INNER JOIN cobranca.cobranca_grupo_crg_mes cbcm ON cbcm.cbcm_id = cbcr.cbcm_id AND cbcm.cbgr_id = :cobrancaGrupoID ");
        sb.append("AND cbcm.cbcm_amreferencia = :amReferencia ");
        sb.append("INNER JOIN cadastro.imovel imov ON orse.imov_id = imov.imov_id ");
        sb.append("LEFT OUTER JOIN atendimentopublico.servico_tipo svtp ON svtp.svtp_id = orse.svtp_id ");
        sb.append(
                "INNER JOIN atendimentopublico.atend_motivo_encmt encmt ON encmt.amen_id = orse.amen_id AND encmt.amen_icexecucao = 2 ");
        sb.append("LEFT OUTER JOIN atendimentopublico.fiscalizacao_situacao fzst ON fzst.fzst_id = orse.fzst_id ");

        return sb.toString();
    }

    /**
     * [UC1177] Gerar Relatrio de Ordens de Servio por Situao
     * 
     * Mtodo auxiliar para a gerao do relatrio de ordem de servio
     * por situao.
     * 
     * @return String
     */
    private String filtrarRelatorioOSSituacaoBoletimNaoGerado() {
        StringBuilder sb = new StringBuilder();

        sb.append("INNER JOIN cobranca.cobranca_documento cbdo ON cbdo.cbdo_id = orse.cbdo_id ");
        sb.append("INNER JOIN cobranca.cobranca_acao_ativ_crg caac ON caac.caac_id = cbdo.caac_id ");
        sb.append("INNER JOIN cobranca.cobranca_acao_cronograma cbcr ON cbcr.cbcr_id = caac.cbcr_id ");
        sb.append(
                "INNER JOIN cobranca.cobranca_grupo_crg_mes cbcm ON cbcm.cbcm_id = cbcr.cbcm_id AND cbcm.cbgr_id = :cobrancaGrupoID ");
        sb.append("AND cbcm.cbcm_amreferencia = :amReferencia ");
        sb.append("INNER JOIN cadastro.imovel imov ON orse.imov_id = imov.imov_id ");
        sb.append("LEFT OUTER JOIN atendimentopublico.servico_tipo svtp ON svtp.svtp_id = orse.svtp_id ");
        sb.append("LEFT OUTER JOIN atendimentopublico.atend_motivo_encmt encmt ON encmt.amen_id = orse.amen_id ");
        sb.append("LEFT OUTER JOIN atendimentopublico.fiscalizacao_situacao fzst ON fzst.fzst_id = orse.fzst_id ");

        return sb.toString();
    }

    /**
     * [UC1177] Gerar Relatrio de Ordens de Servio por Situao
     * 
     * Mtodo auxiliar para a gerao do relatrio de ordem de servio
     * por situao.
     * 
     * @return String
     */
    private String filtrarRelatorioOSSituacaoPenalizadaFiscalizacao() {
        StringBuilder sb = new StringBuilder();
        sb.append(
                "INNER JOIN cobranca.cob_ac_os_nao_aceitas naoAc ON naoAc.orse_id = orse.orse_id AND naoAc.caon_icaceita = 2 ");
        sb.append("INNER JOIN cobranca.cobr_boletim_desc desco ON desco.orse_id = naoAc.orse_id ");
        sb.append("INNER JOIN cobranca.cobr_boletim_medicao medicao ON desco.cobm_id = medicao.cobm_id AND ");
        sb.append("medicao.cbgr_id = :cobrancaGrupoID AND medicao.cobm_amreferencia = :amReferencia ");
        sb.append("INNER JOIN cadastro.imovel imov ON orse.imov_id = imov.imov_id ");
        sb.append("LEFT OUTER JOIN atendimentopublico.servico_tipo svtp ON svtp.svtp_id = orse.svtp_id ");
        sb.append("LEFT OUTER JOIN atendimentopublico.atend_motivo_encmt encmt ON encmt.amen_id = orse.amen_id ");
        sb.append("LEFT OUTER JOIN atendimentopublico.fiscalizacao_situacao fzst ON fzst.fzst_id = orse.fzst_id ");

        return sb.toString();
    }

    /**
     * [UC1177] Gerar Relatrio de Ordens de Servio por Situao
     * 
     * Mtodo auxiliar para a gerao do relatrio de ordem de servio
     * por situao.
     * 
     * @return String
     */
    private String filtrarRelatorioOSSituacaoPenalizadaDecursoPrazo() {
        StringBuilder sb = new StringBuilder();
        sb.append("INNER JOIN cobranca.cobr_boletim_desc desco ON desco.orse_id = orse.orse_id ");
        sb.append("AND desco.orse_id NOT IN (SELECT orse_id FROM cobranca.cob_ac_os_nao_aceitas naoAc) ");
        sb.append("INNER JOIN cobranca.cobr_boletim_medicao medicao ON desco.cobm_id = medicao.cobm_id AND ");
        sb.append("medicao.cbgr_id = :cobrancaGrupoID AND medicao.cobm_amreferencia = :amReferencia ");
        sb.append("INNER JOIN cadastro.imovel imov ON orse.imov_id = imov.imov_id ");
        sb.append("LEFT OUTER JOIN atendimentopublico.servico_tipo svtp ON svtp.svtp_id = orse.svtp_id ");
        sb.append("LEFT OUTER JOIN atendimentopublico.atend_motivo_encmt encmt ON encmt.amen_id = orse.amen_id ");
        sb.append("LEFT OUTER JOIN atendimentopublico.fiscalizacao_situacao fzst ON fzst.fzst_id = orse.fzst_id ");

        return sb.toString();
    }

    /**
     * [UC1177] Gerar Relatrio de Ordens de Servio por Situao
     * 
     * Mtodo auxiliar para a gerao do relatrio de ordem de servio
     * por situao.
     * 
     * @param filtro
     * @param boletimGerado
     * @return String
     */
    private String filtrarRelatorioOSSituacaoFiscalizadas(FiltrarRelatorioOSSituacaoHelper filtro,
            boolean boletimGerado, String joins, String where) {
        StringBuilder sb = new StringBuilder();
        StringBuilder join = new StringBuilder();
        String whereTratado = "";

        sb.append(
                "INNER JOIN atendimentopublico.ordem_servico orseRef ON orseRef.orse_idreferencia = orse.orse_id ");
        sb.append("LEFT OUTER JOIN cobranca.cobr_boletim_exec execu ON execu.orse_id = orse.orse_id ");
        sb.append("INNER JOIN cobranca.cobr_boletim_medicao medicao ON execu.cobm_id = medicao.cobm_id AND ");
        sb.append("medicao.cbgr_id = :cobrancaGrupoID AND medicao.cobm_amreferencia = :amReferencia ");
        sb.append("INNER JOIN cadastro.imovel imov ON orse.imov_id = imov.imov_id ");
        sb.append("LEFT OUTER JOIN atendimentopublico.servico_tipo svtp ON svtp.svtp_id = orse.svtp_id ");
        sb.append("LEFT OUTER JOIN atendimentopublico.atend_motivo_encmt encmt ON encmt.amen_id = orse.amen_id ");
        sb.append("LEFT OUTER JOIN atendimentopublico.fiscalizacao_situacao fzst ON fzst.fzst_id = orse.fzst_id ");
        sb.append(joins);
        if (!where.trim().equals("")) {
            sb.append("WHERE ");
            whereTratado = where.replaceFirst("AND", "");
            sb.append(whereTratado);
        }
        sb.append("UNION ");
        join.append(this.filtrarRelatorioOSSituacaoSelect(filtro, boletimGerado, true, null));
        join.append("FROM atendimentopublico.ordem_servico orse ");
        join.append(
                "INNER JOIN atendimentopublico.ordem_servico orseRef ON orseRef.orse_idreferencia = orse.orse_id ");
        join.append("LEFT OUTER JOIN cobranca.cobr_boletim_desc desco ON desco.orse_id = orse.orse_id ");
        join.append("INNER JOIN cobranca.cobr_boletim_medicao medicao ON desco.cobm_id = medicao.cobm_id AND ");
        join.append("medicao.cbgr_id = :cobrancaGrupoID AND medicao.cobm_amreferencia = :amReferencia ");
        join.append("INNER JOIN cadastro.imovel imov ON orse.imov_id = imov.imov_id ");
        join.append("LEFT OUTER JOIN atendimentopublico.servico_tipo svtp ON svtp.svtp_id = orse.svtp_id ");
        join.append("LEFT OUTER JOIN atendimentopublico.atend_motivo_encmt encmt ON encmt.amen_id = orse.amen_id ");
        join.append(
                "LEFT OUTER JOIN atendimentopublico.fiscalizacao_situacao fzst ON fzst.fzst_id = orse.fzst_id ");
        join.append(joins);
        if (!where.trim().equals("")) {
            join.append("WHERE ");
            whereTratado = where.replaceFirst("AND", "");
            join.append(whereTratado);
        }
        sb.append(join.toString());
        return sb.toString();
    }

    /**
     * [UC1178] Gerar Relatrio de Acompanhamento dos Boletins de Medio
     * 
     * O segundo parmetro (relatorioDefinitivo)  um booleano que
     * indica se o relatrio  definitivo ou no, pois o resultado
     * da query  diferente para os relatrios definitivos e os
     * no-definitivos
     * 
     * @author Diogo Peixoto
     * @date 26/07/2011
     * 
     * @param FiltrarRelatorioAcompanhamentoBoletimMedicaoHelper
     * @param relatorioDefinitivo
     * @return Collection<Object[]>
     * @throws ErroRepositorioException
     */
    public Collection<Object[]> filtrarRelatorioAcompanhamentoBoletimMedicao(
            FiltrarRelatorioAcompanhamentoBoletimMedicaoHelper filtro, boolean relatorioDefinitivo)
            throws ErroRepositorioException {

        Collection<Object[]> relatorios = new ArrayList<Object[]>();
        Session session = HibernateUtil.getSession();
        StringBuilder sb = new StringBuilder();

        try {
            sb.append("SELECT itensServico.idItemServico, ");//0 - ID Item Servio
            sb.append("itensServico.descricaoServico, ");//1 - Descrio Item Servio
            sb.append("itensServico.quantidadeOrcada, ");//2 - Quantidade Orada
            sb.append("itensServico.valorUnitario, ");//3 - Valor Unitrio
            sb.append("sum(itensServico.quantidade) as quantidadeItem, ");//4 - Quantidade do Item
            sb.append("(itensServico.valorUnitario * sum(itensServico.quantidade)) as valorItem, ");//5 - Valor Item
            sb.append("itensServico.unidadeItem, ");//6 - Unidade do Item
            sb.append("itensServico.valorOrcado, ");//7 - Valor Orcado
            sb.append("sum(itensServico.valorMedidoPeriodo) AS valorMedidoPeriodo ");//8 - Valor medido no perodo
            sb.append("FROM (SELECT ");
            sb.append("itse.itse_id AS idItemServico, ");
            sb.append("itse.itse_dsitemservico AS descricaoServico, ");
            sb.append("itsc.itsc_qtorcadaitemservico AS quantidadeOrcada, ");
            sb.append("1 AS quantidade, ");
            sb.append("itsc.itsc_vlitemservcontr AS valorUnitario, ");
            sb.append("(CASE WHEN itse.itse_cdconstantecalculo IN (3, 7, 9, 11, 13, 4, 8, 10, 12, 14) THEN 'UND' ");
            sb.append("WHEN itse.itse_cdconstantecalculo IN (15, 16, 17) THEN 'M2' ");
            sb.append("ELSE '' END) AS unidadeItem, ");
            sb.append("itsc.itsc_vlorcadoitemservico AS valorOrcado, ");
            sb.append("cbex.cbex_vlservico AS valorMedidoPeriodo ");
            sb.append("FROM cobranca.cobr_boletim_exec cbex ");
            sb.append(
                    "INNER JOIN cobranca.cobr_boletim_medicao cobm ON (cbex.cobm_id = cobm.cobm_id AND cobm.cobm_amreferencia = :amReferencia) ");
            sb.append(
                    "INNER JOIN micromedicao.contrato_empresa_servico cese ON (cobm.cese_id = cese.cese_id AND cese.cese_id = :idContrato) ");
            sb.append("INNER JOIN atendimentopublico.ordem_servico orse ON (cbex.orse_id = orse.orse_id) ");
            sb.append(
                    "INNER JOIN micromedicao.item_servico_contrato itsc ON (cese.cese_id = itsc.cese_id AND orse.svtp_id = itsc.svtp_id) ");
            sb.append("INNER JOIN micromedicao.item_servico itse ON (itsc.itse_id = itse.itse_id) ");
            sb.append(
                    "LEFT OUTER JOIN atendimentopublico.ordem_servico_boletim orbo ON (cbex.orse_id = orbo.orse_id) ");
            sb.append("WHERE (itse.itse_cdconstantecalculo IN (2,6) AND orbo.orbo_icpavimento = 3) ");
            sb.append("OR (itse.itse_cdconstantecalculo IN (3,7,9,11,13) AND orbo.orbo_icpavimento = 2) ");
            sb.append("OR (itse.itse_cdconstantecalculo IN (4,8,10,12,14) AND orbo.orbo_icpavimento = 1) ");
            sb.append("OR (itse.itse_cdconstantecalculo IN (1,5) OR itse.itse_cdconstantecalculo > 14) ");
            sb.append("ORDER BY idItemServico) itensServico ");
            sb.append(
                    "GROUP BY idItemServico, descricaoServico, quantidadeOrcada, valorUnitario, unidadeItem, valorOrcado ");
            sb.append("ORDER BY idItemServico ");

            SQLQuery sqlQuery = session.createSQLQuery(sb.toString());

            sqlQuery = sqlQuery.addScalar("idItemServico", Hibernate.INTEGER)
                    .addScalar("descricaoServico", Hibernate.STRING)
                    .addScalar("quantidadeOrcada", Hibernate.BIG_DECIMAL)
                    .addScalar("valorUnitario", Hibernate.BIG_DECIMAL)
                    .addScalar("quantidadeItem", Hibernate.INTEGER).addScalar("valorItem", Hibernate.BIG_DECIMAL)
                    .addScalar("unidadeItem", Hibernate.STRING).addScalar("valorOrcado", Hibernate.BIG_DECIMAL)
                    .addScalar("valorMedidoPeriodo", Hibernate.BIG_DECIMAL);

            sqlQuery.setInteger("idContrato", filtro.getIdContratoEmpresaServico());
            sqlQuery.setInteger("amReferencia", filtro.getMesAnoReferencia());

            relatorios = sqlQuery.list();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
        return relatorios;
    }

    /**
     * [UC1178] Gerar Relatrio de Acompanhamento dos Boletins de Medio
     * 
     * Mtodo que vai retornar as quantidades acumuladas e os valores acumulados
     * no perodo para gerao do relatrio de acompanhamento do boletim de medio.
     * 
     * @author Diogo Peixoto
     * @date 01/08/2011
     * 
     * @param FiltrarRelatorioAcompanhamentoBoletimMedicaoHelper
     * @param relatorioDefinitivo
     * @return Collection<Object[]>
     * @throws ErroRepositorioException
     */
    public Collection<Object[]> filtrarRelatorioAcompanhamentoBoletimMedicaoAcumuladas(
            FiltrarRelatorioAcompanhamentoBoletimMedicaoHelper filtro) throws ErroRepositorioException {

        Collection<Object[]> relatorios = new ArrayList<Object[]>();
        Session session = HibernateUtil.getSession();
        StringBuilder sb = new StringBuilder();

        try {
            sb.append("SELECT itensServico.idItemServico, ");//0 - ID Item Servio
            sb.append("itensServico.descricaoServico, ");//1 - Descrio Item Servio
            sb.append("sum(itensServico.quantidade) as quantidadeAcumuladaPeriodo, ");//2 - Quantidade Acumulada Perodo
            sb.append("sum(itensServico.valorMedidoPeriodo) AS valorAcumuladoPeriodo ");//3 - Valor Acumulado Perodo
            sb.append("FROM (SELECT ");
            sb.append("itse.itse_id AS idItemServico, ");
            sb.append("itse.itse_dsitemservico AS descricaoServico, ");
            sb.append("1 AS quantidade, ");
            sb.append("cbex.cbex_vlservico AS valorMedidoPeriodo ");
            sb.append("FROM cobranca.cobr_boletim_exec cbex ");
            sb.append("INNER JOIN cobranca.cobr_boletim_medicao cobm ON (cbex.cobm_id = cobm.cobm_id) ");
            sb.append(
                    "INNER JOIN micromedicao.contrato_empresa_servico cese ON (cobm.cese_id = cese.cese_id AND cese.cese_id = :idContrato) ");
            sb.append("INNER JOIN atendimentopublico.ordem_servico orse ON (cbex.orse_id = orse.orse_id) ");
            sb.append(
                    "INNER JOIN micromedicao.item_servico_contrato itsc ON (cese.cese_id = itsc.cese_id AND orse.svtp_id = itsc.svtp_id) ");
            sb.append("INNER JOIN micromedicao.item_servico itse ON (itsc.itse_id = itse.itse_id) ");
            sb.append(
                    "LEFT OUTER JOIN atendimentopublico.ordem_servico_boletim orbo ON (cbex.orse_id = orbo.orse_id) ");
            sb.append("WHERE (itse.itse_cdconstantecalculo IN (2,6) AND orbo.orbo_icpavimento = 3) ");
            sb.append("OR (itse.itse_cdconstantecalculo IN (3,7,9,11,13) AND orbo.orbo_icpavimento = 2) ");
            sb.append("OR (itse.itse_cdconstantecalculo IN (4,8,10,12,14) AND orbo.orbo_icpavimento = 1) ");
            sb.append("OR (itse.itse_cdconstantecalculo IN (1,5) OR itse.itse_cdconstantecalculo > 14) ");
            sb.append("ORDER BY idItemServico) itensServico ");
            sb.append("GROUP BY idItemServico, descricaoServico ");
            sb.append("ORDER BY idItemServico ");

            SQLQuery sqlQuery = session.createSQLQuery(sb.toString());

            sqlQuery = sqlQuery.addScalar("idItemServico", Hibernate.INTEGER)
                    .addScalar("descricaoServico", Hibernate.STRING)
                    .addScalar("quantidadeAcumuladaPeriodo", Hibernate.INTEGER)
                    .addScalar("valorAcumuladoPeriodo", Hibernate.BIG_DECIMAL);

            sqlQuery.setInteger("idContrato", filtro.getIdContratoEmpresaServico());

            relatorios = sqlQuery.list();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
        return relatorios;
    }

    /**
     * [UC1178] Gerar Relatrio de Acompanhamento dos Boletins de Medio
     * 
     * @author Diogo Peixoto
     * @date 01/08/2011
     * 
     * @param FiltrarRelatorioAcompanhamentoBoletimMedicaoHelper
     *
     * @return Collection<BigDecimal>
     * @throws ErroRepositorioException
     */
    public Collection<BigDecimal> filtrarRelatorioAcompanhamentoBoletimMedicaoPenalidades(
            FiltrarRelatorioAcompanhamentoBoletimMedicaoHelper filtro, boolean relatorioDefinitivo)
            throws ErroRepositorioException {
        Collection<BigDecimal> relatorios = null;
        try {
            relatorios = this.filtrarRelatorioAcompanhamentoBoletimMedicaoPenalidadesOSFiscalizacao(filtro);
            if (relatorioDefinitivo) {
                relatorios.addAll(this
                        .filtrarRelatorioAcompanhamentoBoletimMedicaoPenalidadesCorteSupressaoNaoRealizacaoServico(
                                filtro));
            }
        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        }
        return relatorios;
    }

    /*
     * [UC1178] Gerar Relatrio de Acompanhamento dos Boletins de Medio
     *
     * Mtodo auxiliar que vai retornar as penalidades de ordem de servio
     * e as penalidades de fiscalizao.
     * 
     * @author Diogo Peixoto
     * @date 01/08/2011
     * 
     * @param FiltrarRelatorioAcompanhamentoBoletimMedicaoHelper
     *
     * @return Collection<BigDecimal>
     * @throws ErroRepositorioException
     */
    private Collection<BigDecimal> filtrarRelatorioAcompanhamentoBoletimMedicaoPenalidadesOSFiscalizacao(
            FiltrarRelatorioAcompanhamentoBoletimMedicaoHelper filtro) throws ErroRepositorioException {

        Collection<Object[]> relatorios = new ArrayList<Object[]>();
        Collection<BigDecimal> retorno = new ArrayList<BigDecimal>();
        Session session = HibernateUtil.getSession();
        StringBuilder sb = new StringBuilder();

        try {
            sb.append("SELECT ");
            sb.append("SUM((SELECT cbde.cbde_vldesconto ");
            sb.append("FROM atendimentopublico.ordem_servico orse ");
            sb.append("WHERE orse.orse_id = cbde.orse_id AND orse.amen_id = 32)) AS penalidadeOS, ");//0 - Penalidade OS

            sb.append("SUM((SELECT cbde.cbde_vldesconto ");
            sb.append("FROM atendimentopublico.ordem_servico orse ");
            sb.append("WHERE orse.orse_id = cbde.orse_id AND orse.amen_id != 32)) AS penalidadeFiscalizacao ");//0 - Penalidade Fiscalizao

            sb.append("FROM cobranca.COBR_BOLETIM_DESC cbde ");
            sb.append(
                    "INNER JOIN cobranca.cobr_boletim_medicao cobm on (cbde.cobm_id = cobm.cobm_id and cobm.cobm_amreferencia = :amReferencia) ");
            sb.append(
                    "INNER JOIN micromedicao.CONTRATO_EMPRESA_SERVICO cese on (cobm.cese_id = cese.cese_id and cese.cese_id = :idContrato) ");

            SQLQuery sqlQuery = session.createSQLQuery(sb.toString());

            sqlQuery = sqlQuery.addScalar("penalidadeOS", Hibernate.BIG_DECIMAL).addScalar("penalidadeFiscalizacao",
                    Hibernate.BIG_DECIMAL);

            sqlQuery.setInteger("idContrato", filtro.getIdContratoEmpresaServico());
            sqlQuery.setInteger("amReferencia", filtro.getMesAnoReferencia());

            relatorios = sqlQuery.list();

            Object[] penalidades = relatorios.iterator().next();
            BigDecimal penalidadeOS = new BigDecimal("0.00");
            if (penalidades[0] != null) {
                penalidadeOS = (BigDecimal) penalidades[0];
            }
            BigDecimal penalidadeFiscalizacao = new BigDecimal("0.00");
            if (penalidades[1] != null) {
                penalidadeFiscalizacao = (BigDecimal) penalidades[1];
            }
            retorno.add(penalidadeOS);
            retorno.add(penalidadeFiscalizacao);
        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
        return retorno;
    }

    /*
     * [UC1178] Gerar Relatrio de Acompanhamento dos Boletins de Medio
     *
     * Mtodo auxiliar que vai retornar as penalidades de ordem de servio
     * e as penalidades de fiscalizao.
     * 
     * @author Diogo Peixoto
     * @date 01/08/2011
     * 
     * @param FiltrarRelatorioAcompanhamentoBoletimMedicaoHelper
     *
     * @return Collection<BigDecimal>
     * @throws ErroRepositorioException
     */
    private Collection<BigDecimal> filtrarRelatorioAcompanhamentoBoletimMedicaoPenalidadesCorteSupressaoNaoRealizacaoServico(
            FiltrarRelatorioAcompanhamentoBoletimMedicaoHelper filtro) throws ErroRepositorioException {

        Collection<Object[]> relatorios = new ArrayList<Object[]>();
        Collection<BigDecimal> retorno = new ArrayList<BigDecimal>();
        Session session = HibernateUtil.getSession();
        StringBuilder sb = new StringBuilder();

        try {
            sb.append("SELECT ");
            sb.append("SUM((SELECT (cbex.cbex_vlservico) * 2 ");
            sb.append("FROM cobranca.motivo_nao_aceit_enc_os mnac ");
            sb.append(
                    "WHERE caon.mnac_id = mnac.mnac_id and mnac.mnac_nnmultdesccortesupindev IS NOT NULL)) AS penalidadeCorteSupressao, ");
            sb.append("SUM((SELECT (cbex.cbex_vlservico) * 2 ");
            sb.append("FROM cobranca.motivo_nao_aceit_enc_os mnac ");
            sb.append(
                    "WHERE caon.mnac_id = mnac.mnac_id and mnac.mnac_nnmultdescservnaoexec IS NOT NULL)) AS penalidadeNaoRealizacaoServico ");
            sb.append("FROM cobranca.cobr_boletim_exec cbex ");
            sb.append(
                    "INNER JOIN cobranca.cobr_boletim_medicao cobm on (cbex.cobm_id = cobm.cobm_id and cobm.cobm_amreferencia = :amReferencia) ");
            sb.append(
                    "INNER JOIN micromedicao.contrato_empresa_servico cese on (cobm.cese_id = cese.cese_id and cese.cese_id = :idContrato) ");
            sb.append("INNER JOIN cobranca.cob_ac_os_nao_aceitas caon on (cbex.orse_id = caon.orse_id) ");

            SQLQuery sqlQuery = session.createSQLQuery(sb.toString());

            sqlQuery = sqlQuery.addScalar("penalidadeCorteSupressao", Hibernate.BIG_DECIMAL)
                    .addScalar("penalidadeNaoRealizacaoServico", Hibernate.BIG_DECIMAL);

            sqlQuery.setInteger("idContrato", filtro.getIdContratoEmpresaServico());
            sqlQuery.setInteger("amReferencia", filtro.getMesAnoReferencia());

            relatorios = sqlQuery.list();

            Object[] penalidades = relatorios.iterator().next();
            BigDecimal penalidadeCorteSupressao = new BigDecimal("0.00");
            if (penalidades[0] != null) {
                penalidadeCorteSupressao = (BigDecimal) penalidades[0];
            }
            BigDecimal penalidadeNaoRealizacaoServicos = new BigDecimal("0.00");
            if (penalidades[1] != null) {
                penalidadeNaoRealizacaoServicos = (BigDecimal) penalidades[1];
            }
            retorno.add(penalidadeCorteSupressao);
            retorno.add(penalidadeNaoRealizacaoServicos);

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
        return retorno;
    }

    /**
     * [UC1178] Gerar Relatrio de Acompanhamento dos Boletins de Medio
     * 
     * @author Diogo Peixoto
     * @date 28/07/2011
     * 
     * @param FiltrarRelatorioAcompanhamentoBoletimMedicaoHelper
     * @param relatorioDefinitivo
     * @return Quantidade de OS Executadas para determinado boletim de medio
     * @throws ErroRepositorioException
     */
    public Integer pesquisarQuantidadeOSExecutadas(FiltrarRelatorioAcompanhamentoBoletimMedicaoHelper filtro)
            throws ErroRepositorioException {

        Session session = HibernateUtil.getSession();
        StringBuilder sb = new StringBuilder();
        Integer qtdeOSExecutadas = 0;

        try {
            sb.append("SELECT COUNT(execu.orse_id) AS quantidade ");
            sb.append("FROM cobranca.cobr_boletim_exec execu ");
            sb.append(
                    "INNER JOIN cobranca.cobr_boletim_medicao med ON execu.cobm_id = med.cobm_id AND med.cobm_amreferencia = :amReferencia ");
            sb.append("AND med.cese_id = :idContrato ");

            String consulta = sb.toString();
            SQLQuery sqlQuery = session.createSQLQuery(consulta);
            sqlQuery = sqlQuery.addScalar("quantidade", Hibernate.INTEGER);

            sqlQuery.setInteger("idContrato", filtro.getIdContratoEmpresaServico());
            sqlQuery.setInteger("amReferencia", filtro.getMesAnoReferencia());

            qtdeOSExecutadas = (Integer) sqlQuery.uniqueResult();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
        return qtdeOSExecutadas;
    }

    /**
     * [UC1178] Gerar Relatrio de Acompanhamento dos Boletins de Medio
     * 
     * @author Diogo Peixoto
     * @date 28/07/2011
     * 
     * @param FiltrarRelatorioAcompanhamentoBoletimMedicaoHelper
     * @param relatorioDefinitivo
     * @return Quantidade de OS Penalizadas para determinado boletim de medio
     * @throws ErroRepositorioException
     */
    public Integer pesquisarQuantidadeOSPenalizadas(FiltrarRelatorioAcompanhamentoBoletimMedicaoHelper filtro)
            throws ErroRepositorioException {

        Session session = HibernateUtil.getSession();
        StringBuilder sb = new StringBuilder();
        Integer qtdeOSPenalizadas = 0;

        try {
            sb.append("SELECT COUNT(desco.orse_id) AS quantidade ");
            sb.append("FROM cobranca.cobr_boletim_desc desco ");
            sb.append(
                    "INNER JOIN cobranca.cobr_boletim_medicao med ON med.cobm_id = desco.cobm_id AND med.cobm_amreferencia = :amReferencia ");
            sb.append("AND med.cese_id = :idContrato ");

            String consulta = sb.toString();
            SQLQuery sqlQuery = session.createSQLQuery(consulta);
            sqlQuery = sqlQuery.addScalar("quantidade", Hibernate.INTEGER);

            sqlQuery.setInteger("idContrato", filtro.getIdContratoEmpresaServico());
            sqlQuery.setInteger("amReferencia", filtro.getMesAnoReferencia());

            qtdeOSPenalizadas = (Integer) sqlQuery.uniqueResult();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
        return qtdeOSPenalizadas;
    }

    /**
     * [UC1178] Gerar Relatrio de Acompanhamento dos Boletins de Medio
     * 
     * @author Diogo Peixoto
     * @date 01/08/2011
     * 
     * @param FiltrarRelatorioAcompanhamentoBoletimMedicaoHelper
     * @return Taxa de Sucesso do Boletim de Medio
     * 
     * @throws ErroRepositorioException
     */
    public BigDecimal pesquisarTaxaSucessoBoletimMedicao(FiltrarRelatorioAcompanhamentoBoletimMedicaoHelper filtro)
            throws ErroRepositorioException {

        Session session = HibernateUtil.getSession();
        StringBuilder sb = new StringBuilder();
        BigDecimal taxaSucesso = new BigDecimal("0.00");

        try {
            sb.append("SELECT sum(cbsu.CBSU_VLTXSUCESSO) AS taxaSucesso ");
            sb.append("FROM cobranca.COBR_BOLETIM_SUCESSO cbsu ");
            sb.append(
                    "INNER JOIN cobranca.cobr_boletim_medicao cobm on (cbsu.cobm_id = cobm.cobm_id and cobm.cobm_amreferencia = :amReferencia) ");
            sb.append(
                    "INNER JOIN micromedicao.contrato_empresa_servico cese on (cobm.cese_id = cese.cese_id and cese.cese_id = :idContrato) ");

            String consulta = sb.toString();
            SQLQuery sqlQuery = session.createSQLQuery(consulta);
            sqlQuery = sqlQuery.addScalar("taxaSucesso", Hibernate.BIG_DECIMAL);

            sqlQuery.setInteger("amReferencia", filtro.getMesAnoReferencia());
            sqlQuery.setInteger("idContrato", filtro.getIdContratoEmpresaServico());

            taxaSucesso = (BigDecimal) sqlQuery.uniqueResult();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
        return taxaSucesso;
    }

    public boolean gruposIniciaodsJaForamEncerrados(FiltrarRelatorioAcompanhamentoBoletimMedicaoHelper filtro)
            throws ErroRepositorioException {

        Session sessao = HibernateUtil.getSession();

        boolean encerrado = true;
        StringBuilder sb = new StringBuilder();
        sb.append("SELECT acao.caac_tmrealizacao AS dataRealizacao ");
        sb.append("FROM cobranca.cobranca_acao_ativ_crg acao ");
        sb.append("INNER JOIN cobranca.cobranca_acao_cronograma cron ON cron.cbcr_id = acao.cbcr_id ");
        sb.append(
                "INNER JOIN cobranca.cobranca_grupo_crg_mes mes ON mes.cbcm_id = cron.cbcm_id AND mes.cbcm_amreferencia = :amReferencia ");
        sb.append("INNER JOIN cobranca.cobranca_grupo grupo ON grupo.cbgr_id = mes.cbgr_id ");
        sb.append(
                "INNER JOIN micromedicao.contrato_empresa_servico cont ON cont.cese_id = grupo.cese_id AND grupo.cese_id = :numeroContrato");

        SQLQuery query = sessao.createSQLQuery(sb.toString());
        query.setInteger("amReferencia", filtro.getMesAnoReferencia());
        query.setInteger("numeroContrato", filtro.getIdContratoEmpresaServico());
        query.addScalar("dataRealizacao", Hibernate.DATE);

        List<Date> retorno = (List<Date>) query.list();

        /*Verifica se existe alguma data igual a NULL, se existe  porque os grupos iniciados
         * no foram executados.
         */
        for (Date date : retorno) {
            if (date == null) {
                encerrado = false;
                break;
            }
        }
        return encerrado;
    }

    /**
     * [UC1186] Gerar Relatrio Ordem de Servio Cobrana p/Resultado
     * 
     * Pesquisar as Ordens de servios a partir de seu imvel e tipo de servio
     * 
     * @author Hugo Azevedo
     * @data 02/07/2011
     */

    public Collection obterOSImovelTipoServico(Integer id, Integer tipoServico) throws ErroRepositorioException {

        Session session = HibernateUtil.getSession();
        Collection<OrdemServico> retorno = new ArrayList();

        try {

            Criteria crit = session.createCriteria(OrdemServico.class);
            crit.setFetchMode("imovel", FetchMode.JOIN);
            crit.setFetchMode("servicoTipo", FetchMode.JOIN);
            crit.setFetchMode("atendimentoMotivoEncerramento", FetchMode.JOIN);
            crit.add(Restrictions.eq("imovel.id", id));
            if (tipoServico != null && tipoServico.intValue() != -1) {
                crit.add(Restrictions.eq("servicoTipo.id", tipoServico.intValue()));
            }
            retorno = (Collection<OrdemServico>) crit.list();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
        return retorno;
    }

    /**
     * 
     * [UC1186] Gerar Relatrio Ordem de Servio Cobrana p/Resultado
     * 
      * Obtm a quantida de OS a partir dos parmetros passados pela funcionalidade de Acompanhamento de Cobrana por Resultado.
      * 
      * @author Hugo Azevedo
      * @date 27/06/2011
      * 
      * @throws ErroRepositorioException
      */

    public Collection obterTotalOSColecaoImovelTipoServico(Collection colecaoImovel, Integer tipoServico)
            throws ErroRepositorioException {

        Session sessao = HibernateUtil.getSession();
        String consulta = "";
        Collection retorno = null;

        consulta = "select count(os.id) " + "from OrdemServico os " + "inner join os.imovel imo "
                + "inner join os.servicoTipo st " + "where imo.id in ( :colecaoImovel ) ";
        if (tipoServico != null && tipoServico.intValue() != -1)
            consulta += "and st.id = :tipoServico";

        try {
            Query query = sessao.createQuery(consulta);
            query.setParameterList("colecaoImovel", colecaoImovel);
            if (tipoServico != null && tipoServico.intValue() != -1)
                query.setInteger("tipoServico", tipoServico);
            retorno = query.list();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(sessao);
        }

        return retorno;

    }

    /**
     * [UC1189] Inserir Registro de Atendimento Loja Virtual
     * 
     * @author Magno Gouveia
     * @date 12/07/2011
     * 
     * @return
     * @throws ErroRepositorioException
     */
    public Collection<Object[]> pesquisarSolicitacaoTipoLojaVirtual() throws ErroRepositorioException {

        Session sessao = HibernateUtil.getSession();
        Collection<Object[]> retorno = null;

        String consulta = "SELECT "
                + " DISTINCT(sotp.sotp_id) AS idSolicitacao, sotp.sotp_dssolicitacaotipo AS descricao "
                + " FROM atendimentopublico.solicitacao_tipo sotp "
                + " INNER JOIN atendimentopublico.solicitacao_tipo_espec step ON step.sotp_id = sotp.sotp_id "
                + " WHERE step.step_icuso = 1 " + "    AND step.step_iclojavirtual = 1 "
                + " ORDER BY sotp.sotp_dssolicitacaotipo";

        try {
            retorno = sessao.createSQLQuery(consulta).addScalar("idSolicitacao", Hibernate.SHORT)
                    .addScalar("descricao", Hibernate.STRING).list();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(sessao);
        }

        return retorno;

    }

    /**
     * [UC1196] Exibir Lojas de Atendimento na Loja Virtual
     * [SB0001] Selecionar Municpios da Regio
     * 
     * @author Magno Gouveia
     * @date 14/07/2011
     * 
     * @return colecaoDeMunicipios
     * @throws ErroRepositorioException
     */
    public Collection<Object[]> pesquisarMunicipiosLojaVirtualCompesa() throws ErroRepositorioException {

        Session sessao = HibernateUtil.getSession();

        Collection<Object[]> retorno = null;

        String consulta = "SELECT DISTINCT " + " m.mreg_id          AS microrregiao, "
                + " m.muni_id          AS idMunicipio, " + " m.muni_nmmunicipio AS municipio "
                + "   FROM cadastro.municipio m " + "   INNER JOIN cadastro.bairro b ON b.muni_id = m.muni_id "
                + "   INNER JOIN cadastro.loja_atendimento la ON la.bair_id = b.bair_id "
                + "   WHERE m.muni_icuso = 1 " + " ORDER BY m.muni_nmmunicipio";

        try {
            retorno = sessao.createSQLQuery(consulta).addScalar("microrregiao", Hibernate.INTEGER)
                    .addScalar("idMunicipio", Hibernate.INTEGER).addScalar("municipio", Hibernate.STRING).list();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(sessao);
        }

        return retorno;
    }

    /**
     * [UC1196] Exibir Lojas de Atendimento na Loja Virtual
     * [SB0002] Exibir Dados da Loja
     * 
     * @author Magno Gouveia
     * @date 14/07/2011
     * 
     * @param id do municpio
     * @return colecaoDeLojasDeAtendimento
     * @throws ErroRepositorioException
     */
    public Collection<Object[]> pesquisarLojasDeAtendimentoLojaVirtualCompesa(Integer idMunicipio)
            throws ErroRepositorioException {

        Session sessao = HibernateUtil.getSession();

        Collection<Object[]> retorno = null;

        String consulta = "SELECT la.loja_nmloja          AS nomeLoja, "
                + " l.logr_nmlogradouro         AS logradouro, " + " la.loja_nnimovel            AS numero, "
                + " m.muni_nmmunicipio          AS municipio, " + " b.bair_nmbairro             AS bairro, "
                + " la.loja_dspontorefencia     AS pontoReferencia, " + " la.loja_cdddd                 AS ddd, "
                + " la.loja_nnfone                AS fone, " + " la.loja_nnfonefax             AS fax, "
                + " la.loja_dsemail               AS email, " + " la.loja_imloja                AS imagem, "
                + " lt.lgtp_dslogradourotipo     AS logradouroTipo, "
                + " ltl.lgtt_dslogradourotitulo AS logradouroTitulo " + " FROM cadastro.loja_atendimento la "
                + " INNER JOIN cadastro.bairro b ON b.bair_id                  = la.bair_id "
                + " INNER JOIN cadastro.logradouro l ON l.logr_id               = la.logr_id "
                + " INNER JOIN cadastro.logradouro_tipo lt ON lt.lgtp_id       = l.lgtp_id "
                + " LEFT JOIN cadastro.logradouro_titulo ltl ON ltl.lgtt_id  = l.lgtt_id "
                + " INNER JOIN cadastro.municipio m ON m.muni_id                = b.muni_id "
                + " WHERE m.muni_icuso = 1 " + " AND b.bair_icuso = 1 " + " AND l.logr_icuso = 1 "
                + " AND m.muni_id    = :idMunicipio " + " ORDER BY la.loja_nmloja";

        try {
            retorno = sessao.createSQLQuery(consulta).addScalar("nomeLoja", Hibernate.STRING)
                    .addScalar("logradouro", Hibernate.STRING).addScalar("numero", Hibernate.STRING)
                    .addScalar("municipio", Hibernate.STRING).addScalar("bairro", Hibernate.STRING)
                    .addScalar("pontoReferencia", Hibernate.STRING).addScalar("ddd", Hibernate.STRING)
                    .addScalar("fone", Hibernate.STRING).addScalar("fax", Hibernate.STRING)
                    .addScalar("email", Hibernate.STRING).addScalar("imagem", Hibernate.BLOB)
                    .addScalar("logradouroTipo", Hibernate.STRING).addScalar("logradouroTitulo", Hibernate.STRING)
                    .setInteger("idMunicipio", idMunicipio).list();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(sessao);
        }

        return retorno;
    }

    public Collection obterColecaoOSFiscalizacaoNaoExecutadas() throws ErroRepositorioException {

        Session sessao = HibernateUtil.getSession();
        String consulta = "";
        Collection retorno = new ArrayList();

        try {
            consulta = " select os.orse_id," + " os.orse_tmgeracao " + " from atendimentopublico.ordem_servico os"
                    + " inner join atendimentopublico.servico_tipo st on os.svtp_id = st.svtp_id"
                    + " inner join atendimentopublico.servico_tipo_referencia str on st.strf_id = str.strf_id"
                    + " where os.orse_tmencerramento is null" + " and os.orse_idreferencia is not null"
                    + " and str.strf_icfiscalizacao = :idFiscalizacao";

            Query query = sessao.createSQLQuery(consulta).addScalar("orse_id", Hibernate.INTEGER)
                    .addScalar("orse_tmgeracao", Hibernate.DATE)
                    .setInteger("idFiscalizacao", ConstantesSistema.INDICADOR_USO_ATIVO);

            retorno = query.list();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(sessao);
        }

        return retorno;

    }

    /**
     * [UC1199]  Acompanhar Arquivos de Roteiro
     * [SB0003]  Pesquisar Fotos da OS
     * 
     * Mtodo que vai retornar as fotos de uma determinada
     * ordem de servio passada no parmetro.
     * 
     * @author Diogo Peixoto
     * @date 12/08/2011
     * 
     * @param Integer - ID da Ordem de Servio
     * 
     * @return Collection<Object[]> - Coleo das Fotos da OS
     * @throws ErroRepositorioException
     */
    public Collection<Object[]> pesquisarFotosOrdemServico(Integer idOS) throws ErroRepositorioException {

        Session sessao = HibernateUtil.getSession();
        Collection<Object[]> retorno = null;
        StringBuilder sb = new StringBuilder();

        sb.append("SELECT ");
        sb.append("osFoto.osft_id AS id, ");//0 - ID Ordem Servio Foto
        sb.append("osFoto.orse_id AS idOS, ");//1 - ID Ordem Servio
        sb.append("osFoto.osft_dsfoto AS descricaoFoto, ");//2 - Descrio Foto
        sb.append("osFoto.osft_imfoto AS foto ");//3 - Foto
        sb.append("FROM ");
        sb.append("atendimentopublico.ordem_servico_foto osFoto ");
        sb.append(
                "INNER JOIN atendimentopublico.ordem_servico orse ON orse.orse_id = osFoto.orse_id AND orse.orse_id = :idOS ");
        sb.append("ORDER BY idOS,osFoto.fsos_id  ");

        try {

            Query query = sessao.createSQLQuery(sb.toString()).addScalar("id", Hibernate.INTEGER)
                    .addScalar("idOS", Hibernate.INTEGER).addScalar("descricaoFoto", Hibernate.STRING)
                    .addScalar("foto", Hibernate.BINARY).setInteger("idOS", idOS);

            retorno = query.list();
        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(sessao);
        }
        return retorno;
    }

    /**
     * [UC1199]  Acompanhar Arquivos de Roteiro
     * [SB0003]  Pesquisar Fotos da OS
     * 
     * Mtodo que vai retornar as fotos de uma determinada
     * ordem de servio passada no parmetro.
     * 
     * @author Diogo Peixoto
     * @date 12/08/2011
     * 
     * @param Integer - ID da Foto da Ordem de Servio
     * 
     * @return Collection<Object[]> - Foto da Ordem de Servio
     * @throws ErroRepositorioException
     */
    public Collection<Object[]> pesquisarFotosOrdemServicoPorIdFoto(Integer idFoto)
            throws ErroRepositorioException {

        Session sessao = HibernateUtil.getSession();
        Collection<Object[]> retorno = null;
        StringBuilder sb = new StringBuilder();

        sb.append("SELECT ");
        sb.append("osFoto.osft_id AS id, ");//0 - ID Ordem Servio Foto
        sb.append("osFoto.orse_id AS idOS, ");//1 - ID Ordem Servio
        sb.append("osFoto.osft_dsfoto AS descricaoFoto, ");//2 - Descrio Foto
        sb.append("osFoto.osft_imfoto AS foto ");//3 - Foto
        sb.append("FROM ");
        sb.append("atendimentopublico.ordem_servico_foto osFoto ");
        sb.append("INNER JOIN atendimentopublico.ordem_servico orse ON orse.orse_id = osFoto.orse_id ");
        sb.append("WHERE osFoto.osft_id = :idFoto ");

        try {

            Query query = sessao.createSQLQuery(sb.toString()).addScalar("id", Hibernate.INTEGER)
                    .addScalar("idOS", Hibernate.INTEGER).addScalar("descricaoFoto", Hibernate.STRING)
                    .addScalar("foto", Hibernate.BINARY).setInteger("idFoto", idFoto);

            retorno = query.list();
        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(sessao);
        }
        return retorno;
    }

    /**
     * Felipe Santos - 24/10/2013
     * 
     * Retorna o nmero de dias e quantidade de OS para Prazo Mdio de Atendimento
     * 
     * @param dataInicial
     * @param dataFinal
     * @param idLocalidade
     * @return Object[]
     * @throws ErroRepositorioException
     */
    public Object[] pesquisarPrazoMedioAtendimentoOSRelatorioBIG(Date dataInicial, Date dataFinal,
            Integer idLocalidade) throws ErroRepositorioException {

        Object[] retorno = null;

        Session session = HibernateUtil.getSession();
        String consulta;

        try {
            consulta = "SELECT coalesce(sum(numeroDias), 0) as numeroDias, count(orse_id) as qtd " + "FROM("
                    + "SELECT case when (date(orse_tmencerramento) - date(orse_tmgeracao)) < 0 then 0 "
                    + "else (date(orse_tmencerramento) - date(orse_tmgeracao)) end as numeroDias, " + "orse_id "
                    + "FROM atendimentopublico.ordem_servico os "
                    + "INNER JOIN atendimentopublico.registro_atendimento ra on os.rgat_id = ra.rgat_id "
                    + "INNER JOIN atendimentopublico.servico_tipo svtp on svtp.svtp_id = os.svtp_id "
                    + "WHERE loca_id = :idLocalidade " + "AND svtp_cdservicotipo='C' "
                    + "AND orse_tmgeracao > '2011-01-01' "
                    + "AND orse_tmencerramento between :dataInicial AND :dataFinal " + ") as prazoOS";

            retorno = (Object[]) session.createSQLQuery(consulta).addScalar("numeroDias", Hibernate.INTEGER)
                    .addScalar("qtd", Hibernate.INTEGER).setDate("dataInicial", dataInicial)
                    .setDate("dataFinal", dataFinal).setInteger("idLocalidade", idLocalidade).setMaxResults(1)
                    .uniqueResult();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }

        return retorno;
    }

    /**
     * Felipe Santos - 24/10/2013
     * 
     * Retorna Quantidade e Economias de Ligao de gua por Perodo e Localidade 
     * 
     * @param dataInicial
     * @param dataFinal
     * @param idLocalidade
     * @return Object[]
     * @throws ErroRepositorioException
     */
    public Object[] pesquisarNovasLigacoesAguaRelatorioBIG(Date dataInicial, Date dataFinal, Integer idLocalidade)
            throws ErroRepositorioException {

        Object[] retorno = null;

        Session session = HibernateUtil.getSession();
        String consulta;

        try {
            consulta = "SELECT count(distinct(lagu_id)) as ligacoes, coalesce(sum(imsb_qteconomia), 0) as economias "
                    + "FROM atendimentopublico.ligacao_agua lagu "
                    + "INNER JOIN cadastro.imovel imov ON imov.imov_id = lagu.lagu_id "
                    + "INNER JOIN cadastro.imovel_subcategoria scat ON scat.imov_id = imov.imov_id "
                    + "WHERE imov.loca_id = :idLocalidade "
                    + "AND lagu_dtligacaoagua between :dataInicial AND :dataFinal";

            retorno = (Object[]) session.createSQLQuery(consulta).addScalar("ligacoes", Hibernate.INTEGER)
                    .addScalar("economias", Hibernate.INTEGER).setDate("dataInicial", dataInicial)
                    .setDate("dataFinal", dataFinal).setInteger("idLocalidade", idLocalidade).setMaxResults(1)
                    .uniqueResult();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }

        return retorno;
    }

    /**
     * Felipe Santos - 24/10/2013
     * 
     * Retorna Quantidade e Economias de Ligao de Esgoto por Perodo e Localidade 
     * 
     * @param dataInicial
     * @param dataFinal
     * @param idLocalidade
     * @return Object[]
     * @throws ErroRepositorioException
     */
    public Object[] pesquisarNovasLigacoesEsgotoRelatorioBIG(Date dataInicial, Date dataFinal, Integer idLocalidade)
            throws ErroRepositorioException {

        Object[] retorno = null;

        Session session = HibernateUtil.getSession();
        String consulta;

        try {
            consulta = "SELECT count(distinct(lesg_id)) as ligacoes, coalesce(sum(imsb_qteconomia), 0) as economias "
                    + "FROM atendimentopublico.ligacao_esgoto lesg "
                    + "INNER JOIN cadastro.imovel imov ON imov.imov_id = lesg.lesg_id "
                    + "INNER JOIN cadastro.imovel_subcategoria scat ON scat.imov_id = imov.imov_id "
                    + "WHERE imov.loca_id = :idLocalidade "
                    + "AND lesg_dtligacao between :dataInicial AND :dataFinal";

            retorno = (Object[]) session.createSQLQuery(consulta).addScalar("ligacoes", Hibernate.INTEGER)
                    .addScalar("economias", Hibernate.INTEGER).setDate("dataInicial", dataInicial)
                    .setDate("dataFinal", dataFinal).setInteger("idLocalidade", idLocalidade).setMaxResults(1)
                    .uniqueResult();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }

        return retorno;
    }

    /**
     * Felipe Santos - 24/10/2013
     * 
     * Retorna Quantidade de Ligaes de gua por Situao e Localidade
     * 
     * @param idLocalidade
     * Integer situacao
     * @return Integer
     * @throws ErroRepositorioException
     */
    public Integer pesquisarQuantidadeConsumidoresRelatorioBIG(Integer idLocalidade, Integer situacao)
            throws ErroRepositorioException {

        Integer retorno = null;

        Session session = HibernateUtil.getSession();
        String consulta;

        try {
            consulta = "SELECT count(*) as qtd FROM cadastro.imovel " + "WHERE loca_id = :idLocalidade "
                    + "AND last_id = :situacao";

            retorno = (Integer) session.createSQLQuery(consulta).addScalar("qtd", Hibernate.INTEGER)
                    .setInteger("idLocalidade", idLocalidade).setInteger("situacao", situacao).setMaxResults(1)
                    .uniqueResult();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no Hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }

        return retorno;
    }

    /**
     * @author Wellington Rocha
     * Data: 03/07/2012
     * 
     * Pesquisar todas os Locais de Instalao de Ramal
     * 
     * Gerao de Rotas para Recadastramento
     * 
     * @return Collection
     * @throws ControladorException
     *  
     */
    public Collection pesquisarRamalLocalInstalacao() throws ErroRepositorioException {
        Collection retorno = null;

        Session session = HibernateUtil.getSession();
        String consulta = null;

        try {
            consulta = "select ramalLocalInstalacao " + " from RamalLocalInstalacao ramalLocalInstalacao "
                    + " where ramalLocalInstalacao.indicadorUso = :indicadorUso ";

            retorno = (Collection) session.createQuery(consulta)
                    .setInteger("indicadorUso", ConstantesSistema.SIM.intValue()).list();

        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }
        return retorno;
    }

    public List<Municipio> obterMunicipiosAgenciaReguladora(Integer idAgencia) throws ErroRepositorioException {
        List<Municipio> retorno = null;

        Session session = HibernateUtil.getSession();
        StringBuilder consulta = null;

        try {
            consulta.append("select municipio from AgenciaReguladoraMunicipio agencia ")
                    .append("inner join fetch agencia.municipio municipio ")
                    .append(" where agencia.comp_id.agenciaReguladoraId = :idAgencia ");

            retorno = (List<Municipio>) session.createQuery(consulta.toString()).setInteger("idAgencia", idAgencia)
                    .list();
        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }

        return retorno;
    }

    public List<AgenciaReguladora> obterAgenciasReguladorasAtivas() throws ErroRepositorioException {
        List<AgenciaReguladora> retorno = null;

        Session session = HibernateUtil.getSession();
        StringBuilder consulta = new StringBuilder();

        try {
            consulta.append("select agencia from AgenciaReguladora agencia ")
                    .append(" where agencia.dataFimVigencia is null ");

            retorno = (List<AgenciaReguladora>) session.createQuery(consulta.toString()).list();
        } catch (HibernateException e) {
            throw new ErroRepositorioException(e, "Erro no hibernate");
        } finally {
            HibernateUtil.closeSession(session);
        }

        return retorno;
    }
}