package com.rjconsultores.integracaoreceitadespesa.dao; import java.math.BigDecimal; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import com.rjconsultores.integracaoreceitadespesa.entidades.DespesaReceita; import com.rjconsultores.integracaoreceitadespesa.entidades.Empresa; import com.rjconsultores.integracaoreceitadespesa.entidades.PuntoVenta; public class Totalbus { private static final Logger log = Logger.getLogger(Totalbus.class); private static final int DAYS_AGO = -1; private Connection conn; private List pontosVenda = new ArrayList(); private List empresas = new ArrayList(); private DecimalFormat df = new DecimalFormat("#0.00"); public Totalbus(Connection con) { this.conn = con; loadEmpresas(); loadPuntosVenta(); } public List getDespesasReceitas(Integer puntoventaId, Integer empresaId, Date fechaParam, boolean incluiTipoPagamentoTurismoBGM) { log.debug("gerando depósitos..."); List despesasReceitas = getDepositos(puntoventaId, empresaId, fechaParam, incluiTipoPagamentoTurismoBGM); log.debug("gerando despesas..."); despesasReceitas.addAll(getDespesas(puntoventaId, empresaId, fechaParam, incluiTipoPagamentoTurismoBGM)); log.debug("gerando despesas cartão..."); despesasReceitas.addAll(getDespesaCartaoDebCred(puntoventaId, empresaId, fechaParam, incluiTipoPagamentoTurismoBGM)); log.debug("gerando receitas..."); despesasReceitas.addAll(getReceitas(puntoventaId, empresaId, fechaParam, incluiTipoPagamentoTurismoBGM)); List rows = new ArrayList(); for (DespesaReceita item : despesasReceitas) { item.preencheLinha(rows); } return rows; } private void loadPuntosVenta() { PreparedStatement pstmt = null; ResultSet rs = null; try { pstmt = getConnection().prepareStatement("Select puntoventa_id, nombpuntoventa from punto_venta order by nombpuntoventa"); rs = pstmt.executeQuery(); while (rs.next()) { PuntoVenta puntoVenta = new PuntoVenta(); puntoVenta.codigo = rs.getInt(1); puntoVenta.nombpuntoventa = rs.getString(2); pontosVenda.add(puntoVenta); } } catch (Exception e) { log.error(e.getMessage(), e); } finally { try { rs.close(); } catch (Exception ignore) { log.error(ignore.getMessage(), ignore); } try { pstmt.close(); } catch (Exception ignore) { log.error(ignore.getMessage(), ignore); } } } private void loadEmpresas() { PreparedStatement pstmt = null; ResultSet rs = null; try { pstmt = getConnection().prepareStatement("Select empresa_id, nombempresa from empresa order by nombempresa"); rs = pstmt.executeQuery(); while (rs.next()) { Empresa empresa = new Empresa(); empresa.codigo = rs.getInt(1); empresa.nombempresa = rs.getString(2); empresas.add(empresa); } } catch (Exception e) { log.error(e.getMessage(), e); } finally { try { rs.close(); } catch (Exception ignore) { log.error(ignore.getMessage(), ignore); } try { pstmt.close(); } catch (Exception ignore) { log.error(ignore.getMessage(), ignore); } } } public Connection getConnection() { return this.conn; } public List getDespesaCartaoDebCred(final Integer puntoVentaId, final Integer empresaId, Date fechaParam, boolean incluiTipoPagamentoTurismoBGM) { List despesas = new ArrayList(); StringBuilder sb = new StringBuilder(); sb.append(" select "); sb.append(" cd.feccorte AS fechorvta, "); sb.append(" e.empresa_id AS empresa, "); sb.append(" pv.puntoventa_id AS puntoventaId, "); sb.append(" sum(cdp.importe) AS valor, "); sb.append(" case when cdp.formapago_id = 2 then 802 else 803 end as contacontabil, "); sb.append(" pv.numpuntoventa AS numpuntoventa, "); sb.append(" ev.tipoeventoextra_id, "); sb.append(" cdp.formapago_id as formapagoId "); sb.append(" from "); sb.append(" caja_diversos cd "); sb.append(" left join evento_extra ev on ev.eventoextra_id = cd.eventoextra_id "); sb.append(" left join empresa e on e.empresa_id = ev.empresa_id "); sb.append(" left join punto_venta pv on pv.puntoventa_id = cd.puntoventa_id "); sb.append(" left join caja_diversos_pago cdp on cdp.cajadiversos_id = cd.cajadiversos_id "); sb.append(" left join tipo_evento_extra tee on tee.tipoeventoextra_id = ev.tipoeventoextra_id "); sb.append(" left join ptovta_integra pi on e.empresa_id = pi.empresa_id and pi.puntoventa_id = pv.puntoventa_id "); sb.append(" where "); sb.append(" cd.feccorte = ? "); adicionaFiltroQuery(puntoVentaId, sb, " and cd.puntoventa_id = ", puntoVentaId != null && !puntoVentaId.equals(-1)); adicionaFiltroQuery(empresaId, sb, " and e.empresa_id = ", empresaId != null); sb.append(" and cd.activo = 1 "); sb.append(" and cdp.formapago_id in (2,3) "); sb.append(" group by "); sb.append(" cd.feccorte, "); sb.append(" e.empresa_id, "); sb.append(" pv.puntoventa_id, "); sb.append(" case when cdp.formapago_id = 2 then 802 else 803 end, "); sb.append(" pv.numpuntoventa, ev.tipoeventoextra_id, "); sb.append(" cdp.formapago_id "); PreparedStatement stmt = null; ResultSet rs = null; Date fecha = fechaParam; if (fechaParam == null) { fecha = getData(); } try { stmt = getConnection().prepareStatement(sb.toString()); stmt.setDate(1, new java.sql.Date(fecha.getTime())); rs = stmt.executeQuery(); while (rs.next()) { DespesaReceita despesa = new DespesaReceita(); despesa.setCodigoEmpresa(rs.getInt(2)); despesa.setCodigoReceitaDespesa(rs.getString(5)); despesa.setDataLancamento(rs.getDate(1)); despesa.setDataMovimento(rs.getDate(1)); despesa.setLocalArrecadacao(rs.getString(6)); if (rs.getBigDecimal(4).signum() == -1) { despesa.setIdentificadorReceitaDespesa("R"); despesa.setValorLancamento(df.format(rs.getBigDecimal(4).multiply(new BigDecimal(-1)))); } else { despesa.setIdentificadorReceitaDespesa("D"); despesa.setValorLancamento(df.format(rs.getBigDecimal(4))); } if (incluiTipoPagamentoTurismoBGM) { despesa.setTipoPagamentoTurismo(rs.getString("tipoeventoextra_id")); } despesa.setFormaPagamentoId(rs.getString("formapagoId")); despesas.add(despesa); } } catch (Exception e) { log.error(e.toString(), e); } finally { try { rs.close(); } catch (Exception ignore) { log.error("", ignore); } try { stmt.close(); } catch (Exception ignore) { log.error("", ignore); } } return despesas; } private void adicionaFiltroQuery(final Integer valor, StringBuilder sb, String filtroSQL, Boolean adicionar) { if (adicionar) { sb.append(filtroSQL + valor); } } public List getReceitas(final Integer puntoVentaId, final Integer empresaId, Date fechaParam, boolean incluiTipoPagamentoTurismoBGM) { List despesas = new ArrayList(); StringBuilder sb = new StringBuilder(); sb.append(" select "); sb.append(" cd.feccorte AS fechorvta, "); sb.append(" e.empresa_id AS empresa, "); sb.append(" pv.puntoventa_id AS puntoventaId, "); sb.append(" sum(cdp.importe) AS valor, "); sb.append(" tee.contacontabil AS contacontabil, "); sb.append(" pv.numpuntoventa AS numpuntoventa, "); sb.append(" ev.descinfo as descinfo, "); sb.append(" ev.tipoeventoextra_id, "); sb.append(" cdp.formapago_id as formapagoId "); sb.append(" from "); sb.append(" caja_diversos cd "); sb.append(" left join evento_extra ev on ev.eventoextra_id = cd.eventoextra_id "); sb.append(" left join empresa e on e.empresa_id = ev.empresa_id "); sb.append(" left join punto_venta pv on pv.puntoventa_id = cd.puntoventa_id "); sb.append(" left join caja_diversos_pago cdp on cdp.cajadiversos_id = cd.cajadiversos_id "); sb.append(" left join tipo_evento_extra tee on tee.tipoeventoextra_id = ev.tipoeventoextra_id "); sb.append(" left join ptovta_integra pi on e.empresa_id = pi.empresa_id and pi.puntoventa_id = pv.puntoventa_id "); sb.append(" where "); sb.append(" cd.feccorte = ? "); adicionaFiltroQuery(puntoVentaId, sb, " and cd.puntoventa_id = ", puntoVentaId != null && !puntoVentaId.equals(-1)); adicionaFiltroQuery(empresaId, sb, " and e.empresa_id = ", empresaId != null); sb.append(" and cd.activo = 1 "); sb.append(" and tee.indtipo = 1 "); sb.append(" group by cd.feccorte, "); sb.append(" e.empresa_id, pv.puntoventa_id, "); sb.append(" tee.contacontabil, pv.numpuntoventa, "); sb.append(" ev.descinfo, ev.tipoeventoextra_id, "); sb.append(" cdp.formapago_id "); PreparedStatement stmt = null; ResultSet rs = null; Date fecha = fechaParam; if (fechaParam == null) { fecha = getData(); } try { stmt = getConnection().prepareStatement(sb.toString()); stmt.setDate(1, new java.sql.Date(fecha.getTime())); rs = stmt.executeQuery(); while (rs.next()) { DespesaReceita receita = new DespesaReceita(); receita.setCodigoEmpresa(rs.getInt(2)); receita.setCodigoReceitaDespesa(rs.getString(5)); receita.setDataLancamento(rs.getDate(1)); receita.setDataMovimento(rs.getDate(1)); receita.setLocalArrecadacao(rs.getString(6)); if (rs.getBigDecimal(4).signum() == -1) { receita.setIdentificadorReceitaDespesa("D"); receita.setValorLancamento(df.format(rs.getBigDecimal(4).multiply(new BigDecimal(-1)))); } else { receita.setIdentificadorReceitaDespesa("R"); receita.setValorLancamento(df.format(rs.getBigDecimal(4))); } receita.setDescricaoDetalhada(rs.getString(7)); if (incluiTipoPagamentoTurismoBGM) { receita.setTipoPagamentoTurismo(rs.getString("tipoeventoextra_id")); } receita.setFormaPagamentoId(rs.getString("formapagoId")); despesas.add(receita); } } catch (Exception e) { log.error(e.getMessage(), e); } finally { try { rs.close(); } catch (Exception ignore) { log.error(ignore.getMessage(), ignore); } try { stmt.close(); } catch (Exception ignore) { log.error(ignore.getMessage(), ignore); } } return despesas; } public List getDespesas(Integer puntoventaId, Integer empresaId, Date fechaParam, boolean incluiTipoPagamentoTurismoBGM) { List despesas = new ArrayList(); StringBuilder sb = new StringBuilder(); sb.append(" select "); sb.append(" cd.feccorte as feccorte, "); sb.append(" e.empresa_id as empresa_id, "); sb.append(" pv.numpuntoventa as numpuntoventa, "); sb.append(" cdp.importe as valor, "); sb.append(" tee.contacontabil as contacontabil, "); sb.append(" ev.descinfo as descinfo, "); sb.append(" ev.tipoeventoextra_id, "); sb.append(" cdp.formapago_id as formapagoId "); sb.append(" from "); sb.append(" caja_diversos cd "); sb.append(" left join evento_extra ev on ev.eventoextra_id = cd.eventoextra_id "); sb.append(" left join empresa e on e.empresa_id = ev.empresa_id "); sb.append(" left join punto_venta pv on pv.puntoventa_id = cd.puntoventa_id "); sb.append(" left join caja_diversos_pago cdp on cdp.cajadiversos_id = cd.cajadiversos_id "); sb.append(" left join tipo_evento_extra tee on tee.tipoeventoextra_id = ev.tipoeventoextra_id "); sb.append(" left join ptovta_integra pi on e.empresa_id = pi.empresa_id and pi.puntoventa_id = pv.puntoventa_id "); sb.append(" where "); sb.append(" cd.feccorte = ? "); sb.append(" and tee.indtipo = 0 "); adicionaFiltroQuery(puntoventaId, sb, " and cd.puntoventa_id = ", puntoventaId != null && !puntoventaId.equals(-1)); adicionaFiltroQuery(empresaId, sb, " and e.empresa_id = ", empresaId != null); sb.append(" and cd.activo = 1 "); sb.append(" and not exists (select ee.EVENTOEXTRA_ID from evento_extra ee where ev.EVENTOEXTRA_ID = ee.EVENTOEXTRACANC_ID) "); sb.append(" and ev.EVENTOEXTRACANC_ID is null "); Date fecha = fechaParam; if (fechaParam == null) { fecha = getData(); } PreparedStatement pstmt = null; ResultSet rs = null; try { pstmt = getConnection().prepareStatement(sb.toString()); pstmt.setDate(1, new java.sql.Date(fecha.getTime())); rs = pstmt.executeQuery(); while (rs.next()) { DespesaReceita despesa = new DespesaReceita(); despesa.setCodigoEmpresa(rs.getInt(2)); despesa.setCodigoReceitaDespesa(rs.getString(5)); despesa.setDataLancamento(rs.getDate(1)); despesa.setDataMovimento(rs.getDate(1)); despesa.setLocalArrecadacao(rs.getString(3)); despesa.setValorLancamento(df.format(rs.getBigDecimal(4).doubleValue() * -1)); despesa.setIdentificadorReceitaDespesa("D"); despesa.setDescricaoDetalhada(rs.getString(6)); if (incluiTipoPagamentoTurismoBGM) { despesa.setTipoPagamentoTurismo(rs.getString("tipoeventoextra_id")); } despesa.setFormaPagamentoId(rs.getString("formapagoId")); despesas.add(despesa); } } catch (Exception e) { log.error(e.getMessage(), e); } finally { try { rs.close(); } catch (Exception ignore) { log.error(ignore.getMessage(), ignore); } try { pstmt.close(); } catch (Exception ignore) { log.error(ignore.getMessage(), ignore); } } return despesas; } public List getDepositos(Integer puntoventaId, Integer empresaId, Date fechaParam, boolean incluiTipoPagamentoTurismoBGM) { List depositos = new ArrayList(); StringBuilder strFechamentos = new StringBuilder(); strFechamentos.append("Select distinct sum(fd.valor_pago), fdep.numdeposito, fdep.fecha_deposito, fc.empresa_id, "); strFechamentos.append(" pv.numpuntoventa, ec.numagencia, ec.numconta, if.CODIGO, ec.numintegracion, fdep.feccreacion "); strFechamentos.append(" from fechamento_deposito fdep "); strFechamentos.append(" join fechamento_cct_deposito fd on fd.fechamentodeposito_id = fdep.fechamentodeposito_id "); strFechamentos.append(" join fechamento_cntcorrente fc on fc.fechamentocntcorrente_id = fd.fechamentocntcorrente_id "); strFechamentos.append(" inner join PUNTO_VENTA pv on PV.PUNTOVENTA_ID = FC.PUNTOVENTA_ID "); strFechamentos.append(" join empresa_contabancaria ec on ec.EMPRESACONTABANCARIA_ID = fdep.EMPRESACONTABANCARIA_ID "); strFechamentos.append(" join INSTI_FINANCEIRA if on if.INSTIFINANCEIRA_ID = EC.INSTIFINANCEIRA_ID "); strFechamentos.append(" join EMPRESA e on e.empresa_id = fc.empresa_id "); strFechamentos.append(" where trunc(fdep.feccreacion) = :fecha and fd.activo = 1 and fc.activo = 1 and fdep.activo = 1 "); adicionaFiltroQuery(puntoventaId, strFechamentos, " and fc.puntoventa_id = ", puntoventaId != null && !puntoventaId.equals(-1)); adicionaFiltroQuery(empresaId, strFechamentos, " and fc.empresa_id = ", empresaId != null); strFechamentos.append(" group by fdep.numdeposito, fdep.feccreacion, fdep.fecha_deposito, fc.empresa_id, pv.numpuntoventa, ec.numagencia, ec.numconta, if.CODIGO, ec.numintegracion "); Date fecha = fechaParam; if (fechaParam == null) { fecha = getData(); } PreparedStatement pstmtFechamentos = null; ResultSet rsFechamentos = null; BigDecimal soma = BigDecimal.ZERO; try { pstmtFechamentos = getConnection().prepareStatement(strFechamentos.toString()); pstmtFechamentos.setDate(1, new java.sql.Date(fecha.getTime())); rsFechamentos = pstmtFechamentos.executeQuery(); while (rsFechamentos.next()) { Integer empId = null; String banco = ""; String agencia = ""; String contaCorrente = ""; String numDep = " Dep: " + rsFechamentos.getString(2); String codRecDesp = null; String numpuntoventa = rsFechamentos.getString(5); if (empId == null) { empId = rsFechamentos.getInt(4); } if (banco.isEmpty()) { banco = "Bco: " + StringUtils.leftPad(rsFechamentos.getString(8), 3, "0"); } if (agencia.isEmpty()) { agencia = " Ag: " + rsFechamentos.getString(6); } if (contaCorrente.isEmpty()) { contaCorrente = " C/C: " + rsFechamentos.getString(7); } if (codRecDesp == null) { codRecDesp = rsFechamentos.getString(9); } DespesaReceita deposito = new DespesaReceita(); deposito.setCodigoEmpresa(empId); deposito.setDataLancamento(rsFechamentos.getDate(10)); deposito.setDataMovimento(rsFechamentos.getDate(3)); deposito.setLocalArrecadacao(numpuntoventa); deposito.setValorLancamento(df.format(rsFechamentos.getBigDecimal(1))); deposito.setIdentificadorReceitaDespesa("D"); deposito.setCodigoReceitaDespesa(codRecDesp); deposito.setDescricaoDetalhada(banco + agencia + contaCorrente + numDep); depositos.add(deposito); soma = soma.add(rsFechamentos.getBigDecimal(1)); } log.debug("Total depósitos: " + soma); } catch (Exception e) { log.error(e.getMessage(), e); } finally { try { pstmtFechamentos.close(); } catch (Exception ignore) { log.error(ignore.getMessage(), ignore); } try { rsFechamentos.close(); } catch (Exception ignore) { log.error(ignore.getMessage(), ignore); } } return depositos; } public Integer getCodigoReceitaDespesaGlobus() { StringBuilder sb = new StringBuilder(); sb.append("Select valorconstante from constante where nombconstante = 'CODIGO_RECEITA_DESPESA_GLOBUS' "); PreparedStatement pstmt = null; ResultSet rs = null; Integer result = null; try { pstmt = getConnection().prepareStatement(sb.toString()); rs = pstmt.executeQuery(); if (rs.next()) { result = rs.getInt(1); } } catch (Exception e) { log.error(e.getMessage(), e); } finally { try { rs.close(); } catch (Exception ignore) { log.error(ignore.getMessage(), ignore); } try { pstmt.close(); } catch (Exception ignore) { log.error(ignore.getMessage(), ignore); } } return result; } public Boolean isConstanteBloqueioMenorQueData(Integer empresaId, Date data) { StringBuilder sb = new StringBuilder(); sb.append("Select valorconstante from constante where nombconstante = 'DATA_LIMITE_EDICAO_DEPOSITO_" + empresaId + "'"); PreparedStatement pstmt = null; ResultSet rs = null; Boolean result = null; try { pstmt = getConnection().prepareStatement(sb.toString()); rs = pstmt.executeQuery(); if (rs.next()) { Date rsDate = new SimpleDateFormat("dd/MM/yyyy").parse(rs.getString(1)); result = !rsDate.after(data); } else { // se não existir a constante, retorno true para que ela seja criada na função updateDataBloqueio result = true; } } catch (Exception e) { log.error(e.getMessage(), e); } finally { try { rs.close(); } catch (Exception ignore) { log.error(ignore.getMessage(), ignore); } try { pstmt.close(); } catch (Exception ignore) { log.error(ignore.getMessage(), ignore); } } return result; } public void updateDataBloqueio(Integer empresaId, Date data) { StringBuilder sb = new StringBuilder(); PreparedStatement pstmt = null; SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); try { if (!getConnection().prepareStatement("Select valorconstante from constante where nombconstante = 'DATA_LIMITE_EDICAO_DEPOSITO_" + empresaId + "'").executeQuery().next()) { sb.append("insert into constante values (constante_seq.nextval, 'DATA_LIMITE_EDICAO_DEPOSITO_" + empresaId + "', 'DATA_LIMITE_EDICAO_DEPOSITO_" + empresaId + "',1," + "'" + sdf.format(data) + "', 1, 1, :datamodif, 1)"); pstmt = getConnection().prepareStatement(sb.toString()); pstmt.setDate(1, new java.sql.Date(new Date().getTime())); } else { sb.append("update constante set valorconstante = :valor where nombconstante = 'DATA_LIMITE_EDICAO_DEPOSITO_" + empresaId + "'"); pstmt = getConnection().prepareStatement(sb.toString()); pstmt.setString(1, sdf.format(data)); } pstmt.executeUpdate(); } catch (Exception e) { log.error(e.getMessage(), e); } finally { try { pstmt.close(); } catch (Exception ignore) { log.error(ignore.getMessage(), ignore); } } } private Date getData() { Calendar cal = Calendar.getInstance(); cal.set(2015, 10, 13); cal.setTime(new Date()); cal.add(Calendar.DAY_OF_MONTH, DAYS_AGO); return cal.getTime(); } public List getPontosVenda() { return pontosVenda; } public void setPontosVenda(List pontosVenda) { this.pontosVenda = pontosVenda; } public List getEmpresas() { return empresas; } public void setEmpresas(List empresas) { this.empresas = empresas; } }