/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.rjconsultores.ventaboletos.dao.hibernate; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.SQLQuery; import org.hibernate.SessionFactory; import org.hibernate.criterion.MatchMode; import org.hibernate.criterion.Order; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import org.hibernate.criterion.SimpleExpression; import org.hibernate.transform.AliasToBeanResultTransformer; 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.RutaDAO; import com.rjconsultores.ventaboletos.entidad.ClaseServicio; import com.rjconsultores.ventaboletos.entidad.Empresa; import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente; import com.rjconsultores.ventaboletos.entidad.Parada; import com.rjconsultores.ventaboletos.entidad.Ruta; import com.rjconsultores.ventaboletos.entidad.RutaSecuencia; import com.rjconsultores.ventaboletos.entidad.Tramo; import com.rjconsultores.ventaboletos.vo.ruta.RutaVO; /** * * @author Rafius */ @SuppressWarnings("unchecked") @Repository("rutaDAO") public class RutaHibernateDAO extends GenericHibernateDAO implements RutaDAO { @Autowired public RutaHibernateDAO(@Qualifier("sessionFactory") SessionFactory factory) { setSessionFactory(factory); } @Override public List obtenerTodos() { Criteria c = getSession().createCriteria(getPersistentClass()); c.add(Restrictions.eq("activo", Boolean.TRUE)); c.addOrder(Order.asc("descruta")); return c.list(); } public List buscarPorTramo(Tramo tramo) { Criteria c = getSession().createCriteria(getPersistentClass()); c.add(Restrictions.eq("activo", Boolean.TRUE)); Criteria cTipoPuntoVenta = c.createCriteria("rutaCombinacionList"); cTipoPuntoVenta.add(Restrictions.eq("tramo", tramo)); return c.list(); } @Override public List buscarPorRutaPorEmpresas(List lsEmpresas) { Criteria c = getSession().createCriteria(getPersistentClass()); c.add(Restrictions.eq("activo", Boolean.TRUE)); c.add(Restrictions.eq("indRutaCancelada", false)); Criteria cEmpresa = c.createCriteria("lsRutaEmpresa"); cEmpresa.add(Restrictions.in("empresa", lsEmpresas)); cEmpresa.add(Restrictions.eq("activo", Boolean.TRUE)); c.addOrder(Order.asc("descruta")); List l = c.list(); for (Ruta r : l) { r.getLsRutaEmpresa(); } return l; } public List buscarPorClaseServicio(ClaseServicio claseServicio) { Criteria c = getSession().createCriteria(getPersistentClass()); c.add(Restrictions.eq("activo", Boolean.TRUE)); c.add(Restrictions.eq("claseServicio", claseServicio)); c.addOrder(Order.asc("descruta")); return c.list(); } public List buscarPorClaseServicioEmpresa(ClaseServicio claseServicio, Empresa empresa) { StringBuffer hql = new StringBuffer(); hql.append("SELECT DISTINCT r "); hql.append("FROM Ruta r INNER JOIN r.lsRutaEmpresa re "); hql.append("WHERE r.claseServicio.claseservicioId = :idClaseServicio "); hql.append("AND re.empresa.empresaId = :idEmpresa "); hql.append("AND r.activo = 1 "); hql.append("ORDER BY r.descruta"); Query sq = getSession().createQuery(hql.toString()); sq.setParameter("idClaseServicio", claseServicio.getClaseservicioId()); sq.setParameter("idEmpresa", empresa.getEmpresaId()); List lsRuta = sq.list(); return lsRuta; } public List buscar(String nomeRuta, ClaseServicio claseServicio, Boolean nomeObrigatorio) { Criteria c = getSession().createCriteria(getPersistentClass()); c.add(Restrictions.eq("activo", Boolean.TRUE)); // c.add(Restrictions.eq("descruta", nomeRuta)); c.add(Restrictions.eq("claseServicio", claseServicio)); c.add(Restrictions.eq("indNombreObligatorio", nomeObrigatorio)); return c.list(); } public List obtenerPorEmpresa(Empresa empresa) { Criteria c = getSession().createCriteria(getPersistentClass()); c.add(Restrictions.eq("activo", Boolean.TRUE)); c.add(Restrictions.ne("rutaId", -1)); if (empresa.getEmpresaId() != -1) { c.createCriteria("lsRutaEmpresa").add(Restrictions.eq("empresa", empresa)).add(Restrictions.eq("activo", Boolean.TRUE)); } c.addOrder(Order.asc("descruta")); return c.list(); } @Override public Parada buscarOrigen(Ruta ruta) { Criteria c = this.getSession().createCriteria(RutaSecuencia.class); c.add(Restrictions.eq("activo", true)); c.add(Restrictions.eq("ruta", ruta)); c.addOrder(Order.asc("numsecuencia")); c.createAlias("tramo", "tramo") .setProjection(Projections.property("tramo.origem")); c.setMaxResults(1); return (Parada) c.uniqueResult(); } @Override public Parada buscarDestino(Ruta ruta) { Criteria c = this.getSession().createCriteria(RutaSecuencia.class); c.add(Restrictions.eq("activo", true)); c.add(Restrictions.eq("ruta", ruta)); c.addOrder(Order.desc("numsecuencia")); c.createAlias("tramo", "tramo") .setProjection(Projections.property("tramo.destino")); c.setMaxResults(1); return (Parada) c.uniqueResult(); } public List buscarTodosExceto(Integer... idRuta) { Criteria c = this.makeCriteria(); for (Integer id : idRuta) { c.add(Restrictions.ne("rutaId", id)); } c.add(Restrictions.eq("activo", Boolean.TRUE)); c.addOrder(Order.asc("descruta")); return c.list(); } public List buscarTodosEstos(Integer[] idRutas) { Criteria c = this.makeCriteria(); c.add(Restrictions.in("rutaId", idRutas)); c.add(Restrictions.eq("activo", Boolean.TRUE)); c.addOrder(Order.asc("descruta")); return c.list(); } public List buscarNumRuta(String numRuta) { Criteria c = getSession().createCriteria(getPersistentClass()); c.add(Restrictions.eq("activo", true)); c.add(Restrictions.eq("numRuta", numRuta)); return c.list(); } public List buscaRuta(String palavraPesquisaRuta) { return buscaRuta(palavraPesquisaRuta, null); } @Override public List buscaRuta(String palavraPesquisaRuta, OrgaoConcedente orgao) { StringBuilder hql = new StringBuilder(); hql.append(" FROM Ruta r"); hql.append(" WHERE (lower(descruta) like :palavraPesquisaRuta "); hql.append(" OR lower(prefixo) like :palavraPesquisaRuta "); hql.append(" OR lower(str(numRuta)) like :palavraPesquisaRuta) and r.activo = 1 "); if (orgao != null) { hql.append(" AND r.orgaoConcedente.orgaoConcedenteId = :orgaoId "); } Query sq = getSession().createQuery(hql.toString()); sq.setParameter("palavraPesquisaRuta", palavraPesquisaRuta.toLowerCase() + '%'); if (orgao != null) { sq.setParameter("orgaoId", orgao.getOrgaoConcedenteId()); } return sq.list(); } @Override public List buscaRutaPorNumeroSemDadoRepetido(String palavraPesquisaRuta) { StringBuilder sql = new StringBuilder(); sql.append(" SELECT MAX(R.RUTA_ID) rutaId, "); sql.append(" R.NUMRUTA numRuta, MAX(R.PREFIXO) prefixo, "); sql.append(" MAX(R.DESCRUTA) descruta, "); sql.append(" MAX(ORGAO.DESCORGAO) orgaoConcedente "); sql.append(" FROM RUTA R "); sql.append(" INNER JOIN ORGAO_CONCEDENTE ORGAO ON R.ORGAOCONCEDENTE_ID = ORGAO.ORGAOCONCEDENTE_ID "); sql.append(" WHERE (LOWER(R.DESCRUTA) LIKE :palavraPesquisaRuta "); sql.append(" OR LOWER(R.PREFIXO) LIKE :palavraPesquisaRuta "); sql.append(" OR LOWER(R.NUMRUTA) LIKE :palavraPesquisaRuta) "); sql.append(" GROUP BY R.NUMRUTA "); SQLQuery qry = getSession().createSQLQuery(sql.toString()) .addScalar("rutaId", LongType.INSTANCE) .addScalar("numRuta", StringType.INSTANCE) .addScalar("prefixo", StringType.INSTANCE) .addScalar("descruta", StringType.INSTANCE) .addScalar("orgaoConcedente", StringType.INSTANCE); qry.setParameter("palavraPesquisaRuta", palavraPesquisaRuta.toLowerCase() + '%'); qry.setResultTransformer(new AliasToBeanResultTransformer(RutaVO.class)); return qry.list(); } public List buscaRutasFromOrgao(OrgaoConcedente orgao) { // busca rutas e pedágios StringBuffer hql = new StringBuffer(); hql.append("select distinct r FROM Ruta r left join r.rutaSecuenciaList rSeqList "); hql.append(" left join rSeqList.lsRutaCase casRutaList "); hql.append(" WHERE r.orgaoConcedente.orgaoConcedenteId = :orgaoId and r.activo = 1 and r.indRutaCancelada = 0 "); hql.append(" order by r.descruta "); Query sq = getSession().createQuery(hql.toString()); sq.setParameter("orgaoId", orgao.getOrgaoConcedenteId()); List lsRuta = sq.list(); return lsRuta; } public List buscaSomenteRutasFromOrgao(OrgaoConcedente orgao) { StringBuffer hql = new StringBuffer(); hql.append("select distinct r FROM Ruta r "); hql.append(" WHERE r.orgaoConcedente.orgaoConcedenteId = :orgaoId and r.activo = 1 and r.indRutaCancelada = 0 "); hql.append(" order by r.descruta "); Query sq = getSession().createQuery(hql.toString()); sq.setParameter("orgaoId", orgao.getOrgaoConcedenteId()); List lsRuta = sq.list(); return lsRuta; } @Override public List buscarRutasPorEmpresaOrgaoConcedente(Empresa empresa, OrgaoConcedente orgao) { Criteria c = getSession().createCriteria(getPersistentClass()); c.add(Restrictions.eq("activo", Boolean.TRUE)); c.add(Restrictions.ne("rutaId", -1)); if (empresa != null && empresa.getEmpresaId() != -1) { c.createCriteria("lsRutaEmpresa").add(Restrictions.eq("empresa", empresa)); } if (orgao != null && orgao.getOrgaoConcedenteId() != -1) { c.add(Restrictions.eq("orgaoConcedente", orgao)); } c.addOrder(Order.asc("descruta")); return c.list(); } @Override public List buscarRutasPorEmpresaOrgaoConcedenteParadaIds(Empresa empresa, OrgaoConcedente orgao, Integer[] lsParadaIds) { Criteria c = getSession().createCriteria(getPersistentClass()); c.add(Restrictions.eq("activo", Boolean.TRUE)); c.add(Restrictions.ne("rutaId", -1)); if (empresa != null && empresa.getEmpresaId() != -1) { c.createCriteria("lsRutaEmpresa").add(Restrictions.eq("empresa", empresa)); } if (orgao != null && orgao.getOrgaoConcedenteId() != -1) { c.add(Restrictions.eq("orgaoConcedente", orgao)); } Criteria rutaCombinacionList = c.createCriteria("rutaCombinacionList"); rutaCombinacionList.add(Restrictions.eq("activo", Boolean.TRUE)); Criteria tramo = rutaCombinacionList.createCriteria("tramo"); tramo.add(Restrictions.eq("activo", Boolean.TRUE)); Criteria parada = tramo.createCriteria("origem"); parada.add(Restrictions.in("paradaId", lsParadaIds)); c.addOrder(Order.asc("descruta")); c.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); return c.list(); } @Override public void updateAsientosVendibles(Ruta ruta, Tramo viejoTramo, Tramo nuevoTramo) { try { getSession().flush(); List qryList = new ArrayList(); StringBuilder qry = new StringBuilder(" update RUTA_COMBINACION set TRAMO_ID = :nuevoTramo, "); qry.append(" FECMODIF = SYSDATE, USUARIO_ID = :usuario where TRAMO_ID = :viejoTramo and RUTA_ID = :ruta "); qry.append(" AND ACTIVO = 1 "); qryList.add(qry.toString()); qry = new StringBuilder(" update RUTA_SECUENCIA set TRAMO_ID = :nuevoTramo, "); qry.append(" FECMODIF = SYSDATE, USUARIO_ID = :usuario where TRAMO_ID = :viejoTramo and RUTA_ID = :ruta "); qry.append(" AND ACTIVO = 1 "); qryList.add(qry.toString()); for (String strQuery : qryList) { Query query = getSession().createSQLQuery(strQuery); query.setInteger("viejoTramo", viejoTramo.getTramoId()); query.setInteger("nuevoTramo", nuevoTramo.getTramoId()); query.setInteger("usuario", nuevoTramo.getUsuarioId()); query.setInteger("ruta", ruta.getRutaId()); query.executeUpdate(); } try { // Pode cair na exception caso ja possua tarifa criada para o tramo, e nao é necessaria criar novamente qryList = new ArrayList(); qry = new StringBuilder(" update TARIFA set TRAMO_ID = :nuevoTramo, "); qry.append(" FECMODIF = SYSDATE, USUARIO_ID = :usuario, ORIGEN_ID =:origen, DESTINO_ID = :destino "); qry.append(" where TRAMO_ID = :viejoTramo and RUTA_ID = :ruta "); qry.append(" AND ACTIVO = 1 "); qryList.add(qry.toString()); qry = new StringBuilder(" update TARIFA_OFICIAL set TRAMO_ID = :nuevoTramo, "); qry.append(" FECMODIF = SYSDATE, USUARIO_ID = :usuario, ORIGEN_ID =:origen, DESTINO_ID = :destino "); qry.append(" where TRAMO_ID = :viejoTramo and RUTA_ID = :ruta "); qry.append(" AND ACTIVO = 1 "); qryList.add(qry.toString()); for (String strQuery : qryList) { Query query = getSession().createSQLQuery(strQuery); query.setInteger("viejoTramo", viejoTramo.getTramoId()); query.setInteger("nuevoTramo", nuevoTramo.getTramoId()); query.setInteger("origen", nuevoTramo.getOrigem().getParadaId()); query.setInteger("destino", nuevoTramo.getDestino().getParadaId()); query.setInteger("usuario", nuevoTramo.getUsuarioId()); query.setInteger("ruta", ruta.getRutaId()); query.executeUpdate(); } } catch (Exception e) { } qry = new StringBuilder(" update CORRIDA_TRAMO set TRAMO_ID = :nuevoTramo, "); qry.append(" FECMODIF = SYSDATE, USUARIO_ID = :usuario, ORIGEN_ID =:origen, DESTINO_ID = :destino "); qry.append(" where TRAMO_ID = :viejoTramo and "); qry.append(" CORRIDA_ID in (select CORRIDA_ID from CORRIDA_CTRL where RUTA_ID = :ruta ) "); qry.append(" AND ACTIVO = 1 "); Query query = getSession().createSQLQuery(qry.toString()); query.setInteger("viejoTramo", viejoTramo.getTramoId()); query.setInteger("nuevoTramo", nuevoTramo.getTramoId()); query.setInteger("origen", nuevoTramo.getOrigem().getParadaId()); query.setInteger("destino", nuevoTramo.getDestino().getParadaId()); query.setInteger("usuario", nuevoTramo.getUsuarioId()); query.setInteger("ruta", ruta.getRutaId()); query.executeUpdate(); qry = new StringBuilder(" update CORRIDA set FECMODIF = SYSDATE, USUARIO_ID = :usuario, "); qry.append(" ORIGEN_ID = (case when ORIGEN_ID = :viejaOrigen then :nuevaOrigen else ORIGEN_ID end ), "); qry.append(" DESTINO_ID = (case when DESTINO_ID = :viejoDestino then :nuevoDestino else DESTINO_ID end ) "); qry.append(" where RUTA_ID = :ruta "); query = getSession().createSQLQuery(qry.toString()); query.setInteger("viejaOrigen", viejoTramo.getOrigem().getParadaId()); query.setInteger("nuevaOrigen", nuevoTramo.getOrigem().getParadaId()); query.setInteger("viejoDestino", viejoTramo.getOrigem().getParadaId()); query.setInteger("nuevoDestino", nuevoTramo.getDestino().getParadaId()); query.setInteger("usuario", nuevoTramo.getUsuarioId()); query.setInteger("ruta", ruta.getRutaId()); query.executeUpdate(); } catch (final Exception ex) { throw new RuntimeException("", ex); } } @Override public List buscarRutasVendaEmbarcada(List empresasIds, Integer rutaId, String numeroLinha, String descRuta, ClaseServicio classe) { Criteria c = getSession().createCriteria(getPersistentClass()); c.add(Restrictions.eq("activo", Boolean.TRUE)); c.add(Restrictions.ne("rutaId", -1)); if(empresasIds != null && !empresasIds.isEmpty()) { c.createCriteria("lsRutaEmpresa").add(Restrictions.in("empresa.empresaId", empresasIds)); } if(rutaId != null) { c.add(Restrictions.eq("rutaId", rutaId)); } if(numeroLinha != null) { List numRutas = Arrays.asList(numeroLinha.split(",")); c.add(Restrictions.in("numRuta", numRutas)); } if(descRuta != null && !descRuta.isEmpty()) { c.add(Restrictions.ilike("descruta", "%" + descRuta.trim().concat("%"))); } if (classe != null && classe.getClaseservicioId() != -1) { c.add(Restrictions.eq("claseServicio", classe)); } c.add(Restrictions.eq("indRutaCancelada", Boolean.FALSE)); c.add(Restrictions.eq("indVendaEmbarcada", Boolean.TRUE)); c.addOrder(Order.asc("descruta")); return c.list(); } @Override public List buscaLikeComboBox(String stringConsulta) { Criteria c = getSession().createCriteria(getPersistentClass()); c.add(Restrictions.eq("activo", Boolean.TRUE)); final SimpleExpression validaNumRuta = Restrictions.like("numRuta", stringConsulta, MatchMode.START); final SimpleExpression validaDescruta = Restrictions.like("descruta", stringConsulta, MatchMode.ANYWHERE); // c.createAlias("claseServicio", "claseServicio"); c.add(Restrictions.or(validaNumRuta, validaDescruta)); // c.setProjection(Projections.projectionList() // .add(Projections.groupProperty("numRuta")) // .add(Projections.property("descruta")) // .add(Projections.property("claseServicio.descclase"))); c.addOrder(Order.asc("numRuta")); return c.list(); } @Override public List buscarPorIds(Integer[] rutaIds) { Criteria c = this.makeCriteria(); c.add(Restrictions.in("rutaId", rutaIds)); return c.list(); } @Override public List buscarPorOrgaoEcasetaPeaje(OrgaoConcedente orgao, Integer[] listCasetaPeaje,Empresa empresa){ Criteria c = getSession().createCriteria(getPersistentClass()); c.add(Restrictions.eq("activo", Boolean.TRUE)); c.add(Restrictions.eq("indRutaCancelada", Boolean.FALSE)); Criteria criteriaRutaSecuencia = c.createCriteria("rutaSecuenciaList","secuencia"); criteriaRutaSecuencia.add(Restrictions.eq("secuencia.activo", Boolean.TRUE)); Criteria criteriaRutaCaseta = criteriaRutaSecuencia.createCriteria("lsRutaCase"); criteriaRutaCaseta.add(Restrictions.eq("activo", Boolean.TRUE)); Criteria criteriaCasetaPeaje=criteriaRutaCaseta.createCriteria("casetaPeaje"); criteriaCasetaPeaje.add(Restrictions.in("casetaPeajeId", listCasetaPeaje)); if(orgao!=null) { Criteria crietriaOrgaoConcendente = c.createCriteria("orgaoConcedente"); crietriaOrgaoConcendente.add(Restrictions.eq("activo", Boolean.TRUE)); crietriaOrgaoConcendente.add(Restrictions.eq("orgaoConcedenteId", orgao.getOrgaoConcedenteId())); } if (empresa != null && empresa.getEmpresaId() != -1) { c.createCriteria("lsRutaEmpresa").add(Restrictions.eq("empresa", empresa)); } c.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); return c.list(); } }