com.floreantpos.model.KitchenTicket.java Source code

Java tutorial

Introduction

Here is the source code for com.floreantpos.model.KitchenTicket.java

Source

/**
 * ************************************************************************
 * * The contents of this file are subject to the MRPL 1.2
 * * (the  "License"),  being   the  Mozilla   Public  License
 * * Version 1.1  with a permitted attribution clause; you may not  use this
 * * file except in compliance with the License. You  may  obtain  a copy of
 * * the License at http://www.floreantpos.org/license.html
 * * Software distributed under the License  is  distributed  on  an "AS IS"
 * * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
 * * License for the specific  language  governing  rights  and  limitations
 * * under the License.
 * * The Original Code is FLOREANT POS.
 * * The Initial Developer of the Original Code is OROCUBE LLC
 * * All portions are Copyright (C) 2015 OROCUBE LLC
 * * All Rights Reserved.
 * ************************************************************************
 */
package com.floreantpos.model;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.SerializationUtils;
import org.apache.commons.lang.StringUtils;

import com.floreantpos.model.base.BaseKitchenTicket;
import com.floreantpos.model.dao.KitchenTicketDAO;
import com.floreantpos.model.dao.OrderTypeDAO;
import com.floreantpos.util.GlobalIdGenerator;

public class KitchenTicket extends BaseKitchenTicket {
    private static final long serialVersionUID = 1L;

    /*[CONSTRUCTOR MARKER BEGIN]*/
    public KitchenTicket() {
        super();
    }

    /**
     * Constructor for primary key
     */
    public KitchenTicket(java.lang.Integer id) {
        super(id);
    }

    /*[CONSTRUCTOR MARKER END]*/

    private String customerName;
    private Printer printer;

    public OrderType getType() {
        String type = getTicketType();

        /*if (StringUtils.isEmpty(type)) {
           return OrderType.DINE_IN;
        }*/

        return OrderTypeDAO.getInstance().findByName(type);
    }

    public void setType(OrderType type) {
        setTicketType(type.name());
    }

    public void setPrinter(Printer printer) {
        this.printer = printer;
    }

    public Printer getPrinter() {
        return this.printer;
    }

    public List<Printer> getPrinters() {
        List<Printer> printers = new ArrayList<Printer>();

        PosPrinters posPrinters = PosPrinters.load();
        PrinterGroup virtualPrinter = getPrinterGroup();

        if (virtualPrinter == null) {
            printers.add(posPrinters.getDefaultKitchenPrinter());
            return printers;
        }

        List<String> printerNames = virtualPrinter.getPrinterNames();
        List<Printer> kitchenPrinters = posPrinters.getKitchenPrinters();
        for (Printer printer : kitchenPrinters) {
            if (printerNames.contains(printer.getVirtualPrinter().getName())) {
                printers.add(printer);
            }
        }

        if (printers.size() == 0) {
            printers.add(posPrinters.getDefaultKitchenPrinter());
        }

        return printers;
    }

