package com.rjconsultores.ventaboletos.dao.hibernate; import java.util.Date; import java.util.List; import org.hibernate.Query; import org.hibernate.SessionFactory; import org.hibernate.transform.AliasToBeanResultTransformer; import org.hibernate.type.BigDecimalType; import org.hibernate.type.IntegerType; import org.hibernate.type.LongType; import org.hibernate.type.StringType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Repository; import com.rjconsultores.ventaboletos.dao.FiscalDAO; import com.rjconsultores.ventaboletos.entidad.EsquemaCorrida; import com.rjconsultores.ventaboletos.utilerias.DateUtil; import com.rjconsultores.ventaboletos.vo.impressaofiscal.ImportacionFiscalReducaoZVO; import com.rjconsultores.ventaboletos.vo.impressaofiscal.ImportacionManualFiscalVO; import com.rjconsultores.ventaboletos.vo.impressaofiscal.SituacaoTributaria; @Repository("fiscalDAO") public class FiscalHibernateDAO extends GenericHibernateDAO implements FiscalDAO { public static final String DATE_FORMAT_FISCAL = "yyyyMMdd"; @Autowired public FiscalHibernateDAO(@Qualifier("sessionFactory") SessionFactory factory) { setSessionFactory(factory); } @Override public List buscaDatosFiscaisECFManual(Date inicio, Date fim, Integer empresaId) { StringBuilder sql = new StringBuilder(); sql.append("select r4.numserie20 as numImpressora, "); sql.append(" coalesce(r4.coo, b.numfoliopreimpreso) as coo, "); sql.append(" b.boleto_id as boletoId, "); sql.append(" b.marca_id as empresaId, "); sql.append(" e.nombempresa as empresa, "); sql.append(" to_char(b.fechorventa, 'yyyyMMdd') as dataEmissao, "); sql.append(" b.preciopagado as valorTotal, "); sql.append(" co.codibge as origenId, "); sql.append(" eo.cveestado as origenUf, "); sql.append(" cd.codibge as destinoId, "); sql.append(" ed.cveestado as destinoUf, "); sql.append(" r5.totparcial as repTributado, "); sql.append(" b.preciopagado as valorItem, "); sql.append(" r5.tipopassagem as tipoPassagem, "); sql.append(" r5.numitem as numItem, "); sql.append(" r5.codproduto as codProduto, "); sql.append(" b.numseriepreimpresa as serie, "); sql.append(" eio.icms as icms, "); sql.append(" eio.porctributo as porctributo, "); sql.append(" eo.estado_id as estadoIdOrigen, "); sql.append(" ed.estado_id as estadoIdDestino, "); sql.append(" subserie as subSerie, "); sql.append(" docfiscal as aidf, "); sql.append(" fi.numserie as numpdv,"); sql.append(" fi.modelo as modeloImpressora,"); sql.append(" r4.usuario_id as numCaixa,"); sql.append(" case b.importetaxaembarque when 0 then null else b.importetaxaembarque "); sql.append(" end as importetaxaembarque, "); sql.append(" case b.importepedagio when 0 then null else b.importepedagio "); sql.append(" end as importepedagio, "); sql.append(" case b.importeoutros when 0 then null else b.importeoutros "); sql.append(" end as importeoutros, "); sql.append(" case b.importeseguro when 0 then null else b.importeseguro "); sql.append(" end as importeseguro "); sql.append("from boleto b "); sql.append(" left join fiscal_r4 r4 on b.boleto_id = r4.boleto_id "); sql.append(" left outer join fiscal_r5 r5 on r4.numserie20 = r5.numserie20 "); sql.append(" and r4.coo = r5.coo "); sql.append(" left outer join fiscal_impressora fi on fi.numserie20 = r4.numserie20 "); sql.append(" inner join empresa e on e.empresa_id = b.marca_id "); sql.append(" left join alias_servico ase ON ase.origen_id = b.origen_id "); sql.append(" and ase.destino_id = b.destino_id and ase.ruta_id = b.ruta_id "); sql.append(" left join parada o on coalesce(ase.aliasorigen_id, b.origen_id) = o.parada_id "); sql.append(" left join ciudad co on o.ciudad_id = co.ciudad_id "); sql.append(" left join estado eo on co.estado_id = eo.estado_id "); sql.append(" left join empresa_imposto eio on eo.estado_id = eio.estado_id "); sql.append(" and eio.activo = 1 "); sql.append(" and b.marca_id = eio.empresa_id "); sql.append(" left join parada d on coalesce(ase.aliasdestino_id, b.destino_id) = d.parada_id "); sql.append(" left join ciudad cd on d.ciudad_id = cd.ciudad_id "); sql.append(" left join estado ed on cd.estado_id = ed.estado_id "); sql.append(" left join aidf a on a.serie = b.numseriepreimpresa "); sql.append(" and eo.estado_id = a.estado_id "); sql.append(" and a.empresa_id = e.empresa_id "); sql.append("WHERE b.marca_id = :empresaId "); sql.append(" AND b.fechorventa BETWEEN :datIni AND :datFim "); sql.append(" AND b.tipoventa_id = 3"); sql.append("GROUP BY r4.numserie20, "); sql.append(" COALESCE(r4.coo, b.numfoliopreimpreso), "); sql.append(" b.boleto_id, "); sql.append(" b.marca_id, "); sql.append(" e.nombempresa, "); sql.append(" TO_CHAR(b.fechorventa, 'yyyyMMdd'), "); sql.append(" b.preciopagado, "); sql.append(" co.codibge, "); sql.append(" cd.codibge, "); sql.append(" r5.totparcial, "); sql.append(" b.preciopagado, "); sql.append(" r5.tipopassagem, "); sql.append(" r5.numitem, "); sql.append(" r5.codproduto, "); sql.append(" b.numseriepreimpresa, "); sql.append(" eio.icms, "); sql.append(" eio.porctributo, "); sql.append(" eo.estado_id, "); sql.append(" ed.estado_id, "); sql.append(" subserie, "); sql.append(" docfiscal, "); sql.append(" b.importetaxaembarque, "); sql.append(" b.importepedagio, "); sql.append(" b.importeoutros, "); sql.append(" b.importeseguro, "); sql.append(" fi.numserie, "); sql.append(" fi.modelo, "); sql.append(" r4.usuario_id, "); sql.append(" eo.cveestado, "); sql.append(" ed.cveestado "); Query query = getSession().createSQLQuery(sql.toString()) .addScalar("numImpressora", StringType.INSTANCE) .addScalar("coo", StringType.INSTANCE) .addScalar("boletoId", LongType.INSTANCE) .addScalar("origenId", IntegerType.INSTANCE) .addScalar("empresaId", IntegerType.INSTANCE) .addScalar("dataEmissao", StringType.INSTANCE) .addScalar("valorTotal", BigDecimalType.INSTANCE) .addScalar("origenId", IntegerType.INSTANCE) .addScalar("destinoId", IntegerType.INSTANCE) .addScalar("repTributado", StringType.INSTANCE) .addScalar("valorItem", BigDecimalType.INSTANCE) .addScalar("tipoPassagem", StringType.INSTANCE) .addScalar("numItem", StringType.INSTANCE) .addScalar("codProduto", StringType.INSTANCE) .addScalar("serie", StringType.INSTANCE) .addScalar("icms", BigDecimalType.INSTANCE) .addScalar("porctributo", BigDecimalType.INSTANCE) .addScalar("estadoIdOrigen", IntegerType.INSTANCE) .addScalar("estadoIdDestino", IntegerType.INSTANCE) .addScalar("importetaxaembarque", BigDecimalType.INSTANCE) .addScalar("importepedagio", BigDecimalType.INSTANCE) .addScalar("importeoutros", BigDecimalType.INSTANCE) .addScalar("importeseguro", BigDecimalType.INSTANCE) .addScalar("subSerie", StringType.INSTANCE) .addScalar("aidf", StringType.INSTANCE) .addScalar("numpdv", StringType.INSTANCE) .addScalar("modeloImpressora", StringType.INSTANCE) .addScalar("numCaixa", StringType.INSTANCE) .addScalar("origenUf", StringType.INSTANCE) .addScalar("destinoUf", StringType.INSTANCE); query.setResultTransformer(new AliasToBeanResultTransformer(ImportacionManualFiscalVO.class)); query.setInteger("empresaId", empresaId); query.setTimestamp("datIni", inicio); query.setTimestamp("datFim", fim); return query.list(); } @Override public List buscaDatosFiscaisReducaoZ(Date inicio, Date fim, Integer empresaId) { StringBuilder sql = new StringBuilder(); sql.append("SELECT r2.datamov AS datamov, "); sql.append(" r2.numreducoes AS numreducoes, "); sql.append(" r2.crz AS crz, "); sql.append(" r2.numserie20 AS numserie20, "); sql.append(" r2.coo AS coo, "); sql.append(" r2.cooinicial AS cooinicial, "); sql.append(" r2.coofinal AS coofinal, "); sql.append(" r2.vendabrutadiaria AS vendabrutadiaria, "); sql.append(" r2.datareducao AS datareducao, "); sql.append(" r2.horareducao AS horareducao, "); sql.append(" r3.totparcial AS aliquota, "); sql.append(" r3.valoracumulado AS imposto, "); sql.append(" ifi.numserie AS numpdv, "); sql.append(" e.cnpj AS cnpj, "); sql.append(" r2.totgeral AS gtFinal, "); sql.append(" anterior.totgeral AS gtInicial "); sql.append("FROM fiscal_r2 r2 "); sql.append(" inner join fiscal_r3 r3 "); sql.append(" ON r3.crz = r2.crz "); sql.append(" AND r2.numserie20 = r3.numserie20 "); sql.append(" AND r3.datamov = r2.datamov "); sql.append(" inner join fiscal_impressora ifi "); sql.append(" ON ifi.numserie20 = r2.numserie20 "); sql.append(" inner join fiscal_t2 t2 "); sql.append(" ON ifi.fiscalimpressora_id = t2.fiscalimpressora_id "); sql.append(" inner join empresa e "); sql.append(" ON TRANSLATE(t2.cnpj, ' / - . ', ' ') = e.cnpj, "); sql.append(" (SELECT numserie20, crz, totgeral "); sql.append(" FROM fiscal_r2) anterior "); sql.append("WHERE r2.datamov BETWEEN :datIni AND :datFim "); sql.append(" AND e.empresa_id = :empresaId "); sql.append(" AND r3.totparcial not in ("); sql.append("'" + SituacaoTributaria.CANCELADO.getValue() + "'").append(", "); sql.append("'" + SituacaoTributaria.DESCRITIVO.getValue() + "'").append(", "); sql.append("'" + SituacaoTributaria.OPCIONAL.getValue() + "'").append(")"); sql.append(" AND anterior.numserie20 = r2.numserie20 "); sql.append(" AND anterior.crz = r2.crz - 1 "); sql.append("GROUP BY r2.datamov, "); sql.append(" r2.numreducoes, "); sql.append(" r2.crz, "); sql.append(" r2.numserie20, "); sql.append(" r2.coo, "); sql.append(" r2.cooinicial, "); sql.append(" r2.coofinal, "); sql.append(" r2.vendabrutadiaria, "); sql.append(" r2.datareducao, "); sql.append(" r2.horareducao, "); sql.append(" r3.totparcial, "); sql.append(" r3.valoracumulado, "); sql.append(" ifi.numserie, "); sql.append(" e.cnpj, "); sql.append(" r2.totgeral, "); sql.append(" anterior.totgeral "); sql.append("ORDER BY r2.datamov, "); sql.append(" numserie20, "); sql.append(" crz, "); sql.append(" r2.numreducoes, "); sql.append(" r3.totparcial"); Query query = getSession().createSQLQuery(sql.toString()) .addScalar("datamov", StringType.INSTANCE) .addScalar("numreducoes", StringType.INSTANCE) .addScalar("crz", StringType.INSTANCE) .addScalar("numserie20", StringType.INSTANCE) .addScalar("coo", StringType.INSTANCE) .addScalar("cooinicial", StringType.INSTANCE) .addScalar("coofinal", StringType.INSTANCE) .addScalar("vendabrutadiaria", BigDecimalType.INSTANCE) .addScalar("datareducao", StringType.INSTANCE) .addScalar("horareducao", StringType.INSTANCE) .addScalar("aliquota", StringType.INSTANCE) .addScalar("imposto", BigDecimalType.INSTANCE) .addScalar("numpdv", StringType.INSTANCE) .addScalar("cnpj", StringType.INSTANCE) .addScalar("gtFinal", BigDecimalType.INSTANCE) .addScalar("gtInicial", BigDecimalType.INSTANCE); query.setResultTransformer(new AliasToBeanResultTransformer(ImportacionFiscalReducaoZVO.class)); query.setInteger("empresaId", empresaId); query.setString("datIni", DateUtil.getStringDate(inicio, DATE_FORMAT_FISCAL)); query.setString("datFim", DateUtil.getStringDate(fim, DATE_FORMAT_FISCAL)); return query.list(); } @Override public String sqlFiscaisECF(Date inicio, Date fim, Integer empresaId) { StringBuilder sql = new StringBuilder(); sql.append("SELECT r4.numserie20 as numImpressora, "); sql.append(" r4.coo as coo, "); sql.append(" r4.imptotalliquido as valorTotal, "); sql.append(" r4.datainicialemissao as dataEmissao, "); sql.append(" r4.cpfcnpjcliente as cnpjCliente, "); sql.append(" b.boleto_id as boletoId, "); sql.append(" b.marca_id as empresaId, "); sql.append(" co.codibge as origenId, "); sql.append(" eo.cveestado as origenUf, "); sql.append(" cd.codibge as destinoId, "); sql.append(" ed.cveestado as destinoUf, "); sql.append(" fi.numcnpj as cnpjImpressora, "); sql.append(" fi.numserie as numpdv, "); sql.append(" r5.totparcial as repTributado, "); sql.append(" r5.imptotalliquido as valorItem, "); sql.append(" r5.tipopassagem as tipoPassagem, "); sql.append(" r5.numitem as numItem, "); sql.append(" r5.codproduto as codProduto, "); sql.append(" fi.modelo as modeloImpressora, "); sql.append(" r4.usuario_id as numCaixa, "); sql.append(" ml2.valortarifa as valorTarifa, "); sql.append(" ml2.pedagio as valorPedagio, "); sql.append(" ml2.taxaembarque as valorEmbarque "); sql.append(" FROM fiscal_r4 r4 "); sql.append(" INNER JOIN fiscal_r5 r5 ON r4.numserie20 = r5.numserie20 AND r4.coo = r5.coo "); sql.append(" AND r4.datamov = r5.datamov AND r4.contador = r5.contador "); sql.append(" INNER JOIN fiscal_impressora fi ON fi.numserie20 = r4.numserie20 "); sql.append(" AND fi.fiscalimpressora_id = r5.fiscalimpressora_id "); sql.append(" INNER JOIN fiscal_ml2 ml2 ON ml2.boleto_id = r4.boleto_id "); sql.append(" INNER JOIN boleto b ON b.boleto_id = r4.boleto_id "); // sql.append(" INNER JOIN boleto b ON b.boleto_id = r4.boleto_id AND r4.empresa_id = b.marca_id "); sql.append(" LEFT JOIN alias_servico ase ON ase.origen_id = b.origen_id "); sql.append(" and ase.destino_id = b.destino_id and ase.ruta_id = b.ruta_id "); sql.append(" INNER JOIN parada o ON coalesce(ase.aliasorigen_id, b.origen_id) = o.parada_id "); sql.append(" INNER JOIN ciudad co ON o.ciudad_id = co.ciudad_id "); sql.append(" INNER JOIN estado eo ON eo.estado_id = co.estado_id "); sql.append(" INNER JOIN parada d ON coalesce(ase.aliasdestino_id, b.destino_id) = d.parada_id "); sql.append(" INNER JOIN ciudad cd ON d.ciudad_id = cd.ciudad_id "); sql.append(" INNER JOIN estado ed ON ed.estado_id = cd.estado_id "); sql.append(" WHERE r4.datamov BETWEEN ? AND ? "); sql.append(" AND b.marca_id = ? "); sql.append(" GROUP BY r4.numserie20, "); sql.append(" r4.coo, "); sql.append(" r4.datainicialemissao, "); sql.append(" r4.cpfcnpjcliente, "); sql.append(" r4.imptotalliquido, "); sql.append(" b.boleto_id, "); sql.append(" b.marca_id, "); sql.append(" co.codibge, "); sql.append(" cd.codibge, "); sql.append(" fi.numcnpj, "); sql.append(" fi.numserie, "); sql.append(" r5.impdesconto, "); sql.append(" r5.totparcial, "); sql.append(" r5.imptotalliquido, "); sql.append(" r5.tipopassagem, "); sql.append(" r5.numitem, "); sql.append(" r5.codproduto, "); sql.append(" fi.modelo, "); sql.append(" r4.usuario_id, "); sql.append(" eo.cveestado, "); sql.append(" ed.cveestado, "); sql.append(" ml2.valortarifa, "); sql.append(" ml2.pedagio, "); sql.append(" ml2.taxaembarque "); sql.append(" ORDER BY r4.numserie20, "); sql.append(" r4.coo, "); sql.append(" r4.datainicialemissao "); return sql.toString(); } private int gerarRegistroP2(List lsEsquemaCorrida, Date dataDe, Date dataAte) { Integer[] idsCorrida = getIdsCorrida(lsEsquemaCorrida); StringBuilder sb = new StringBuilder(""); sb.append(" INSERT INTO FISCAL_P2 (CODPRODUTO,descricao,valorunitario_ta,valorunitario_tx,valorunitario_pe,valorunitario_ot,valorunitario_se,empresa_id,estado_origem,estado_aliascorrida,estado_aliasgeral) "); sb.append(" "); sb.append(" select DISTINCT "); sb.append(" CODPRODUTO(t.origen_id , t.destino_id , rc.ruta_id) AS CODPRODUTO, "); sb.append(" t.desctramo as descricao, "); sb.append(" tr.precio as valorunitario_ta, "); sb.append(" tr.importetaxaembarque as valorunitario_tx, "); sb.append(" tr.importepedagio as valorunitario_pe, "); sb.append(" tr.importeoutros as valorunitario_ot, "); sb.append(" tr.importeseguro as valorunitario_se, "); sb.append(" c.empresacorrida_id as empresa_id, "); sb.append(" co.estado_id as estado_origem, "); sb.append(" cas1.estado_id as estado_aliascorrida, "); sb.append(" cas2.estado_id as estado_aliasgeral "); sb.append(" "); sb.append(" from "); sb.append(" ruta_combinacion rc "); sb.append(" inner join tramo t on t.tramo_id = rc.tramo_id "); sb.append(" inner join parada po on po.parada_id = t.origen_id "); sb.append(" inner join parada pd on pd.parada_id = t.destino_id "); sb.append(" inner join corrida c on c.ruta_id = rc.ruta_id "); sb.append(" inner join corrida_tramo cto on cto.corrida_id = c.corrida_id and cto.feccorrida = c.feccorrida and t.origen_id = cto.origen_id "); sb.append(" inner join corrida_tramo ctd on ctd.corrida_id = c.corrida_id and ctd.feccorrida = c.feccorrida and t.destino_id = ctd.destino_id "); sb.append(" inner join tarifa tr on tr.ruta_id = rc.ruta_id and tr.origen_id = t.origen_id and tr.destino_id = t.destino_id "); sb.append(" inner join vigencia_tarifa vt on vt.vigenciatarifa_id = tr.vigenciatarifa_id "); sb.append(" inner join ciudad co on co.ciudad_id = po.ciudad_id "); sb.append(" left join alias_servico as1 on as1.corrida_id = as1.corrida_id and as1.origen_id = t.origen_id and as1.destino_id = t.destino_id and as1.ruta_id = rc.ruta_id "); sb.append(" left join parada pas1 on pas1.parada_id = as1.aliasorigen_id "); sb.append(" left join ciudad cas1 on cas1.ciudad_id = pas1.ciudad_id "); sb.append(" left join alias_servico as2 on as2.corrida_id is null and as2.origen_id = t.origen_id and as2.destino_id = t.destino_id and as2.ruta_id = rc.ruta_id "); sb.append(" left join parada pas2 on pas2.parada_id = as2.aliasorigen_id "); sb.append(" left join ciudad cas2 on cas2.ciudad_id = pas2.ciudad_id "); sb.append(" where "); sb.append(" rc.activo = 1 "); sb.append(" and cto.activo = 1 "); sb.append(" and ctd.activo = 1 "); sb.append(" and tr.activo = 1 "); sb.append(" and cto.fechorsalida between vt.feciniciovigencia and vt.fecfinvigencia "); sb.append(" and c.feccorrida between :datIni and :datFim "); sb.append(" and c.corrida_id in (:corridaId) "); sb.append(" and ROWNUM < 2 "); Query query = getSession().createSQLQuery(sb.toString()); query.setParameterList("corridaId", idsCorrida); query.setDate("datIni", new java.sql.Date(dataDe.getTime())); query.setDate("datFim", new java.sql.Date(dataAte.getTime())); return query.executeUpdate(); } private Integer[] getIdsCorrida(List lsEsquemaCorrida) { Integer[] idsCorrida = new Integer[lsEsquemaCorrida.size()]; int i = 0; for (EsquemaCorrida ec : lsEsquemaCorrida) { idsCorrida[i] = ec.getNumCorrida(); i++; } return idsCorrida; } private int gerarRegistroF2(List lsEsquemaCorrida, Date dataDe, Date dataAte) { StringBuilder sb = new StringBuilder(""); sb.append(" INSERT INTO FISCAL_F2 (cnpj, codigo_local_emissao,identificacao_linha, descricao_linha, data_partida, hora_partida, codigo_tipo_viagem) "); sb.append(" select distinct oc.cnpj, t.origen_id as codigo_local_emissao, r.prefixo as identificacao_linha, r.descruta as descricao_linha, to_char(cto.fechorsalida, 'YYYYMMdd') as data_partida, to_char(cto.fechorsalida, 'hh24miss') as hora_partida, (case nvl(c.tiposervicio_id, 0) when 2 then '01' else '00' end) as codigo_tipo_viagem "); sb.append(" from "); sb.append(" ruta_combinacion rc "); sb.append(" inner join ruta r on r.ruta_id = rc.ruta_id "); sb.append(" inner join orgao_concedente oc on oc.orgaoconcedente_id = r.orgaoconcedente_id "); sb.append(" inner join tramo t on t.tramo_id = rc.tramo_id "); sb.append(" inner join parada po on po.parada_id = t.origen_id "); sb.append(" inner join parada pd on pd.parada_id = t.destino_id "); sb.append(" inner join corrida c on c.ruta_id = rc.ruta_id "); sb.append(" inner join corrida_tramo cto on cto.corrida_id = c.corrida_id and cto.feccorrida = c.feccorrida and t.origen_id = cto.origen_id "); sb.append(" inner join corrida_tramo ctd on ctd.corrida_id = c.corrida_id and ctd.feccorrida = c.feccorrida and t.destino_id = ctd.destino_id "); sb.append(" inner join tarifa tr on tr.ruta_id = rc.ruta_id and tr.origen_id = t.origen_id and tr.destino_id = t.destino_id "); sb.append(" inner join vigencia_tarifa vt on vt.vigenciatarifa_id = tr.vigenciatarifa_id "); sb.append(" inner join punto_venta pv on pv.empresa_id = c.empresacorrida_id "); sb.append(" where "); sb.append(" rc.activo = 1 "); sb.append(" and cto.activo = 1 "); sb.append(" and ctd.activo = 1 "); sb.append(" and cto.fechorsalida between vt.feciniciovigencia and vt.fecfinvigencia "); sb.append(" and c.feccorrida between :datIni and :datFim "); sb.append(" and c.corrida_id in (:corridaId) "); sb.append(" and ROWNUM < 2 "); Integer[] idsCorrida = getIdsCorrida(lsEsquemaCorrida); Query query = getSession().createSQLQuery(sb.toString()); query.setParameterList("corridaId", idsCorrida); query.setDate("datIni", new java.sql.Date(dataDe.getTime())); query.setDate("datFim", new java.sql.Date(dataAte.getTime())); return query.executeUpdate(); } @Override public int gerarRegistroP2_F2(List lsEsquemaCorrida, Date dataDe, Date dataAte) { int gerarRegistroP2 = this.gerarRegistroP2(lsEsquemaCorrida, dataDe, dataAte); int gerarRegistroF2 = this.gerarRegistroF2(lsEsquemaCorrida, dataDe, dataAte); return gerarRegistroP2 + gerarRegistroF2; } }