/*
* CashDrawerReportDialog.java
*
* Created on August 24, 2006, 11:20 PM
*/
package com.floreantpos.ui.dialog;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Set;
import javax.swing.JEditorPane;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import net.miginfocom.swing.MigLayout;
import org.apache.ecs.Document;
import org.apache.ecs.html.BR;
import org.apache.ecs.html.HR;
import org.apache.ecs.html.P;
import org.apache.ecs.html.TD;
import org.apache.ecs.html.TR;
import org.apache.ecs.html.Table;
import com.floreantpos.main.Application;
import com.floreantpos.model.DrawerPullReport;
import com.floreantpos.model.DrawerPullVoidTicketEntry;
import com.floreantpos.model.Terminal;
import com.floreantpos.model.User;
import com.floreantpos.model.dao.TerminalDAO;
import com.floreantpos.print.PosPrintService;
import com.floreantpos.report.services.ReportService;
import com.floreantpos.swing.PosButton;
import com.floreantpos.ui.TitlePanel;
/**
*
* @author MShahriar
*/
public class DrawerPullReportDialog extends POSDialog {
private SimpleDateFormat dateFormat = new SimpleDateFormat("dd MMMM, yyyy");
private DecimalFormat decimalFormat = new DecimalFormat("0.00");
private DrawerPullReport drawerPullReport;
private Terminal terminal;
public DrawerPullReportDialog(java.awt.Frame parent, boolean modal) {
super(parent, modal);
initComponents();
}
public void initialize() throws Exception {
terminal = Application.getInstance().getTerminal();
drawerPullReport = ReportService.buildDrawerPullReport();
taReport.setContentType("text/html");
taReport.setEditable(false);
taReport.setMargin(new Insets(0,10,0,10));
taReport.setText(createReport());
taReport.setCaretPosition(0);
taReport.setPreferredSize(new Dimension(360,100));
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
private void initComponents() {
setLayout(new BorderLayout(5,5));
titlePanel1 = new TitlePanel();
add(titlePanel1, BorderLayout.NORTH);
taReport = new JEditorPane();
taReport.setContentType("text/html");
add(new JScrollPane(taReport));
JPanel buttonPanel = new JPanel(new MigLayout("fill","","[fill, grow][]"));
buttonPanel.add(new JSeparator(), "grow,span,wrap");
buttonPanel.add(btnPrint = new PosButton("PRINT"), "w 120, h 50, grow");
buttonPanel.add(btnResetCashDrawer = new PosButton("RESET DRAWER"), "w 120, h 50, grow");
buttonPanel.add(btnFinish = new PosButton("CLOSE"), "w 120, h 50, grow");
add(buttonPanel, BorderLayout.SOUTH);
btnFinish.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
btnFinishActionPerformed();
}
});
btnResetCashDrawer.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
btnResetCashDrawerActionPerformed();
}
});
btnPrint.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
PosPrintService.printDrawerPullReport(drawerPullReport, terminal);
} catch (Exception ex) {
POSMessageDialog.showError(DrawerPullReportDialog.this, "Error while printing\n" + ex.getMessage());
ex.printStackTrace();
}
}
});
}// </editor-fold>//GEN-END:initComponents
private void btnResetCashDrawerActionPerformed() {//GEN-FIRST:event_btnResetCashDrawerActionPerformed
int option = JOptionPane.showOptionDialog(this, "Sure reset cash drawer?", "Confirm", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null);
if(option != JOptionPane.YES_OPTION) return;
Application app = Application.getInstance();
Terminal terminal = app.getTerminal();
User user = Application.getCurrentUser();
TerminalDAO dao = new TerminalDAO();
try {
dao.resetCashDrawer(drawerPullReport, terminal, user);
} catch (Exception e) {
POSMessageDialog.showError("Cannot save", e);
}
}//GEN-LAST:event_btnResetCashDrawerActionPerformed
private void btnFinishActionPerformed() {//GEN-FIRST:event_btnFinishActionPerformed
dispose();
}//GEN-LAST:event_btnFinishActionPerformed
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new DrawerPullReportDialog(new javax.swing.JFrame(), true).setVisible(true);
}
});
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private com.floreantpos.swing.PosButton btnFinish;
private com.floreantpos.swing.PosButton btnPrint;
private com.floreantpos.swing.PosButton btnResetCashDrawer;
private javax.swing.JEditorPane taReport;
private com.floreantpos.ui.TitlePanel titlePanel1;
// End of variables declaration//GEN-END:variables
void createReportHeader(Document document) {
P p = new P();
//p.addElement(new Font().addAttribute("size", "7"));
p.addAttribute("align", "center");
p.addElement("===================================");
p.addElement(new BR());
p.addElement("DRAWER PULL");
p.addElement(new BR());
p.addElement("===================================");
document.appendBody(p);
}
void createSectionHeader(Document document, String headerText) {
P p = new P();
p.addAttribute("align", "center");
p.addElement(headerText);
p.addElement(new HR());
document.appendBody(p);
}
void addSeparator(Document document) {
P p = new P();
HR hr = new HR();
hr.addAttribute("style", "border: dashed;");
p.addElement(hr);
document.appendBody(p);
}
void addTableSeparator(Table table) {
TR tr = new TR();
TD td = new TD();
td.addAttribute("colspan", 2);
td.addAttribute("align", "right");
HR hr = new HR();
hr.addAttribute("style", "border: dashed;");
td.addElement(hr);
tr.addElement(td);
table.addElement(tr);
}
void addExceptionTableSeparator(Table table) {
TR tr = new TR();
TD td = new TD();
td.addAttribute("colspan", 5);
td.addAttribute("align", "right");
HR hr = new HR();
hr.addAttribute("style", "border: dashed;");
td.addElement(hr);
tr.addElement(td);
table.addElement(tr);
}
void addTableRow(Table table, String column1, String coulmn2) {
TR tr = new TR();
tr.addElement(new TD().addElement(column1));
tr.addElement(new TD().addAttribute("align", "right").addElementToRegistry(coulmn2));
table.addElement(tr);
}
void addDiscountTableRow(Table table, String column1, String coulmn2) {
TR tr = new TR();
tr.addElement(new TD().addAttribute("style", "padding-left: 50px;").addElementToRegistry(column1));
tr.addElement(new TD().addAttribute("align", "right").addElementToRegistry(coulmn2));
table.addElement(tr);
}
void addExceptionTableRow(Table table, String column1, String coulmn2, String coulmn3, String coulmn4, String column5) {
TR tr = new TR();
TD td = new TD();
td.addAttribute("valign", "top");
td.addElement(column1);
tr.addElement(td);
td = new TD();
td.addAttribute("valign", "top");
td.addElement(coulmn2);
tr.addElement(td);
td = new TD();
td.addAttribute("valign", "top");
td.addAttribute("align", "right");
td.addElement(coulmn3);
tr.addElement(td);
td = new TD();
td.addAttribute("valign", "top");
td.addAttribute("align", "right");
td.addElement(coulmn4);
tr.addElement(td);
td = new TD();
td.addAttribute("valign", "top");
td.addAttribute("align", "right");
td.addElement(column5);
tr.addElement(td);
table.addElement(tr);
}
public String createReport() throws Exception {
Document document = new Document();
Table table = null;
createReportHeader(document);
P p = new P();
p.addElement("Time: " + dateFormat.format(new Date()));
document.appendBody(p);
createSectionHeader(document, " SALES BALANCE ");
table = new Table();
table.addAttribute("width", "100%");
addTableRow(table, " NET SALES", decimalFormat.format(drawerPullReport.getNetSales()));
addTableRow(table, "+SALES TAX", decimalFormat.format(drawerPullReport.getSalesTax()));
addTableRow(table, "=TOTAL REVENUES", decimalFormat.format(drawerPullReport.getTotalRevenue()));
addTableRow(table, "+CHARGED TIPS", decimalFormat.format(drawerPullReport.getChargedTips()));
addTableSeparator(table);
addTableRow(table, "=GROSS RECEIPTS", decimalFormat.format(drawerPullReport.getGrossReceipts()));
document.appendBody(table);
document.appendBody(new BR());
table = new Table();
table.addAttribute("width", "100%");
addTableRow(table, "-CASH RECEIPTS (" + drawerPullReport.getCashReceiptNumber() + ")", decimalFormat.format(drawerPullReport.getCashReceiptAmount()));
addTableRow(table, "-CREDIT CARDS (" + drawerPullReport.getCreditCardReceiptNumber() + ")", decimalFormat.format(drawerPullReport.getCreditCardReceiptAmount()));
addTableRow(table, "-DEBIT CARDS (" + drawerPullReport.getDebitCardReceiptNumber() + ")", decimalFormat.format(drawerPullReport.getDebitCardReceiptAmount()));
addTableRow(table, "-GIFT RETURNS (" + drawerPullReport.getGiftCertReturnCount() + ")", decimalFormat.format(drawerPullReport.getGiftCertReturnAmount()));
addTableRow(table, "+GIFT CERT. CHANGE", decimalFormat.format(drawerPullReport.getGiftCertChangeAmount()));
addTableRow(table, "+CASH BACK", decimalFormat.format(drawerPullReport.getCashBack()));
addTableSeparator(table);
addTableRow(table, "=RECEIPT DIFFERENTIAL", decimalFormat.format(drawerPullReport.getReceiptDifferential()));
document.appendBody(table);
document.appendBody(new BR());
table = new Table();
table.addAttribute("width", "100%");
addTableRow(table, "+CHARGED TIPS", decimalFormat.format(drawerPullReport.getChargedTips()));
addTableRow(table, "-TIPS PAID", decimalFormat.format(drawerPullReport.getTipsPaid()));
addTableSeparator(table);
addTableRow(table, "=TIPS DIFFERENTIAL", decimalFormat.format(drawerPullReport.getTipsDifferential()));
document.appendBody(table);
document.appendBody(new BR());
createSectionHeader(document, " CASH BALANCE ");
table = new Table();
table.addAttribute("width", "100%");
addTableRow(table, "CASH (" + drawerPullReport.getCashReceiptNumber() + ")", decimalFormat.format(drawerPullReport.getCashReceiptAmount()));
//addTableRow(table, "CASH TAX", decimalFormat.format(drawerPullReport.getCashTax()));
addTableRow(table, "-TIPS PAID", decimalFormat.format(drawerPullReport.getTipsPaid()));
addTableRow(table, "-PAY OUT (" + drawerPullReport.getPayOutNumber() + ")", decimalFormat.format(drawerPullReport.getPayOutAmount()));
addTableRow(table, "-CASH BACK", decimalFormat.format(drawerPullReport.getCashBack()));
addTableRow(table, "+BEGIN CASH", decimalFormat.format(terminal.getOpeningBalance()));
addTableRow(table, "-DRAWER BLEED (" + drawerPullReport.getDrawerBleedNumber() + ")", decimalFormat.format(drawerPullReport.getDrawerBleedAmount()));
addTableSeparator(table);
addTableRow(table, "=DRAWER ACCOUNTABLE", decimalFormat.format(drawerPullReport.getDrawerAccountable()));
addTableRow(table, ">CASH TO DEPOSIT", decimalFormat.format(drawerPullReport.getCashToDeposit()));
document.appendBody(table);
createSectionHeader(document, "=== EXCEPTIONS ===");
createSectionHeader(document, "=== VOIDS/REFUNDS (Without Tax) ===");
table = new Table();
table.addAttribute("width", "100%");
addExceptionTableRow(table, "CODE", "REASON", "WAST", "QTY", "AMOUNT");
addExceptionTableSeparator(table);
//CONDITIONAL
Set<DrawerPullVoidTicketEntry> voidTickets = drawerPullReport.getVoidTickets();
if(voidTickets != null) {
for (DrawerPullVoidTicketEntry entry : voidTickets) {
addExceptionTableRow(table, String.valueOf(entry.getCode()), entry.getReason(), " ", String.valueOf(entry.getQuantity()), Application.formatNumber(entry.getAmount()));
}
}
addExceptionTableSeparator(table);
document.appendBody(table);
table = new Table();
table.addAttribute("width", "100%");
addTableRow(table, "TOTAL VOIDS W/WST", decimalFormat.format(drawerPullReport.getTotalVoidWst()));
addTableRow(table, "TOTAL VOIDS", decimalFormat.format(drawerPullReport.getTotalVoid()));
document.appendBody(table);
createSectionHeader(document, "=== DISCOUNTS/COUPONS ===");
table = new Table();
document.appendBody(table);
table.addAttribute("width", "100%");
addTableRow(table, "TOTAL DISCOUNT/COUPON", "");
addDiscountTableRow(table, "TOTAL COUNT", String.valueOf(drawerPullReport.getTotalDiscountCount()));
addDiscountTableRow(table, "TOTAL Dsct", Application.formatNumber(drawerPullReport.getTotalDiscountAmount()));
addDiscountTableRow(table, "TOTAL Sales", Application.formatNumber(drawerPullReport.getTotalDiscountSales()));
addDiscountTableRow(table, "TOTAL Guest", String.valueOf(drawerPullReport.getTotalDiscountGuest()));
addDiscountTableRow(table, "Party Size", String.valueOf(drawerPullReport.getTotalDiscountPartySize()));
addDiscountTableRow(table, "Check Size", String.valueOf(drawerPullReport.getTotalDiscountCheckSize()));
addDiscountTableRow(table, "Count [%]", String.valueOf(" "));
addDiscountTableRow(table, "Ration", String.valueOf(" "));
return document.toString();
}
public void setTitle(String title) {
titlePanel1.setTitle(title);
super.setTitle(title);
}
}