package com.rjconsultores.ventaboletos.dao.hibernate; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.math.BigDecimal; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.sql.DataSource; import org.apache.commons.lang.BooleanUtils; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import com.rjconsultores.ventaboletos.dao.ReceitaDespesaDAO; import com.rjconsultores.ventaboletos.exception.BusinessException; import com.rjconsultores.ventaboletos.relatorios.receitaDespesa.RelatorioFinanceiroReceitasDespesasBean; import com.rjconsultores.ventaboletos.utilerias.MoneyHelper; import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement; @Repository("receitaDespesaDAO") public class ReceitaDespesaHibernateDAO implements ReceitaDespesaDAO { private static Logger log = Logger.getLogger(ReceitaDespesaHibernateDAO.class); @Autowired private DataSource dataSourceRead; private Map parametrosFiltro; @Override public List getRelatorioDetalhado(Map parametros) throws BusinessException { Connection con = null; try { con = dataSourceRead.getConnection(); StringBuilder sql = new StringBuilder(); sql.append(" SELECT ") .append("LISTAGG(fp.cvepago||' /'||CAST(cfp.IMPORTE AS VARCHAR(10)),';') WITHIN GROUP( ORDER BY 1 DESC ) AS descpago,") .append(" C.FECHORVTA, P.PUNTOVENTA_ID, P.NOMBPUNTOVENTA, P.NUMPUNTOVENTA, TE.TIPOEVENTOEXTRA_ID, TE.DESCTIPOEVENTO, ") .append(" C.NUMSERIEPREIMPRESA, C.NUMFOLIOPREIMPRESO, E.NUMDOCUMENTO,E.EVENTOEXTRA_ID ") .append(" FROM CAJA_DIVERSOS C ") .append(" JOIN EVENTO_EXTRA E ON E.EVENTOEXTRA_ID = C.EVENTOEXTRA_ID ") .append(" JOIN TIPO_EVENTO_EXTRA TE ON TE.TIPOEVENTOEXTRA_ID = E.TIPOEVENTOEXTRA_ID ") .append(" JOIN PUNTO_VENTA P ON P.PUNTOVENTA_ID = C.PUNTOVENTA_ID ") .append(" JOIN CAJA_DIVERSOS_PAGO cfp ON ( c.cajadiversos_id = cfp.cajadiversos_id)") .append(" JOIN FORMA_PAGO fp ON ( cfp.formapago_id = fp.formapago_id )") .append(" LEFT JOIN BOLETO B ON B.BOLETO_ID = E.BOLETO_ID ") .append("WHERE C.ACTIVO = 1 "); adicionarFiltros(sql, parametros); sql.append(" GROUP BY ") .append("c.fechorvta, ") .append("p.puntoventa_id, ") .append("p.nombpuntoventa, ") .append("p.numpuntoventa, ") .append("te.tipoeventoextra_id, ") .append("te.desctipoevento, ") .append("c.numseriepreimpresa, ") .append("c.numfoliopreimpreso, ") .append("e.numdocumento, ") .append("e.eventoextra_id "); sql.append("ORDER BY C.FECHORVTA, TE.DESCTIPOEVENTO, P.NOMBPUNTOVENTA, P.NUMPUNTOVENTA"); NamedParameterStatement stmt = new NamedParameterStatement(con, sql.toString()); setParametros(stmt); ResultSet resultSet = stmt.executeQuery(); List lsBean = new ArrayList(); while (resultSet.next()) { RelatorioFinanceiroReceitasDespesasBean bean = new RelatorioFinanceiroReceitasDespesasBean(); bean.setDescTipoEvento(resultSet.getString("DESCTIPOEVENTO")); bean.setFecHorVta(resultSet.getDate("FECHORVTA")); bean.setTipoEventoExtraId(resultSet.getString("TIPOEVENTOEXTRA_ID")); bean.setNombPuntoVenta(resultSet.getString("NOMBPUNTOVENTA")); bean.setNumPuntoVenta(resultSet.getString("NUMPUNTOVENTA")); bean.setPuntoVentaId(resultSet.getInt("PUNTOVENTA_ID")); bean.setFormaPagamento(resultSet.getString("DESCPAGO")); bean.setNumSeriePreImpresa(resultSet.getString("NUMSERIEPREIMPRESA")); bean.setNumFolioPreImpreso(resultSet.getString("NUMFOLIOPREIMPRESO")); bean.setNumDocumento(resultSet.getString("NUMDOCUMENTO")); setFormasDePagamento(bean); setValorFormaPagamento(bean); bean.setIndtipo(MoneyHelper.isMaiorIgual(bean.getPrecio(), BigDecimal.ZERO) ? 1 : 0); lsBean.add(bean); } return lsBean; } catch (Exception e) { log.error(e.getMessage(), e); throw new BusinessException(e.getMessage(), e); }finally { try { if (con != null && !con.isClosed()) { con.close(); } } catch (SQLException e) { log.error(e.getMessage(), e); } } } @Override public List getRelatorioSintetico(Map parametros) throws BusinessException { Connection con = null; try { con = dataSourceRead.getConnection(); StringBuilder sql = new StringBuilder(); sql.append("SELECT P.PUNTOVENTA_ID, P.NOMBPUNTOVENTA, P.NUMPUNTOVENTA, CDP.IMPORTE ") .append("FROM CAJA_DIVERSOS C ") .append("JOIN EVENTO_EXTRA E ON E.EVENTOEXTRA_ID = C.EVENTOEXTRA_ID ") .append("JOIN TIPO_EVENTO_EXTRA TE ON TE.TIPOEVENTOEXTRA_ID = E.TIPOEVENTOEXTRA_ID ") .append("JOIN PUNTO_VENTA P ON P.PUNTOVENTA_ID = C.PUNTOVENTA_ID ") .append("JOIN CAJA_DIVERSOS_PAGO CDP ON CDP.CAJADIVERSOS_ID = C.CAJADIVERSOS_ID ") .append("LEFT JOIN BOLETO B ON B.BOLETO_ID = E.BOLETO_ID ") .append("WHERE C.ACTIVO = 1 "); adicionarFiltros(sql, parametros); sql.append("ORDER BY P.NOMBPUNTOVENTA, P.NUMPUNTOVENTA"); NamedParameterStatement stmt = new NamedParameterStatement(con, sql.toString()); setParametros(stmt); ResultSet resultSet = stmt.executeQuery(); Map map = new HashMap(); while (resultSet.next()) { RelatorioFinanceiroReceitasDespesasBean bean = new RelatorioFinanceiroReceitasDespesasBean(); bean.setPuntoVentaId(resultSet.getInt("PUNTOVENTA_ID")); bean.setNombPuntoVenta(resultSet.getString("NOMBPUNTOVENTA")); bean.setNumPuntoVenta(resultSet.getString("NUMPUNTOVENTA")); if(map.containsKey(bean.getPuntoVentaId())) { bean = map.get(bean.getPuntoVentaId()); } BigDecimal precio = resultSet.getBigDecimal("IMPORTE"); if(MoneyHelper.isMaiorIgual(precio, BigDecimal.ZERO)) { bean.setReceita(MoneyHelper.somar(bean.getReceita(), precio)); } else { bean.setDespesa(MoneyHelper.somar(bean.getDespesa(), precio)); } map.put(bean.getPuntoVentaId(), bean); } List lsBean = new ArrayList(map.values()); return lsBean; } catch (Exception e) { log.error(e.getMessage(), e); throw new BusinessException(e.getMessage(), e); }finally { try { if (con != null && !con.isClosed()) { con.close(); } } catch (SQLException e) { log.error(e.getMessage(), e); } } } @Override public List getRelatorioAgencia(Map parametros) throws BusinessException { Connection con = null; try { con = dataSourceRead.getConnection(); StringBuilder sql = new StringBuilder(); sql.append("SELECT P.PUNTOVENTA_ID, P.NOMBPUNTOVENTA, P.NUMPUNTOVENTA, TE.TIPOEVENTOEXTRA_ID, TE.DESCTIPOEVENTO, ") .append("SUM(CDP.IMPORTE) PRECIO ") .append("FROM CAJA_DIVERSOS C ") .append("JOIN EVENTO_EXTRA E ON E.EVENTOEXTRA_ID = C.EVENTOEXTRA_ID ") .append("JOIN TIPO_EVENTO_EXTRA TE ON TE.TIPOEVENTOEXTRA_ID = E.TIPOEVENTOEXTRA_ID ") .append("JOIN PUNTO_VENTA P ON P.PUNTOVENTA_ID = C.PUNTOVENTA_ID ") .append("JOIN CAJA_DIVERSOS_PAGO CDP ON CDP.CAJADIVERSOS_ID = C.CAJADIVERSOS_ID ") .append("LEFT JOIN BOLETO B ON B.BOLETO_ID = E.BOLETO_ID ") .append("WHERE C.ACTIVO = 1 "); adicionarFiltros(sql, parametros); sql.append("GROUP BY P.PUNTOVENTA_ID, P.NOMBPUNTOVENTA, P.NUMPUNTOVENTA, TE.TIPOEVENTOEXTRA_ID, TE.DESCTIPOEVENTO ") .append("ORDER BY P.NOMBPUNTOVENTA, P.NUMPUNTOVENTA, TE.DESCTIPOEVENTO"); NamedParameterStatement stmt = new NamedParameterStatement(con, sql.toString()); setParametros(stmt); ResultSet resultSet = stmt.executeQuery(); List lsBean = new ArrayList(); while (resultSet.next()) { RelatorioFinanceiroReceitasDespesasBean bean = new RelatorioFinanceiroReceitasDespesasBean(); bean.setPuntoVentaId(resultSet.getInt("PUNTOVENTA_ID")); bean.setNombPuntoVenta(resultSet.getString("NOMBPUNTOVENTA")); bean.setNumPuntoVenta(resultSet.getString("NUMPUNTOVENTA")); bean.setPrecio(resultSet.getBigDecimal("PRECIO")); bean.setIndtipo(MoneyHelper.isMaiorIgual(bean.getPrecio(), BigDecimal.ZERO) ? 1 : 0); bean.setTipoEventoExtraId(resultSet.getString("TIPOEVENTOEXTRA_ID")); bean.setDescTipoEvento(resultSet.getString("DESCTIPOEVENTO")); lsBean.add(bean); } return lsBean; } catch (Exception e) { log.error(e.getMessage(), e); throw new BusinessException(e.getMessage(), e); }finally { try { if (con != null && !con.isClosed()) { con.close(); } } catch (SQLException e) { log.error(e.getMessage(), e); } } } @Override public List getRelatorioEvento(Map parametros) throws BusinessException { Connection con = null; try { con = dataSourceRead.getConnection(); StringBuilder sql = new StringBuilder(); sql.append("SELECT P.PUNTOVENTA_ID, P.NOMBPUNTOVENTA, P.NUMPUNTOVENTA, TE.TIPOEVENTOEXTRA_ID, TE.DESCTIPOEVENTO, ") .append("SUM(CDP.IMPORTE) PRECIO ") .append("FROM CAJA_DIVERSOS C ") .append("JOIN EVENTO_EXTRA E ON E.EVENTOEXTRA_ID = C.EVENTOEXTRA_ID ") .append("JOIN TIPO_EVENTO_EXTRA TE ON TE.TIPOEVENTOEXTRA_ID = E.TIPOEVENTOEXTRA_ID ") .append("JOIN PUNTO_VENTA P ON P.PUNTOVENTA_ID = C.PUNTOVENTA_ID ") .append("JOIN CAJA_DIVERSOS_PAGO CDP ON CDP.CAJADIVERSOS_ID = C.CAJADIVERSOS_ID ") .append("LEFT JOIN BOLETO B ON B.BOLETO_ID = E.BOLETO_ID ") .append("WHERE C.ACTIVO = 1 "); adicionarFiltros(sql, parametros); sql.append("GROUP BY P.PUNTOVENTA_ID, P.NOMBPUNTOVENTA, P.NUMPUNTOVENTA, TE.TIPOEVENTOEXTRA_ID, TE.DESCTIPOEVENTO ") .append("ORDER BY TE.TIPOEVENTOEXTRA_ID, TE.DESCTIPOEVENTO, P.NOMBPUNTOVENTA"); NamedParameterStatement stmt = new NamedParameterStatement(con, sql.toString()); setParametros(stmt); ResultSet resultSet = stmt.executeQuery(); List lsBean = new ArrayList(); while (resultSet.next()) { RelatorioFinanceiroReceitasDespesasBean bean = new RelatorioFinanceiroReceitasDespesasBean(); bean.setPuntoVentaId(resultSet.getInt("PUNTOVENTA_ID")); bean.setNombPuntoVenta(resultSet.getString("NOMBPUNTOVENTA")); bean.setNumPuntoVenta(resultSet.getString("NUMPUNTOVENTA")); bean.setPrecio(resultSet.getBigDecimal("PRECIO")); bean.setIndtipo(MoneyHelper.isMaiorIgual(bean.getPrecio(), BigDecimal.ZERO) ? 1 : 0); bean.setTipoEventoExtraId(resultSet.getString("TIPOEVENTOEXTRA_ID")); bean.setDescTipoEvento(resultSet.getString("DESCTIPOEVENTO")); lsBean.add(bean); } return lsBean; } catch (Exception e) { log.error(e.getMessage(), e); throw new BusinessException(e.getMessage(), e); }finally { try { if (con != null && !con.isClosed()) { con.close(); } } catch (SQLException e) { log.error(e.getMessage(), e); } } } @SuppressWarnings({ "unchecked", "rawtypes" }) private void adicionarFiltros(StringBuilder sql, Map parametros) { parametrosFiltro = new HashMap(); sql.append(" AND (E.BOLETO_ID IS NULL OR E.BOLETO_ID = B.BOLETO_ID) "); if(parametros.containsKey("empresaId")) { sql.append("AND E.EMPRESA_ID = :empresaId "); parametrosFiltro.put("empresaId", parametros.get("empresaId")); } boolean isDataFechamentoCaixa = parametros.get("isDataFechamentoCaixa") != null ? BooleanUtils.toBoolean(parametros.get("isDataFechamentoCaixa").toString()) : false; if(isDataFechamentoCaixa) { if(parametros.containsKey("fecInicio")) { sql.append("AND C.FECCORTE >= TO_DATE(:fecInicio,'DD/MM/YYYY HH24:MI:SS') "); parametrosFiltro.put("fecInicio", parametros.get("fecInicio")); } if(parametros.containsKey("fecFinal")) { sql.append("AND C.FECCORTE <= TO_DATE(:fecFinal,'DD/MM/YYYY HH24:MI:SS') "); parametrosFiltro.put("fecFinal", parametros.get("fecFinal")); } } else { if(parametros.containsKey("fecInicio")) { sql.append("AND C.FECHORVTA >= TO_DATE(:fecInicio,'DD/MM/YYYY HH24:MI:SS') "); parametrosFiltro.put("fecInicio", parametros.get("fecInicio")); } if(parametros.containsKey("fecFinal")) { sql.append("AND C.FECHORVTA <= TO_DATE(:fecFinal,'DD/MM/YYYY HH24:MI:SS') "); parametrosFiltro.put("fecFinal", parametros.get("fecFinal")); } } if(parametros.containsKey("numDocumento")) { sql.append("AND E.NUMDOCUMENTO = :numDocumento "); parametrosFiltro.put("numDocumento", parametros.get("numDocumento")); } if(parametros.containsKey("indTipo")) { sql.append("AND TE.INDTIPO = :indTipo "); parametrosFiltro.put("indTipo", parametros.get("indTipo")); } if(parametros.containsKey("lsPuntoVenta")) { List values = parametros.get("lsPuntoVenta") instanceof Collection ? new ArrayList((Collection) parametros.get("lsPuntoVenta")) : new ArrayList(((List) parametros.get("lsPuntoVenta"))); int size = values.size(); Integer[] ls = new Integer[size]; for (int i = 0; i < size; i++) { ls[i] = Integer.valueOf((values.get(i).toString())); } sql.append("AND C.PUNTOVENTA_ID IN (" + StringUtils.join(ls, ',') + ") "); } if(parametros.containsKey("lsEventosExtra")) { List values = parametros.get("lsEventosExtra") instanceof Collection ? new ArrayList((Collection) parametros.get("lsEventosExtra")) : new ArrayList(((List) parametros.get("lsEventosExtra"))); int size = values.size(); Integer[] ls = new Integer[size]; for (int i = 0; i < size; i++) { ls[i] = Integer.valueOf((values.get(i).toString())); } sql.append("AND TE.TIPOEVENTOEXTRA_ID IN (" + StringUtils.join(ls, ',') + ") "); } } private void setParametros(NamedParameterStatement stmt) throws SQLException { for (Entry parametro : parametrosFiltro.entrySet()) { stmt.setObject(parametro.getKey(), parametro.getValue()); } } private void setFormasDePagamento(RelatorioFinanceiroReceitasDespesasBean bean) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException { String formasPagamento = bean.getFormaPagamento(); if (formasPagamento != null) { final String[] formaPagamento = formasPagamento.split("\\;") ; if (formaPagamento.length > 1) { int contador = 0; while (contador < formaPagamento.length) { final Class cls = bean.getClass(); final String metodo = "setFormaPagamento" + (contador+1); Method meth = cls.getMethod(metodo, String.class); meth.invoke(bean, formatarFormaDePagamento(formaPagamento[contador])); contador++; } } else { bean.setFormaPagamento1(formatarFormaDePagamento(formaPagamento[0])); } } } private void setValorFormaPagamento(RelatorioFinanceiroReceitasDespesasBean bean) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException { String formasPagamento = bean.getFormaPagamento(); if (formasPagamento != null) { final String[] formaPagamento = formasPagamento.split("\\;") ; if (formaPagamento.length > 1) { int contador = 0; while (contador < formaPagamento.length) { final Class cls = bean.getClass(); final String metodo = "setValorFormaPagamento" + (contador+1); Method meth = cls.getMethod(metodo, BigDecimal.class); meth.invoke(bean, formatarValorFormaDePagamento(formaPagamento[contador])); contador++; } } else { bean.setValorFormaPagamento1(formatarValorFormaDePagamento(formaPagamento[0])); } } bean.setPrecio(MoneyHelper.somar(bean.getValorFormaPagamento1(), bean.getValorFormaPagamento2(), bean.getValorFormaPagamento3())); } private String formatarFormaDePagamento(String formaDePagamento){ if(formaDePagamento!=null){ final String[] formaPagamentoAuxilar = formaDePagamento.split("\\/") ; return formaPagamentoAuxilar[0]; } return null; } private BigDecimal formatarValorFormaDePagamento(String formaDePagamento){ if(formaDePagamento!=null){ final String[] formaPagamentoAuxilar = formaDePagamento.split("\\/") ; return formaPagamentoAuxilar.length>1? new BigDecimal(formaPagamentoAuxilar[1].replace(",", ".").trim()):new BigDecimal("0.0"); } return null; } }