package gcom.arrecadacao;
import gcom.arrecadacao.bean.PesquisarAvisoBancarioPorContaCorrenteHelper;
import gcom.relatorio.arrecadacao.RelatorioAvisoBancarioPorContaCorrenteBean;
import gcom.util.ErroRepositorioException;
import gcom.util.HibernateUtil;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
/**
* O reposit�rio faz a comunica��o com a base de dados atrav�s do hibernate. O
* cliente usa o reposit�rio como fonte de dados.
*
* @author S�vio Luiz
*/
public class RepositorioArrecadacaoPostgresHBM extends RepositorioArrecadacaoHBM {
/**
* [UC0829] Gerar Relat�rio Avisos Bancarios Por Conta Corrente
*
* @author Arthur Carvalho
* @date 28/12/2010
*/
@Override
public List<RelatorioAvisoBancarioPorContaCorrenteBean> pesquisarAvisoBancarioPorContaCorrente(
PesquisarAvisoBancarioPorContaCorrenteHelper helper) throws ErroRepositorioException {
List<RelatorioAvisoBancarioPorContaCorrenteBean> retorno = new ArrayList<RelatorioAvisoBancarioPorContaCorrenteBean>();
Session session = HibernateUtil.getSession();
String where = "";
if (helper.getIdBanco() != null) {
where += " AND b.bnco_id = :idBanco ";
}
if (helper.getIdContaBancaria() != null) {
where += " AND cb.ctbc_id = :idContaBancaria ";
}
String anoMes = String.valueOf(helper.getMesAno());
int ano = new Integer(anoMes.substring(0, 4));
int mes = new Integer(anoMes.substring(4, 6));
String consulta =
"( " +
"SELECT " +
"a.avbc_id as id_aviso, " + // 0
"a.avbc_dtrealizada as data_realizada, " + // 1
"a.arrc_id as id_arrecadador, " + // 2
"c.clie_nmcliente as descricao_arrecadador, " + // 3
"a.arfm_id as id_arrecadacao_forma, " + // 4
"af.arfm_dsarrecadacaoforma as descricao_arrecadacao_forma, " + // 5
"b.bnco_id as id_banco, " + // 6
"b.bnco_nmbanco as descricao_banco, " + // 7
"cb.ctbc_id as id_conta, " + // 8
"cb.ctbc_nnconta as numero_conta, " + // 9
"ag.agen_id as id_agencia, " + // 10
"ag.agen_cdagencia as codigo_agencia, " + // 11
"ag.agen_nmagencia as descricao_agencia, " + // 12
"cb.ctbc_nncontacontabil as numero_conta_contabil, " + // 13
"ag.agen_nnfone as numero_fone, " +// 14
"ag.agen_nnfoneramal as numero_ramal, " + // 15
"a.avbc_dtlancamento as data_lancamento, " + // 16
"a.avbc_nnsequencial as sequencial_aviso, " + // 17
"a.avbc_nndocumento as numero_documento, " + // 18
"( CASE WHEN a.avbc_iccreditodebito = 1 THEN a.avbc_vlrealizado ELSE 0 END ) as credito, " + // 19
"( CASE WHEN a.avbc_iccreditodebito = 2 THEN a.avbc_vlrealizado ELSE 0 END ) as debito, " + // 20
"a.avbc_amreferenciaarrecadacao as ano_mes_arrecadacao, " + // 21
"1 " +
"FROM arrecadacao.aviso_bancario a " +
"LEFT JOIN arrecadacao.arrecadador ar ON (a.arrc_id = ar.arrc_id) " +
"LEFT JOIN cadastro.cliente c ON (ar.clie_id = c.clie_id) " +
"LEFT JOIN arrecadacao.arrecadacao_forma af ON (a.arfm_id = af.arfm_id) " +
"INNER JOIN arrecadacao.conta_bancaria cb ON (a.ctbc_id = cb.ctbc_id) " +
"INNER JOIN arrecadacao.agencia ag ON (cb.agen_id = ag.agen_id) " +
"INNER JOIN arrecadacao.banco b ON (ag.bnco_id = b.bnco_id) " +
"WHERE " +
"(a.avbc_amreferenciaarrecadacao = :anoMesReferencia OR (date_part('year', a.avbc_dtrealizada) = :ano AND date_part('month', a.avbc_dtrealizada) = :mes)) " + where +
") UNION ALL ( " +
"SELECT " +
"0, " + // 0
"ac.avac_dtacerto as data_realizada, " + // 1
"a.arrc_id as id_arrecadador, " + // 2
"c.clie_nmcliente as descricao_arrecadador, " + // 3
"a.arfm_id as arrecadacao_forma, " + // 4
"af.arfm_dsarrecadacaoforma as descricao_arrecadacao_forma, " + // 5
"b.bnco_id as id_banco, " + // 6
"b.bnco_nmbanco as descricao_banco, " + // 7
"cb.ctbc_id as id_conta, " + // 8
"cb.ctbc_nnconta as numero_conta, " + // 9
"ag.agen_id as id_agencia, " + // 10
"ag.agen_cdagencia as codigo_agencia, " + // 11
"ag.agen_nmagencia as descricao_agencia, " + // 12
"cb.ctbc_nncontacontabil as numero_conta_contabil, " + // 13
"ag.agen_nnfone as numero_fone, " +// 14
"ag.agen_nnfoneramal as numero_ramal, " + // 15
"now(), " + // 16
"a.avbc_nnsequencial as sequencial_aviso, " + // 17
"a.avbc_nndocumento as numero_documento, " + // 18
"( CASE WHEN ((ac.avac_iccreditodebito = 1 AND ac.avac_icarrecadacaodevolucao = 1) OR (ac.avac_iccreditodebito = 2 AND ac.avac_icarrecadacaodevolucao = 2)) THEN ac.avac_vlacerto ELSE 0 END ) as credito, " + // 19
"( CASE WHEN ((ac.avac_iccreditodebito = 1 AND ac.avac_icarrecadacaodevolucao = 2) OR (ac.avac_iccreditodebito = 2 AND ac.avac_icarrecadacaodevolucao = 1)) THEN ac.avac_vlacerto ELSE 0 END ) as debito, " + // 20
"a.avbc_amreferenciaarrecadacao as ano_mes_arrecadacao, " +// 21
"10 " +
"FROM arrecadacao.aviso_acertos ac " +
"INNER JOIN arrecadacao.aviso_bancario a ON (ac.avbc_id = a.avbc_id) " +
"LEFT JOIN arrecadacao.arrecadador ar ON (a.arrc_id = ar.arrc_id) " +
"LEFT JOIN cadastro.cliente c ON (ar.clie_id = c.clie_id) " +
"LEFT JOIN arrecadacao.arrecadacao_forma af ON (a.arfm_id = af.arfm_id) " +
"INNER JOIN arrecadacao.conta_bancaria cb ON (a.ctbc_id = cb.ctbc_id) " +
"INNER JOIN arrecadacao.agencia ag ON (cb.agen_id = ag.agen_id) " +
"INNER JOIN arrecadacao.banco b ON (ag.bnco_id = b.bnco_id) " +
"WHERE " +
"(ac.avac_amreferenciaarrecadacao = :anoMesReferencia OR (date_part('year', ac.avac_dtacerto) = :ano AND date_part('month', ac.avac_dtacerto) = :mes)) " + where +
") ORDER BY 7, 9, 2, 23";
try {
SQLQuery q = session.createSQLQuery(consulta);
q.addScalar("id_aviso", Hibernate.INTEGER);
q.addScalar("data_realizada", Hibernate.DATE);
q.addScalar("id_arrecadador", Hibernate.INTEGER);
q.addScalar("descricao_arrecadador", Hibernate.STRING);
q.addScalar("id_arrecadacao_forma", Hibernate.INTEGER);
q.addScalar("descricao_arrecadacao_forma", Hibernate.STRING);
q.addScalar("id_banco", Hibernate.INTEGER);
q.addScalar("descricao_banco", Hibernate.STRING);
q.addScalar("id_conta", Hibernate.INTEGER);
q.addScalar("numero_conta", Hibernate.STRING);
q.addScalar("id_agencia", Hibernate.INTEGER);
q.addScalar("codigo_agencia", Hibernate.STRING);
q.addScalar("descricao_agencia", Hibernate.STRING);
q.addScalar("numero_conta_contabil", Hibernate.INTEGER);
q.addScalar("numero_fone", Hibernate.STRING);
q.addScalar("numero_ramal", Hibernate.STRING);
q.addScalar("data_lancamento", Hibernate.DATE);
q.addScalar("sequencial_aviso", Hibernate.INTEGER);
q.addScalar("numero_documento", Hibernate.INTEGER);
q.addScalar("credito", Hibernate.BIG_DECIMAL);
q.addScalar("debito", Hibernate.BIG_DECIMAL);
q.addScalar("ano_mes_arrecadacao", Hibernate.INTEGER);
q.setInteger("anoMesReferencia", helper.getMesAno());
q.setInteger("ano", ano);
q.setInteger("mes", mes);
if (helper.getIdBanco() != null) {
q.setInteger("idBanco", helper.getIdBanco());
}
if (helper.getIdContaBancaria() != null) {
q.setInteger("idContaBancaria", helper.getIdContaBancaria());
}
for (Object[] linha : (List<Object[]>) q.list()) {
RelatorioAvisoBancarioPorContaCorrenteBean bean = new RelatorioAvisoBancarioPorContaCorrenteBean();
bean.setIdAviso((Integer) linha[0]);
bean.setDataRealizada((Date) linha[1]);
bean.setIdArrecadador((Integer) linha[2]);
bean.setDescricaoArrecadador((String) linha[3]);
bean.setIdArrecadacaoForma((Integer) linha[4]);
bean.setDescricaoArrecadacaoForma((String) linha[5]);
bean.setIdBanco((Integer) linha[6]);
bean.setDescricaoBanco((String) linha[7]);
bean.setIdConta((Integer) linha[8]);
bean.setNumeroConta((String) linha[9]);
bean.setIdAgencia((Integer) linha[10]);
bean.setCodigoAgencia((String) linha[11]);
bean.setDescricaoAgencia((String) linha[12]);
bean.setNumeroContaContabil((Integer) linha[13]);
bean.setNumeroFone((String) linha[14]);
bean.setNumeroRamal((String) linha[15]);
bean.setDataLancamento((Date) linha[16]);
bean.setSequencialAviso((Integer) linha[17]);
bean.setNumeroDocumento((Integer) linha[18]);
bean.setCredito((BigDecimal) linha [19]);
bean.setDebito((BigDecimal) linha[20]);
bean.setAnoMesArrecadacao((Integer) linha[21]);
retorno.add(bean);
}
} catch (HibernateException e) {
throw new ErroRepositorioException(e, "Erro no Hibernate");
} finally {
HibernateUtil.closeSession(session);
}
return retorno;
}
}