package com.floreantpos.print; import java.text.DecimalFormat; import java.util.Date; import java.util.List; import java.util.Set; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.floreantpos.config.PrintConfig; import com.floreantpos.jreports.JReportPrintService; import com.floreantpos.main.Application; import com.floreantpos.model.DrawerPullReport; import com.floreantpos.model.DrawerPullVoidTicketEntry; import com.floreantpos.model.Restaurant; import com.floreantpos.model.Terminal; import com.floreantpos.model.Ticket; import com.floreantpos.model.TicketCookingInstruction; import com.floreantpos.model.TicketItem; import com.floreantpos.model.TicketItemModifier; import com.floreantpos.model.TicketItemModifierGroup; import com.floreantpos.model.TipsCashoutReport; import com.floreantpos.model.TipsCashoutReport.TipsCashoutReportData; import com.floreantpos.model.dao.RestaurantDAO; import foxtrot.Job; import foxtrot.Worker; public class PosPrintService { private static Log logger = LogFactory.getLog(PosPrintService.class); static int firstColumnLength = 4; static int secondColumnLength = 16; static int thirdColumnLength = 8; static int fourthColumnLength = 8; static int columnGap = 2; static int totalLength = 42; static int kitchenFirstColumnLength = 4; static int kitchenSecondColumnLength = 24; static int kitchenThirdColumnLength = 8; static void printCentered(PosPrinter printer, String text) { int blank = totalLength - text.length(); int half = blank / 2; text = StringUtils.leftPad(text, half + text.length(), ' '); text = StringUtils.rightPad(text, totalLength, ' '); printer.beginLine(PosPrinter.SIZE_0); printer.printText(text); printer.endLine(); } static void printSeparator(PosPrinter printer, char separatorChar) { String text = String.valueOf(separatorChar); text = StringUtils.leftPad(text, totalLength, separatorChar); printer.beginLine(PosPrinter.SIZE_0); printer.printText(text); printer.endLine(); } static void print1stColumn(PosPrinter printer, String text, int columnLength) { printer.beginLine(PosPrinter.SIZE_0); if (text.length() < columnLength) { text = StringUtils.rightPad(text, columnLength, ' '); } printer.printText(text); printer.printText(PosPrinter.JPOS_SIZE0); } static void printLastColumn(PosPrinter printer, String text, int columnLength) { if (text.length() < columnLength) { text = StringUtils.rightPad(text, columnLength, ' '); } printer.printText(text); printer.printText(PosPrinter.JPOS_SIZE0); printer.endLine(); } static void printColumn(PosPrinter printer, String text, int columnLength) { if (text.length() < columnLength) { text = StringUtils.rightPad(text, columnLength, ' '); } printer.printText(text); printer.printText(PosPrinter.JPOS_SIZE0); } static void printRightAlignedColumn(PosPrinter printer, String text, int columnLength) { if (text.length() < columnLength) { text = StringUtils.leftPad(text, columnLength, ' '); } printer.printText(text); printer.printText(PosPrinter.JPOS_SIZE0); } static void printColumnSeparator(PosPrinter printer) { printer.printText(" "); } static void printMultilineColumn(PosPrinter printer, String text, int previoisColumnLength, int columnLength, boolean padLeft) { if (text.length() < columnLength) { if (padLeft) { text = StringUtils.leftPad(text, text.length() + previoisColumnLength + columnGap, ' '); text = StringUtils.rightPad(text, columnLength + previoisColumnLength + columnGap, ' '); } else { text = StringUtils.rightPad(text, columnLength, ' '); } } else if (text.length() > columnLength) { String stringBefore = text.substring(0, columnLength); String stringAfter = text.substring(columnLength); if (padLeft) { stringBefore = StringUtils.leftPad(stringBefore, previoisColumnLength + columnGap, ' '); } printer.printText(stringBefore); printer.endLine(); printer.beginLine(PosPrinter.SIZE_0); printSecondColumn(printer, stringAfter, previoisColumnLength, columnLength, true); return; } printer.printText(text); } static void printFirstColumn(PosPrinter printer, String text, int columnLength) { if (text.length() < columnLength) { text = StringUtils.rightPad(text, columnLength, ' '); } printer.printText(text); printer.printText(PosPrinter.JPOS_SIZE0 + " "); } static void printSecondColumn(PosPrinter printer, String text, int firstColumnLength, int secondColumnLength, boolean padLeft) { if (text.length() < secondColumnLength) { if (padLeft) { text = StringUtils.leftPad(text, text.length() + firstColumnLength + columnGap, ' '); text = StringUtils.rightPad(text, secondColumnLength + firstColumnLength + columnGap, ' '); } else { text = StringUtils.rightPad(text, secondColumnLength, ' '); } } else if (text.length() > secondColumnLength) { String stringBefore = text.substring(0, secondColumnLength); String stringAfter = text.substring(secondColumnLength); if (padLeft) { stringBefore = StringUtils.leftPad(stringBefore, firstColumnLength + columnGap, ' '); } printer.printText(stringBefore); printer.endLine(); printer.beginLine(PosPrinter.SIZE_0); printSecondColumn(printer, stringAfter, firstColumnLength, secondColumnLength, true); return; } printer.printText(text); printer.printText(" "); } static void printThirdColumn(PosPrinter printer, String text, int thirdColumnLength) { if (text.length() < thirdColumnLength) { text = StringUtils.leftPad(text, thirdColumnLength, ' '); } printer.printText(text); printer.printText(" "); } static void printFourthColumn(PosPrinter printer, String text, int fourthColumnLength) { if (text.length() < fourthColumnLength) { text = StringUtils.leftPad(text, fourthColumnLength, ' '); } printer.printText(text); } public static void printTicket(final Ticket ticket) throws Exception { Job job = new Job() { @Override public Object run() { PosPrinter posPrinter = null; try { if(PrintConfig.getReceiptPrinterType() == PrinterType.OS_PRINTER) { JReportPrintService.printTicket(ticket); return null; } Restaurant restaurant = RestaurantDAO.getInstance().get(Integer.valueOf(1)); posPrinter = new PosPrinter(PrintConfig.getJavaPosReceiptPrinterName(), PrintConfig.getCashDrawerName()); posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText("\u001b|cA\u001b|2C" + restaurant.getName()); posPrinter.endLine(); if (restaurant.getAddressLine1() != null) { printCentered(posPrinter, restaurant.getAddressLine1()); } if (restaurant.getAddressLine2() != null) { printCentered(posPrinter, restaurant.getAddressLine2()); } if (restaurant.getAddressLine3() != null) { printCentered(posPrinter, restaurant.getAddressLine3()); } if (restaurant.getTelephone() != null) { printCentered(posPrinter, restaurant.getTelephone()); } posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText("Chk#: "); posPrinter.printText(String.valueOf(ticket.getId())); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText("Tbl#: "); posPrinter.printText(String.valueOf(ticket.getTableNumber())); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText("Guest#: "); posPrinter.printText(String.valueOf(ticket.getNumberOfGuests())); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText("Srv : "); posPrinter.printText(String.valueOf(ticket.getOwner().getUserId() + "/" + ticket.getOwner())); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText("Date: "); posPrinter.printText(Application.formatDate(new Date())); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); printFirstColumn(posPrinter, "QTY", firstColumnLength); printSecondColumn(posPrinter, "ITEM", firstColumnLength, secondColumnLength, false); printThirdColumn(posPrinter, "UPRICE", thirdColumnLength); printFourthColumn(posPrinter, "SUBTOTAL", fourthColumnLength); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText(StringUtils.leftPad("", totalLength, "_")); posPrinter.endLine(); List<TicketItem> ticketItems = ticket.getTicketItems(); if (ticketItems != null) { for (TicketItem ticketItem : ticketItems) { posPrinter.beginLine(PosPrinter.SIZE_0); printFirstColumn(posPrinter, String.valueOf(ticketItem.getItemCount()), firstColumnLength); printSecondColumn(posPrinter, ticketItem.getName(), firstColumnLength, secondColumnLength, false); printThirdColumn(posPrinter, Application.formatNumber(ticketItem.getUnitPrice()), thirdColumnLength); printFourthColumn(posPrinter, Application.formatNumber(ticketItem.getSubtotalAmountWithoutModifiers()), fourthColumnLength); posPrinter.endLine(); List<TicketItemModifierGroup> modifierGroups = ticketItem.getTicketItemModifierGroups(); if (modifierGroups != null) { for (TicketItemModifierGroup modifierGroup : modifierGroups) { List<TicketItemModifier> modifiers = modifierGroup.getTicketItemModifiers(); if (modifiers != null) { for (TicketItemModifier modifier : modifiers) { if (modifier.getTotalAmount() == 0) { continue; } boolean extra = false; String display = " - " + modifier.getName(); if (modifier.getModifierType() == TicketItemModifier.EXTRA_MODIFIER) { display = " - Extra " + display; extra = true; } posPrinter.beginLine(PosPrinter.SIZE_0); printFirstColumn(posPrinter, String.valueOf(modifier.getItemCount()), firstColumnLength); printSecondColumn(posPrinter, display, firstColumnLength, secondColumnLength, false); if(extra) { printThirdColumn(posPrinter, Application.formatNumber(modifier.getExtraUnitPrice()), thirdColumnLength); } else { printThirdColumn(posPrinter, Application.formatNumber(modifier.getUnitPrice()), thirdColumnLength); } printFourthColumn(posPrinter, Application.formatNumber(modifier.getTotalAmount()), fourthColumnLength); posPrinter.endLine(); } } } } } } posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText(StringUtils.leftPad("", totalLength, "_")); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText(StringUtils.leftPad("SUB-TOTAL :", 32)); posPrinter.printText(StringUtils.leftPad(Application.formatNumber(ticket.getSubtotalAmount()), 10)); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText(StringUtils.leftPad("TAX :", 32)); posPrinter.printText(StringUtils.leftPad(Application.formatNumber(ticket.getTaxAmount()), 10)); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText(StringUtils.leftPad("GRAND TOTAL :", 32)); posPrinter.printText(StringUtils.leftPad(Application.formatNumber(ticket.getTotalAmount()), 10)); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText(StringUtils.leftPad("TIP :", 32)); if (ticket.getGratuity() != null) { posPrinter.printText(StringUtils.leftPad(Application.formatNumber(ticket.getGratuity().getAmount()), 10)); } posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText(StringUtils.leftPad("TOTAL :", 32)); posPrinter.endLine(); printCentered(posPrinter, "THANK YOU!!"); printCentered(posPrinter, "PLEASE COME AGAIN!!!"); posPrinter.printCutPartial(); //posPrinter.openDrawer(); } catch(Exception x) { logger.error("Error while printing ticket", x); } finally { if (posPrinter != null) { posPrinter.finalize(); } } return null; } }; Worker.post(job); } public static void printToKitchen(final Ticket ticket) throws Exception { Job job = new Job() { @Override public Object run() { PosPrinter posPrinter = null; try { if(PrintConfig.getKitchenPrinterType() == PrinterType.OS_PRINTER) { JReportPrintService.printTicketToKitchen(ticket); return null; } Restaurant restaurant = RestaurantDAO.getInstance().get(Integer.valueOf(1)); posPrinter = new PosPrinter(PrintConfig.getJavaPosKitchenPrinterName(), PrintConfig.getCashDrawerName()); posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText("\u001b|cA\u001b|2C" + restaurant.getName()); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText("Ticket #" + ticket.getId()); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText("Srv : "); posPrinter.printText(String.valueOf(ticket.getOwner().getUserId() + "/" + ticket.getOwner())); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText("Date: "); posPrinter.printText(Application.formatDate(new Date())); posPrinter.endLine(); posPrinter.printEmptyLine(); posPrinter.beginLine(PosPrinter.SIZE_0); printFirstColumn(posPrinter, "ITEM#", kitchenFirstColumnLength); printSecondColumn(posPrinter, "ITEM NAME", kitchenFirstColumnLength, kitchenSecondColumnLength, false); printFourthColumn(posPrinter, "UNIT", kitchenThirdColumnLength); posPrinter.endLine(); List<TicketItem> ticketItems = ticket.getTicketItems(); for (TicketItem ticketItem : ticketItems) { if (ticketItem.isShouldPrintToKitchen() && !ticketItem.isPrintedToKitchen()) { printItemToKitchen(posPrinter, ticketItem); ticketItem.setPrintedToKitchen(true); } List<TicketItemModifierGroup> ticketItemModifierGroups = ticketItem.getTicketItemModifierGroups(); if (ticketItemModifierGroups != null) { for (TicketItemModifierGroup modifierGroup : ticketItemModifierGroups) { List<TicketItemModifier> ticketItemModifiers = modifierGroup.getTicketItemModifiers(); if (ticketItemModifiers != null) { for (TicketItemModifier modifier : ticketItemModifiers) { if (modifier.isShouldPrintToKitchen() && !modifier.isPrintedToKitchen()) { printModifierToKitchen(posPrinter, modifier); modifier.setPrintedToKitchen(true); } } } } } } posPrinter.printEmptyLine(); if (ticket.getDeletedItems() != null) { List deletedItems = ticket.getDeletedItems(); for (Object object : deletedItems) { if (object instanceof TicketItem) { TicketItem item = (TicketItem) object; if (item.isShouldPrintToKitchen()) { printDeletedItem(posPrinter, item.getId()); } } else if (object instanceof TicketItemModifier) { TicketItemModifier ticketItemModifier = (TicketItemModifier) object; if (ticketItemModifier.isShouldPrintToKitchen()) { printDeletedItem(posPrinter, ticketItemModifier.getId()); } } } } posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText("\u001b|cA\u001b|2CINSTRUCTIONS"); posPrinter.endLine(); Set<TicketCookingInstruction> cookingInstructions = ticket.getCookingInstructions(); if (cookingInstructions != null) { for (TicketCookingInstruction instruction : cookingInstructions) { if (!instruction.isPrintedToKitchen()) { printCentered(posPrinter, instruction.getDescription()); instruction.setPrintedToKitchen(true); } } } posPrinter.printCutPartial(); } catch(Exception x) { logger.error("Error while printing to kitchen", x); } finally { if (posPrinter != null) { posPrinter.finalize(); } } return null; } }; Worker.post(job); } public static void printVoidInfo(Ticket ticket) throws Exception { PosPrinter posPrinter = null; try { Restaurant restaurant = RestaurantDAO.getInstance().get(Integer.valueOf(1)); posPrinter = new PosPrinter(PrintConfig.getJavaPosKitchenPrinterName(), PrintConfig.getCashDrawerName()); posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText("\u001b|cA\u001b|2C" + restaurant.getName()); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText("\u001b|cA\u001DB\1============VOIDED CHECK============\u001DB\0"); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText("Ticket #" + ticket.getId()); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText("Srv : "); posPrinter.printText(String.valueOf(ticket.getOwner().getUserId() + "/" + ticket.getOwner())); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText("Date: "); posPrinter.printText(Application.formatDate(new Date())); posPrinter.endLine(); posPrinter.printEmptyLine(); posPrinter.printCutPartial(); } finally { if (posPrinter != null) { posPrinter.finalize(); } } } private static void printDeletedItem(PosPrinter posPrinter, int itemId) { posPrinter.beginLine(PosPrinter.SIZE_0); printFirstColumn(posPrinter, "DO NOT COOK " + itemId, firstColumnLength); posPrinter.endLine(); } private static void printItemToKitchen(PosPrinter posPrinter, TicketItem ticketItem) { posPrinter.beginLine(PosPrinter.SIZE_0); printFirstColumn(posPrinter, String.valueOf(ticketItem.getId()), kitchenFirstColumnLength); printSecondColumn(posPrinter, ticketItem.getName(), kitchenFirstColumnLength, kitchenSecondColumnLength, false); printFourthColumn(posPrinter, String.valueOf(ticketItem.getItemCount()), kitchenThirdColumnLength); posPrinter.endLine(); } private static void printModifierToKitchen(PosPrinter posPrinter, TicketItemModifier modifier) { posPrinter.beginLine(PosPrinter.SIZE_0); printFirstColumn(posPrinter, String.valueOf(modifier.getId()), kitchenFirstColumnLength); printSecondColumn(posPrinter, " - " + modifier.getName(), kitchenFirstColumnLength, kitchenSecondColumnLength, false); printFourthColumn(posPrinter, String.valueOf(modifier.getItemCount()), kitchenThirdColumnLength); posPrinter.endLine(); } static void printDrawerPullLine(PosPrinter printer, String firstColumn, String secondColumn) { printer.beginLine(PosPrinter.SIZE_0); printFirstColumn(printer, firstColumn, 30); printFourthColumn(printer, secondColumn, 10); printer.endLine(); } static void printDiscountLine(PosPrinter printer, String firstColumn, String secondColumn) { printer.beginLine(PosPrinter.SIZE_0); printer.printText(" "); printColumn(printer, firstColumn, 27); printRightAlignedColumn(printer, secondColumn, 10); printer.endLine(); } public static void printDrawerPullReport(DrawerPullReport drawerPullReport, Terminal terminal) { PosPrinter posPrinter = null; DecimalFormat decimalFormat = new DecimalFormat("0.00"); try { posPrinter = new PosPrinter(PrintConfig.getJavaPosReceiptPrinterName(), PrintConfig.getCashDrawerName()); printSeparator(posPrinter, '='); printCentered(posPrinter, "Time: " + Application.formatDate(drawerPullReport.getReportTime())); printSeparator(posPrinter, '='); posPrinter.printEmptyLine(); printDrawerPullLine(posPrinter, " NET SALES", decimalFormat.format(drawerPullReport.getNetSales())); printDrawerPullLine(posPrinter, "+SALES TAX", decimalFormat.format(drawerPullReport.getSalesTax())); printDrawerPullLine(posPrinter, "=TOTAL REVENUES", decimalFormat.format(drawerPullReport.getTotalRevenue())); printDrawerPullLine(posPrinter, "+CHARGED TIPS", decimalFormat.format(drawerPullReport.getChargedTips())); printSeparator(posPrinter, '-'); printDrawerPullLine(posPrinter, "=GROSS RECEIPTS", decimalFormat.format(drawerPullReport.getGrossReceipts())); posPrinter.printEmptyLine(); printDrawerPullLine(posPrinter, "-CASH RECEIPTS (" + drawerPullReport.getCashReceiptNumber() + ")", decimalFormat.format(drawerPullReport.getCashReceiptAmount())); printDrawerPullLine(posPrinter, "-CREDIT CARDS (" + drawerPullReport.getCreditCardReceiptNumber() + ")", decimalFormat.format(drawerPullReport.getCreditCardReceiptAmount())); printDrawerPullLine(posPrinter, "-DEBIT CARDS (" + drawerPullReport.getDebitCardReceiptNumber() + ")", decimalFormat.format(drawerPullReport.getDebitCardReceiptAmount())); printDrawerPullLine(posPrinter, "-GIFT RETURNS (" + drawerPullReport.getGiftCertReturnCount() + ")", decimalFormat.format(drawerPullReport.getGiftCertReturnAmount())); printDrawerPullLine(posPrinter, "+GIFT CERT. CHANGE" , decimalFormat.format(drawerPullReport.getGiftCertChangeAmount())); printDrawerPullLine(posPrinter, "+CASH BACK", decimalFormat.format(drawerPullReport.getCashBack())); printSeparator(posPrinter, '-'); printDrawerPullLine(posPrinter, "=RECEIPT DIFFERENTIAL", decimalFormat.format(drawerPullReport.getReceiptDifferential())); posPrinter.printEmptyLine(); printDrawerPullLine(posPrinter, "+CHARGED TIPS", decimalFormat.format(drawerPullReport.getChargedTips())); printDrawerPullLine(posPrinter, "-TIPS PAID", decimalFormat.format(drawerPullReport.getTipsPaid())); printSeparator(posPrinter, '-'); printDrawerPullLine(posPrinter, "=TIPS DIFFERENTIAL", decimalFormat.format(drawerPullReport.getTipsDifferential())); posPrinter.printEmptyLine(); printCentered(posPrinter, "CASH BALANCE"); printSeparator(posPrinter, '='); printDrawerPullLine(posPrinter, "CASH (" + drawerPullReport.getCashReceiptNumber() + ")", decimalFormat.format(drawerPullReport.getCashReceiptAmount())); printDrawerPullLine(posPrinter, "-TIPS PAID", decimalFormat.format(drawerPullReport.getTipsPaid())); printDrawerPullLine(posPrinter, "-PAY OUT (" + drawerPullReport.getPayOutNumber() + ")", decimalFormat.format(drawerPullReport.getPayOutAmount())); printDrawerPullLine(posPrinter, "-CASH BACK", decimalFormat.format(drawerPullReport.getCashBack())); printDrawerPullLine(posPrinter, "+BEGIN CASH", decimalFormat.format(terminal.getOpeningBalance())); printDrawerPullLine(posPrinter, "-DRAWER BLEED (" + drawerPullReport.getDrawerBleedNumber() + ")", decimalFormat.format(drawerPullReport.getDrawerBleedAmount())); printSeparator(posPrinter, '-'); printDrawerPullLine(posPrinter, "=DRAWER ACCOUNTABLE", decimalFormat.format(drawerPullReport.getDrawerAccountable())); printDrawerPullLine(posPrinter, ">CASH TO DEPOSIT", decimalFormat.format(terminal.getCurrentBalance())); printCentered(posPrinter, "=== EXCEPTIONS ==="); printCentered(posPrinter, "=== VOIDS/REFUNDS (Without Tax) ==="); posPrinter.beginLine(PosPrinter.SIZE_0); printColumn(posPrinter, "CODE", 6); printColumnSeparator(posPrinter); printColumn(posPrinter, "REASON", 10); printColumnSeparator(posPrinter); printColumn(posPrinter, "WAST", 4); printColumnSeparator(posPrinter); printColumn(posPrinter, "QTY", 6); printColumnSeparator(posPrinter); printColumn(posPrinter, "AMOUNT", 7); posPrinter.endLine(); Set<DrawerPullVoidTicketEntry> voidTickets = drawerPullReport.getVoidTickets(); if (voidTickets != null) { for (DrawerPullVoidTicketEntry entry : voidTickets) { print1stColumn(posPrinter, String.valueOf(entry.getCode()), 6); printColumnSeparator(posPrinter); printColumn(posPrinter, entry.getReason(), 10); printColumnSeparator(posPrinter); printColumn(posPrinter, " ", 4); printColumnSeparator(posPrinter); printColumn(posPrinter, String.valueOf(entry.getQuantity()), 6); printColumnSeparator(posPrinter); printColumn(posPrinter, Application.formatNumber(entry.getAmount()), 7); } } printSeparator(posPrinter, '='); print1stColumn(posPrinter, "TOTAL VOIDS W/WST", 25); printColumnSeparator(posPrinter); printRightAlignedColumn(posPrinter, decimalFormat.format(drawerPullReport.getTotalVoidWst()), 15); print1stColumn(posPrinter, "TOTAL VOIDS", 25); printColumnSeparator(posPrinter); printRightAlignedColumn(posPrinter, decimalFormat.format(drawerPullReport.getTotalVoid()), 15); posPrinter.endLine(); posPrinter.printEmptyLine(); printLastColumn(posPrinter, "TOTAL DISCOUNT", 25); printDiscountLine(posPrinter, "TOTAL COUNT", String.valueOf(drawerPullReport.getTotalDiscountCount())); printDiscountLine(posPrinter, "TOTAL Dsct", Application.formatNumber(drawerPullReport.getTotalDiscountAmount())); printDiscountLine(posPrinter, "TOTAL Sales", Application.formatNumber(drawerPullReport.getTotalDiscountSales())); printDiscountLine(posPrinter, "TOTAL Guest", String.valueOf(drawerPullReport.getTotalDiscountGuest())); printDiscountLine(posPrinter, "Party Size", String.valueOf(drawerPullReport.getTotalDiscountPartySize())); printDiscountLine(posPrinter, "Check Size", String.valueOf(drawerPullReport.getTotalDiscountCheckSize())); printDiscountLine(posPrinter, "Count [%]", String.valueOf(" ")); printDiscountLine(posPrinter, "Ration", String.valueOf(" ")); posPrinter.printCutPartial(); } finally { if (posPrinter != null) { posPrinter.finalize(); } } } public static void printServerTipsReport(TipsCashoutReport report) { PosPrinter posPrinter = null; DecimalFormat decimalFormat = new DecimalFormat("0.00"); try { posPrinter = new PosPrinter(PrintConfig.getJavaPosReceiptPrinterName(), PrintConfig.getCashDrawerName()); int c1 = 15; int c2 = 20; printCentered(posPrinter, "TIPS CASH OUT REPORT"); printSeparator(posPrinter, '='); posPrinter.printEmptyLine(); posPrinter.beginLine(PosPrinter.SIZE_0); printFirstColumn(posPrinter, "Server", c1); printSecondColumn(posPrinter, ": " + report.getServer(), c1, c2, false); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); printFirstColumn(posPrinter, "From", c1); printSecondColumn(posPrinter, ": " + Application.formatDate(report.getFromDate()), c1, c2, false); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); printFirstColumn(posPrinter, "To", c1); printSecondColumn(posPrinter, ": " + Application.formatDate(report.getToDate()), c1, c2, false); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); printFirstColumn(posPrinter, "Time", c1); printSecondColumn(posPrinter, ": " + Application.formatDate(report.getReportTime()), c1, c2, false); posPrinter.endLine(); List<TipsCashoutReportData> datas = report.getDatas(); if (datas == null) { return; } posPrinter.beginLine(PosPrinter.SIZE_0); printFirstColumn(posPrinter, "REF#", firstColumnLength); printSecondColumn(posPrinter, "C/Type", firstColumnLength, secondColumnLength, false); printThirdColumn(posPrinter, "Total", thirdColumnLength); printFourthColumn(posPrinter, "Tips", fourthColumnLength); posPrinter.endLine(); for (TipsCashoutReportData data : datas) { posPrinter.beginLine(PosPrinter.SIZE_0); printFirstColumn(posPrinter, String.valueOf(data.getTicketId()), firstColumnLength); printSecondColumn(posPrinter, data.getSaleType(), firstColumnLength, secondColumnLength, false); printThirdColumn(posPrinter, decimalFormat.format(data.getTicketTotal()), thirdColumnLength); printFourthColumn(posPrinter, decimalFormat.format(data.getTips()), fourthColumnLength); posPrinter.endLine(); } posPrinter.beginLine(PosPrinter.SIZE_0); printFirstColumn(posPrinter, "Transaction Count", c1); printSecondColumn(posPrinter, ": " + (report.getDatas() == null ? "0" : String.valueOf(report.getDatas().size())), c1, c2, false); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); printFirstColumn(posPrinter, "Cash Tips", c1); printSecondColumn(posPrinter, ": " + Application.formatNumber(report.getCashTipsAmount()), c1, c2, false); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); printFirstColumn(posPrinter, "Charged Tips", c1); printSecondColumn(posPrinter, ": " + Application.formatNumber(report.getChargedTipsAmount()), c1, c2, false); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); printFirstColumn(posPrinter, "Total Tips", c1); printSecondColumn(posPrinter, ": " + Application.formatNumber(report.getTotalTips()), c1, c2, false); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); printFirstColumn(posPrinter, "Average Tips", c1); printSecondColumn(posPrinter, ": " + Application.formatNumber(report.getAverageTips()), c1, c2, false); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); printFirstColumn(posPrinter, "Tips Due", c1); printSecondColumn(posPrinter, ": " + Application.formatNumber(report.getTipsDue()), c1, c2, false); posPrinter.endLine(); posPrinter.printCutPartial(); } finally { if (posPrinter != null) { posPrinter.finalize(); } } } /* public static void printMoneyReceipt(Ticket ticket) { PosPrinter posPrinter = null; try { Restaurant restaurant = RestaurantDAO.getInstance().get(Integer.valueOf(1)); posPrinter = new PosPrinter(PrintConfig.getJavaPosReceiptPrinterName(), PrintConfig.getCashDrawerName()); posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText("\u001b|cA\u001b|2C" + restaurant.getName()); posPrinter.endLine(); if (restaurant.getAddressLine1() != null) { printCentered(posPrinter, restaurant.getAddressLine1()); } if (restaurant.getAddressLine2() != null) { printCentered(posPrinter, restaurant.getAddressLine2()); } if (restaurant.getAddressLine3() != null) { printCentered(posPrinter, restaurant.getAddressLine3()); } if (restaurant.getTelephone() != null) { printCentered(posPrinter, restaurant.getTelephone()); } posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.endLine(); printCentered(posPrinter, "*** CHARGED RECEIPT ***"); posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText("Date/Time: "); SimpleDateFormat dateFormat = new SimpleDateFormat("mm/dd/yyyy hh:mm a"); posPrinter.printText(dateFormat.format(new Date())); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText("Check No: "); if(ticket.getCardNumber() != null) { posPrinter.printText(ticket.getCardNumber()); } else { posPrinter.printText("Cash"); } posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText("Server: "); posPrinter.printText(String.valueOf(ticket.getOwner().getUserId() + "/" + ticket.getOwner())); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText("Reference: "); posPrinter.printText(String.valueOf(ticket.getTableNumber())); posPrinter.endLine(); if (ticket.getCardType() != null) { posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText("Card Type: "); posPrinter.printText(String.valueOf(ticket.getCardType())); posPrinter.endLine(); } posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText("Subtotal: "); posPrinter.printText(Application.formatNumber(ticket.getSubtotalAmount())); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText("Discount: "); posPrinter.printText(Application.formatNumber(ticket.getDiscountAmount())); posPrinter.endLine(); posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText("Tax: "); posPrinter.printText(Application.formatNumber(ticket.getTaxAmount())); posPrinter.endLine(); double totalAmount = ticket.getTotalAmount(); if (ticket.getGratuity() != null) { posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText("Tip: "); posPrinter.printText(Application.formatNumber(ticket.getGratuity().getAmount())); posPrinter.endLine(); totalAmount += ticket.getGratuity().getAmount(); } posPrinter.beginLine(PosPrinter.SIZE_0); posPrinter.printText("Total: "); posPrinter.printText(Application.formatNumber(totalAmount)); posPrinter.endLine(); posPrinter.printCutPartial(); } finally { if (posPrinter != null) { posPrinter.finalize(); } } }*/ }