    //   private static List<TicketItem> consolidateTicketItems(Ticket ticket) {
    //      List<TicketItem> newticketItems = new ArrayList<TicketItem>();
    //      newticketItems.addAll(((Ticket) SerializationUtils.clone(ticket)).getTicketItems());
    //
    //      Map<String, List<TicketItem>> itemMap = new LinkedHashMap<String, List<TicketItem>>();
    //
    //      for (Iterator iterator = newticketItems.iterator(); iterator.hasNext();) {
    //         TicketItem newItem = (TicketItem) iterator.next();
    //
    //         if (!newItem.isShouldPrintToKitchen() || newItem.isPrintedToKitchen()) {
    //            continue;
    //         }
    //         List<TicketItem> itemListInMap = itemMap.get(newItem.getItemId().toString());
    //
    //         if (itemListInMap == null) {
    //            List<TicketItem> list = new ArrayList<TicketItem>();
    //            list.add(newItem);
    //
    //            itemMap.put(newItem.getItemId().toString(), list);
    //         }
    //         else {
    //            boolean merged = false;
    //            for (TicketItem itemInMap : itemListInMap) {
    //               if (itemInMap.isMergable(newItem, false)) {
    //                  itemInMap.merge(newItem);
    //                  merged = true;
    //                  break;
    //               }
    //            }
    //
    //            if (!merged) {
    //               itemListInMap.add(newItem);
    //            }
    //         }
    //      }
    //
    //      newticketItems.clear();
    //      Collection<List<TicketItem>> values = itemMap.values();
    //      for (List<TicketItem> list : values) {
    //         if (list != null) {
    //            newticketItems.addAll(list);
    //         }
    //      }
    //
    //      for (TicketItem originalTicketItem : ticket.getTicketItems()) {
    //         List<TicketItem> itemFromMap = itemMap.get(originalTicketItem.getItemId().toString());
    //
    //         if (itemFromMap != null) {
    //            setPrintedToKitchen(originalTicketItem);
    //         }
    //      }
    //
    //      return newticketItems;
    //   }

    private static void setPrintedToKitchen(TicketItem ticketItem) {
        ticketItem.setPrintedToKitchen(true);
        List<TicketItemModifier> ticketItemModifiers = ticketItem.getTicketItemModifiers();
        if (ticketItemModifiers != null) {
            for (TicketItemModifier itemModifier : ticketItemModifiers) {

                if (!itemModifier.isShouldPrintToKitchen()) {
                    continue;
                }
                itemModifier.setPrintedToKitchen(true);
            }
        }

        List<TicketItemModifier> addOns = ticketItem.getAddOns();
        if (addOns != null) {
            for (TicketItemModifier ticketItemModifier : addOns) {
                if (!ticketItemModifier.isShouldPrintToKitchen()) {
                    continue;
                }
                ticketItemModifier.setPrintedToKitchen(true);
            }
        }

        List<TicketItemCookingInstruction> cookingInstructions = ticketItem.getCookingInstructions();
        if (cookingInstructions != null) {
            for (TicketItemCookingInstruction cookingInstruction : cookingInstructions) {
                cookingInstruction.setPrintedToKitchen(true);
            }
        }
    }

