/*
 * 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.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.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<Ruta, Integer> implements RutaDAO {

	@Autowired
	public RutaHibernateDAO(@Qualifier("sessionFactory") SessionFactory factory) {
		setSessionFactory(factory);
	}

	@Override
	public List<Ruta> obtenerTodos() {
		Criteria c = getSession().createCriteria(getPersistentClass());
		c.add(Restrictions.eq(ACTIVO, Boolean.TRUE));
		c.addOrder(Order.asc("descruta"));

		return c.list();
	}

	public List<Ruta> 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<Ruta> buscarPorRutaPorEmpresas(List<Empresa> 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<Ruta> l = c.list();
		for (Ruta r : l) {
			r.getLsRutaEmpresa();
		}
		return l;
	}

	public List<Ruta> 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<Ruta> buscarPorClaseServicioEmpresa(ClaseServicio claseServicio, Empresa empresa) {
		StringBuilder hql = new StringBuilder();
		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<Ruta> lsRuta = sq.list();
		return lsRuta;
	}

	public List<Ruta> 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<Ruta> obtenerPorEmpresa(Empresa empresa) {
		Criteria c = getSession().createCriteria(getPersistentClass());
		c.add(Restrictions.eq(ACTIVO, Boolean.TRUE));
		c.add(Restrictions.ne("rutaId", -1));
		c.add(Restrictions.not(Restrictions.eq("indRutaCancelada", Boolean.TRUE)));
		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<Ruta> 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<Ruta> 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<Ruta> 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<Ruta> buscaRuta(String palavraPesquisaRuta) {
		return buscaRuta(palavraPesquisaRuta, null);
	}

	@Override
	public List<Ruta> 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<RutaVO> 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();
	}
	
	@Override
	public List<RutaVO> buscaRutaParadas(Integer rotaId) {
		StringBuilder sql = new StringBuilder();
		sql.append(" SELECT  r.ruta_id rutaId, R.NUMRUTA numRuta, R.PREFIXO prefixo,   ");
		sql.append(" r.descruta descruta, po.descparada descOrigem, pd.descparada descDestino, rc.numsecuencia numSecuencia, tr.origen_id origenId, tr.destino_id destinoId ");
		sql.append(" FROM ruta r ");
		sql.append(" LEFT JOIN ruta_secuencia  rc ON ( rc.ruta_id = r.ruta_id AND rc.activo = 1 ) 		");
		sql.append(" LEFT JOIN tramo           tr ON ( tr.tramo_id = rc.tramo_id AND tr.activo = 1 ) 	");
		sql.append(" LEFT JOIN parada          po ON ( po.parada_id = tr.origen_id AND po.activo = 1 ) 	");
		sql.append(" LEFT JOIN parada          pd ON ( pd.parada_id = tr.destino_id AND pd.activo = 1 ) 	");
		sql.append(" WHERE  rc.ruta_id = :rotaId  ");
		sql.append(" ORDER BY rc.numsecuencia ");

		SQLQuery qry = getSession().createSQLQuery(sql.toString())
				.addScalar("rutaId", LongType.INSTANCE)
				.addScalar("numRuta", StringType.INSTANCE)
				.addScalar("prefixo", StringType.INSTANCE)
				.addScalar("descruta", StringType.INSTANCE)
				.addScalar("descOrigem", StringType.INSTANCE)
				.addScalar("descDestino", StringType.INSTANCE)
				.addScalar("numSecuencia", IntegerType.INSTANCE)
				.addScalar("origenId", IntegerType.INSTANCE)
				.addScalar("destinoId", IntegerType.INSTANCE);
				
		qry.setParameter("rotaId", rotaId);

		qry.setResultTransformer(new AliasToBeanResultTransformer(RutaVO.class));
		return qry.list();
	}

	public List<Ruta> 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<Ruta> lsRuta = sq.list();
		return lsRuta;
	}
	
	public List<Ruta> 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<Ruta> lsRuta = sq.list();
		return lsRuta;
	}

	@Override
	public List<Ruta> 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<Ruta> 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<String> qryList = new ArrayList<String>();
			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<String>();
				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<Ruta> buscarRutasVendaEmbarcada(List<Integer> 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<String> 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<Ruta> 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<Ruta> buscarPorIds(Integer[] rutaIds) {
		Criteria c = this.makeCriteria();
		c.add(Restrictions.in("rutaId", rutaIds));
		return c.list();		
	}
	
	@Override
	public List<Ruta> 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();		
		
		
	}

	@Override
	public List<Ruta> buscarRutasPorEmpresaOrgaoConcedenteClaseServicio(Empresa empresa, OrgaoConcedente orgao, ClaseServicio claseServicio) {

		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));
		}
		
		if (claseServicio != null && claseServicio.getClaseservicioId() != -1) {
			c.add(Restrictions.eq("claseServicio", claseServicio));
		}

		c.addOrder(Order.asc("descruta"));

		return c.list();
	}
	
}
