package com.floreantpos.model.dao; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; import org.hibernate.Criteria; import org.hibernate.Hibernate; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.criterion.ProjectionList; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import com.floreantpos.model.Gratuity; import com.floreantpos.model.PosTransaction; import com.floreantpos.model.Shift; import com.floreantpos.model.Terminal; import com.floreantpos.model.Ticket; import com.floreantpos.model.TicketItem; import com.floreantpos.model.TicketItemModifierGroup; import com.floreantpos.model.User; import com.floreantpos.model.util.TicketSummary; public class TicketDAO extends BaseTicketDAO { private final static TicketDAO instance = new TicketDAO(); /** * Default constructor. Can be used in place of getInstance() */ public TicketDAO() { } public Ticket initializeTicket(Ticket ticket) { Session session = createNewSession(); Ticket newTicket = (Ticket) session.merge(ticket); Hibernate.initialize(newTicket.getTicketItems()); Hibernate.initialize(newTicket.getCouponAndDiscounts()); Hibernate.initialize(newTicket.getCookingInstructions()); List<TicketItem> ticketItems = newTicket.getTicketItems(); if (ticketItems != null) { for (TicketItem ticketItem : ticketItems) { List<TicketItemModifierGroup> ticketItemModifierGroups = ticketItem.getTicketItemModifierGroups(); Hibernate.initialize(ticketItemModifierGroups); if (ticketItemModifierGroups != null) { for (TicketItemModifierGroup ticketItemModifierGroup : ticketItemModifierGroups) { Hibernate.initialize(ticketItemModifierGroup.getTicketItemModifiers()); } } } } session.close(); return newTicket; } public List<Gratuity> getServerGratuities(Terminal terminal, String transactionType) { Session session = null; ArrayList<Gratuity> gratuities = new ArrayList<Gratuity>(); try { session = getSession(); Criteria criteria = session.createCriteria(getReferenceClass()); criteria.add(Restrictions.eq(Ticket.PROP_DRAWER_RESETTED, Boolean.FALSE)); criteria.add(Restrictions.eq(Ticket.PROP_TERMINAL, terminal)); criteria.add(Restrictions.eq(Ticket.PROP_TRANSACTION_TYPE, transactionType)); criteria.createAlias(Ticket.PROP_GRATUITY, "gratuity"); criteria.add(Restrictions.eq("gratuity.paid", Boolean.FALSE)); List list = criteria.list(); for (Iterator iter = list.iterator(); iter.hasNext();) { Ticket ticket = (Ticket) iter.next(); gratuities.add(ticket.getGratuity()); } return gratuities; } finally { closeSession(session); } } public double getPaidGratuityAmount(Terminal terminal) { Session session = null; try { session = getSession(); Criteria criteria = session.createCriteria(getReferenceClass(), "t"); criteria = criteria.createAlias(Ticket.PROP_GRATUITY, "gratuity"); criteria.add(Restrictions.eq(Ticket.PROP_DRAWER_RESETTED, Boolean.FALSE)); criteria.add(Restrictions.eq(Ticket.PROP_TERMINAL, terminal)); criteria.add(Restrictions.eq("gratuity.paid", Boolean.TRUE)); criteria.setProjection(Projections.sum("gratuity.amount")); List list = criteria.list(); if(list.size() > 0 && list.get(0) instanceof Number) { return ((Number) list.get(0)).doubleValue(); } return 0; } finally { closeSession(session); } } public void voidTicket(Ticket ticket) throws Exception { Session session = null; Transaction tx = null; try { ticket.setVoided(true); ticket.setPaid(false); ticket.setClosed(true); ticket.setClosingDate(new Date()); session = createNewSession(); tx = session.beginTransaction(); session.update(ticket); Criteria criteria = session.createCriteria(com.floreantpos.model.PosTransaction.class); criteria.add(Restrictions.eq(com.floreantpos.model.PosTransaction.PROP_TICKET, ticket)); List list = criteria.list(); if(list != null) { for (Iterator iter = list.iterator(); iter.hasNext();) { PosTransaction transaction = (PosTransaction) iter.next(); Terminal terminal = transaction.getTerminal(); terminal.setCurrentBalance(terminal.getCurrentBalance() - transaction.getSubtotalAmount()); session.update(terminal); transaction.setTerminal(null); session.delete(transaction); } } session.flush(); tx.commit(); } catch (Exception x) { try { tx.rollback(); } catch (Exception e) { } throw x; } finally { closeSession(session); } } public List<Ticket> findOpenTickets() { Session session = null; try { session = getSession(); Criteria criteria = session.createCriteria(getReferenceClass()); criteria.add(Restrictions.eq(Ticket.PROP_CLOSED, Boolean.FALSE)); List list = criteria.list(); return list; } finally { closeSession(session); } } public List<Ticket> findOpenTicketsForUser(User user) { Session session = null; try { session = getSession(); Criteria criteria = session.createCriteria(getReferenceClass()); criteria.add(Restrictions.eq(Ticket.PROP_CLOSED, Boolean.FALSE)); criteria.add(Restrictions.eq(Ticket.PROP_VOIDED, Boolean.FALSE)); criteria.add(Restrictions.eq(Ticket.PROP_OWNER, user)); List list = criteria.list(); return list; } finally { closeSession(session); } } public List<Ticket> findOpenTickets(Date startDate, Date endDate) { Session session = null; try { session = getSession(); Criteria criteria = session.createCriteria(getReferenceClass()); criteria.add(Restrictions.eq(Ticket.PROP_CLOSED, Boolean.FALSE)); criteria.add(Restrictions.ge(Ticket.PROP_CREATE_DATE, startDate)); criteria.add(Restrictions.le(Ticket.PROP_CREATE_DATE, endDate)); List list = criteria.list(); return list; } finally { closeSession(session); } } public Ticket findTicketByTableNumber(int tableNumber) { Session session = null; try { session = getSession(); Criteria criteria = session.createCriteria(getReferenceClass()); criteria.add(Restrictions.eq(Ticket.PROP_CLOSED, Boolean.FALSE)); criteria.add(Restrictions.eq(Ticket.PROP_TABLE_NUMBER, Integer.valueOf(tableNumber))); List list = criteria.list(); if(list.size() <= 0) { return null; } return (Ticket) list.get(0); } finally { closeSession(session); } } public TicketSummary getOpenTicketSummary() { Session session = null; TicketSummary ticketSummary = new TicketSummary(); try { session = getSession(); Criteria criteria = session.createCriteria(Ticket.class); criteria.add(Restrictions.eq(Ticket.PROP_CLOSED, Boolean.FALSE)); criteria.add(Restrictions.eq(Ticket.PROP_VOIDED, Boolean.FALSE)); criteria.add(Restrictions.eq(Ticket.PROP_DRAWER_RESETTED, Boolean.FALSE)); ProjectionList projectionList = Projections.projectionList(); projectionList.add(Projections.count(Ticket.PROP_ID)); projectionList.add(Projections.sum(Ticket.PROP_TOTAL_AMOUNT)); criteria.setProjection(projectionList); List list = criteria.list(); if (list.size() > 0) { Object[] o = (Object[]) list.get(0); ticketSummary.setTotalTicket(((Integer) o[0]).intValue()); ticketSummary.setTotalPrice(o[1] == null ? 0 : ((Double) o[1]).doubleValue()); } return ticketSummary; } finally { closeSession(session); } } public TicketSummary getClosedTicketSummary(Terminal terminal) { Session session = null; TicketSummary ticketSummary = new TicketSummary(); try { session = getSession(); Criteria criteria = session.createCriteria(Ticket.class); criteria.add(Restrictions.eq(Ticket.PROP_CLOSED, Boolean.TRUE)); criteria.add(Restrictions.eq(Ticket.PROP_VOIDED, Boolean.FALSE)); criteria.add(Restrictions.eq(Ticket.PROP_DRAWER_RESETTED, Boolean.FALSE)); criteria.add(Restrictions.eq(Ticket.PROP_TERMINAL, terminal)); ProjectionList projectionList = Projections.projectionList(); projectionList.add(Projections.count(Ticket.PROP_ID)); projectionList.add(Projections.sum(Ticket.PROP_TOTAL_AMOUNT)); criteria.setProjection(projectionList); List list = criteria.list(); if (list.size() > 0) { Object[] o = (Object[]) list.get(0); ticketSummary.setTotalTicket(((Integer) o[0]).intValue()); ticketSummary.setTotalPrice(o[1] == null ? 0 : ((Double) o[1]).doubleValue()); } return ticketSummary; } finally { closeSession(session); } } // public void saveTransaction(Ticket ticket, com.floreantpos.model.PosTransaction transaction, Terminal terminal, User user) throws Exception { // Session session = null; // Transaction tx = null; // try { // if(transaction instanceof CashTransaction) { // terminal.setCurrentBalance(terminal.getCurrentBalance() + ticket.getTotalPrice()); // } // // ticket.setVoided(false); // ticket.setPaid(true); // ticket.setClosed(true); // ticket.setDrawerResetted(false); // ticket.setClosingDate(new Date()); // ticket.setTerminal(terminal); // // transaction.setTicket(ticket); // transaction.setAmount(ticket.getSubTotal()); // transaction.setTaxAmount(ticket.getTotalTax()); // transaction.setAppliedDiscount(ticket.getTotalDiscount()); // transaction.setTerminal(terminal); // transaction.setUser(user); // transaction.setTransactionTime(new Date()); // // session = createNewSession(); // tx = session.beginTransaction(); // // saveOrUpdate(ticket, session); // saveOrUpdate(transaction, session); // saveOrUpdate(terminal, session); // // tx.commit(); // // } catch (Exception e) { // try { // tx.rollback(); // }catch (Exception x) {} // // throw e; // } finally { // closeSession(session); // } // } public List<Ticket> findTickets(Date startDate, Date endDate, boolean closed) { Session session = null; try { session = getSession(); Criteria criteria = session.createCriteria(getReferenceClass()); criteria.add(Restrictions.ge(Ticket.PROP_CREATE_DATE, startDate)); criteria.add(Restrictions.le(Ticket.PROP_CREATE_DATE, endDate)); criteria.add(Restrictions.eq(Ticket.PROP_CLOSED, Boolean.TRUE)); criteria.add(Restrictions.eq(Ticket.PROP_VOIDED, Boolean.FALSE)); criteria.add(Restrictions.eq(Ticket.PROP_DRAWER_RESETTED, Boolean.valueOf(closed))); return criteria.list(); } finally { closeSession(session); } } public List<Ticket> findTicketsForLaborHour(Date startDate, Date endDate, int hour, String userType, Terminal terminal) { Session session = null; try { session = getSession(); Criteria criteria = session.createCriteria(getReferenceClass()); criteria.add(Restrictions.ge(Ticket.PROP_ACTIVE_DATE, startDate)); criteria.add(Restrictions.le(Ticket.PROP_ACTIVE_DATE, endDate)); criteria.add(Restrictions.eq(Ticket.PROP_CREATION_HOUR, Integer.valueOf(hour))); //criteria.add(Restrictions.eq(Ticket.PROP_CLOSED, Boolean.TRUE)); //criteria.add(Restrictions.eq(Ticket.PROP_VOIDED, Boolean.FALSE)); if (userType != null) { criteria.createAlias(Ticket.PROP_OWNER, "u"); criteria.add(Restrictions.eq("u.newUserType", userType)); } if (terminal != null) { criteria.add(Restrictions.eq(Ticket.PROP_TERMINAL, terminal)); } return criteria.list(); } finally { closeSession(session); } } public List<Ticket> findTicketsForShift(Date startDate, Date endDate, Shift shit, String userType, Terminal terminal) { Session session = null; try { session = getSession(); Criteria criteria = session.createCriteria(getReferenceClass()); criteria.add(Restrictions.ge(Ticket.PROP_CREATE_DATE, startDate)); criteria.add(Restrictions.le(Ticket.PROP_CREATE_DATE, endDate)); criteria.add(Restrictions.eq(Ticket.PROP_SHIFT, shit)); criteria.add(Restrictions.eq(Ticket.PROP_CLOSED, Boolean.TRUE)); criteria.add(Restrictions.eq(Ticket.PROP_VOIDED, Boolean.FALSE)); if (userType != null) { criteria.createAlias(Ticket.PROP_OWNER, "u"); criteria.add(Restrictions.eq("u.newUserType", userType)); } if (terminal != null) { criteria.add(Restrictions.eq(Ticket.PROP_TERMINAL, terminal)); } return criteria.list(); } finally { closeSession(session); } } public static TicketDAO getInstance() { return instance; } }