    public static List<KitchenTicket> fromTicket(Ticket ticket) {
        Map<Printer, KitchenTicket> itemMap = new HashMap<Printer, KitchenTicket>();
        List<KitchenTicket> kitchenTickets = new ArrayList<KitchenTicket>(4);

        Ticket clonedTicket = (Ticket) SerializationUtils.clone(ticket);
        clonedTicket.setGlobalId(GlobalIdGenerator.generate());
        clonedTicket.consolidateTicketItems();
        List<TicketItem> ticketItems = clonedTicket.getTicketItems();
        if (ticketItems == null) {
            return kitchenTickets;
        }

        if (ticket.getOrderType().isAllowSeatBasedOrder()) {
            Collections.sort(ticketItems, new Comparator<TicketItem>() {

                @Override
                public int compare(TicketItem o1, TicketItem o2) {
                    return o1.getId() - o2.getId();
                }
            });
            Collections.sort(ticketItems, new Comparator<TicketItem>() {

                @Override
                public int compare(TicketItem o1, TicketItem o2) {
                    return o1.getSeatNumber() - o2.getSeatNumber();
                }

            });
        }

        for (TicketItem ticketItem : ticketItems) {
            if (ticketItem.isPrintedToKitchen() || !ticketItem.isShouldPrintToKitchen()) {
                continue;
            }

            List<Printer> printers = ticketItem.getPrinters(ticket.getOrderType());
            if (printers == null) {
                continue;
            }

            for (Printer printer : printers) {
                KitchenTicket kitchenTicket = itemMap.get(printer);
                if (kitchenTicket == null) {
                    kitchenTicket = new KitchenTicket();
                    kitchenTicket.setPrinterGroup(ticketItem.getPrinterGroup());
                    kitchenTicket.setTicketId(ticket.getId());
                    kitchenTicket.setCreateDate(new Date());
                    kitchenTicket.setTicketType(ticket.getTicketType());

                    if (ticket.getTableNumbers() != null) {
                        kitchenTicket.setTableNumbers(new ArrayList<Integer>(ticket.getTableNumbers()));
                    }

                    kitchenTicket.setServerName(ticket.getOwner().getFirstName());
                    kitchenTicket.setStatus(KitchenTicketStatus.WAITING.name());

                    if (StringUtils.isNotEmpty(ticket.getProperty(Ticket.CUSTOMER_NAME))) {
                        kitchenTicket.setCustomerName(ticket.getProperty(Ticket.CUSTOMER_NAME));
                    }

                    KitchenTicketDAO.getInstance().saveOrUpdate(kitchenTicket);

                    kitchenTicket.setPrinter(printer);

                    itemMap.put(printer, kitchenTicket);
                }

                KitchenTicketItem item = new KitchenTicketItem();
                item.setTicketItemId(ticketItem.getId());
                item.setMenuItemCode(ticketItem.getItemCode());
                item.setMenuItemName(ticketItem.getNameDisplay());
                if (ticketItem.getMenuItem() == null) {
                    item.setMenuItemGroupName("MISC."); //$NON-NLS-1$
                    item.setMenuItemGroupId(1001);
                    item.setSortOrder(10001);
                } else {
                    item.setMenuItemGroupName(ticketItem.getGroupName());
                    item.setMenuItemGroupId(ticketItem.getMenuItem().getParent().getId());
                    item.setSortOrder(ticketItem.getMenuItem().getParent().getSortOrder());
                }

                item.setFractionalUnit(ticketItem.isFractionalUnit());
                item.setUnitName(ticketItem.getItemUnitName());

                if (ticketItem.isFractionalUnit()) {
                    item.setFractionalQuantity(ticketItem.getItemQuantity());
                } else {
                    item.setQuantity(ticketItem.getItemCount());
                }
                item.setStatus(KitchenTicketStatus.WAITING.name());

                kitchenTicket.addToticketItems(item);

                ticketItem.setPrintedToKitchen(true);

                includeModifiers(ticketItem, kitchenTicket);
                includeCookintInstructions(ticketItem, kitchenTicket);

            }

        }

        Collection<KitchenTicket> values = itemMap.values();

        for (KitchenTicket kitchenTicket : values) {
            kitchenTickets.add(kitchenTicket);
            String kitchenTicketNumber = ticket.getProperty("KITCHEN_TICKET_NUMBER"); //$NON-NLS-1$
            if (kitchenTicketNumber == null) {
                kitchenTicketNumber = "1"; //$NON-NLS-1$
            } else {
                kitchenTicketNumber = String.valueOf(Integer.valueOf(kitchenTicketNumber) + 1);
            }
            ticket.addProperty("KITCHEN_TICKET_NUMBER", kitchenTicketNumber); //$NON-NLS-1$
            kitchenTicket.setSequenceNumber(Integer.valueOf(kitchenTicketNumber));
        }
        ticket.markPrintedToKitchen();
        return kitchenTickets;
    }

    private static void includeCookintInstructions(TicketItem ticketItem, KitchenTicket kitchenTicket) {
        List<TicketItemCookingInstruction> cookingInstructions = ticketItem.getCookingInstructions();
        if (cookingInstructions != null) {
            for (TicketItemCookingInstruction ticketItemCookingInstruction : cookingInstructions) {
                KitchenTicketItem item = new KitchenTicketItem();
                item.setCookable(false);
                item.setMenuItemName(ticketItemCookingInstruction.getNameDisplay());
                if (ticketItem.getMenuItem() == null) {
                    item.setMenuItemGroupName("MISC."); //$NON-NLS-1$
                    item.setMenuItemGroupId(1001);
                    item.setSortOrder(10001);
                } else {
                    item.setMenuItemGroupName(ticketItem.getGroupName());
                    item.setMenuItemGroupId(ticketItem.getMenuItem().getParent().getId());
                    item.setSortOrder(ticketItem.getMenuItem().getParent().getSortOrder());
                }
                kitchenTicket.addToticketItems(item);
                ticketItemCookingInstruction.setPrintedToKitchen(true);
            }
        }
    }

