package com.rjconsultores.ventaboletos.dao.hibernate; 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.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.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 C.FECHORVTA, P.PUNTOVENTA_ID, P.NOMBPUNTOVENTA, P.NUMPUNTOVENTA, TE.INDTIPO, TE.TIPOEVENTOEXTRA_ID, TE.DESCTIPOEVENTO, C.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("WHERE C.ACTIVO = 1 "); adicionarFiltros(sql, parametros); 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.setPrecio(resultSet.getBigDecimal("PRECIO")); bean.setPuntoVentaId(resultSet.getInt("PUNTOVENTA_ID")); 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, ") .append("SUM(CASE WHEN TE.INDTIPO = 1 THEN C.PRECIO ELSE 0 END) RECEITA, ") .append("SUM(CASE WHEN TE.INDTIPO = 0 THEN CASE WHEN C.PRECIO < 0 THEN (C.PRECIO * -1) ELSE C.PRECIO END ELSE 0 END) DESPESA ") .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("WHERE C.ACTIVO = 1 "); adicionarFiltros(sql, parametros); sql.append("GROUP BY P.PUNTOVENTA_ID, P.NOMBPUNTOVENTA, P.NUMPUNTOVENTA ") .append("ORDER BY 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.setPuntoVentaId(resultSet.getInt("PUNTOVENTA_ID")); bean.setNombPuntoVenta(resultSet.getString("NOMBPUNTOVENTA")); bean.setNumPuntoVenta(resultSet.getString("NUMPUNTOVENTA")); bean.setReceita(resultSet.getBigDecimal("RECEITA")); bean.setDespesa(resultSet.getBigDecimal("DESPESA")); 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 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, TE.INDTIPO, ") .append("SUM(CASE WHEN TE.INDTIPO = 1 THEN C.PRECIO ELSE (CASE WHEN TE.INDTIPO = 0 THEN CASE WHEN C.PRECIO < 0 THEN (C.PRECIO * -1) ELSE C.PRECIO END ELSE 0 END) END) 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("WHERE C.ACTIVO = 1 "); adicionarFiltros(sql, parametros); sql.append("GROUP BY P.PUNTOVENTA_ID, P.NOMBPUNTOVENTA, P.NUMPUNTOVENTA, TE.TIPOEVENTOEXTRA_ID, TE.DESCTIPOEVENTO, TE.INDTIPO ") .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(resultSet.getInt("INDTIPO")); 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, TE.INDTIPO, ") .append("SUM(CASE WHEN TE.INDTIPO = 1 THEN C.PRECIO ELSE (CASE WHEN TE.INDTIPO = 0 THEN CASE WHEN C.PRECIO < 0 THEN (C.PRECIO * -1) ELSE C.PRECIO END ELSE 0 END) END) 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("WHERE C.ACTIVO = 1 "); adicionarFiltros(sql, parametros); sql.append("GROUP BY P.PUNTOVENTA_ID, P.NOMBPUNTOVENTA, P.NUMPUNTOVENTA, TE.TIPOEVENTOEXTRA_ID, TE.DESCTIPOEVENTO, TE.INDTIPO ") .append("ORDER BY TE.TIPOEVENTOEXTRA_ID, TE.DESCTIPOEVENTO, TE.INDTIPO, 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(resultSet.getInt("INDTIPO")); 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(); if(parametros.containsKey("empresaId")) { sql.append("AND E.EMPRESA_ID = :empresaId "); parametrosFiltro.put("empresaId", parametros.get("empresaId")); } if(parametros.containsKey("fecInicio")) { sql.append("AND C.FECHORVTA >= TO_DATE(:fecInicio,'DD/MM/YYYY HH24:MI') "); parametrosFiltro.put("fecInicio", parametros.get("fecInicio")); } if(parametros.containsKey("fecFinal")) { sql.append("AND C.FECHORVTA <= TO_DATE(:fecFinal,'DD/MM/YYYY HH24:MI') "); parametrosFiltro.put("fecFinal", parametros.get("fecFinal")); } 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()); } } }