package com.floreantpos.model.dao;
import java.util.Calendar;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import com.floreantpos.PosException;
import com.floreantpos.model.AttendenceHistory;
import com.floreantpos.model.Shift;
import com.floreantpos.model.Terminal;
import com.floreantpos.model.Ticket;
import com.floreantpos.model.User;
import com.floreantpos.model.UserType;
public class UserDAO extends BaseUserDAO {
public final static UserDAO instance = new UserDAO();
/**
* Default constructor. Can be used in place of getInstance()
*/
public UserDAO() {
}
public User findUser(int id) {
Session session = null;
try {
session = getSession();
Criteria criteria = session.createCriteria(getReferenceClass());
criteria.add(Restrictions.eq(User.PROP_USER_ID, id));
List list = criteria.list();
if(list.size() > 0) {
return (User) list.get(0);
}
return null;
} finally {
if (session != null) {
closeSession(session);
}
}
}
// public User findUser(int id, String type) {
// Session session = null;
//
// try {
// session = getSession();
// Criteria criteria = session.createCriteria(getReferenceClass());
// criteria.add(Restrictions.eq(User.PROP_USER_ID, id));
// criteria.add(Restrictions.eq(User.PROP_USER_TYPE, type));
//
// return (User) criteria.uniqueResult();
// } finally {
// if (session != null) {
// closeSession(session);
// }
// }
// }
public User findUser(int id, UserType userType) {
Session session = null;
try {
session = getSession();
Criteria criteria = session.createCriteria(getReferenceClass());
criteria.add(Restrictions.eq(User.PROP_USER_ID, id));
criteria.add(Restrictions.eq(User.PROP_NEW_USER_TYPE, userType));
return (User) criteria.uniqueResult();
} finally {
if (session != null) {
closeSession(session);
}
}
}
public Integer findUserWithMaxId() {
Session session = null;
try {
session = getSession();
Criteria criteria = session.createCriteria(getReferenceClass());
criteria.setProjection(Projections.max(User.PROP_USER_ID));
List list = criteria.list();
if(list != null && list.size() > 0) {
return (Integer) list.get(0);
}
return null;
} finally {
if (session != null) {
closeSession(session);
}
}
}
public List<User> getClockedInUser(Terminal terminal) {
Session session = null;
try {
session = getSession();
Criteria criteria = session.createCriteria(getReferenceClass());
criteria.add(Restrictions.eq(User.PROP_CLOCKED_IN, Boolean.TRUE));
criteria.add(Restrictions.eq(User.PROP_CURRENT_TERMINAL, terminal));
return criteria.list();
} finally {
if (session != null) {
closeSession(session);
}
}
}
public void saveClockIn(User user, AttendenceHistory attendenceHistory,
Shift shift, Calendar currentTime) {
Session session = null;
Transaction tx = null;
try {
session = getSession();
tx = session.beginTransaction();
session.saveOrUpdate(user);
session.saveOrUpdate(attendenceHistory);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
if (tx != null) {
try {
tx.rollback();
} catch (Exception x) {
}
}
throw new PosException("Unable to store clock in information", e);
} finally {
if (session != null) {
closeSession(session);
}
}
}
public void saveClockOut(User user, AttendenceHistory attendenceHistory,
Shift shift, Calendar currentTime) {
Session session = null;
Transaction tx = null;
try {
session = getSession();
tx = session.beginTransaction();
session.saveOrUpdate(user);
session.saveOrUpdate(attendenceHistory);
tx.commit();
} catch (Exception e) {
if (tx != null) {
try {
tx.rollback();
} catch (Exception x) {
}
}
throw new PosException("Unable to store clock out information", e);
} finally {
if (session != null) {
closeSession(session);
}
}
}
private boolean validate(User user, boolean editMode) throws PosException {
String hql = "from User u where u.userId=:userId and u.newUserType=:userType";
Session session = getSession();
Query query = session.createQuery(hql);
query = query.setParameter("userId", user.getUserId());
query = query.setParameter("userType", user.getNewUserType());
if (query.list().size() > 0) {
throw new PosException("Another user with same ID already exists");
}
return true;
}
public void saveOrUpdate(User user, boolean editMode) {
Session session = null;
try {
if (!editMode) {
validate(user, editMode);
}
super.saveOrUpdate(user);
} catch (Exception x) {
throw new PosException("Could not save user", x);
} finally {
closeSession(session);
}
}
// public User findByPassword(String password) throws PosException {
// Session session = null;
// Transaction tx = null;
//
// String hql = "from User u where u.password=:password";
//
// try {
// session = getSession();
// tx = session.beginTransaction();
// Query query = session.createQuery(hql);
// query = query.setParameter("password", password);
// User user = (User) query.uniqueResult();
// tx.commit();
// if(user == null) {
// throw new PosException("User not found");
// }
// return user;
// } catch(PosException x) {
// throw x;
// } catch (Exception e) {
// try {
// if(tx != null) {
// tx.rollback();
// }
// }catch(Exception e2) {}
// throw new PosException("Unnable to find user", e);
// } finally {
// if(session != null) {
// session.close();
// }
// }
// }
public int findNumberOfOpenTickets(User user) throws PosException {
Session session = null;
Transaction tx = null;
String hql = "select count(*) from Ticket ticket where ticket.owner=:owner and ticket."
+ Ticket.PROP_CLOSED + "settled=false";
int count = 0;
try {
session = getSession();
tx = session.beginTransaction();
Query query = session.createQuery(hql);
query = query.setEntity("owner", user);
Iterator iterator = query.iterate();
if (iterator.hasNext()) {
count = ((Integer) iterator.next()).intValue();
}
tx.commit();
return count;
} catch (Exception e) {
try {
if (tx != null) {
tx.rollback();
}
} catch (Exception e2) {
}
throw new PosException("Unnable to find user", e);
} finally {
if (session != null) {
session.close();
}
}
}
}