    private static void includeModifiers(TicketItem ticketItem, KitchenTicket kitchenTicket) {
        List<TicketItemModifier> ticketItemModifiers = ticketItem.getTicketItemModifiers();
        if (ticketItemModifiers != null) {
            for (TicketItemModifier itemModifier : ticketItemModifiers) {
                /*   if (!itemModifier.isShouldPrintToKitchen()) {
                      continue;
                   }*/

                if (itemModifier.isPrintedToKitchen() || !itemModifier.isShouldPrintToKitchen()) {
                    continue;
                }

                //System.out.println(itemModifier.getName());

                KitchenTicketItem item = new KitchenTicketItem();
                item.setMenuItemCode(""); //$NON-NLS-1$
                item.setTicketItemModifierId(itemModifier.getId());
                String nameDisplay = (itemModifier.isInfoOnly() ? "" : "  --") + itemModifier.getNameDisplay();
                item.setMenuItemName(nameDisplay);
                if (ticketItem.getMenuItem() == null) {
                    item.setMenuItemGroupName("MISC."); //$NON-NLS-1$
                    item.setMenuItemGroupId(1001);
                    item.setSortOrder(10001);
                } else {
                    item.setMenuItemGroupName(ticketItem.getGroupName());
                    item.setMenuItemGroupId(ticketItem.getMenuItem().getParent().getId());
                    item.setSortOrder(ticketItem.getMenuItem().getParent().getSortOrder());
                }
                //item.setFractionalQuantity(itemModifier.getItemCount().doubleValue());
                item.setQuantity(itemModifier.getItemCount());
                item.setStatus(KitchenTicketStatus.WAITING.name());
                kitchenTicket.addToticketItems(item);

                itemModifier.setPrintedToKitchen(true);
            }
        }

        List<TicketItemModifier> addOns = ticketItem.getAddOns();
        if (addOns != null) {
            for (TicketItemModifier ticketItemModifier : addOns) {
                /*if (!ticketItemModifier.isShouldPrintToKitchen()) {
                   continue;
                }*/

                if (ticketItemModifier.isPrintedToKitchen() || !ticketItemModifier.isShouldPrintToKitchen()) {
                    continue;
                }
                KitchenTicketItem item = new KitchenTicketItem();
                item.setMenuItemCode(""); //$NON-NLS-1$
                item.setTicketItemModifierId(ticketItem.getId());
                item.setMenuItemName(ticketItemModifier.getNameDisplay());
                if (ticketItem.getMenuItem() == null) {
                    item.setMenuItemGroupName("MISC."); //$NON-NLS-1$
                    item.setMenuItemGroupId(1001);
                    item.setSortOrder(10001);
                } else {
                    item.setMenuItemGroupName(ticketItem.getGroupName());
                    item.setMenuItemGroupId(ticketItem.getMenuItem().getParent().getId());
                    item.setSortOrder(ticketItem.getMenuItem().getParent().getSortOrder());
                }
                //item.setFractionalQuantity(ticketItemModifier.getItemCount().doubleValue());
                item.setQuantity(ticketItemModifier.getItemCount());
                item.setStatus(KitchenTicketStatus.WAITING.name());
                kitchenTicket.addToticketItems(item);

                ticketItemModifier.setPrintedToKitchen(true);
            }
        }
    }

    public static enum KitchenTicketStatus {
        WAITING, VOID, DONE;
    }

    public String getCustomerName() {
        return customerName;
    }

    public void setCustomerName(String customerName) {
        this.customerName = customerName;
    }
}