package com.rjconsultores.ventaboletos.dao.hibernate; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import java.util.List; import java.util.Map; import org.hibernate.Query; import org.hibernate.SQLQuery; import org.hibernate.SessionFactory; import org.hibernate.transform.Transformers; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Repository; import com.rjconsultores.ventaboletos.dao.TarifaOficialDAO; import com.rjconsultores.ventaboletos.dao.sqlbuilder.SQLBuilder; import com.rjconsultores.ventaboletos.entidad.Empresa; import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente; import com.rjconsultores.ventaboletos.entidad.Ruta; import com.rjconsultores.ventaboletos.entidad.TarifaOficial; import com.rjconsultores.ventaboletos.entidad.VigenciaTarifa; import com.rjconsultores.ventaboletos.utilerias.ApplicationProperties; @Repository("tarifaOficialDAO") public class TarifaOficialHibernateDAO extends GenericHibernateDAO implements TarifaOficialDAO { private static Logger log = LoggerFactory.getLogger(TarifaOficialHibernateDAO.class); @Autowired private SQLBuilder sqlBuilder; @Autowired public TarifaOficialHibernateDAO(@Qualifier("sessionFactory") SessionFactory factory) { setSessionFactory(factory); } @Override public Integer gerarTarifaPorCoeficiente(Integer rutaId, Integer usuarioId, Integer orgaoConcedenteId, List idsEmpresas) { String sql = sqlBuilder.getSQLGerarTarifaOficial(rutaId, usuarioId, orgaoConcedenteId, idsEmpresas); int qtd = getSession().createSQLQuery(sql).executeUpdate(); return qtd; } @Override public Integer gerarTarifaArtesp(Integer rutaId, Integer usuarioId, Integer orgaoConcedenteId, List idsEmpresas) { String sql = sqlBuilder.getSQLGerarTarifaOficialArtesp(rutaId, usuarioId, orgaoConcedenteId, idsEmpresas); int qtd = getSession().createSQLQuery(sql).executeUpdate(); return qtd; } @Override public Integer gerarTabelaZerada(Integer rutaId, Integer usuarioId, Integer orgaoConcedenteId, List idsEmpresas) { String sql = sqlBuilder.getSQLGerarTabelaZerada(rutaId, usuarioId, orgaoConcedenteId, idsEmpresas); int qtd = getSession().createSQLQuery(sql).executeUpdate(); return qtd; } @Override public Integer atualizarTarifaCoeficiente(Integer rutaId, Integer usuarioId, Integer orgaoConcedenteId) { String sql = sqlBuilder.getSQLAtualizarTarifaOficial(rutaId, usuarioId, orgaoConcedenteId); int qtd = getSession().createSQLQuery(sql).executeUpdate(); return qtd; } public void limparTarifasOficiais(List lsEmpresaSelected) { String query = "DELETE FROM TarifaOficial "; if (lsEmpresaSelected != null && !lsEmpresaSelected.isEmpty()) { query += "WHERE tarifaOficialId IN ( "; query += " SELECT t.tarifaOficialId FROM TarifaOficial t WHERE t.marca.empresa.empresaId IN ("; for (Empresa e : lsEmpresaSelected) { query += e.getEmpresaId() + ","; } query = query.substring(0, query.length() - 1); query += "))"; } Query q = getSession().createQuery(query); q.executeUpdate(); } private void apagarTarifasInativas(VigenciaTarifa vigenciaTarifa, Empresa empresa, OrgaoConcedente orgao) { StringBuilder sb = new StringBuilder(""); sb.append("select "); sb.append(" tar.tarifaId "); sb.append("from "); sb.append(" Tarifa tar,TarifaOficial tao "); sb.append("where "); sb.append(" tar.activo=0 "); sb.append(" and tao.activo = 1 "); sb.append(" and tar.tramo=tao.tramo "); sb.append(" and tar.marca=tao.marca "); sb.append(" and tar.claseServicio =tao.claseServicio "); sb.append(" and tar.moneda=tao.moneda "); sb.append(" and tar.orgaoConcedente=tao.orgaoConcedente "); sb.append(" and tar.ruta=tao.ruta "); sb.append(" and tar.vigenciaTarifa.vigenciatarifaId = :vigenciaId "); if (orgao != null) { sb.append(" and tar.orgaoConcedente = :orgao "); } if (empresa != null) { sb.append(" and tar.marca.empresa = :empresa "); } Query query = getSession().createQuery("DELETE FROM TarifaTipoptovta WHERE tarifa.tarifaId in (" + sb.toString() + ")"); query.setParameter("vigenciaId", vigenciaTarifa.getVigenciatarifaId()); if (orgao != null) { query.setParameter("orgao", orgao); } if (empresa != null) { query.setParameter("empresa", empresa); } int qtd = query.executeUpdate(); log.info("qtd TarifaTipoptovta apagada = " + qtd); query = getSession().createQuery("DELETE FROM TarifaCategoria WHERE tarifa.tarifaId in (" + sb.toString() + ")"); query.setParameter("vigenciaId", vigenciaTarifa.getVigenciatarifaId()); if (orgao != null) { query.setParameter("orgao", orgao); } if (empresa != null) { query.setParameter("empresa", empresa); } qtd = query.executeUpdate(); log.info("qtd TarifaCategoria apagada = " + qtd); query = getSession().createQuery("DELETE FROM Tarifa WHERE activo = 0 and tarifaId in (" + sb.toString() + ")"); query.setParameter("vigenciaId", vigenciaTarifa.getVigenciatarifaId()); if (orgao != null) { query.setParameter("orgao", orgao); } if (empresa != null) { query.setParameter("empresa", empresa); } qtd = query.executeUpdate(); log.info("qtd Tarifa apagada = " + qtd); } @SuppressWarnings("unchecked") @Override public void copiarParaTarifa(VigenciaTarifa vigenciaTarifa, Integer usuarioId, Boolean calculaPegagio, Boolean calculaTarifa, Boolean calculaTaxaEmbarque, Boolean calculaSeguro, Empresa empresa, OrgaoConcedente orgaoConcedente) { //Apago antes as tarifas que podem estar como activo =0 apagarTarifasInativas(vigenciaTarifa, empresa, orgaoConcedente); // Insiro as tarifas que não existem SQLQuery querySQL = getSession().createSQLQuery(sqlBuilder.getSQLInserirTarifaPelaTarifaOficial(vigenciaTarifa.getVigenciatarifaId(), usuarioId, empresa, orgaoConcedente)); querySQL.executeUpdate(); // Atualizo o preço e o componente dos preços que já existem querySQL = getSession().createSQLQuery(sqlBuilder.getSQLSelecionarTarifaPorTarifaOficalParaAtualizar(vigenciaTarifa.getVigenciatarifaId(), empresa, orgaoConcedente)); querySQL.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); List> dados = querySQL.list(); for (Map dado : dados) { querySQL = getSession().createSQLQuery(sqlBuilder.getSQLAtualizarTarifaPorTarifaOfical(dado, usuarioId, calculaPegagio, calculaTarifa, calculaTaxaEmbarque, calculaSeguro)); querySQL.executeUpdate(); } } @Override public void atualizarTaxaEmbarque(List lsRuta, Integer usuarioId, Integer orgaoConcedenteId, List idsEmpresas) { int x = 0; if (lsRuta != null && !lsRuta.isEmpty()) { x = lsRuta.size(); } do { Integer rutaId = null; if (lsRuta != null && !lsRuta.isEmpty()) { rutaId = lsRuta.get(x - 1).getRutaId(); } // Atualizo a taxa de embarque de acordo a parada e km SQLQuery query = getSession().createSQLQuery(sqlBuilder.getAtualizarTaxaEmbarquePorKmParada(rutaId, usuarioId, orgaoConcedenteId, idsEmpresas)); query.executeUpdate(); // Atualizo a taxa de embarque de acordo a km do orgao query = getSession().createSQLQuery(sqlBuilder.getSQLAtualizarTaxaEmbarquePorKmOrgao(rutaId, usuarioId, orgaoConcedenteId, idsEmpresas)); query.executeUpdate(); // Atualizo a taxa de embarque de acordo a parada e valor fixo query = getSession().createSQLQuery(sqlBuilder.getSQLAtualizarTaxaEmbarquePorParadaFixo(rutaId, usuarioId, orgaoConcedenteId, idsEmpresas)); query.executeUpdate(); x--; } while (x > 0); } @Override public void atualizarSeguroPorKm(Integer rutaId, Integer orgaoId, Integer usuarioId) { SQLQuery query = getSession().createSQLQuery(sqlBuilder.getSQLAtualizarSeguroPorKm(rutaId, usuarioId, orgaoId)); query.executeUpdate(); } @Override public void atualizarSeguroPorTarifa(Integer rutaId, Integer orgaoId, Integer usuarioId) { SQLQuery query = getSession().createSQLQuery(sqlBuilder.getSQLAtualizarSeguroPorTarifa(rutaId, usuarioId, orgaoId)); query.executeUpdate(); } @Override public long obtenerCount(List lsEmpresaSelected){ String query = " select count(*) from TarifaOficial "; if (lsEmpresaSelected != null && !lsEmpresaSelected.isEmpty()) { query += "WHERE tarifaOficialId IN ( "; query += " SELECT t.tarifaOficialId FROM TarifaOficial t WHERE t.marca.empresa.empresaId IN ("; for (Empresa e : lsEmpresaSelected) { query += e.getEmpresaId() + ","; } query = query.substring(0, query.length() - 1); query += "))"; } long qtd = 0; Query q = getSession().createQuery(query); qtd = (Long) q.list().get(0); return qtd; } @Override public void aplicarArredondamentoTarifa(Integer orgaoConcedenteId, Integer usuarioId, Boolean taxaEmbarque) { StringBuilder sql = new StringBuilder(); sql.append(" UPDATE TarifaOficial tao "); sql.append(" SET tao.precio = FN_ARREDONDAMENTO_TARIFA(tao.precio,tao.orgaoConcedente.orgaoConcedenteId,tao.importeseguro,tao.importetaxaembarque,tao.importepedagio,tao.importeoutros,:txEmbarque), "); sql.append(" tao.activo = true , "); sql.append(" tao.fecmodif= CURRENT_TIMESTAMP(), "); sql.append(" tao.usuarioId =:usuarioId "); if (orgaoConcedenteId != null) { sql.append(" WHERE tao.orgaoConcedente.orgaoConcedenteId = :orgao "); } Query query = getSession().createQuery(sql.toString()); if (orgaoConcedenteId != null) { query.setParameter("orgao", orgaoConcedenteId); } query.setInteger("txEmbarque", taxaEmbarque ? 1 : 0); query.setParameter("usuarioId", usuarioId); query.executeUpdate(); } @SuppressWarnings("deprecation") public void atualizarPedagio() { StringBuilder sql = new StringBuilder(); if (ApplicationProperties.getInstance().artespPedagioIdaVoltaDivPor2()) { sql.append(" merge into tarifa_oficial "); sql.append(" using "); sql.append(" ( "); sql.append(" WITH tarifas_ofic as ( "); sql.append(" select tarifaoficial_id, ORGAOCONCEDENTE_ID, ruta_id , origen_id , DESTINO_ID from tarifa_oficial where activo = 1"); sql.append(" ), "); sql.append(" noArtesp as (select p.destino_id dest, p.origen_id as orig , p.ruta_id as idruta ,p.orgaoconcedente_id as idorgao, "); sql.append(" p.importepeaje as importe , p.activo as actv from peaje p inner join tarifas_ofic tof on "); sql.append(" p.ORGAOCONCEDENTE_ID = tof.ORGAOCONCEDENTE_ID and p.ruta_id = tof.ruta_id "); sql.append(" and p.ORIGEN_ID = tof.ORIGEN_ID and p.DESTINO_ID = tof.DESTINO_ID and p.activo = 1), "); sql.append(" linha as ( select * from ruta where ruta_id in (select ruta_id from tarifas_ofic ) ) , "); sql.append(" linha_voltaId as (select ru.ruta_id rutavolta_id, t_1.ruta_id as ida from ruta ru "); sql.append(" inner join linha t_1 on ru.prefixo like t_1.prefixo "); sql.append(" and ru.orgaoconcedente_id = t_1.orgaoconcedente_id "); sql.append(" and ru.indsentidoIda <> t_1.indsentidoIda "); sql.append(" and ( (ru.numruta like t_1.numruta) or (ru.numruta like (to_char(to_Number(t_1.numruta)+1))) ) "); sql.append(" and ru.ruta_id <> t_1.ruta_id "); sql.append(" and ru.claseservicio_id = t_1.claseservicio_id "); sql.append(" where ru.activo = 1), "); sql.append(" artesp as ( "); sql.append(" SELECT * "); sql.append(" FROM peaje p "); sql.append(" INNER JOIN tarifas_ofic tof "); sql.append(" ON p.ORGAOCONCEDENTE_ID = tof.ORGAOCONCEDENTE_ID "); sql.append(" AND p.ruta_id = tof.ruta_id "); sql.append(" AND p.ORIGEN_ID = tof.ORIGEN_ID "); sql.append(" AND p.DESTINO_ID = tof.DESTINO_ID "); sql.append(" AND p.activo = 1 "); sql.append(" union "); sql.append(" SELECT * "); sql.append(" FROM peaje p "); sql.append(" INNER JOIN tarifas_ofic tof "); sql.append(" ON p.ORGAOCONCEDENTE_ID = tof.ORGAOCONCEDENTE_ID "); sql.append(" AND p.ruta_id = (select rutavolta_id from linha_voltaId where linha_voltaId.ida = tof.ruta_id) "); sql.append(" AND p.DESTINO_ID = tof.ORIGEN_ID "); sql.append(" AND p.ORIGEN_ID = tof.DESTINO_ID "); sql.append(" AND p.activo = 1 "); sql.append(" AND p.ruta_id = (select rutavolta_id from linha_voltaId where linha_voltaId.ida = tof.ruta_id) "); sql.append(" ) , "); sql.append(" resultado as ( "); sql.append(" select distinct tof.tarifaoficial_id tarifaoficial_id, tof.ruta_id as ruta, "); sql.append(" ( case tof.orgaoconcedente_id "); sql.append(" when 21 then ( select (sum(importepeaje)/2) from artesp ar where ar.tarifaoficial_id = tof.tarifaoficial_id ) "); sql.append(" else ( select distinct sum(noar.importe) from noArtesp noar where noar.idorgao = tof.ORGAOCONCEDENTE_ID and noar.idruta = tof.ruta_id "); sql.append(" and noar.ORIG = tof.ORIGEN_ID and noar.DEST = tof.DESTINO_ID and noar.actv = 1 ) "); sql.append(" end ) importepeaje from tarifas_ofic tof "); sql.append(" ), "); sql.append(" peaje_tarifas as ( select * from resultado ) "); sql.append(" select pf.tarifaoficial_id , sum(importepeaje) as soma from peaje_tarifas pf Group by pf.tarifaoficial_id "); sql.append(" "); sql.append(" ) tarifa_importe "); sql.append(" on (tarifa_oficial.tarifaoficial_id = tarifa_importe.tarifaoficial_id) "); sql.append(" when matched then "); sql.append(" update set "); sql.append(" importepedagio = tarifa_importe.soma "); }else{ sql.append(" merge into tarifa_oficial "); sql.append(" using "); sql.append(" ( "); sql.append(" WITH tarifas_ofic as ( "); sql.append(" select tarifaoficial_id, ORGAOCONCEDENTE_ID, ruta_id , origen_id , DESTINO_ID from tarifa_oficial "); sql.append(" ), "); sql.append(" peaje_tarifas as ( "); sql.append(" select * from peaje p inner join tarifas_ofic tof on "); sql.append(" p.ORGAOCONCEDENTE_ID = tof.ORGAOCONCEDENTE_ID and p.ruta_id = tof.ruta_id "); sql.append(" and p.ORIGEN_ID = tof.ORIGEN_ID and p.DESTINO_ID = tof.DESTINO_ID and p.activo = 1 "); sql.append(" ) "); sql.append(" select pf.tarifaoficial_id , sum(importepeaje) as soma from peaje_tarifas pf Group by pf.tarifaoficial_id "); sql.append(" "); sql.append(" ) tarifa_importe "); sql.append(" on (tarifa_oficial.tarifaoficial_id = tarifa_importe.tarifaoficial_id) "); sql.append(" when matched then "); sql.append(" update set "); sql.append(" importepedagio = tarifa_importe.soma "); } Connection conn = getSession().connection(); Statement stmt; try { stmt = conn.createStatement(); stmt.executeUpdate(sql.toString()); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }