package persistencia;
import java.util.Calendar;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.TypedQuery;
@Stateless
public class OfertaDAOImpl extends BaseDAO<Oferta> implements OfertaDAO {
private static final String obtenerOfertasUsrQuery =
"SELECT DISTINCT o " +
"FROM Oferta o JOIN o.categorias oc " +
"WHERE EXISTS ( " +
" SELECT c FROM Usuario u JOIN u.categorias c " +
" WHERE c = oc AND " +
" u.id = :userId) " +
" AND o.local.id = :localId";
private static final String obtenerPromedioValoracion =
"SELECT AVG(p.evaluacion) " +
"FROM Oferta o " +
" JOIN o.pagos p " +
" WHERE o.id = :idOferta";
private static final String obtenerTodasQuery = "SELECT o FROM Oferta o";
private static final String obtenerPagosQuery =
"SELECT count(p.id) " +
"FROM Oferta o JOIN o.pagos p " +
"WHERE o.id = :idOferta";
private static final String obtenerPagosDesdeQuery =
"SELECT count(p.id) " +
"FROM Oferta o JOIN o.pagos p " +
"WHERE o.id = :idOferta " +
" AND p.fecha >= :fecha";
private static final String obtenerPagosHastaQuery =
"SELECT count(p.id) " +
"FROM Oferta o JOIN o.pagos p " +
"WHERE o.id = :idOferta " +
" AND p.fecha <= :fecha";
private static final String obtenerPagosEntreQuery =
"SELECT count(p.id) " +
"FROM Oferta o JOIN o.pagos p " +
"WHERE o.id = :idOferta " +
" AND p.fecha BETWEEN :inicio AND :fin";
private static final String obtenerOfertasLocal =
"SELECT o " +
"FROM Local l JOIN l.ofertas o " +
"WHERE l.id = :idLocal";
@Override
public Oferta buscarPorId(int id) {
Oferta ret = em.find(Oferta.class, id);
return ret;
}
@Override
public List<Oferta> ofertasRelacionadas(int idLocal, int idUsuario) {
TypedQuery<Oferta> query = em.createQuery(obtenerOfertasUsrQuery,Oferta.class);
query.setParameter("userId", idUsuario);
query.setParameter("localId", idLocal);
return query.getResultList();
}
@Override
public float promedioValoraciones(int idOferta) {
TypedQuery<Double> query = em.createQuery(obtenerPromedioValoracion, Double.class);
query.setParameter("idOferta", idOferta);
return query.getSingleResult().floatValue();
}
@Override
public List<Oferta> obtenerTodas() {
TypedQuery<Oferta> query = em.createQuery(obtenerTodasQuery, Oferta.class);
return query.getResultList();
}
@Override
public long obtenerCantPagos(int idOferta) {
TypedQuery<Long> query = em.createQuery(obtenerPagosQuery, Long.class);
query.setParameter("idOferta", idOferta);
return query.getSingleResult();
}
@Override
public long obtenerCantPagosDesde(int idOferta, Calendar fecha) {
TypedQuery<Long> query = em.createQuery(obtenerPagosDesdeQuery, Long.class);
query.setParameter("idOferta", idOferta);
query.setParameter("fecha", fecha);
return query.getSingleResult();
}
@Override
public long obtenerCantPagosHasta(int idOferta, Calendar fecha) {
TypedQuery<Long> query = em.createQuery(obtenerPagosHastaQuery, Long.class);
query.setParameter("idOferta", idOferta);
query.setParameter("fecha", fecha);
return query.getSingleResult();
}
@Override
public long obtenerCantPagosEntre(int idOferta, Calendar desde,
Calendar hasta) {
TypedQuery<Long> query = em.createQuery(obtenerPagosEntreQuery, Long.class);
query.setParameter("idOferta", idOferta);
query.setParameter("inicio", desde);
query.setParameter("fin", hasta);
return query.getSingleResult();
}
@Override
public List<Oferta> obtenerOfertasLocal(int idLocal) {
TypedQuery<Oferta> query = em.createQuery(obtenerOfertasLocal, Oferta.class);
query.setParameter("idLocal", idLocal);
return query.getResultList();
}
}