package com.floreantpos.ui.views;
import java.awt.LayoutManager;
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import com.floreantpos.main.Application;
import com.floreantpos.model.PosTransaction;
import com.floreantpos.model.Ticket;
import com.floreantpos.print.PosPrintService;
import com.floreantpos.services.PosTransactionService;
import com.floreantpos.swing.MessageDialog;
import com.floreantpos.ui.dialog.POSMessageDialog;
import com.floreantpos.ui.dialog.PaymentTypeSelectionDialog;
import com.floreantpos.ui.dialog.TransactionCompletionDialog;
import com.floreantpos.ui.views.order.RootView;
public abstract class PaymentView extends JPanel {
protected SettleTicketView settleTicketView;
public PaymentView(LayoutManager layout, boolean isDoubleBuffered) {
super(layout, isDoubleBuffered);
}
public PaymentView(LayoutManager layout) {
super(layout);
}
public PaymentView(boolean isDoubleBuffered) {
super(isDoubleBuffered);
}
public PaymentView() {
super();
}
public SettleTicketView getSettleTicketView() {
return settleTicketView;
}
public void setSettleTicketView(SettleTicketView settleTicketView) {
this.settleTicketView = settleTicketView;
}
protected double getTotalAmount() {
List<Ticket> ticketsToSettle = settleTicketView.getTicketsToSettle();
if(ticketsToSettle == null) {
return 0;
}
double total = 0;
for (Ticket ticket : ticketsToSettle) {
total += ticket.getTotalAmount();
}
return total;
}
protected double getPaidAmount() {
List<Ticket> ticketsToSettle = settleTicketView.getTicketsToSettle();
if(ticketsToSettle == null) {
return 0;
}
double total = 0;
for (Ticket ticket : ticketsToSettle) {
total += ticket.getPaidAmount();
}
return total;
}
protected double getDueAmount() {
List<Ticket> ticketsToSettle = settleTicketView.getTicketsToSettle();
if(ticketsToSettle == null) {
return 0;
}
double total = 0;
for (Ticket ticket : ticketsToSettle) {
total += ticket.getDueAmount();
}
return total;
}
protected double getTotalGratuity() {
List<Ticket> ticketsToSettle = settleTicketView.getTicketsToSettle();
if(ticketsToSettle == null) {
return 0;
}
double total = 0;
for (Ticket ticket : ticketsToSettle) {
if(ticket.getGratuity() != null) {
total += ticket.getGratuity().getAmount();
}
}
return total;
}
public void changePaymentMethod() {
PaymentTypeSelectionDialog dialog = new PaymentTypeSelectionDialog();
dialog.setSize(250, 400);
dialog.open();
if (!dialog.isCanceled()) {
SettleTicketView view = SettleTicketView.getInstance();
view.setPaymentView(dialog.getSelectedPaymentView());
view.setTicketsToSettle(settleTicketView.getTicketsToSettle());
RootView.getInstance().showView(SettleTicketView.VIEW_NAME);
}
}
public void settleTickets(double tenderedAmount, double gratuityAmount, PosTransaction posTransaction, String cardType, String cardAuthorizationCode) {
try {
double totalAmount = Double.parseDouble(Application.formatNumber(getTotalAmount()));
double dueAmountBeforePaid = Double.parseDouble(Application.formatNumber(getDueAmount()));
List<Ticket> ticketsToSettle = settleTicketView.getTicketsToSettle();
if (ticketsToSettle.size() > 1 && tenderedAmount < dueAmountBeforePaid) {
MessageDialog.showError("You cannot partially pay multiple tickets.");
return;
}
PosTransactionService service = PosTransactionService.getInstance();
service.settleTickets(ticketsToSettle, tenderedAmount, gratuityAmount, posTransaction, cardType, cardAuthorizationCode);
try {
for (Ticket ticket : ticketsToSettle) {
PosPrintService.printTicket(ticket);
}
}catch(Exception ee) {
POSMessageDialog.showError(Application.getPosWindow(), "There was an error while printing money receipt", ee);
}
/*if(Application.getPrinterConfiguration().isPrintReceiptWhenTicketPaid()) {
try {
for (Ticket ticket : ticketsToSettle) {
PosPrintService.printTicket(ticket);
}
}catch(Exception ee) {
POSMessageDialog.showError(Application.getPosWindow(), "There was an error while printing to kitchen", ee);
}
}
if(Application.getPrinterConfiguration().isPrintKitchenWhenTicketPaid()) {
try {
for (Ticket ticket : ticketsToSettle) {
if(ticket.needsKitchenPrint()) {
PosPrintService.printToKitcken(ticket);
}
ticket.clearDeletedItems();
}
}catch(Exception ee) {
POSMessageDialog.showError(Application.getPosWindow(), "There was an error while printing to kitchen", ee);
}
}*/
double paidAmount = Double.parseDouble(Application.formatNumber(getPaidAmount()));
double dueAmount = Double.parseDouble(Application.formatNumber(getDueAmount()));
TransactionCompletionDialog dialog = TransactionCompletionDialog.getInstance();
dialog.setTickets(ticketsToSettle);
dialog.setTenderedAmount(tenderedAmount);
dialog.setTotalAmount(totalAmount);
dialog.setPaidAmount(paidAmount);
dialog.setDueAmount(dueAmount);
dialog.setDueAmountBeforePaid(dueAmountBeforePaid);
dialog.setGratuityAmount(gratuityAmount);
dialog.updateView();
dialog.pack();
dialog.open();
if(dueAmount > 0.0) {
int option = JOptionPane.showConfirmDialog(Application.getPosWindow(), "A partial payment has been made, do you want to make another payment on this check?", "MDS-POS", JOptionPane.YES_NO_OPTION);
if(option != JOptionPane.YES_OPTION) {
RootView.getInstance().showView(SwitchboardView.VIEW_NAME);
return;
}
PaymentTypeSelectionDialog paymentTypeSelectionDialog = new PaymentTypeSelectionDialog();
paymentTypeSelectionDialog.setSize(250, 400);
paymentTypeSelectionDialog.open();
if (!paymentTypeSelectionDialog.isCanceled()) {
settleTicketView.setPaymentView(paymentTypeSelectionDialog.getSelectedPaymentView());
settleTicketView.setTicketsToSettle(ticketsToSettle);
}
}
else {
RootView.getInstance().showView(SwitchboardView.VIEW_NAME);
}
} catch (Exception e) {
POSMessageDialog.showError(this, POSMessageDialog.ERROR_MESSAGE, e);
}
}
public abstract void updateView();
}