/*
* TicketInfoView.java
*
* Created on August 13, 2006, 11:17 PM
*/
package com.floreantpos.ui.views;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.JTextField;
import net.miginfocom.swing.MigLayout;
import com.floreantpos.main.Application;
import com.floreantpos.model.Ticket;
import com.floreantpos.model.TicketCouponAndDiscount;
import com.floreantpos.model.dao.TicketDAO;
import com.floreantpos.swing.POSToggleButton;
import com.floreantpos.swing.PosButton;
import com.floreantpos.ui.dialog.CouponAndDiscountDialog;
import com.floreantpos.ui.dialog.DiscountListDialog;
import com.floreantpos.ui.dialog.POSMessageDialog;
/**
*
* @author MShahriar
*/
public class TicketDetailView extends JPanel implements ActionListener {
public final static String VIEW_NAME = "TICKET_DETAIL";
private com.floreantpos.swing.PosButton btnApplyCoupon;
private com.floreantpos.swing.POSToggleButton btnTaxExempt;
private com.floreantpos.swing.PosButton btnViewDiscounts;
private javax.swing.JLabel lblBalanceDue;
private javax.swing.JTextField tfCreateTime;
private javax.swing.JTextField tfGuests;
private javax.swing.JTextField tfServerId;
private javax.swing.JTextField tfServerName;
private javax.swing.JTextField tfSubtotal;
private javax.swing.JTextField tfTable;
private javax.swing.JTextField tfTax;
private javax.swing.JTextField tfTerminal;
private javax.swing.JTextField tfTicketId;
private javax.swing.JTextField tfTotal;
private javax.swing.JTextField tfDue;
private javax.swing.JTextField tfTotalDiscount;
private SettleTicketView settleTicketView;
private SimpleDateFormat dateFormat = new SimpleDateFormat("MMM dd yy, hh:mm a");
private JPanel topPanel;
private JPanel balanceDuePanel;
private JPanel buttonPanel;
private List<Ticket> tickets;
/** Creates new form TicketInfoView */
public TicketDetailView() {
setLayout(new BorderLayout(5, 5));
topPanel = new JPanel(new MigLayout("align 50%"));
addRow(topPanel, "Ticket ID:", tfTicketId = new JTextField());
addRow(topPanel, "Server ID:", tfServerId = new JTextField());
addRow(topPanel, "Server Name:", tfServerName = new JTextField());
addRow(topPanel, "Created:", tfCreateTime = new JTextField());
addRow(topPanel, "Terminal:", tfTerminal = new JTextField());
addRow(topPanel, "Table #:", tfTable = new JTextField());
addRow(topPanel, "Guest #:", tfGuests = new JTextField());
addRow(topPanel, "Subtotal:", tfSubtotal = new JTextField());
addRow(topPanel, "Discount:", tfTotalDiscount = new JTextField());
addRow(topPanel, "Tax:", tfTax = new JTextField());
addRow(topPanel, "Total:", tfTotal = new JTextField());
addRow(topPanel, "Due:", tfDue = new JTextField());
add(topPanel, BorderLayout.CENTER);
balanceDuePanel = new JPanel(new MigLayout("align 50%"));
balanceDuePanel.add(new JSeparator(), "grow, span,w 320");
JLabel balanceDueTitle = new JLabel("BALANCE DUE");
balanceDuePanel.add(balanceDueTitle, "newline,grow,span");
balanceDuePanel.add(lblBalanceDue = new JLabel("0"), "newline,grow,span");
buttonPanel = new JPanel(new MigLayout("align 50%"));
buttonPanel.add(new JSeparator(), "newline, grow,span");
buttonPanel.add(btnApplyCoupon = new PosButton("COUPON & DISCOUNT"), "w 160, h 50, grow, span");
buttonPanel.add(btnViewDiscounts = new PosButton("VIEW DISCOUNTS"), "newline,w 160, h 50, ax 100%");
buttonPanel.add(btnTaxExempt = new POSToggleButton("TAX EXEMPT"), "w 160, h 50");
JPanel bottomPanel = new JPanel(new BorderLayout(5, 5));
bottomPanel.add(balanceDuePanel);
bottomPanel.add(buttonPanel, BorderLayout.SOUTH);
add(bottomPanel, BorderLayout.SOUTH);
setOpaque(false);
balanceDueTitle.setFont(new java.awt.Font("Tahoma", 1, 36));
balanceDueTitle.setForeground(new java.awt.Color(255, 102, 0));
balanceDueTitle.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
lblBalanceDue.setFont(new java.awt.Font("Tahoma", 1, 36));
lblBalanceDue.setForeground(new java.awt.Color(255, 102, 0));
lblBalanceDue.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
lblBalanceDue.setText("0.0");
btnApplyCoupon.addActionListener(this);
btnTaxExempt.addActionListener(this);
btnViewDiscounts.addActionListener(this);
}
private JLabel createLabel(String text) {
JLabel label = new JLabel(text);
label.setHorizontalAlignment(JLabel.RIGHT);
return label;
}
private JTextField createTextField(JTextField textField) {
textField.setEditable(false);
textField.setBackground(Color.white);
return textField;
}
private void addRow(JPanel panel, String title, JTextField textField) {
panel.add(createLabel(title), "newline, height pref");
panel.add(createTextField(textField), "w 250,height pref");
}
protected double getTotalAmount() {
List<Ticket> ticketsToSettle = getTickets();
if (ticketsToSettle == null) {
return 0;
}
double total = 0;
for (Ticket ticket : ticketsToSettle) {
total += ticket.getTotalAmount();
}
return total;
}
private void doTaxExempt() {//GEN-FIRST:event_doTaxExempt
List<Ticket> ticketsToSettle = getTickets();
boolean setTaxExempt = btnTaxExempt.isSelected();
if (setTaxExempt) {
int option = JOptionPane.showOptionDialog(this, "Are you sure you want to set tax exempt?", "Confirm", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null);
if (option != JOptionPane.YES_OPTION) {
return;
}
for (Ticket ticket : ticketsToSettle) {
ticket.setTaxExempt(true);
ticket.calculatePrice();
}
}
else {
for (Ticket ticket : ticketsToSettle) {
ticket.setTaxExempt(false);
ticket.calculatePrice();
}
}
updateView();
if(settleTicketView != null) {
settleTicketView.updatePaymentView();
}
}//GEN-LAST:event_doTaxExempt
private void doViewDiscounts() {//GEN-FIRST:event_btnViewDiscountsdoViewDiscounts
try {
DiscountListDialog dialog = new DiscountListDialog(tickets);
dialog.open();
if (!dialog.isCanceled() && dialog.isModified()) {
updateModel();
for (Ticket ticket : tickets) {
TicketDAO.getInstance().saveOrUpdate(ticket);
}
updateView();
if(settleTicketView != null) {
settleTicketView.updatePaymentView();
}
}
} catch (Exception e) {
POSMessageDialog.showError(this, "An error has occured", e);
}
}//GEN-LAST:event_btnViewDiscountsdoViewDiscounts
private void doApplyCoupon() {//GEN-FIRST:event_btnApplyCoupondoApplyCoupon
try {
for (Ticket ticket : tickets) {
if(ticket.getCouponAndDiscounts() != null && ticket.getCouponAndDiscounts().size() > 0) {
POSMessageDialog.showError("Only one discount or coupon can be added.");
return;
}
}
List<Ticket> tickets = getTickets();
Ticket ticket = tickets.get(0);
CouponAndDiscountDialog dialog = new CouponAndDiscountDialog();
dialog.setTicket(ticket);
dialog.initData();
dialog.open();
if (!dialog.isCanceled()) {
TicketCouponAndDiscount coupon = dialog.getSelectedCoupon();
ticket.addTocouponAndDiscounts(coupon);
updateModel();
TicketDAO.getInstance().saveOrUpdate(ticket);
updateView();
if(settleTicketView != null) {
settleTicketView.updatePaymentView();
}
}
} catch (Exception e) {
POSMessageDialog.showError(this, "Failed to apply coupon, an error has occured", e);
}
}//GEN-LAST:event_btnApplyCoupondoApplyCoupon
private void updateModel() {
List<Ticket> ticketsToSettle = getTickets();
for (Ticket ticket : ticketsToSettle) {
ticket.calculatePrice();
}
}
public void clearView() {
tfTicketId.setText("");
tfServerName.setText("");
tfCreateTime.setText("");
tfGuests.setText("");
tfTable.setText("");
tfTerminal.setText("");
tfSubtotal.setText("");
tfTotalDiscount.setText("");
tfTax.setText("");
tfTotal.setText("");
tfDue.setText("");
lblBalanceDue.setText("0.0");
}
private void updateView() {
List<Ticket> tickets = getTickets();
if (tickets.size() <= 0) {
clearView();
return;
}
String currencySymbol = Application.getCurrencySymbol();
if (tickets.size() == 1) {
Ticket ticket = tickets.get(0);
if (ticket.getId() != null) {
tfTicketId.setText(ticket.getId().toString());
}
tfServerId.setText(String.valueOf(ticket.getOwner().getUserId()));
tfServerName.setText(ticket.getOwner().toString());
tfCreateTime.setText(dateFormat.format(ticket.getCreateDate()));
tfGuests.setText(String.valueOf(ticket.getNumberOfGuests()));
tfTable.setText(String.valueOf(ticket.getTableNumber()));
tfTerminal.setText(ticket.getTerminal().getName());
tfSubtotal.setText(currencySymbol + Application.formatNumber(ticket.getSubtotalAmount()));
tfTotalDiscount.setText(currencySymbol + Application.formatNumber(ticket.getDiscountAmount()));
tfTax.setText(currencySymbol + Application.formatNumber(ticket.getTaxAmount()));
tfTotal.setText(currencySymbol + Application.formatNumber(ticket.getTotalAmount()));
tfDue.setText(currencySymbol + Application.formatNumber(ticket.getDueAmount()));
lblBalanceDue.setText(Application.formatNumber(ticket.getDueAmount()));
btnTaxExempt.setSelected(ticket.isTaxExempt());
btnApplyCoupon.setEnabled(true);
return;
}
Ticket firstTicket = tickets.get(0);
String idString = "";
int serverId = firstTicket.getOwner().getUserId();
String serverName = firstTicket.getOwner().toString();
String createTime = "<variant>";
int totalGuests = 0;
String tableNumber = "<variant>";
String terminal = firstTicket.getTerminal().getName();
double subtotal = 0;
double discount = 0;
double tax = 0;
double total = 0;
int taxExemptTicketCount = 0;
for (Iterator iter = tickets.iterator(); iter.hasNext();) {
Ticket ticket = (Ticket) iter.next();
if (ticket.getId() != null) {
idString += ticket.getId();
if (iter.hasNext()) {
idString += ", ";
}
}
totalGuests += ticket.getNumberOfGuests();
subtotal += ticket.getSubtotalAmount();
discount += ticket.getDiscountAmount();
tax += ticket.getTaxAmount();
total += ticket.getTotalAmount();
if (ticket.isTaxExempt()) {
taxExemptTicketCount++;
}
}
tfTicketId.setText(idString);
tfServerId.setText(String.valueOf(serverId));
tfServerName.setText(serverName);
tfCreateTime.setText(createTime);
tfGuests.setText(String.valueOf(totalGuests));
tfTable.setText(tableNumber);
tfTerminal.setText(terminal);
tfSubtotal.setText(currencySymbol + Application.formatNumber(subtotal));
tfTotalDiscount.setText(currencySymbol + Application.formatNumber(discount));
tfTax.setText(currencySymbol + Application.formatNumber(tax));
tfTotal.setText(currencySymbol + Application.formatNumber(total));
lblBalanceDue.setText(Application.formatNumber(total));
if (taxExemptTicketCount == tickets.size()) {
btnTaxExempt.setSelected(true);
}
else {
btnTaxExempt.setSelected(false);
}
btnApplyCoupon.setEnabled(false);
}
// Variables declaration - do not modify//GEN-BEGIN:variables
// End of variables declaration//GEN-END:variables
public void setDiscountPanelVisible(boolean b) {
balanceDuePanel.setVisible(b);
}
public boolean isDiscountPanelVisible() {
return balanceDuePanel.isVisible();
}
public void setBalanceDuePanelVisible(boolean b) {
balanceDuePanel.setVisible(b);
}
public boolean isBalanceDuePanelVisible() {
return balanceDuePanel.isVisible();
}
public void setButtonPanelVisible(boolean b) {
buttonPanel.setVisible(b);
}
public SettleTicketView getSettleTicketView() {
return settleTicketView;
}
public void setSettleTicketView(SettleTicketView settleTicketView) {
this.settleTicketView = settleTicketView;
}
public List<Ticket> getTickets() {
return tickets;
}
public void setTickets(List<Ticket> tickets) {
this.tickets = tickets;
updateView();
}
public void setTicket(Ticket ticket) {
tickets = new ArrayList<Ticket>(1);
tickets.add(ticket);
updateView();
}
public void cleanup() {
tickets = null;
}
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
if (source == btnApplyCoupon) {
doApplyCoupon();
}
if (source == btnTaxExempt) {
doTaxExempt();
}
if (source == btnViewDiscounts) {
doViewDiscounts();
}
}
}