Files
unicenta-opos/src/main/java/com/unicenta/pos/sales/JPanelTicket.java
T

3521 lines
134 KiB
Java
Raw Normal View History

2023-04-06 18:58:04 +01:00
// uniCenta oPOS - Touch Friendly Point Of Sale
// Copyright (c) 2009-2018 uniCenta & previous Openbravo POS works
// https://unicenta.com
//
// This file is part of uniCenta oPOS
//
// uniCenta oPOS is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// uniCenta oPOS is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with uniCenta oPOS. If not, see <http://www.gnu.org/licenses/>.
package com.unicenta.pos.sales;
import bsh.EvalError;
import bsh.Interpreter;
import com.alee.extended.time.ClockType;
import com.alee.extended.time.WebClock;
import com.alee.managers.notification.NotificationIcon;
import com.alee.managers.notification.NotificationManager;
import com.alee.managers.notification.WebNotification;
import com.unicenta.basic.BasicException;
import com.unicenta.beans.JNumberPop;
import com.unicenta.data.gui.ComboBoxValModel;
import com.unicenta.data.gui.ListKeyed;
import com.unicenta.data.gui.MessageInf;
import com.unicenta.data.loader.SentenceList;
import com.unicenta.plugins.Application;
import com.unicenta.pos.catalog.JCatalog;
import com.unicenta.pos.customers.*;
import com.unicenta.pos.forms.*;
import com.unicenta.pos.inventory.ProductStock;
import com.unicenta.pos.inventory.TaxCategoryInfo;
import com.unicenta.pos.panels.JProductFinder;
import com.unicenta.pos.payment.JPaymentSelect;
import com.unicenta.pos.payment.JPaymentSelectReceipt;
import com.unicenta.pos.payment.JPaymentSelectRefund;
import com.unicenta.pos.printer.TicketParser;
import com.unicenta.pos.printer.TicketPrinterException;
import com.unicenta.pos.sales.restaurant.RestaurantDBUtils;
import com.unicenta.pos.scale.ScaleException;
import com.unicenta.pos.scripting.ScriptEngine;
import com.unicenta.pos.scripting.ScriptException;
import com.unicenta.pos.scripting.ScriptFactory;
import com.unicenta.pos.ticket.*;
import com.unicenta.pos.util.AltEncrypter;
import com.unicenta.pos.util.InactivityListener;
import com.unicenta.pos.util.JRPrinterAWT300;
import com.unicenta.pos.util.ReportUtils;
import lombok.extern.slf4j.Slf4j;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRMapArrayDataSource;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.xml.JRXmlLoader;
import javax.print.PrintService;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.FocusEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.util.*;
import static java.awt.Window.getWindows;
/**
* @author JG uniCenta
*/
@Slf4j
public abstract class JPanelTicket extends JPanel implements JPanelView, BeanFactoryApp, TicketsEditor {
private final static int NUMBERZERO = 0;
private final static int NUMBERVALID = 1;
private final static int NUMBER_INPUTZERO = 0;
private final static int NUMBER_INPUTZERODEC = 1;
private final static int NUMBER_INPUTINT = 2;
private final static int NUMBER_INPUTDEC = 3;
private final static int NUMBER_PORZERO = 4;
private final static int NUMBER_PORZERODEC = 5;
private final static int NUMBER_PORINT = 6;
private final static int NUMBER_PORDEC = 7;
protected JTicketLines m_ticketlines;
private TicketParser m_TTP;
protected TicketInfo m_oTicket;
protected Object m_oTicketExt;
private int m_iNumberStatus;
private int m_iNumberStatusInput;
private int m_iNumberStatusPor;
private StringBuffer m_sBarcode;
private JTicketsBag m_ticketsbag;
private SentenceList senttax;
private ListKeyed taxcollection;
private SentenceList senttaxcategories;
private ListKeyed taxcategoriescollection;
private ComboBoxValModel taxcategoriesmodel;
private TaxesLogic taxeslogic;
protected JPanelButtons m_jbtnconfig;
protected AppView m_App;
protected DataLogicSystem dlSystem;
protected DataLogicSales dlSales;
protected DataLogicCustomers dlCustomers;
private JPaymentSelect paymentdialogreceipt;
private JPaymentSelect paymentdialogrefund;
private JRootApp root;
private Object m_principalapp;
private Boolean restaurant;
private Boolean orderlistopen;
private Action logout;
private InactivityListener listener;
private Integer delay = 0;
private final String m_sCurrentTicket = null;
protected TicketsEditor m_panelticket;
private DataLogicReceipts dlReceipts = null;
private Boolean priceWith00;
private final String temp_jPrice = "";
private String tableDetails;
private RestaurantDBUtils restDB;
private KitchenDisplay kitchenDisplay;
private String ticketPrintType;
private Boolean warrantyPrint = false;
private TicketInfo m_ticket;
private TicketInfo m_ticketCopy;
private AppConfig m_config;
private Integer count = 0;
private Integer oCount = 0;
private Boolean pinOK;
/**
* Creates new form JTicketView
*/
public JPanelTicket() {
initComponents();
}
/**
* @param app
* @throws BeanFactoryException
*/
@Override
public void init(AppView app) throws BeanFactoryException {
m_config = new AppConfig(new File((System.getProperty("user.home")), AppLocal.APP_ID + ".properties"));
m_config.load();
m_App = app;
restDB = new RestaurantDBUtils(m_App);
dlSystem = (DataLogicSystem) m_App.getBean("com.unicenta.pos.forms.DataLogicSystem");
dlSales = (DataLogicSales) m_App.getBean("com.unicenta.pos.forms.DataLogicSales");
dlCustomers = (DataLogicCustomers) m_App.getBean("com.unicenta.pos.customers.DataLogicCustomers");
dlReceipts = (DataLogicReceipts) app.getBean("com.unicenta.pos.sales.DataLogicReceipts");
/* uniCenta Feb 2018
* Changed for 4.3
* Set up main toolbar area with two rows to add cater for additional scripts
* else over-crowding and some dynamic buttons off screen/not visible
* m_jPanelScripts contains m_jButtonsExt panel for buttons Enabled/Disabled in
* Resources>Menu.Root
*/
// Set Configuration>General>Tickets toolbar simple : standard : restaurant option
m_ticketsbag = getJTicketsBag();
m_jPanelBag.add(m_ticketsbag.getBagComponent(), BorderLayout.LINE_START);
add(m_ticketsbag.getNullComponent(), "null");
// Script event buttons
m_jbtnconfig = new JPanelButtons("Ticket.Buttons", this);
m_jButtonsExt.add(m_jbtnconfig);
// Configuration>Peripheral options
if (!m_App.getDeviceScale().existsScale()) {
m_jbtnScale.setVisible(false);
}
jbtnMooring.setVisible(Boolean.valueOf(m_App.getProperties().getProperty("till.marineoption")));
m_jPanelScripts.setVisible(false);
m_jButtonsExt.setVisible(false);
jTBtnShow.setSelected(false);
if (Boolean.valueOf(m_App.getProperties().getProperty("till.amountattop"))) {
m_jPanEntries.remove(jPanel9);
m_jPanEntries.remove(m_jNumberKeys);
m_jPanEntries.add(jPanel9);
m_jPanEntries.add(m_jNumberKeys);
}
priceWith00 = ("true".equals(m_App.getProperties().getProperty("till.pricewith00")));
if (priceWith00) {
m_jNumberKeys.dotIs00(true);
}
m_ticketlines = new JTicketLines(dlSystem.getResourceAsXML("Ticket.Line"));
m_jPanelCentral.add(m_ticketlines, java.awt.BorderLayout.CENTER);
m_TTP = new TicketParser(m_App.getDeviceTicket(), dlSystem);
catcontainer.add(getSouthComponent(), BorderLayout.CENTER);
senttax = dlSales.getTaxList();
senttaxcategories = dlSales.getTaxCategoriesList();
taxcategoriesmodel = new ComboBoxValModel();
stateToZero();
m_oTicket = null;
m_oTicketExt = null;
jCheckStock.setText(AppLocal.getIntString("message.title.checkstock"));
if (this instanceof JPanelTicketSales) {
// 2016-10-14 TJMChan - Sales screen Layout code starts here.
if (AppConfig.getInstance().getProperty("machine.saleslayout") != null) {
JSalesLayoutManager.createLayout();
if (AppConfig.getInstance().getProperty("machine.saleslayout").equals("Layout1")) {
Component southcomponent = getSouthComponent();
catcontainer.add(southcomponent, BorderLayout.CENTER);
JPanel southpanel = (JPanel) southcomponent;
((JPanel) southpanel.getComponent(0)).setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5));
JPanel fpanel = new JPanel(new BorderLayout());
fpanel.add(m_jPanEntries, BorderLayout.WEST);
if (southcomponent instanceof JCatalog) {
fpanel.add(((JCatalog) southpanel).getCatComponent(), BorderLayout.EAST);
}
m_jPanEntriesE.add(jPanel5, BorderLayout.WEST);
m_jPanEntriesE.add(fpanel, BorderLayout.EAST);
m_jTicketId.setPreferredSize(new Dimension(300, 16));
m_jPanTicket.add(m_jTicketId, BorderLayout.BEFORE_FIRST_LINE);
jPanel2.setPreferredSize(new Dimension(90, 305));
jPanel5.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 0));
jPanel4.add(m_jPanTotals, BorderLayout.CENTER);
m_jContEntries.add(m_jPanEntriesE, BorderLayout.NORTH);
if (southcomponent instanceof JCatalog) {
JCatalog catpanel = (JCatalog) southpanel;
m_jContEntries.add(catpanel.getProductComponent(), BorderLayout.CENTER);
catpanel.setControls("south");
catpanel.getCatComponent().setPreferredSize(new Dimension(230, 10));
catpanel.getProductComponent().setPreferredSize(new Dimension(230, 350));
} else {
m_jContEntries.add(southpanel, BorderLayout.CENTER);
}
southcomponent.setPreferredSize(new Dimension(0, 0));
} else if (AppConfig.getInstance().getProperty("machine.saleslayout").equals("Layout2")) {
if (catcontainer.getComponent(0) instanceof JCatalog) {
JCatalog catpanel = (JCatalog) catcontainer.getComponent(0);
catpanel.setControls("south");
catpanel.getCatComponent().setPreferredSize(new Dimension(230, 10));
}
jPanel4.add(m_jPanTotals, BorderLayout.CENTER);
m_jPanContainer.add(m_jPanTicket, BorderLayout.EAST);
m_jPanContainer.add(catcontainer, BorderLayout.CENTER);
jPanel5.setPreferredSize(new Dimension(80, 0));
jPanel2.setPreferredSize(new Dimension(90, 310));
m_jPanEntriesE.add(jPanel5, BorderLayout.CENTER);
m_jPanEntriesE.setBorder(BorderFactory.createEmptyBorder(3, 0, 0, 0));
m_jContEntries.add(m_jPanEntries, BorderLayout.CENTER);
m_jPanEntries.setPreferredSize(new Dimension(250, 316));
m_jTicketId.setPreferredSize(new Dimension(300, 16));
m_jPanTicket.add(m_jTicketId, BorderLayout.BEFORE_FIRST_LINE);
m_jPanTicket.setPreferredSize(new Dimension(390, 316));
m_jPanTicket.add(m_jContEntries, BorderLayout.SOUTH);
} else if (AppConfig.getInstance().getProperty("machine.saleslayout").equals("Layout3")) {
JPanel catPanel = null;
JPanel jpanelA = new JPanel(new BorderLayout());
if (catcontainer.getComponent(0) instanceof JCatalog) {
JCatalog myCatpanel = (JCatalog) catcontainer.getComponent(0);
myCatpanel.setControls("south");
myCatpanel.getCatComponent().setPreferredSize(new Dimension(230, 10));
catPanel = (JPanel) myCatpanel.getCatComponent();
catPanel.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 0));
m_jPanContainer.add(jpanelA, BorderLayout.EAST);
jpanelA.add(catPanel, BorderLayout.CENTER);
}
jPanel4.add(m_jPanTotals, BorderLayout.CENTER);
m_jPanContainer.add(m_jPanTicket, BorderLayout.EAST);
m_jPanContainer.add(catcontainer, BorderLayout.CENTER);
jPanel5.setPreferredSize(new Dimension(80, 0));
jPanel2.setPreferredSize(new Dimension(90, 310));
m_jPanEntriesE.add(jPanel5, BorderLayout.CENTER);
m_jPanEntriesE.setBorder(BorderFactory.createEmptyBorder(3, 0, 0, 0));
m_jContEntries.add(m_jPanEntries, BorderLayout.CENTER);
m_jPanEntries.setPreferredSize(new Dimension(250, 316));
m_jTicketId.setPreferredSize(new Dimension(300, 16));
m_jPanTicket.add(m_jTicketId, BorderLayout.BEFORE_FIRST_LINE);
if (catPanel != null) {
m_jPanTicket.setPreferredSize(new Dimension(500, 316));
jpanelA.add(m_jContEntries, BorderLayout.EAST);
m_jPanTicket.add(jpanelA, BorderLayout.SOUTH);
} else {
m_jPanTicket.setPreferredSize(new Dimension(390, 316));
m_jPanTicket.add(m_jContEntries, BorderLayout.SOUTH);
}
}
}
}
}
@Override
public Object getBean() {
return this;
}
@Override
public JComponent getComponent() {
return this;
}
private void jPanContainerFocusLost(FocusEvent evt) {
System.out.println("PanelContainer : Focus Lost");
}
private class logout extends AbstractAction {
public logout() {
}
@Override
public void actionPerformed(ActionEvent ae) {
closeAllDialogs();
switch (m_App.getProperties().getProperty("machine.ticketsbag")) {
case "restaurant":
if ("false".equals(m_App.getProperties().getProperty("till.autoLogoffrestaurant"))) {
deactivate();
((JRootApp) m_App).closeAppView();
break;
}
deactivate();
setActiveTicket(null, null);
break;
default:
deactivate();
((JRootApp) m_App).closeAppView();
}
}
}
private void closeAllDialogs() {
Window[] windows = getWindows();
for (Window window : windows) {
if (window instanceof JDialog) {
window.dispose();
}
}
}
private void saveCurrentTicket() {
String currentTicket = (String) m_oTicketExt;
if (currentTicket != null) {
try {
dlReceipts.updateSharedTicket(currentTicket, m_oTicket, m_oTicket.getPickupId());
// } catch (BasicException e) {
// new MessageInf(e).show(this);
// }
} catch (BasicException ex) {
log.error(ex.getMessage());
}
}
}
/**
* @throws BasicException
*/
@Override
public void activate() throws BasicException {
Action logout = new logout();
String autoLogoff = (m_App.getProperties().getProperty("till.autoLogoff"));
if (autoLogoff != null) {
if (autoLogoff.equals("true")) {
try {
delay = Integer.parseInt(m_App.getProperties().getProperty("till.autotimer"));
} catch (NumberFormatException e) {
delay = 0;
}
delay *= 1000;
}
}
if (delay != 0) {
listener = new InactivityListener(logout, delay);
listener.start();
}
paymentdialogreceipt = JPaymentSelectReceipt.getDialog(this);
paymentdialogreceipt.init(m_App);
paymentdialogrefund = JPaymentSelectRefund.getDialog(this);
paymentdialogrefund.init(m_App);
m_jaddtax.setSelected("true".equals(m_jbtnconfig.getProperty("taxesincluded")));
java.util.List<TaxInfo> taxlist = senttax.list();
taxcollection = new ListKeyed<>(taxlist);
java.util.List<TaxCategoryInfo> taxcategorieslist = senttaxcategories.list();
taxcategoriescollection = new ListKeyed<>(taxcategorieslist);
taxcategoriesmodel = new ComboBoxValModel(taxcategorieslist);
m_jTax.setModel(taxcategoriesmodel);
String taxesid = m_jbtnconfig.getProperty("taxcategoryid");
if (taxesid == null) {
if (m_jTax.getItemCount() > 0) {
m_jTax.setSelectedIndex(0);
}
} else {
taxcategoriesmodel.setSelectedKey(taxesid);
}
taxeslogic = new TaxesLogic(taxlist);
m_jaddtax.setSelected((Boolean.parseBoolean(m_App.getProperties().getProperty("till.taxincluded"))));
if (m_App.getAppUserView().getUser().hasPermission("sales.ChangeTaxOptions")) {
m_jTax.setVisible(true);
m_jaddtax.setVisible(true);
} else {
m_jTax.setVisible(false);
m_jaddtax.setVisible(false);
}
m_jDelete.setEnabled(m_App.getAppUserView().getUser().hasPermission("sales.EditLines"));
m_jNumberKeys.setMinusEnabled(m_App.getAppUserView().getUser().hasPermission("sales.EditLines"));
m_jNumberKeys.setEqualsEnabled(m_App.getAppUserView().getUser().hasPermission("sales.Total"));
m_jbtnconfig.setPermissions(m_App.getAppUserView().getUser());
m_ticketsbag.setEnabled(false);
m_ticketsbag.activate();
CustomerInfoGlobal customerInfoGlobal = CustomerInfoGlobal.getInstance();
if (customerInfoGlobal.getCustomerInfoExt() != null) {
if (m_oTicket != null) {
m_oTicket.setCustomer(customerInfoGlobal.getCustomerInfoExt());
}
}
refreshTicket();
}
@Override
public boolean deactivate() {
if (listener != null) {
listener.stop();
}
return m_ticketsbag.deactivate();
}
protected abstract JTicketsBag getJTicketsBag();
protected abstract Component getSouthComponent();
protected abstract void resetSouthComponent();
/**
* @param oTicket
* @param oTicketExt
*/
@SuppressWarnings("empty-statement")
@Override
public void setActiveTicket(TicketInfo oTicket, Object oTicketExt) {
switch (m_App.getProperties().getProperty("machine.ticketsbag")) {
case "restaurant":
if ("true".equals(m_App.getProperties().getProperty("till.autoLogoffrestaurant"))) {
if (listener != null) {
listener.restart();
}
}
}
m_oTicket = oTicket;
m_oTicketExt = oTicketExt;
if (m_oTicket != null) {
m_oTicket.setUser(m_App.getAppUserView().getUser().getUserInfo());
m_oTicket.setActiveCash(m_App.getActiveCashIndex());
m_oTicket.setDate(new Date());
if ("restaurant".equals(m_App.getProperties().getProperty("machine.ticketsbag"))
&& !oTicket.getOldTicket()) {
if (restDB.getCustomerNameInTable(oTicketExt.toString()) == null) {
if (m_oTicket.getCustomer() != null) {
restDB.setCustomerNameInTable(m_oTicket.getCustomer().toString(),
oTicketExt.toString());
}
}
if (restDB.getWaiterNameInTable(oTicketExt.toString()) == null
|| "".equals(restDB.getWaiterNameInTable(oTicketExt.toString()))) {
restDB.setWaiterNameInTable(m_App.getAppUserView().getUser().getName(),
oTicketExt.toString());
}
restDB.setTicketIdInTable(m_oTicket.getId(), oTicketExt.toString());
restDB.setGuestsInTable(restDB.getGuestsInTable(m_oTicket.getId()), m_oTicket.getId());
restDB.setOccupied(m_oTicket.getId());
}
}
if ((m_oTicket != null) && (((Boolean.parseBoolean(m_App.getProperties()
.getProperty("table.showwaiterdetails")))
|| (Boolean.valueOf(m_App.getProperties().getProperty(
"table.showcustomerdetails")))))) {
}
if ((m_oTicket != null) && (((Boolean.valueOf(m_App.getProperties()
.getProperty("table.showcustomerdetails"))) ||
(Boolean.parseBoolean(m_App.getProperties().getProperty("table.showwaiterdetails")))))) {
if (restDB.getTableMovedFlag(m_oTicket.getId())) {
restDB.moveCustomer(oTicketExt.toString(), m_oTicket.getId());
}
}
executeEvent(m_oTicket, m_oTicketExt, "ticket.show");
if (m_App.getAppUserView().getUser().hasPermission("sales.PrintRemote")) {
j_btnRemotePrt.setEnabled(true);
} else {
j_btnRemotePrt.setEnabled(false);
}
refreshTicket();
}
/**
* @return
*/
@Override
public TicketInfo getActiveTicket() {
return m_oTicket;
}
private void refreshTicket() {
CardLayout cl = (CardLayout) (getLayout());
if (m_oTicket == null) {
m_jTicketId.setText(null);
m_ticketlines.clearTicketLines();
m_jSubtotalEuros.setText(null);
m_jTaxesEuros.setText(null);
m_jTotalEuros.setText(null);
jCheckStock.setText(null);
checkStock();
stateToZero();
repaint();
cl.show(this, "null");
if ((m_oTicket != null) && (m_oTicket.getLinesCount() == 0)) {
resetSouthComponent();
}
} else {
if (m_oTicket.getTicketType() == TicketInfo.RECEIPT_REFUND) {
m_jEditLine.setVisible(false);
m_jList.setVisible(false);
}
m_oTicket.getLines().forEach((line) -> {
line.setTaxInfo(taxeslogic.getTaxInfo(line
.getProductTaxCategoryID(), m_oTicket.getCustomer()));
});
m_jTicketId.setText(m_oTicket.getName(m_oTicketExt));
m_ticketlines.clearTicketLines();
for (int i = 0; i < m_oTicket.getLinesCount(); i++) {
m_ticketlines.addTicketLine(m_oTicket.getLine(i));
}
// set line here?
countArticles();
printPartialTotals();
stateToZero();
cl.show(this, "ticket");
if (m_oTicket.getLinesCount() == 0) {
resetSouthComponent();
}
m_jKeyFactory.setText(null);
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
m_jKeyFactory.requestFocus();
}
});
}
}
private void countArticles() {
oCount = count; // existing line before change
count = (int) m_oTicket.getArticlesCount(); //existing line after change
if (m_oTicket != null) {
for (int i = 0; i < m_oTicket.getLinesCount(); i++) {
if (m_App.getAppUserView().getUser().hasPermission("sales.Total")
&& m_oTicket.getArticlesCount() > 1) {
btnSplit.setEnabled(true);
} else {
btnSplit.setEnabled(false);
}
}
}
}
private boolean changeCount(boolean pinOK) {
pinOK = false;
if (m_oTicket != null) {
if (m_App.getProperties().getProperty("override.check").equals("true")) {
Integer secret = Integer.parseInt(m_App.getProperties().getProperty("override.pin"));
Integer iValue = JNumberPop.showEditNumber(this, AppLocal.getIntString("title.override.enterpin"));
if (iValue == null ? secret == null : iValue.equals(secret)) {
pinOK = true;
JOptionPane.showMessageDialog(this, "Units changed from "
+ count + " to " + oCount);
return pinOK;
} else {
pinOK = false;
JOptionPane.showMessageDialog(this, AppLocal.getIntString("message.override.badpin"));
return pinOK;
}
}
}
return pinOK;
}
private void printPartialTotals() {
if (m_oTicket.getLinesCount() == 0) {
m_jSubtotalEuros.setText(null);
m_jTaxesEuros.setText(null);
m_jTotalEuros.setText(null);
} else {
m_jSubtotalEuros.setText(m_oTicket.printSubTotal());
m_jTaxesEuros.setText(m_oTicket.printTax());
m_jTotalEuros.setText(m_oTicket.printTotal());
}
repaint();
}
private void paintTicketLine(int index, TicketLineInfo oLine) {
if (executeEventAndRefresh("ticket.setline",
new ScriptArg("index", index), new ScriptArg("line", oLine)) == null) {
m_oTicket.setLine(index, oLine);
m_ticketlines.setTicketLine(index, oLine);
m_ticketlines.setSelectedIndex(index);
oCount = count; // pass line old multiplier value
countArticles();
visorTicketLine(oLine);
printPartialTotals();
stateToZero();
executeEventAndRefresh("ticket.change");
}
}
private void addTicketLine(ProductInfoExt oProduct, double dMul, double dPrice) {
// if (oProduct.isVprice() || oProduct.getID().equals("xxx999_999xxx_x9x9x9")){
if (oProduct.isVprice()) {
TaxInfo tax = taxeslogic.getTaxInfo(oProduct.getTaxCategoryID(), m_oTicket.getCustomer());
if (m_jaddtax.isSelected()) {
dPrice /= (1 + tax.getRate());
}
addTicketLine(new TicketLineInfo(oProduct, dMul, dPrice, tax,
(java.util.Properties) (oProduct.getProperties().clone())));
} else if (oProduct.getID().equals("xxx998_998xxx_x8x8x8")) {
if (m_App.getProperties().getProperty("till.SCOnOff").equals("true")) {
TaxInfo tax = taxeslogic.getTaxInfo(oProduct.getTaxCategoryID(),
m_oTicket.getCustomer());
String SCRate = (m_App.getProperties().getProperty("till.SCRate"));
double scharge;
scharge = Double.parseDouble(SCRate);
scharge = m_oTicket.getTotal() * (scharge / 100);
addTicketLine(new TicketLineInfo(oProduct, 1, scharge, tax,
(java.util.Properties) (oProduct.getProperties().clone())));
} else {
JOptionPane.showMessageDialog(this, "Service Charge Not Enabled");
}
} else {
// get the line product tax
TaxInfo tax = taxeslogic.getTaxInfo(oProduct.getTaxCategoryID(), m_oTicket.getCustomer());
addTicketLine(new TicketLineInfo(oProduct, dMul, dPrice, tax,
(java.util.Properties) (oProduct.getProperties().clone())));
// if (oProduct.getID().equals("xxx999_999xxx_x9x9x9")){
// m_jEditLine.doClick();
// }
refreshTicket();
}
j_btnRemotePrt.setEnabled(true);
}
/**
* @param oLine
*/
protected void addTicketLine(TicketLineInfo oLine) {
if (executeEventAndRefresh("ticket.addline", new ScriptArg("line", oLine)) == null) {
if (oLine.isProductCom()) {
int i = m_ticketlines.getSelectedIndex();
if (i >= 0 && !m_oTicket.getLine(i).isProductCom()) {
i++;
}
while (i >= 0 && i < m_oTicket.getLinesCount() && m_oTicket.getLine(i).isProductCom()) {
i++;
}
if (i >= 0) {
m_oTicket.insertLine(i, oLine);
m_ticketlines.insertTicketLine(i, oLine);
} else {
Toolkit.getDefaultToolkit().beep();
}
} else {
m_oTicket.addLine(oLine);
m_ticketlines.addTicketLine(oLine);
try {
int i = m_ticketlines.getSelectedIndex();
TicketLineInfo line = m_oTicket.getLine(i);
if (line.isProductVerpatrib()) {
JProductAttEdit2 attedit = JProductAttEdit2.getAttributesEditor(this, m_App.getSession());
attedit.editAttributes(line.getProductAttSetId(), line.getProductAttSetInstId());
attedit.setVisible(true);
if (attedit.isOK()) {
line.setProductAttSetInstId(attedit.getAttributeSetInst());
line.setProductAttSetInstDesc(attedit.getAttributeSetInstDescription());
paintTicketLine(i, line);
}
}
} catch (BasicException ex) {
MessageInf msg = new MessageInf(MessageInf.SGN_WARNING,
AppLocal.getIntString("message.cannotfindattributes"), ex);
msg.show(this);
}
}
visorTicketLine(oLine);
printPartialTotals();
stateToZero();
checkStock();
countArticles();
executeEvent(m_oTicket, m_oTicketExt, "ticket.change");
}
}
private void removeTicketLine(int i) {
// if (m_App.getProperties().getProperty("override.check").equals("true")) {
if (!m_oTicket.getLine(i).getUpdated()) {
JOptionPane.showMessageDialog(this
, AppLocal.getIntString("message.deletelinesent")
, AppLocal.getIntString("label.deleteline")
, JOptionPane.WARNING_MESSAGE);
} else {
if (executeEventAndRefresh("ticket.removeline", new ScriptArg("index", i)) == null) {
String ticketID = Integer.toString(m_oTicket.getTicketId());
if (m_oTicket.getTicketId() == 0) {
ticketID = "Void";
}
dlSystem.execLineRemoved(
new Object[]{
m_App.getAppUserView().getUser().getName(),
ticketID,
m_oTicket.getLine(i).getProductID(),
m_oTicket.getLine(i).getProductName(),
m_oTicket.getLine(i).getMultiply()
}
);
if (m_oTicket.getLine(i).isProductCom()) {
m_oTicket.removeLine(i);
m_ticketlines.removeTicketLine(i);
} else {
if (i < 1) {
if (m_App.getAppUserView().getUser().hasPermission("sales.DeleteLines")) {
int input = JOptionPane.showConfirmDialog(this,
AppLocal.getIntString("message.deletelineyes")
, AppLocal.getIntString("label.deleteline"), JOptionPane.YES_NO_OPTION);
if (input == 0) {
m_oTicket.removeLine(i);
m_ticketlines.removeTicketLine(i);
}
} else {
JOptionPane.showMessageDialog(this,
AppLocal.getIntString("message.deletelineno")
, AppLocal.getIntString("label.deleteline"), JOptionPane.WARNING_MESSAGE);
}
} else {
m_oTicket.removeLine(i);
m_ticketlines.removeTicketLine(i);
while (i < m_oTicket.getLinesCount() && m_oTicket.getLine(i).isProductCom()) {
m_oTicket.removeLine(i);
m_ticketlines.removeTicketLine(i);
}
}
}
visorTicketLine(null);
printPartialTotals();
stateToZero();
checkStock();
countArticles();
executeEventAndRefresh("ticket.change");
}
}
// }
}
private ProductInfoExt getInputProduct() {
ProductInfoExt oProduct = new ProductInfoExt();
// Always add Default Prod ID + Add Name to Misc. if empty
oProduct.setID("xxx999_999xxx_x9x9x9");
oProduct.setReference("xxx999");
oProduct.setCode("xxx999");
oProduct.setName("***");
oProduct.setTaxCategoryID(((TaxCategoryInfo) taxcategoriesmodel
.getSelectedItem()).getID());
oProduct.setPriceSell(includeTaxes(oProduct.getTaxCategoryID(), getInputValue()));
return oProduct;
}
private double includeTaxes(String tcid, double dValue) {
if (m_jaddtax.isSelected()) {
TaxInfo tax = taxeslogic.getTaxInfo(tcid, m_oTicket.getCustomer());
double dTaxRate = tax == null ? 0.0 : tax.getRate();
return dValue / (1.0 + dTaxRate);
} else {
return dValue;
}
}
private double excludeTaxes(String tcid, double dValue) {
TaxInfo tax = taxeslogic.getTaxInfo(tcid, m_oTicket.getCustomer());
double dTaxRate = tax == null ? 0.0 : tax.getRate();
return dValue / (1.0 + dTaxRate);
}
private double getInputValue() {
try {
return Double.parseDouble(m_jPrice.getText());
} catch (NumberFormatException e) {
return 0.0;
}
}
private double getPorValue() {
try {
return Double.parseDouble(m_jPor.getText().substring(1));
} catch (NumberFormatException | StringIndexOutOfBoundsException e) {
return 1.0;
}
}
private void stateToZero() {
m_jPor.setText("");
m_jPrice.setText("");
m_sBarcode = new StringBuffer();
m_iNumberStatus = NUMBER_INPUTZERO;
m_iNumberStatusInput = NUMBERZERO;
m_iNumberStatusPor = NUMBERZERO;
repaint();
}
private void incProductByCode(String sCode) {
try {
ProductInfoExt oProduct = dlSales.getProductInfoByCode(sCode);
if (oProduct == null) {
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
sCode + " - " + AppLocal.getIntString("message.noproduct"),
"Check", JOptionPane.WARNING_MESSAGE);
stateToZero();
} else {
incProduct(oProduct);
}
} catch (BasicException eData) {
stateToZero();
new MessageInf(eData).show(this);
}
}
private void incProductByCodePrice(String sCode, double dPriceSell) {
try {
ProductInfoExt oProduct = dlSales.getProductInfoByCode(sCode);
if (oProduct == null) {
Toolkit.getDefaultToolkit().beep();
new MessageInf(MessageInf.SGN_WARNING, AppLocal
.getIntString("message.noproduct")).show(this);
stateToZero();
} else {
if (m_jaddtax.isSelected()) {
TaxInfo tax = taxeslogic.getTaxInfo(oProduct.getTaxCategoryID(), m_oTicket.getCustomer());
addTicketLine(oProduct, 1.0, dPriceSell / (1.0 + tax.getRate()));
} else {
addTicketLine(oProduct, 1.0, dPriceSell);
}
}
} catch (BasicException eData) {
stateToZero();
new MessageInf(eData).show(this);
}
}
private void incProduct(ProductInfoExt prod) {
if (prod.isScale() && m_App.getDeviceScale().existsScale()) {
try {
Double value = m_App.getDeviceScale().readWeight();
if (value != null) {
incProduct(value, prod);
}
} catch (ScaleException e) {
Toolkit.getDefaultToolkit().beep();
new MessageInf(MessageInf.SGN_WARNING, AppLocal
.getIntString("message.noweight"), e).show(this);
stateToZero();
}
} else {
if (!prod.isVprice()) {
incProduct(1.0, prod);
} else {
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
AppLocal.getIntString("message.novprice"));
}
}
}
private void incProduct(double dPor, ProductInfoExt prod) {
if (prod.isVprice()) {
addTicketLine(prod, getPorValue(), getInputValue());
} else {
addTicketLine(prod, dPor, prod.getPriceSell());
}
}
/**
* @param prod
*/
protected void buttonTransition(ProductInfoExt prod) {
if (m_iNumberStatusInput == NUMBERZERO && m_iNumberStatusPor == NUMBERZERO) {
incProduct(prod);
} else if (m_iNumberStatusInput == NUMBERVALID && m_iNumberStatusPor == NUMBERZERO) {
incProduct(getInputValue(), prod);
} else if (prod.isVprice()) {
addTicketLine(prod, getPorValue(), getInputValue());
} else {
Toolkit.getDefaultToolkit().beep();
}
}
@SuppressWarnings("empty-statement")
private void stateTransition(char cTrans) {
if ((cTrans == '\n') || (cTrans == '?')) {
if (m_sBarcode.length() > 0) {
String sCode = m_sBarcode.toString();
String sCodetype = "EAN"; // Declare EAN. It's default
if ("true".equals(m_App.getProperties()
.getProperty("machine.barcodetype"))) {
sCodetype = "UPC";
} else {
sCodetype = "EAN"; // Ensure not null
}
if (sCode.startsWith("C")
|| sCode.startsWith("c")) {
try {
String card = sCode;
CustomerInfoExt newcustomer = dlSales.findCustomerExt(card);
if (newcustomer == null) {
Toolkit.getDefaultToolkit().beep();
new MessageInf(MessageInf.SGN_WARNING, AppLocal
.getIntString("message.nocustomer")).show(this);
} else {
m_oTicket.setCustomer(newcustomer);
m_jTicketId.setText(m_oTicket.getName(m_oTicketExt));
}
} catch (BasicException e) {
Toolkit.getDefaultToolkit().beep();
new MessageInf(MessageInf.SGN_WARNING, AppLocal
.getIntString("message.nocustomer"), e).show(this);
}
stateToZero();
} else if (sCode.startsWith(";")) {
stateToZero();
// START OF BARCODE PARSING
/* This block is deliberately verbose and is base for future scanner handling
* Some scanners inject a CR+LF... some don't...
* stateTransition() must allow for this as these add characters to .length()
* First 3 digits are GS1 CountryCode OR Retailer internal use
*
* Prefix ManCodeProdCode CheckCode
* PPP MMMMMCCCCC K
* 012 3456789012 K
* Barcode CCCCC must be unique
* Notes:
* ManufacturerCode and ProductCode must be exactly 10 digits
* If code begins with 0 then is actually a UPC-A with prepended 0
*
* uniCenta oPOS Retailer instore uses these RULES
* Prefixes 020 to 029 are set aside for Retailer internal use
* This means that CCCC becomes price/weight values
* Prefixes 978 and 979 are set aside for ISBN - Future use
*
* Prefix ManCode ProdCode CheckCode
* PPP MMMMM CCCCC K Format
* 012 34567 89012 K Human
*
*/
} else if ("EAN".equals(sCodetype)
&& ((sCode.startsWith("2")) || (sCode.startsWith("02"))) // check code prefix
&& ((sCode.length() == 13) || (sCode.length() == 12))) { // check code length variances
try {
ProductInfoExt oProduct // get product(s) with PMMMMM
= dlSales.getProductInfoByShortCode(sCode);
if (oProduct == null) { // nothing returned so display message to user
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
sCode + " - "
+ AppLocal.getIntString("message.noproduct"),
"Check", JOptionPane.WARNING_MESSAGE);
stateToZero(); // clear the user input
} else if ("EAN-13".equals(oProduct.getCodetype())) { // have a valid barcode
oProduct.setProperty("product.barcode", sCode); // set the screen's barcode from input
double dPriceSell = oProduct.getPriceSell(); // default price for product
double weight = 0; // used if barcode includes weight of product
double dUnits = 0; // used for pro-rata unit
String sVariableTypePrefix = sCode.substring(0, 2); // get first two PPP digits
String sVariableNum; // CCCCC variable value of barcode
if (sCode.length() == 13) { // full barcode from scanner
sVariableNum = sCode.substring(8, 12); // get the 5 CCCCC digits
} else { // barcode can be any length
sVariableNum = sCode.substring(7, 11); // get the 5 CCCCC digits
} // scanner has dropped 1st digit so shift get to left
// PRICE - SET value decimals
switch (sVariableTypePrefix) { // Use CCCCC value of 01049 as example
case "02": // first 2 PPP digits determine decimal position
dUnits = (Double.parseDouble(sVariableNum) // position decimal in CCC.CC
/ 100) / oProduct.getPriceSell(); // 2 decimal = 010.49
break;
case "20":
dUnits = (Double.parseDouble(sVariableNum) // position decimal in CCC.CC
/ 100) / oProduct.getPriceSell(); // 2 decimal = 010.49
break;
case "21":
dUnits = (Double.parseDouble(sVariableNum) // position decimal in CC.CCC
/ 10) / oProduct.getPriceSell(); // 2 decimal = 0104.9
break;
case "22":
dUnits = Double.parseDouble(sVariableNum) // position decimal in CCCC.C
/ oProduct.getPriceSell(); // Price = 01049.
break;
// WEIGHT - SET value decimals
case "23": // Use CCCCC 01049kg as example
weight = Double.parseDouble(sVariableNum)
/ 1000; // Weight = 01.049
dUnits = weight; // set Units for price calculation
break;
case "24":
weight = Double.parseDouble(sVariableNum)
/ 100; // Weight = 010.49
dUnits = weight; // set Units for price calculation
break;
case "25":
weight = Double.parseDouble(sVariableNum)
/ 10; // Weight = 0104.9
dUnits = weight; // set Units for price calculation
break;
default:
break;
}
TaxInfo tax = taxeslogic // get the TaxRate for the product
.getTaxInfo(oProduct.getTaxCategoryID()
, m_oTicket.getCustomer()); // calculate if ticket has a Customer
switch (sVariableTypePrefix) {
// PRICE - Assign var's
case "02": // now we need to calculate some values
dPriceSell = oProduct.getPriceSellTax(tax)
/ (1.0 + tax.getRate()); // selling price with tax
dUnits = (Double.parseDouble(sVariableNum)
/ 100) / oProduct.getPriceSellTax(tax); // Units as proportion of selling price
oProduct.setProperty("product.price"
, Double.toString(oProduct.getPriceSell())); // push to screen
break;
case "20": // as above
dPriceSell = oProduct.getPriceSellTax(tax)
/ (1.0 + tax.getRate());
dUnits = (Double.parseDouble(sVariableNum)
/ 100) / oProduct.getPriceSellTax(tax);
oProduct.setProperty("product.price"
, Double.toString(oProduct.getPriceSellTax(tax)));
break;
case "21":
dPriceSell = oProduct.getPriceSellTax(tax)
/ (1.0 + tax.getRate());
dUnits = (Double.parseDouble(sVariableNum)
/ 10) / oProduct.getPriceSellTax(tax);
oProduct.setProperty("product.price"
, Double.toString(oProduct.getPriceSell()));
break;
case "22":
dPriceSell = oProduct.getPriceSellTax(tax)
/ (1.0 + tax.getRate());
dUnits = (Double.parseDouble(sVariableNum)
/ 1) / oProduct.getPriceSellTax(tax);
oProduct.setProperty("product.price"
, Double.toString(oProduct.getPriceSell()));
break;
// WEIGHT - Assign variable to Unit
case "23":
weight = Double.parseDouble(sVariableNum)
/ 1000; // 3 decimals = 01.049 kg
dUnits = weight; // which represents 1gramme Units
oProduct.setProperty("product.weight"
, Double.toString(weight));
oProduct.setProperty("product.price"
, Double.toString(dPriceSell));
break;
case "24":
weight = Double.parseDouble(sVariableNum)
/ 100; // 2 decimals = 010.49 kg
dUnits = weight; // which represents 10gramme Units
oProduct.setProperty("product.weight"
, Double.toString(weight));
oProduct.setProperty("product.price"
, Double.toString(dPriceSell));
break;
case "25":
weight = Double.parseDouble(sVariableNum)
/ 10; // 1 decimal = 0104.9 kg
dUnits = weight; // which represents 100gramme Units
oProduct.setProperty("product.weight"
, Double.toString(weight));
oProduct.setProperty("product.price"
, Double.toString(dPriceSell));
break;
/*
* Some countries use different barcode prefix 26-29 or 250 etc.
* Use this section to add more case statements but these are not mandatory
* If you have your own internal or other barcode schema then...
* Example:
case "28":
{
// price has tax. Remove it from sPriceSell
TaxInfo tax = taxeslogic.getTaxInfo(oProduct.getTaxCategoryID(), m_oTicket.getCustomer());
dPriceSell /= (1.0 + tax.getRate());
oProduct.setProperty("product.price", Double.toString(dPriceSell));
weight = -1.0;
break;
*/
default:
break;
}
if (m_jaddtax.isSelected()) {
addTicketLine(oProduct
, dUnits //weight
, dPriceSell = oProduct.getPriceSellTax(tax));
} else {
addTicketLine(oProduct
, dUnits
, dPriceSell);
}
}
} catch (BasicException eData) {
stateToZero();
new MessageInf(eData).show(this);
}
// UPC-A
/* Note: if begins 02 then its a standard
// UPC-A max value limitation is 4 digit price
// UPC-A Extended uses State digit to give 5 digit price
// uniCenta oPOS does not support UPC-A Extended at this time
// Identifier Prod State Cost CheckCode
// I PPPPP S CCCC K
// 1 23456 7 8901 2
* 0 = Standard UPC number (must have a zero to do zero-suppressed numbers)
* 1 = Reserved
* 2 = Random-weight items (fruits, vegetables, meats, etc.)
* 3 = Pharmaceuticals
* 4 = In-store marketing for retailers (Other stores will not understand)
* 5 = Coupons
* 6 = Standard UPC number
* 7 = Standard UPC number
* 8 = Reserved
* 9 = Reserved
*/
} else if ("UPC".equals(sCodetype)
&& (sCode.startsWith("2"))
&& (sCode.length() == 12)) {
try {
ProductInfoExt oProduct
= dlSales.getProductInfoByUShortCode(sCode); // Return only UPC product
if (oProduct == null) {
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
sCode + " - "
+ AppLocal.getIntString("message.noproduct"),
"Check", JOptionPane.WARNING_MESSAGE);
stateToZero();
} else if ("Upc-A".equals(oProduct.getCodetype())) {
oProduct.setProperty("product.barcode", sCode);
double dPriceSell = oProduct.getPriceSell(); // default price for product
double weight = 0; // used if barcode includes weight of product
double dUnits = 0; // used for pro-rata unit
String sVariableNum = sCode.substring(7, 11); // grab the value from the code only using 4 digit price
TaxInfo tax = taxeslogic // get the TaxRate for the product
.getTaxInfo(oProduct.getTaxCategoryID()
, m_oTicket.getCustomer());
if (oProduct.getPriceSell() != 0.0) { // we have a weight barcode
weight = Double.parseDouble(sVariableNum) / 100; // 2 decimals (e.g. 10.49 kg)
dUnits = weight; // Units is now transformed to weight
oProduct.setProperty("product.weight" // catch-all for weight
, Double.toString(weight));
oProduct.setProperty("product.price" // get the prod sellprice
, Double.toString(oProduct.getPriceSell()));
dPriceSell = oProduct.getPriceSellTax(tax); // calculate the tax on sellprice
dUnits = (Double.parseDouble(sVariableNum) // calculate Units in sellprice with Tax
/ 100)
/ oProduct.getPriceSellTax(tax);
} else { // no sellprice so we have a price barcode
dPriceSell = (Double.parseDouble(sVariableNum) // calculate Units in sellprice with Tax
/ 100);
dUnits = 1; // no sellprice to calculate so must be 1 Unit
}
if (m_jaddtax.isSelected()) {
addTicketLine(oProduct
, dUnits
, dPriceSell);
} else {
addTicketLine(oProduct
, dUnits
, dPriceSell / (1.0 + tax.getRate()));
}
}
} catch (BasicException eData) {
stateToZero();
new MessageInf(eData).show(this);
}
} else {
incProductByCode(sCode); // returned is standard so go get it
}
// END OF BARCODE
} else {
Toolkit.getDefaultToolkit().beep();
}
} else {
m_sBarcode.append(cTrans);
if (cTrans == '\u007f') {
stateToZero();
} else if ((cTrans == '0') && (m_iNumberStatus == NUMBER_INPUTZERO)) {
m_jPrice.setText(Character.toString('0'));
} else if ((cTrans == '1' || cTrans == '2' || cTrans == '3'
|| cTrans == '4' || cTrans == '5' || cTrans == '6'
|| cTrans == '7' || cTrans == '8' || cTrans == '9')
&& (m_iNumberStatus == NUMBER_INPUTZERO)) {
if (!priceWith00) {
m_jPrice.setText(m_jPrice.getText() + cTrans);
} else {
m_jPrice.setText(setTempjPrice(m_jPrice.getText() + cTrans));
}
m_iNumberStatus = NUMBER_INPUTINT;
m_iNumberStatusInput = NUMBERVALID;
} else if ((cTrans == '0' || cTrans == '1' || cTrans == '2'
|| cTrans == '3' || cTrans == '4' || cTrans == '5'
|| cTrans == '6' || cTrans == '7' || cTrans == '8'
|| cTrans == '9')
&& (m_iNumberStatus == NUMBER_INPUTINT)) {
if (!priceWith00) {
m_jPrice.setText(m_jPrice.getText() + cTrans);
} else {
m_jPrice.setText(setTempjPrice(m_jPrice.getText() + cTrans));
}
} else if (cTrans == '.'
&& m_iNumberStatus == NUMBER_INPUTZERO && !priceWith00) {
m_jPrice.setText("0.");
m_iNumberStatus = NUMBER_INPUTZERODEC;
} else if (cTrans == '.'
&& m_iNumberStatus == NUMBER_INPUTZERO) {
m_jPrice.setText("");
m_iNumberStatus = NUMBER_INPUTZERO;
} else if (cTrans == '.'
&& m_iNumberStatus == NUMBER_INPUTINT && !priceWith00) {
m_jPrice.setText(m_jPrice.getText() + ".");
m_iNumberStatus = NUMBER_INPUTDEC;
} else if (cTrans == '.'
&& m_iNumberStatus == NUMBER_INPUTINT) {
if (!priceWith00) {
m_jPrice.setText(m_jPrice.getText() + "00");
} else {
m_jPrice.setText(setTempjPrice(m_jPrice.getText() + "00"));
}
m_iNumberStatus = NUMBER_INPUTINT;
} else if ((cTrans == '0')
&& (m_iNumberStatus == NUMBER_INPUTZERODEC
|| m_iNumberStatus == NUMBER_INPUTDEC)) {
if (!priceWith00) {
m_jPrice.setText(m_jPrice.getText() + cTrans);
} else {
m_jPrice.setText(setTempjPrice(m_jPrice.getText() + cTrans));
}
} else if ((cTrans == '1' || cTrans == '2' || cTrans == '3'
|| cTrans == '4' || cTrans == '5' || cTrans == '6'
|| cTrans == '7' || cTrans == '8' || cTrans == '9')
&& (m_iNumberStatus == NUMBER_INPUTZERODEC
|| m_iNumberStatus == NUMBER_INPUTDEC)) {
m_jPrice.setText(m_jPrice.getText() + cTrans);
m_iNumberStatus = NUMBER_INPUTDEC;
m_iNumberStatusInput = NUMBERVALID;
} else if (cTrans == '*'
&& (m_iNumberStatus == NUMBER_INPUTINT
|| m_iNumberStatus == NUMBER_INPUTDEC)) {
m_jPor.setText("x");
m_iNumberStatus = NUMBER_PORZERO;
} else if (cTrans == '*'
&& (m_iNumberStatus == NUMBER_INPUTZERO
|| m_iNumberStatus == NUMBER_INPUTZERODEC)) {
m_jPrice.setText("0");
m_jPor.setText("x");
m_iNumberStatus = NUMBER_PORZERO;
} else if ((cTrans == '0')
&& (m_iNumberStatus == NUMBER_PORZERO)) {
m_jPor.setText("x0");
} else if ((cTrans == '1' || cTrans == '2' || cTrans == '3'
|| cTrans == '4' || cTrans == '5' || cTrans == '6'
|| cTrans == '7' || cTrans == '8' || cTrans == '9')
&& (m_iNumberStatus == NUMBER_PORZERO)) {
m_jPor.setText("x" + Character.toString(cTrans));
m_iNumberStatus = NUMBER_PORINT;
m_iNumberStatusPor = NUMBERVALID;
} else if ((cTrans == '0' || cTrans == '1' || cTrans == '2'
|| cTrans == '3' || cTrans == '4' || cTrans == '5'
|| cTrans == '6' || cTrans == '7' || cTrans == '8'
|| cTrans == '9') && (m_iNumberStatus == NUMBER_PORINT)) {
m_jPor.setText(m_jPor.getText() + cTrans);
} else if (cTrans == '.'
&& m_iNumberStatus == NUMBER_PORZERO && !priceWith00) {
m_jPor.setText("x0.");
m_iNumberStatus = NUMBER_PORZERODEC;
} else if (cTrans == '.'
&& m_iNumberStatus == NUMBER_PORZERO) {
m_jPor.setText("x");
m_iNumberStatus = NUMBERVALID;
} else if (cTrans == '.'
&& m_iNumberStatus == NUMBER_PORINT && !priceWith00) {
m_jPor.setText(m_jPor.getText() + ".");
m_iNumberStatus = NUMBER_PORDEC;
} else if (cTrans == '.'
&& m_iNumberStatus == NUMBER_PORINT) {
m_jPor.setText(m_jPor.getText() + "00");
m_iNumberStatus = NUMBERVALID;
} else if ((cTrans == '0')
&& (m_iNumberStatus == NUMBER_PORZERODEC
|| m_iNumberStatus == NUMBER_PORDEC)) {
m_jPor.setText(m_jPor.getText() + cTrans);
} else if ((cTrans == '1' || cTrans == '2' || cTrans == '3'
|| cTrans == '4' || cTrans == '5' || cTrans == '6'
|| cTrans == '7' || cTrans == '8' || cTrans == '9')
&& (m_iNumberStatus == NUMBER_PORZERODEC || m_iNumberStatus == NUMBER_PORDEC)) {
m_jPor.setText(m_jPor.getText() + cTrans);
m_iNumberStatus = NUMBER_PORDEC;
m_iNumberStatusPor = NUMBERVALID;
} else if (cTrans == '\u00a7'
&& m_iNumberStatusInput == NUMBERVALID
&& m_iNumberStatusPor == NUMBERZERO) {
if (m_App.getDeviceScale().existsScale()
&& m_App.getAppUserView().getUser().hasPermission("sales.EditLines")) {
try {
Double value = m_App.getDeviceScale().readWeight();
if (value != null) {
ProductInfoExt product = getInputProduct();
addTicketLine(product, value, product.getPriceSell());
}
} catch (ScaleException e) {
Toolkit.getDefaultToolkit().beep();
new MessageInf(MessageInf.SGN_WARNING, AppLocal.getIntString("message.noweight"), e).show(this);
stateToZero();
}
} else {
Toolkit.getDefaultToolkit().beep();
}
} else if (cTrans == '\u00a7'
&& m_iNumberStatusInput == NUMBERZERO
&& m_iNumberStatusPor == NUMBERZERO) {
int i = m_ticketlines.getSelectedIndex();
if (i < 0) {
Toolkit.getDefaultToolkit().beep();
} else if (m_App.getDeviceScale().existsScale()) {
try {
Double value = m_App.getDeviceScale().readWeight();
if (value != null) {
TicketLineInfo newline = new TicketLineInfo(m_oTicket.getLine(i));
newline.setMultiply(value);
newline.setPrice(Math.abs(newline.getPrice()));
paintTicketLine(i, newline);
}
} catch (ScaleException e) {
Toolkit.getDefaultToolkit().beep();
new MessageInf(MessageInf.SGN_WARNING, AppLocal.getIntString("message.noweight"), e).show(this);
stateToZero();
}
} else {
Toolkit.getDefaultToolkit().beep();
}
} else if (cTrans == '+'
&& m_iNumberStatusInput == NUMBERZERO
&& m_iNumberStatusPor == NUMBERZERO) {
int i = m_ticketlines.getSelectedIndex();
if (i < 0) {
Toolkit.getDefaultToolkit().beep();
} else {
TicketLineInfo newline = new TicketLineInfo(m_oTicket.getLine(i));
//If it's a refund + button means one unit less
if (m_oTicket.getTicketType() == TicketInfo.RECEIPT_REFUND) {
if (m_App.getProperties().getProperty("override.check").equals("true")) {
oCount = count - 1; //increment existing line
pinOK = false;
changeCount(pinOK);
newline.setMultiply(newline.getMultiply() - 1.0);
newline.setProperty("ticket.updated", "true");
paintTicketLine(i, newline);
} else {
newline.setMultiply(newline.getMultiply() - 1.0);
newline.setProperty("ticket.updated", "true");
paintTicketLine(i, newline);
}
} else {
if (m_App.getProperties().getProperty("override.check").equals("true")) {
oCount = count + 1; //increment existing line
pinOK = false;
if (changeCount(pinOK)) {
newline.setMultiply(newline.getMultiply() + 1.0);
newline.setProperty("ticket.updated", "true");
paintTicketLine(i, newline);
}
} else {
newline.setMultiply(newline.getMultiply() + 1.0);
newline.setProperty("ticket.updated", "true");
paintTicketLine(i, newline);
}
}
}
} else if (cTrans == '-'
&& m_iNumberStatusInput == NUMBERZERO
&& m_iNumberStatusPor == NUMBERZERO
&& m_App.getAppUserView().getUser().hasPermission("sales.EditLines")) {
int i = m_ticketlines.getSelectedIndex();
if (i < 0) {
Toolkit.getDefaultToolkit().beep();
} else {
TicketLineInfo newline = new TicketLineInfo(m_oTicket.getLine(i));
if (m_oTicket.getTicketType() == TicketInfo.RECEIPT_REFUND) {
if (m_App.getProperties().getProperty("override.check").equals("true")) {
oCount = count - 1; //increment existing line
pinOK = false;
changeCount(pinOK);
newline.setMultiply(newline.getMultiply() - 1.0);
newline.setProperty("ticket.updated", "true");
paintTicketLine(i, newline);
} else {
newline.setMultiply(newline.getMultiply() - 1.0);
newline.setProperty("ticket.updated", "true");
paintTicketLine(i, newline);
}
if (newline.getMultiply() >= 0) {
removeTicketLine(i);
} else {
paintTicketLine(i, newline);
}
} else {
if (m_App.getProperties().getProperty("override.check").equals("true")) {
oCount = count - 1; //increment existing line
pinOK = false;
if (changeCount(pinOK)) {
newline.setMultiply(newline.getMultiply() - 1.0);
newline.setProperty("ticket.updated", "true");
paintTicketLine(i, newline);
}
} else {
newline.setMultiply(newline.getMultiply() - 1.0);
newline.setProperty("ticket.updated", "true");
paintTicketLine(i, newline);
}
if (newline.getMultiply() <= 0.0) {
removeTicketLine(i);
} else {
paintTicketLine(i, newline);
}
}
}
} else if (cTrans == '+'
&& m_iNumberStatusInput == NUMBERZERO
&& m_iNumberStatusPor == NUMBERVALID) {
int i = m_ticketlines.getSelectedIndex();
if (i < 0) {
Toolkit.getDefaultToolkit().beep();
} else {
double dPor = getPorValue();
TicketLineInfo newline = new TicketLineInfo(m_oTicket.getLine(i));
if (m_oTicket.getTicketType() == TicketInfo.RECEIPT_REFUND) {
if (m_App.getProperties().getProperty("override.check").equals("true")) {
oCount = count - 1; //increment existing line
pinOK = false;
changeCount(pinOK);
newline.setMultiply(-dPor);
newline.setProperty("ticket.updated", "true");
newline.setPrice(Math.abs(newline.getPrice()));
paintTicketLine(i, newline);
} else {
newline.setMultiply(-dPor);
newline.setProperty("ticket.updated", "true");
newline.setPrice(Math.abs(newline.getPrice()));
paintTicketLine(i, newline);
}
} else {
if (m_App.getProperties().getProperty("override.check").equals("true")) {
oCount = count + 1; //increment existing line
pinOK = false;
if (changeCount(pinOK)) {
newline.setMultiply(dPor);
newline.setProperty("ticket.updated", "true");
newline.setPrice(Math.abs(newline.getPrice()));
paintTicketLine(i, newline);
}
} else {
newline.setMultiply(dPor);
newline.setProperty("ticket.updated", "true");
newline.setPrice(Math.abs(newline.getPrice()));
paintTicketLine(i, newline);
}
}
}
} else if (cTrans == '-'
&& m_iNumberStatusInput == NUMBERZERO
&& m_iNumberStatusPor == NUMBERVALID
&& m_App.getAppUserView().getUser().hasPermission("sales.EditLines")) {
int i = m_ticketlines.getSelectedIndex();
if (i < 0) {
Toolkit.getDefaultToolkit().beep();
} else {
double dPor = getPorValue();
TicketLineInfo newline = new TicketLineInfo(m_oTicket.getLine(i));
if (m_oTicket.getTicketType() == TicketInfo.RECEIPT_REFUND) {
if (m_App.getProperties().getProperty("override.check").equals("true")) {
oCount = count - 1; //increment existing line
pinOK = false;
changeCount(pinOK);
newline.setMultiply(-dPor);
newline.setProperty("ticket.updated", "true");
newline.setPrice(Math.abs(newline.getPrice()));
paintTicketLine(i, newline);
} else {
newline.setMultiply(-dPor);
newline.setProperty("ticket.updated", "true");
newline.setPrice(Math.abs(newline.getPrice()));
paintTicketLine(i, newline);
}
} else {
if (m_App.getProperties().getProperty("override.check").equals("true")) {
oCount = count - 1; //increment existing line
pinOK = false;
if (changeCount(pinOK)) {
newline.setMultiply(dPor);
newline.setProperty("ticket.updated", "true");
newline.setPrice(Math.abs(newline.getPrice()));
paintTicketLine(i, newline);
}
} else {
newline.setMultiply(dPor);
newline.setProperty("ticket.updated", "true");
newline.setPrice(Math.abs(newline.getPrice()));
paintTicketLine(i, newline);
}
}
}
} else if (cTrans == '+'
&& m_iNumberStatusInput == NUMBERVALID
&& m_iNumberStatusPor == NUMBERZERO
&& m_App.getAppUserView().getUser().hasPermission("sales.EditLines")) {
ProductInfoExt product = getInputProduct();
addTicketLine(product, 1.0, product.getPriceSell());
m_jEditLine.doClick();
} else if (cTrans == '-'
&& m_iNumberStatusInput == NUMBERVALID
&& m_iNumberStatusPor == NUMBERZERO
&& m_App.getAppUserView().getUser().hasPermission("sales.EditLines")) {
ProductInfoExt product = getInputProduct();
addTicketLine(product, 1.0, -product.getPriceSell());
m_jEditLine.doClick();
} else if (cTrans == '+'
&& m_iNumberStatusInput == NUMBERVALID
&& m_iNumberStatusPor == NUMBERVALID
&& m_App.getAppUserView().getUser().hasPermission("sales.EditLines")) {
ProductInfoExt product = getInputProduct();
addTicketLine(product, getPorValue(), product.getPriceSell());
} else if (cTrans == '-'
&& m_iNumberStatusInput == NUMBERVALID
&& m_iNumberStatusPor == NUMBERVALID
&& m_App.getAppUserView().getUser().hasPermission("sales.EditLines")) {
ProductInfoExt product = getInputProduct();
addTicketLine(product, getPorValue(), -product.getPriceSell());
} else if (cTrans == ' ' || cTrans == '=') {
if (m_oTicket.getLinesCount() > 0) {
if (closeTicket(m_oTicket, m_oTicketExt)) {
m_ticketsbag.deleteTicket();
String autoLogoff = (m_App.getProperties().getProperty("till.autoLogoff"));
if (autoLogoff != null) {
if (autoLogoff.equals("true")) {
if ("restaurant".equals(
m_App.getProperties().getProperty("machine.ticketsbag"))
&& ("true".equals(m_App.getProperties().getProperty("till.autoLogoffrestaurant")))) {
deactivate();
setActiveTicket(null, null);
} else {
((JRootApp) m_App).closeAppView();
}
}
}
;
} else {
refreshTicket();
}
} else {
Toolkit.getDefaultToolkit().beep();
}
}
}
}
private Window getActiveWindow() {
for (Window window: getWindows()) {
if (window instanceof JRootFrame) {
return window;
}
}
return null;
}
private boolean closeTicket(TicketInfo ticket, Object ticketext) {
if (listener != null) {
listener.stop();
}
boolean resultok = false;
if (m_App.getAppUserView().getUser().hasPermission("sales.Total")) {
warrantyCheck(ticket);
try {
taxeslogic.calculateTaxes(ticket);
if (ticket.getTotal() >= 0.0) {
ticket.resetPayments();
}
if (executeEvent(ticket, ticketext, "ticket.total") == null) {
if (listener != null) {
listener.stop();
}
printTicket("Printer.TicketTotal", ticket, ticketext);
JPaymentSelect paymentdialog = ticket.getTicketType() == TicketInfo.RECEIPT_NORMAL
? paymentdialogreceipt
: paymentdialogrefund;
paymentdialog.setPrintSelected("true".equals(m_jbtnconfig.getProperty("printselected", "true")));
paymentdialog.setTransactionID(ticket.getTransactionID());
if (paymentdialog.showDialog(ticket.getTotal(), ticket.getCustomer())) {
ticket.setPayments(paymentdialog.getSelectedPayments());
ticket.setUser(m_App.getAppUserView().getUser().getUserInfo());
ticket.setActiveCash(m_App.getActiveCashIndex());
ticket.setDate(new Date());
if (executeEvent(ticket, ticketext, "ticket.save") == null) {
try {
dlSales.saveTicket(ticket, m_App.getInventoryLocation());
2024-05-20 17:03:58 +01:00
String lastTicketNumber = Integer.toString(ticket.getTicketId());
String lastTicketType = Integer.toString(ticket.getTicketType());
m_config.setProperty("lastticket.number", lastTicketNumber);
m_config.setProperty("lastticket.type", lastTicketType);
m_config.setLastTicket(lastTicketNumber, lastTicketType);
2023-04-06 18:58:04 +01:00
} catch (BasicException eData) {
MessageInf msg = new MessageInf(MessageInf.SGN_NOTICE, AppLocal.getIntString("message.nosaveticket"), eData);
msg.show(this);
} catch (IOException ex) {
log.error(ex.getMessage());
}
if (m_config.getProperty("till.digital-receipt") != null && m_config.getProperty("till.digital-receipt").equals("true")){
log.debug("Send digital receipt");
String xml = dlSystem.getResourceAsXML("Printer.Ticket");
new Application().sendReceipt(ticket, xml, getActiveWindow());
}
executeEvent(ticket, ticketext, "ticket.close",
new ScriptArg("print", paymentdialog.isPrintSelected()));
printTicket(paymentdialog.isPrintSelected() || warrantyPrint
? "Printer.Ticket"
: "Printer.Ticket2", ticket, ticketext);
Notify(AppLocal.getIntString("notify.printing"));
resultok = true;
if ("restaurant".equals(m_App.getProperties()
.getProperty("machine.ticketsbag")) && !ticket.getOldTicket()) {
/* Deliberately Explicit to allow for reassignments - future
* even though we could do a single SQL statment sweep for reset
*/
restDB.clearCustomerNameInTable(ticketext.toString());
restDB.clearWaiterNameInTable(ticketext.toString());
restDB.clearTicketIdInTable(ticketext.toString());
}
}
}
}
} catch (TaxesException e) {
MessageInf msg = new MessageInf(MessageInf.SGN_WARNING,
AppLocal.getIntString("message.cannotcalculatetaxes"));
msg.show(this);
resultok = false;
}
m_oTicket.resetTaxes();
m_oTicket.resetPayments();
jCheckStock.setText("");
}
return resultok;
}
private boolean warrantyCheck(TicketInfo ticket) {
warrantyPrint = false;
int lines = 0;
while (lines < ticket.getLinesCount()) {
if (!warrantyPrint) {
warrantyPrint = ticket.getLine(lines).isProductWarranty();
return (true);
}
lines++;
}
return false;
}
/**
* @param pTicket
* @return
*/
public String getPickupString(TicketInfo pTicket) {
if (pTicket == null) {
return ("0");
}
String tmpPickupId = Integer.toString(pTicket.getPickupId());
String pickupSize = (m_App.getProperties().getProperty("till.pickupsize"));
if (pickupSize != null && (Integer.parseInt(pickupSize) >= tmpPickupId.length())) {
while (tmpPickupId.length() < (Integer.parseInt(pickupSize))) {
tmpPickupId = "0" + tmpPickupId;
}
}
return (tmpPickupId);
}
private void printTicket(String sresourcename, TicketInfo ticket, Object ticketext) {
String sresource = dlSystem.getResourceAsXML(sresourcename);
if (sresource == null) {
MessageInf msg = new MessageInf(MessageInf.SGN_WARNING, AppLocal.getIntString("message.cannotprintticket"));
msg.show(JPanelTicket.this);
} else {
if (ticket.getPickupId() == 0) {
try {
ticket.setPickupId(dlSales.getNextPickupIndex());
} catch (BasicException e) {
ticket.setPickupId(0);
}
}
try {
ScriptEngine script = ScriptFactory.getScriptEngine(ScriptFactory.VELOCITY);
if (Boolean.parseBoolean(m_App.getProperties().getProperty("receipt.newlayout"))) {
script.put("taxes", ticket.getTaxLines());
} else {
script.put("taxes", taxcollection);
}
script.put("taxeslogic", taxeslogic);
script.put("ticket", ticket);
script.put("place", ticketext);
script.put("warranty", warrantyPrint);
script.put("pickupid", getPickupString(ticket));
refreshTicket();
m_TTP.printTicket(script.eval(sresource).toString(), ticket);
} catch (ScriptException | TicketPrinterException e) {
MessageInf msg = new MessageInf(MessageInf.SGN_WARNING, AppLocal.getIntString("message.cannotprintticket"), e);
msg.show(JPanelTicket.this);
}
}
}
public void printTicket(String resource) {
// this method is intended to be called only from JPanelButtons.
if (resource == null) {
MessageInf msg = new MessageInf(MessageInf.SGN_WARNING, AppLocal.getIntString("message.cannotexecute"));
msg.show(this);
} else {
// JG 5 Jul 17 calculate taxes disabled as causing incorrect tax recalc
// taxeslogic.calculateTaxes(m_oTicket);
printTicket(resource, m_oTicket, m_oTicketExt);
}
Notify(AppLocal.getIntString("notify.printed"));
j_btnRemotePrt.setEnabled(false);
}
public void customerAdd(String resource) {
Notify(AppLocal.getIntString("notify.customeradd"));
}
public void customerRemove(String resource) {
Notify(AppLocal.getIntString("notify.customerremove"));
}
public void customerChange(String resource) {
Notify(AppLocal.getIntString("notify.customerchange"));
}
public void Notify(String msg) {
final WebNotification notification = new WebNotification();
notification.setIcon(NotificationIcon.information);
notification.setDisplayTime(4000);
final WebClock clock = new WebClock();
clock.setClockType(ClockType.timer);
clock.setTimeLeft(5000);
notification.setContent(msg);
NotificationManager.showNotification(notification);
clock.start();
}
private void printReport(String resourcefile, TicketInfo ticket, Object ticketext) {
try {
JasperReport jr;
InputStream in = getClass().getResourceAsStream(resourcefile + ".ser");
if (in == null) {
// read and compile the report
JasperDesign jd = JRXmlLoader.load(getClass().getResourceAsStream(resourcefile + ".jrxml"));
jr = JasperCompileManager.compileReport(jd);
} else {
try (ObjectInputStream oin = new ObjectInputStream(in)) {
jr = (JasperReport) oin.readObject();
}
}
Map reportparams = new HashMap();
try {
reportparams.put("REPORT_RESOURCE_BUNDLE", ResourceBundle.getBundle(resourcefile + ".properties"));
} catch (MissingResourceException e) {
}
reportparams.put("TAXESLOGIC", taxeslogic);
Map reportfields = new HashMap();
reportfields.put("TICKET", ticket);
reportfields.put("PLACE", ticketext);
JasperPrint jp = JasperFillManager.fillReport(jr, reportparams, new JRMapArrayDataSource(new Object[]{reportfields}));
PrintService service = ReportUtils.getPrintService(m_App.getProperties().getProperty("machine.printername"));
JRPrinterAWT300.printPages(jp, 0, jp.getPages().size() - 1, service);
} catch (JRException | IOException | ClassNotFoundException e) {
MessageInf msg = new MessageInf(MessageInf.SGN_WARNING, AppLocal.getIntString("message.cannotloadreport"), e);
msg.show(this);
}
}
private void visorTicketLine(TicketLineInfo oLine) {
if (oLine == null) {
m_App.getDeviceTicket().getDeviceDisplay().clearVisor();
} else {
try {
ScriptEngine script = ScriptFactory.getScriptEngine(ScriptFactory.VELOCITY);
script.put("ticketline", oLine);
m_TTP.printTicket(script.eval(dlSystem.getResourceAsXML("Printer.TicketLine")).toString());
} catch (ScriptException | TicketPrinterException e) {
MessageInf msg = new MessageInf(MessageInf.SGN_WARNING, AppLocal.getIntString("message.cannotprintline"), e);
msg.show(JPanelTicket.this);
}
}
}
private Object evalScript(ScriptObject scr, String resource, ScriptArg... args) {
// resource here is guaranteed to be not null
try {
scr.setSelectedIndex(m_ticketlines.getSelectedIndex());
return scr.evalScript(dlSystem.getResourceAsXML(resource), args);
} catch (ScriptException e) {
MessageInf msg = new MessageInf(MessageInf.SGN_WARNING, AppLocal.getIntString("message.cannotexecute"), e);
msg.show(this);
return msg;
}
}
/**
* @param resource
* @param args
*/
public void evalScriptAndRefresh(String resource, ScriptArg... args) {
if (resource == null) {
MessageInf msg = new MessageInf(MessageInf.SGN_WARNING, AppLocal.getIntString("message.cannotexecute"));
msg.show(this);
} else {
ScriptObject scr = new ScriptObject(m_oTicket, m_oTicketExt);
scr.setSelectedIndex(m_ticketlines.getSelectedIndex());
evalScript(scr, resource, args);
refreshTicket();
setSelectedIndex(scr.getSelectedIndex());
}
}
/**
*
*/
private Object executeEventAndRefresh(String eventkey, ScriptArg... args) {
String resource = m_jbtnconfig.getEvent(eventkey);
if (resource == null) {
return null;
} else {
ScriptObject scr = new ScriptObject(m_oTicket, m_oTicketExt);
scr.setSelectedIndex(m_ticketlines.getSelectedIndex());
Object result = evalScript(scr, resource, args);
refreshTicket();
setSelectedIndex(scr.getSelectedIndex());
return result;
}
}
private Object executeEvent(TicketInfo ticket, Object ticketext, String eventkey, ScriptArg... args) {
String resource = m_jbtnconfig.getEvent(eventkey);
if (resource == null) {
return null;
} else {
ScriptObject scr = new ScriptObject(ticket, ticketext);
return evalScript(scr, resource, args);
}
}
/**
* @param sresourcename
* @return
*/
public String getResourceAsXML(String sresourcename) {
return dlSystem.getResourceAsXML(sresourcename);
}
/**
* @param sresourcename
* @return
*/
public BufferedImage getResourceAsImage(String sresourcename) {
return dlSystem.getResourceAsImage(sresourcename);
}
private void setSelectedIndex(int i) {
if (i >= 0 && i < m_oTicket.getLinesCount()) {
m_ticketlines.setSelectedIndex(i);
} else if (m_oTicket.getLinesCount() > 0) {
m_ticketlines.setSelectedIndex(m_oTicket.getLinesCount() - 1);
}
}
/**
*
*/
public static class ScriptArg {
private final String key;
private final Object value;
/**
* @param key
* @param value
*/
public ScriptArg(String key, Object value) {
this.key = key;
this.value = value;
}
/**
* @return
*/
public String getKey() {
return key;
}
/**
* @return
*/
public Object getValue() {
return value;
}
}
private String setTempjPrice(String jPrice) {
jPrice = jPrice.replace(".", "");
// remove all leading zeros from the string
long tempL = Long.parseLong(jPrice);
jPrice = Long.toString(tempL);
while (jPrice.length() < 3) {
jPrice = "0" + jPrice;
}
return (jPrice.length() <= 2) ? jPrice : (new StringBuffer(jPrice).insert(jPrice.length() - 2, ".").toString());
}
public void checkStock() {
int i = m_ticketlines.getSelectedIndex();
if (i < 0) {
} else {
try {
TicketLineInfo line = m_oTicket.getLine(i);
String pId = line.getProductID();
String lName = (m_App.getProperties().getProperty("machine.department"));
lName = "'" + lName + "'";
ProductStock checkProduct;
String location = m_App.getInventoryLocation();
checkProduct = dlSales.getProductStockState(pId, location);
if (checkProduct != null) {
if (checkProduct.getUnits() <= 0) {
jCheckStock.setForeground(Color.magenta);
} else {
jCheckStock.setForeground(Color.darkGray);
}
double dUnits = checkProduct.getUnits();
int iUnits;
iUnits = (int) dUnits;
jCheckStock.setText(Integer.toString(iUnits));
} else {
jCheckStock.setText(null);
}
} catch (BasicException ex) {
log.error(ex.getMessage());
}
}
}
public void checkCustomer() {
if (m_oTicket.getCustomer().isVIP() == true) {
String content;
String vip;
String discount;
if (m_oTicket.getCustomer().isVIP() == true) {
vip = AppLocal.getIntString("message.vipyes");
} else {
vip = AppLocal.getIntString("message.vipno");
}
if (m_oTicket.getCustomer().getDiscount() > 0) {
discount = AppLocal.getIntString("message.discyes") + m_oTicket.getCustomer().getDiscount() + "%";
} else {
discount = AppLocal.getIntString("message.discno");
}
content = "<html>" +
"<b>" + AppLocal.getIntString("label.vip") + " : " + "</b>" + vip + "<br>" +
"<b>" + AppLocal.getIntString("label.discount") + " : " + "</b>" + discount + "<br>";
JFrame frame = new JFrame();
JOptionPane.showMessageDialog(frame,
content,
"Info",
JOptionPane.WARNING_MESSAGE);
}
}
/**
*
*/
public class ScriptObject {
private final TicketInfo ticket;
private final Object ticketext;
private int selectedindex;
private ScriptObject(TicketInfo ticket, Object ticketext) {
this.ticket = ticket;
this.ticketext = ticketext;
}
/**
* @return
*/
public double getInputValue() {
if (m_iNumberStatusInput == NUMBERVALID && m_iNumberStatusPor == NUMBERZERO) {
return JPanelTicket.this.getInputValue();
} else {
return 0.0;
}
}
/**
* @return
*/
public int getSelectedIndex() {
return selectedindex;
}
/**
* @param i
*/
public void setSelectedIndex(int i) {
selectedindex = i;
}
/**
* @param resourcefile
*/
public void printReport(String resourcefile) {
JPanelTicket.this.printReport(resourcefile, ticket, ticketext);
}
/**
* @param sresourcename
*/
public void printTicket(String sresourcename) {
JPanelTicket.this.printTicket(sresourcename, ticket, ticketext);
j_btnRemotePrt.setEnabled(false);
}
/**
* @param code
* @param args
* @return Script object and value
* @throws ScriptException
*/
public Object evalScript(String code, ScriptArg... args) throws ScriptException {
ScriptEngine script = ScriptFactory.getScriptEngine(ScriptFactory.BEANSHELL);
String sDBUser = m_App.getProperties().getProperty("db.user");
String sDBPassword = m_App.getProperties().getProperty("db.password");
if (sDBUser != null && sDBPassword != null && sDBPassword.startsWith("crypt:")) {
AltEncrypter cypher = new AltEncrypter("cypherkey" + sDBUser);
sDBPassword = cypher.decrypt(sDBPassword.substring(6));
}
script.put("hostname", m_App.getProperties().getProperty("machine.hostname"));
script.put("dbURL", m_App.getProperties().getProperty("db.URL") + m_App.getProperties().getProperty("db.schema"));
script.put("dbUser", sDBUser);
script.put("dbPassword", sDBPassword);
script.put("ticket", ticket);
script.put("place", ticketext);
script.put("taxes", taxcollection);
script.put("taxeslogic", taxeslogic);
script.put("user", m_App.getAppUserView().getUser());
script.put("sales", this);
script.put("taxesinc", m_jaddtax.isSelected());
script.put("warranty", warrantyPrint);
script.put("pickupid", getPickupString(ticket));
for (ScriptArg arg : args) {
script.put(arg.getKey(), arg.getValue());
}
return script.eval(code);
}
}
/**
* 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 FormEditor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
m_jPanContainer = new javax.swing.JPanel();
m_jOptions = new javax.swing.JPanel();
m_jPanelBag = new javax.swing.JPanel();
jTBtnShow = new javax.swing.JToggleButton();
m_jbtnScale = new javax.swing.JButton();
jbtnMooring = new javax.swing.JButton();
m_jButtons = new javax.swing.JPanel();
btnSplit = new javax.swing.JButton();
btnReprint1 = new javax.swing.JButton();
j_btnRemotePrt = new javax.swing.JButton();
jBtnCustomer = new javax.swing.JButton();
m_jPanelScripts = new javax.swing.JPanel();
m_jButtonsExt = new javax.swing.JPanel();
jPanel1 = new javax.swing.JPanel();
m_jPanTicket = new javax.swing.JPanel();
jPanel5 = new javax.swing.JPanel();
jPanel2 = new javax.swing.JPanel();
m_jDelete = new javax.swing.JButton();
m_jList = new javax.swing.JButton();
m_jEditLine = new javax.swing.JButton();
jEditAttributes = new javax.swing.JButton();
jCheckStock = new javax.swing.JButton();
m_jPanelCentral = new javax.swing.JPanel();
jPanel4 = new javax.swing.JPanel();
filler2 = new javax.swing.Box.Filler(new java.awt.Dimension(5, 0), new java.awt.Dimension(5, 0), new java.awt.Dimension(5, 32767));
m_jTicketId = new javax.swing.JLabel();
m_jPanTotals = new javax.swing.JPanel();
m_jLblTotalEuros3 = new javax.swing.JLabel();
m_jLblTotalEuros2 = new javax.swing.JLabel();
m_jLblTotalEuros1 = new javax.swing.JLabel();
m_jSubtotalEuros = new javax.swing.JLabel();
m_jTaxesEuros = new javax.swing.JLabel();
m_jTotalEuros = new javax.swing.JLabel();
m_jContEntries = new javax.swing.JPanel();
m_jPanEntries = new javax.swing.JPanel();
m_jNumberKeys = new com.unicenta.beans.JNumberKeys();
jPanel9 = new javax.swing.JPanel();
m_jaddtax = new com.alee.extended.button.WebSwitch();
m_jPrice = new javax.swing.JLabel();
m_jPor = new javax.swing.JLabel();
m_jEnter = new javax.swing.JButton();
m_jTax = new javax.swing.JComboBox();
m_jKeyFactory = new javax.swing.JTextField();
m_jPanEntriesE = new javax.swing.JPanel();
catcontainer = new javax.swing.JPanel();
setBackground(new java.awt.Color(255, 204, 153));
setOpaque(false);
setLayout(new java.awt.CardLayout());
m_jPanContainer.addFocusListener(new java.awt.event.FocusAdapter() {
public void focusLost(java.awt.event.FocusEvent evt) {
m_jPanContainerFocusLost(evt);
}
});
m_jPanContainer.setLayout(new java.awt.BorderLayout());
m_jOptions.setLayout(new java.awt.BorderLayout());
m_jPanelBag.setAutoscrolls(true);
m_jPanelBag.setMaximumSize(new java.awt.Dimension(10, 10));
m_jPanelBag.setPreferredSize(new java.awt.Dimension(0, 60));
jTBtnShow.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N
jTBtnShow.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/unicenta/images/resources.png"))); // NOI18N
jTBtnShow.setPreferredSize(new java.awt.Dimension(80, 45));
jTBtnShow.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jTBtnShowActionPerformed(evt);
}
});
m_jPanelBag.add(jTBtnShow);
m_jbtnScale.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
m_jbtnScale.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/unicenta/images/scale.png"))); // NOI18N
m_jbtnScale.setText(AppLocal.getIntString("button.scale")); // NOI18N
java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("pos_messages"); // NOI18N
m_jbtnScale.setToolTipText(bundle.getString("tooltip.scale")); // NOI18N
m_jbtnScale.setFocusPainted(false);
m_jbtnScale.setFocusable(false);
m_jbtnScale.setMargin(new java.awt.Insets(8, 14, 8, 14));
m_jbtnScale.setMaximumSize(new java.awt.Dimension(85, 44));
m_jbtnScale.setMinimumSize(new java.awt.Dimension(85, 44));
m_jbtnScale.setPreferredSize(new java.awt.Dimension(85, 45));
m_jbtnScale.setRequestFocusEnabled(false);
m_jbtnScale.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
m_jbtnScaleActionPerformed(evt);
}
});
m_jPanelBag.add(m_jbtnScale);
jbtnMooring.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
jbtnMooring.setText(bundle.getString("button.moorings")); // NOI18N
jbtnMooring.setMargin(new java.awt.Insets(8, 14, 8, 14));
jbtnMooring.setMaximumSize(new java.awt.Dimension(80, 40));
jbtnMooring.setMinimumSize(new java.awt.Dimension(80, 40));
jbtnMooring.setPreferredSize(new java.awt.Dimension(80, 45));
jbtnMooring.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jbtnMooringActionPerformed(evt);
}
});
m_jPanelBag.add(jbtnMooring);
m_jButtons.setPreferredSize(new java.awt.Dimension(350, 55));
btnSplit.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/unicenta/images/sale_split_sml.png"))); // NOI18N
btnSplit.setToolTipText(bundle.getString("tooltip.salesplit")); // NOI18N
btnSplit.setEnabled(false);
btnSplit.setFocusPainted(false);
btnSplit.setFocusable(false);
btnSplit.setMargin(new java.awt.Insets(8, 14, 8, 14));
btnSplit.setMaximumSize(new java.awt.Dimension(50, 40));
btnSplit.setMinimumSize(new java.awt.Dimension(50, 40));
btnSplit.setPreferredSize(new java.awt.Dimension(80, 45));
btnSplit.setRequestFocusEnabled(false);
btnSplit.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnSplitActionPerformed(evt);
}
});
btnReprint1.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
btnReprint1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/unicenta/images/reprint24.png"))); // NOI18N
btnReprint1.setToolTipText(bundle.getString("tooltip.reprintLastTicket")); // NOI18N
btnReprint1.setFocusPainted(false);
btnReprint1.setFocusable(false);
btnReprint1.setMargin(new java.awt.Insets(8, 14, 8, 14));
btnReprint1.setMaximumSize(new java.awt.Dimension(50, 40));
btnReprint1.setMinimumSize(new java.awt.Dimension(50, 40));
btnReprint1.setPreferredSize(new java.awt.Dimension(80, 45));
btnReprint1.setRequestFocusEnabled(false);
btnReprint1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnReprint1ActionPerformed(evt);
}
});
j_btnRemotePrt.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
j_btnRemotePrt.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/unicenta/images/remote_print.png"))); // NOI18N
j_btnRemotePrt.setText(bundle.getString("button.sendorder")); // NOI18N
j_btnRemotePrt.setToolTipText(bundle.getString("tooltip.printtoremote")); // NOI18N
j_btnRemotePrt.setMargin(new java.awt.Insets(0, 4, 0, 4));
j_btnRemotePrt.setMaximumSize(new java.awt.Dimension(50, 40));
j_btnRemotePrt.setMinimumSize(new java.awt.Dimension(50, 40));
j_btnRemotePrt.setPreferredSize(new java.awt.Dimension(80, 45));
j_btnRemotePrt.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
j_btnRemotePrtActionPerformed(evt);
}
});
jBtnCustomer.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N
jBtnCustomer.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/unicenta/images/customer.png"))); // NOI18N
jBtnCustomer.setToolTipText(bundle.getString("tooltip.salescustomer")); // NOI18N
jBtnCustomer.setPreferredSize(new java.awt.Dimension(80, 45));
jBtnCustomer.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jBtnCustomerActionPerformed(evt);
}
});
javax.swing.GroupLayout m_jButtonsLayout = new javax.swing.GroupLayout(m_jButtons);
m_jButtons.setLayout(m_jButtonsLayout);
m_jButtonsLayout.setHorizontalGroup(
m_jButtonsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(m_jButtonsLayout.createSequentialGroup()
.addContainerGap()
.addComponent(jBtnCustomer, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btnSplit, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(j_btnRemotePrt, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btnReprint1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
m_jButtonsLayout.setVerticalGroup(
m_jButtonsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(m_jButtonsLayout.createSequentialGroup()
.addGap(5, 5, 5)
.addGroup(m_jButtonsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(j_btnRemotePrt, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(btnSplit, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(btnReprint1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jBtnCustomer, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
m_jPanelBag.add(m_jButtons);
m_jOptions.add(m_jPanelBag, java.awt.BorderLayout.PAGE_START);
m_jPanelScripts.setPreferredSize(new java.awt.Dimension(200, 60));
m_jPanelScripts.setLayout(new java.awt.BorderLayout());
m_jButtonsExt.setPreferredSize(new java.awt.Dimension(20, 60));
jPanel1.setMinimumSize(new java.awt.Dimension(235, 50));
jPanel1.setPreferredSize(new java.awt.Dimension(10, 55));
m_jButtonsExt.add(jPanel1);
m_jPanelScripts.add(m_jButtonsExt, java.awt.BorderLayout.PAGE_START);
m_jOptions.add(m_jPanelScripts, java.awt.BorderLayout.CENTER);
m_jPanelScripts.getAccessibleContext().setAccessibleDescription("");
m_jPanContainer.add(m_jOptions, java.awt.BorderLayout.NORTH);
m_jPanTicket.setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5));
m_jPanTicket.setLayout(new java.awt.BorderLayout());
jPanel5.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
jPanel5.setPreferredSize(new java.awt.Dimension(75, 270));
jPanel5.setLayout(new java.awt.BorderLayout());
jPanel2.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 5, 0, 5));
jPanel2.setPreferredSize(new java.awt.Dimension(70, 250));
jPanel2.setLayout(new java.awt.GridLayout(0, 1, 5, 5));
m_jDelete.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/unicenta/images/editdelete.png"))); // NOI18N
m_jDelete.setToolTipText(bundle.getString("tooltip.saleremoveline")); // NOI18N
m_jDelete.setFocusPainted(false);
m_jDelete.setFocusable(false);
m_jDelete.setMargin(new java.awt.Insets(8, 14, 8, 14));
m_jDelete.setMaximumSize(new java.awt.Dimension(42, 36));
m_jDelete.setMinimumSize(new java.awt.Dimension(42, 36));
m_jDelete.setPreferredSize(new java.awt.Dimension(50, 45));
m_jDelete.setRequestFocusEnabled(false);
m_jDelete.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
m_jDeleteActionPerformed(evt);
}
});
jPanel2.add(m_jDelete);
m_jList.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/unicenta/images/search32.png"))); // NOI18N
m_jList.setToolTipText(bundle.getString("tooltip.saleproductfind")); // NOI18N
m_jList.setFocusPainted(false);
m_jList.setFocusable(false);
m_jList.setMargin(new java.awt.Insets(8, 14, 8, 14));
m_jList.setMaximumSize(new java.awt.Dimension(42, 36));
m_jList.setMinimumSize(new java.awt.Dimension(42, 36));
m_jList.setPreferredSize(new java.awt.Dimension(50, 45));
m_jList.setRequestFocusEnabled(false);
m_jList.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
m_jListActionPerformed(evt);
}
});
jPanel2.add(m_jList);
m_jEditLine.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/unicenta/images/sale_editline.png"))); // NOI18N
m_jEditLine.setToolTipText(bundle.getString("tooltip.saleeditline")); // NOI18N
m_jEditLine.setFocusPainted(false);
m_jEditLine.setFocusable(false);
m_jEditLine.setMargin(new java.awt.Insets(8, 14, 8, 14));
m_jEditLine.setMaximumSize(new java.awt.Dimension(42, 36));
m_jEditLine.setMinimumSize(new java.awt.Dimension(42, 36));
m_jEditLine.setPreferredSize(new java.awt.Dimension(50, 45));
m_jEditLine.setRequestFocusEnabled(false);
m_jEditLine.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
m_jEditLineActionPerformed(evt);
}
});
jPanel2.add(m_jEditLine);
jEditAttributes.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/unicenta/images/attributes.png"))); // NOI18N
jEditAttributes.setToolTipText(bundle.getString("tooltip.saleattributes")); // NOI18N
jEditAttributes.setFocusPainted(false);
jEditAttributes.setFocusable(false);
jEditAttributes.setMargin(new java.awt.Insets(8, 14, 8, 14));
jEditAttributes.setMaximumSize(new java.awt.Dimension(42, 36));
jEditAttributes.setMinimumSize(new java.awt.Dimension(42, 36));
jEditAttributes.setPreferredSize(new java.awt.Dimension(50, 45));
jEditAttributes.setRequestFocusEnabled(false);
jEditAttributes.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jEditAttributesActionPerformed(evt);
}
});
jPanel2.add(jEditAttributes);
jCheckStock.setFont(new java.awt.Font("Arial", 1, 14)); // NOI18N
jCheckStock.setForeground(new java.awt.Color(76, 197, 237));
jCheckStock.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/unicenta/images/info.png"))); // NOI18N
jCheckStock.setToolTipText(bundle.getString("tooltip.salecheckstock")); // NOI18N
jCheckStock.setFocusPainted(false);
jCheckStock.setFocusable(false);
jCheckStock.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
jCheckStock.setHorizontalTextPosition(javax.swing.SwingConstants.LEFT);
jCheckStock.setMargin(new java.awt.Insets(8, 4, 8, 4));
jCheckStock.setMaximumSize(new java.awt.Dimension(42, 36));
jCheckStock.setMinimumSize(new java.awt.Dimension(42, 36));
jCheckStock.setPreferredSize(new java.awt.Dimension(80, 45));
jCheckStock.setRequestFocusEnabled(false);
jCheckStock.setVerticalTextPosition(javax.swing.SwingConstants.TOP);
jCheckStock.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jCheckStockMouseClicked(evt);
}
});
jCheckStock.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jCheckStockActionPerformed(evt);
}
});
jPanel2.add(jCheckStock);
jPanel5.add(jPanel2, java.awt.BorderLayout.NORTH);
m_jPanTicket.add(jPanel5, java.awt.BorderLayout.LINE_START);
m_jPanelCentral.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N
m_jPanelCentral.setPreferredSize(new java.awt.Dimension(450, 240));
m_jPanelCentral.setLayout(new java.awt.BorderLayout());
jPanel4.setLayout(new java.awt.BorderLayout());
jPanel4.add(filler2, java.awt.BorderLayout.LINE_START);
m_jTicketId.setFont(new java.awt.Font("Arial", 1, 12)); // NOI18N
m_jTicketId.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
m_jTicketId.setVerticalAlignment(javax.swing.SwingConstants.TOP);
m_jTicketId.setOpaque(true);
m_jTicketId.setPreferredSize(new java.awt.Dimension(300, 40));
m_jTicketId.setRequestFocusEnabled(false);
m_jTicketId.setVerticalTextPosition(javax.swing.SwingConstants.TOP);
jPanel4.add(m_jTicketId, java.awt.BorderLayout.CENTER);
m_jPanTotals.setPreferredSize(new java.awt.Dimension(375, 60));
m_jPanTotals.setLayout(new java.awt.GridLayout(2, 3, 4, 0));
m_jLblTotalEuros3.setFont(new java.awt.Font("Arial", 1, 14)); // NOI18N
m_jLblTotalEuros3.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
m_jLblTotalEuros3.setLabelFor(m_jSubtotalEuros);
m_jLblTotalEuros3.setText(AppLocal.getIntString("label.subtotalcash")); // NOI18N
m_jPanTotals.add(m_jLblTotalEuros3);
m_jLblTotalEuros2.setFont(new java.awt.Font("Arial", 1, 14)); // NOI18N
m_jLblTotalEuros2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
m_jLblTotalEuros2.setLabelFor(m_jSubtotalEuros);
m_jLblTotalEuros2.setText(AppLocal.getIntString("label.taxcash")); // NOI18N
m_jPanTotals.add(m_jLblTotalEuros2);
m_jLblTotalEuros1.setFont(new java.awt.Font("Arial", 1, 14)); // NOI18N
m_jLblTotalEuros1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
m_jLblTotalEuros1.setLabelFor(m_jTotalEuros);
m_jLblTotalEuros1.setText(AppLocal.getIntString("label.totalcash")); // NOI18N
m_jPanTotals.add(m_jLblTotalEuros1);
m_jSubtotalEuros.setBackground(m_jEditLine.getBackground());
m_jSubtotalEuros.setFont(new java.awt.Font("Arial", 0, 18)); // NOI18N
m_jSubtotalEuros.setForeground(m_jEditLine.getForeground());
m_jSubtotalEuros.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
m_jSubtotalEuros.setLabelFor(m_jSubtotalEuros);
m_jSubtotalEuros.setToolTipText(bundle.getString("tooltip.salesubtotal")); // NOI18N
m_jSubtotalEuros.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(153, 153, 153), 1, true));
m_jSubtotalEuros.setMaximumSize(new java.awt.Dimension(125, 25));
m_jSubtotalEuros.setMinimumSize(new java.awt.Dimension(80, 25));
m_jSubtotalEuros.setPreferredSize(new java.awt.Dimension(80, 25));
m_jSubtotalEuros.setRequestFocusEnabled(false);
m_jPanTotals.add(m_jSubtotalEuros);
m_jTaxesEuros.setBackground(m_jEditLine.getBackground());
m_jTaxesEuros.setFont(new java.awt.Font("Arial", 0, 18)); // NOI18N
m_jTaxesEuros.setForeground(m_jEditLine.getForeground());
m_jTaxesEuros.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
m_jTaxesEuros.setLabelFor(m_jTaxesEuros);
m_jTaxesEuros.setToolTipText(bundle.getString("tooltip.saletax")); // NOI18N
m_jTaxesEuros.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(153, 153, 153), 1, true));
m_jTaxesEuros.setMaximumSize(new java.awt.Dimension(125, 25));
m_jTaxesEuros.setMinimumSize(new java.awt.Dimension(80, 25));
m_jTaxesEuros.setPreferredSize(new java.awt.Dimension(80, 25));
m_jTaxesEuros.setRequestFocusEnabled(false);
m_jPanTotals.add(m_jTaxesEuros);
m_jTotalEuros.setBackground(m_jEditLine.getBackground());
m_jTotalEuros.setFont(new java.awt.Font("Arial", 1, 18)); // NOI18N
m_jTotalEuros.setForeground(m_jEditLine.getForeground());
m_jTotalEuros.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
m_jTotalEuros.setLabelFor(m_jTotalEuros);
m_jTotalEuros.setToolTipText(bundle.getString("tooltip.saletotal")); // NOI18N
m_jTotalEuros.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(153, 153, 153), 1, true));
m_jTotalEuros.setMaximumSize(new java.awt.Dimension(125, 25));
m_jTotalEuros.setMinimumSize(new java.awt.Dimension(80, 25));
m_jTotalEuros.setPreferredSize(new java.awt.Dimension(100, 25));
m_jTotalEuros.setRequestFocusEnabled(false);
m_jPanTotals.add(m_jTotalEuros);
jPanel4.add(m_jPanTotals, java.awt.BorderLayout.LINE_END);
m_jPanelCentral.add(jPanel4, java.awt.BorderLayout.SOUTH);
m_jPanTicket.add(m_jPanelCentral, java.awt.BorderLayout.CENTER);
m_jPanContainer.add(m_jPanTicket, java.awt.BorderLayout.CENTER);
m_jContEntries.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
m_jContEntries.setMinimumSize(new java.awt.Dimension(300, 350));
m_jContEntries.setLayout(new java.awt.BorderLayout());
m_jPanEntries.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N
m_jPanEntries.setPreferredSize(new java.awt.Dimension(300, 350));
m_jPanEntries.setLayout(new javax.swing.BoxLayout(m_jPanEntries, javax.swing.BoxLayout.Y_AXIS));
m_jNumberKeys.setMinimumSize(new java.awt.Dimension(300, 300));
m_jNumberKeys.setPreferredSize(new java.awt.Dimension(250, 250));
m_jNumberKeys.addJNumberEventListener(new com.unicenta.beans.JNumberEventListener() {
public void keyPerformed(com.unicenta.beans.JNumberEvent evt) {
m_jNumberKeysKeyPerformed(evt);
}
});
m_jPanEntries.add(m_jNumberKeys);
jPanel9.setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5));
m_jaddtax.setBorder(null);
m_jaddtax.setToolTipText(bundle.getString("tooltip.switchtax")); // NOI18N
m_jaddtax.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N
m_jaddtax.setPreferredSize(new java.awt.Dimension(60, 30));
m_jaddtax.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
m_jaddtaxActionPerformed(evt);
}
});
m_jPrice.setFont(new java.awt.Font("Arial", 1, 16)); // NOI18N
m_jPrice.setForeground(new java.awt.Color(76, 197, 237));
m_jPrice.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
m_jPrice.setBorder(javax.swing.BorderFactory.createCompoundBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(76, 197, 237)), javax.swing.BorderFactory.createEmptyBorder(1, 4, 1, 4)));
m_jPrice.setOpaque(true);
m_jPrice.setPreferredSize(new java.awt.Dimension(100, 25));
m_jPrice.setRequestFocusEnabled(false);
m_jPor.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
m_jPor.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
m_jPor.setRequestFocusEnabled(false);
m_jEnter.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/unicenta/images/barcode.png"))); // NOI18N
m_jEnter.setToolTipText(bundle.getString("tooltip.salebarcode")); // NOI18N
m_jEnter.setFocusPainted(false);
m_jEnter.setFocusable(false);
m_jEnter.setPreferredSize(new java.awt.Dimension(80, 45));
m_jEnter.setRequestFocusEnabled(false);
m_jEnter.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
m_jEnterActionPerformed(evt);
}
});
m_jTax.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N
m_jTax.setToolTipText(bundle.getString("tooltip.salestaxswitch")); // NOI18N
m_jTax.setFocusable(false);
m_jTax.setPreferredSize(new java.awt.Dimension(28, 25));
m_jTax.setRequestFocusEnabled(false);
m_jKeyFactory.setEditable(false);
m_jKeyFactory.setFont(new java.awt.Font("Arial", 0, 11)); // NOI18N
m_jKeyFactory.setForeground(javax.swing.UIManager.getDefaults().getColor("Panel.background"));
m_jKeyFactory.setAutoscrolls(false);
m_jKeyFactory.setBorder(null);
m_jKeyFactory.setCaretColor(javax.swing.UIManager.getDefaults().getColor("Panel.background"));
m_jKeyFactory.setMinimumSize(new java.awt.Dimension(0, 0));
m_jKeyFactory.setPreferredSize(new java.awt.Dimension(1, 1));
m_jKeyFactory.setRequestFocusEnabled(false);
m_jKeyFactory.setVerifyInputWhenFocusTarget(false);
m_jKeyFactory.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyTyped(java.awt.event.KeyEvent evt) {
m_jKeyFactoryKeyTyped(evt);
}
});
javax.swing.GroupLayout jPanel9Layout = new javax.swing.GroupLayout(jPanel9);
jPanel9.setLayout(jPanel9Layout);
jPanel9Layout.setHorizontalGroup(
jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel9Layout.createSequentialGroup()
.addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(m_jPor)
.addComponent(m_jKeyFactory, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 7, Short.MAX_VALUE)
.addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel9Layout.createSequentialGroup()
.addComponent(m_jaddtax, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGap(7, 7, 7)
.addComponent(m_jTax, javax.swing.GroupLayout.PREFERRED_SIZE, 128, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED))
.addGroup(jPanel9Layout.createSequentialGroup()
.addComponent(m_jPrice, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGap(5, 5, 5)))
.addComponent(m_jEnter, javax.swing.GroupLayout.PREFERRED_SIZE, 71, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
jPanel9Layout.setVerticalGroup(
jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel9Layout.createSequentialGroup()
.addComponent(m_jEnter, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(0, 0, Short.MAX_VALUE))
.addGroup(jPanel9Layout.createSequentialGroup()
.addComponent(m_jPrice, javax.swing.GroupLayout.PREFERRED_SIZE, 44, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 7, Short.MAX_VALUE)
.addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(m_jTax, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(m_jaddtax, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel9Layout.createSequentialGroup()
.addComponent(m_jPor)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(m_jKeyFactory, javax.swing.GroupLayout.PREFERRED_SIZE, 1, javax.swing.GroupLayout.PREFERRED_SIZE))
);
m_jPanEntries.add(jPanel9);
m_jContEntries.add(m_jPanEntries, java.awt.BorderLayout.NORTH);
m_jPanEntriesE.setLayout(new java.awt.BorderLayout());
m_jContEntries.add(m_jPanEntriesE, java.awt.BorderLayout.LINE_END);
m_jPanContainer.add(m_jContEntries, java.awt.BorderLayout.LINE_END);
catcontainer.setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5));
catcontainer.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N
catcontainer.setLayout(new java.awt.BorderLayout());
m_jPanContainer.add(catcontainer, java.awt.BorderLayout.SOUTH);
add(m_jPanContainer, "ticket");
}// </editor-fold>//GEN-END:initComponents
private void m_jbtnScaleActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_m_jbtnScaleActionPerformed
stateTransition('\u00a7');
}//GEN-LAST:event_m_jbtnScaleActionPerformed
private void m_jEditLineActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_m_jEditLineActionPerformed
count = (int) m_oTicket.getArticlesCount(); // get existing line value
int i = m_ticketlines.getSelectedIndex();
if (i < 0) {
Toolkit.getDefaultToolkit().beep(); // no line selected
} else {
try {
TicketLineInfo newline = JProductLineEdit.showMessage(this, m_App, m_oTicket.getLine(i));
if (newline != null) {
paintTicketLine(i, newline);
}
} catch (BasicException e) {
new MessageInf(e).show(this);
}
}
}//GEN-LAST:event_m_jEditLineActionPerformed
private void m_jEnterActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_m_jEnterActionPerformed
stateTransition('\n');
}//GEN-LAST:event_m_jEnterActionPerformed
private void m_jNumberKeysKeyPerformed(com.unicenta.beans.JNumberEvent evt) {//GEN-FIRST:event_m_jNumberKeysKeyPerformed
stateTransition(evt.getKey());
j_btnRemotePrt.setEnabled(true);
j_btnRemotePrt.revalidate();
}//GEN-LAST:event_m_jNumberKeysKeyPerformed
private void m_jKeyFactoryKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_m_jKeyFactoryKeyTyped
m_jKeyFactory.setText(null);
stateTransition(evt.getKeyChar());
}//GEN-LAST:event_m_jKeyFactoryKeyTyped
private void m_jDeleteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_m_jDeleteActionPerformed
int i = m_ticketlines.getSelectedIndex();
if (m_App.getProperties().getProperty("override.check").equals("true")) {
pinOK = false;
if (changeCount(pinOK)) {
if (i < 0) {
Toolkit.getDefaultToolkit().beep();
} else {
removeTicketLine(i);
jCheckStock.setText("");
}
}
} else {
if (i < 0) {
Toolkit.getDefaultToolkit().beep();
} else {
removeTicketLine(i);
jCheckStock.setText("");
}
}
}//GEN-LAST:event_m_jDeleteActionPerformed
private void m_jListActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_m_jListActionPerformed
ProductInfoExt prod = JProductFinder.showMessage(JPanelTicket.this, dlSales);
if (prod != null) {
buttonTransition(prod);
}
}//GEN-LAST:event_m_jListActionPerformed
private void jEditAttributesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jEditAttributesActionPerformed
if (listener != null) {
listener.stop();
}
int i = m_ticketlines.getSelectedIndex();
if (i < 0) {
Toolkit.getDefaultToolkit().beep(); // no line selected
} else {
try {
TicketLineInfo line = m_oTicket.getLine(i);
JProductAttEdit2 attedit = JProductAttEdit2.getAttributesEditor(this, m_App.getSession());
attedit.editAttributes(line.getProductAttSetId(), line.getProductAttSetInstId());
attedit.setVisible(true);
if (attedit.isOK()) {
line.setProductAttSetInstId(attedit.getAttributeSetInst());
line.setProductAttSetInstDesc(attedit.getAttributeSetInstDescription());
paintTicketLine(i, line);
}
} catch (BasicException ex) {
JOptionPane.showMessageDialog(this,
AppLocal.getIntString("message.cannotfindattributes"),
AppLocal.getIntString("message.title"),
JOptionPane.INFORMATION_MESSAGE);
}
}
if (listener != null) {
listener.restart();
}
}//GEN-LAST:event_jEditAttributesActionPerformed
private void jbtnMooringActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnMooringActionPerformed
// Display vessel selection box on screen if reply is good add to the ticket
if (listener != null) {
listener.stop();
}
JMooringDetails mooring = JMooringDetails.getMooringDetails(this, m_App.getSession());
mooring.setVisible(true);
if (mooring.isCreate()) {
if (((mooring.getVesselDays() > 0)) && ((mooring.getVesselSize() > 1))) {
try {
ProductInfoExt vProduct = dlSales.getProductInfoByCode("BFeesDay1");
vProduct.setName("Berth Fees 1st Day " + mooring.getVesselName());
addTicketLine(vProduct, mooring.getVesselSize(), vProduct.getPriceSell());
if (mooring.getVesselDays() > 1) {
vProduct = dlSales.getProductInfoByCode("BFeesDay2");
vProduct.setName("Additional Days " + (mooring.getVesselDays() - 1));
addTicketLine(vProduct, mooring.getVesselSize() * (mooring.getVesselDays() - 1), vProduct.getPriceSell());
}
if (mooring.getVesselPower()) {
vProduct = dlSales.getProductInfoByCode("PowerSupplied");
addTicketLine(vProduct, mooring.getVesselDays(), vProduct.getPriceSell());
}
} catch (BasicException e) {
}
}
}
refreshTicket();
}//GEN-LAST:event_jbtnMooringActionPerformed
private void j_btnRemotePrtActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_j_btnRemotePrtActionPerformed
String rScript = (dlSystem.getResourceAsText("script.SendOrder"));
Interpreter i = new Interpreter();
try {
i.set("ticket", m_oTicket);
i.set("place", m_oTicketExt);
i.set("user", m_App.getAppUserView().getUser());
i.set("sales", this);
i.set("pickupid", m_oTicket.getPickupId());
Object result;
result = i.eval(rScript);
} catch (EvalError ex) {
log.error(ex.getMessage());
}
remoteOrderDisplay();
}//GEN-LAST:event_j_btnRemotePrtActionPerformed
private void btnReprint1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnReprint1ActionPerformed
if (m_config.getProperty("lastticket.number") != null) {
try {
TicketInfo ticket = dlSales.loadTicket(
Integer.parseInt((m_config.getProperty("lastticket.type"))),
Integer.parseInt((m_config.getProperty("lastticket.number"))));
if (ticket == null) {
JFrame frame = new JFrame();
JOptionPane.showMessageDialog(frame,
AppLocal.getIntString("message.notexiststicket"),
AppLocal.getIntString("message.notexiststickettitle"),
JOptionPane.WARNING_MESSAGE);
} else {
m_ticket = ticket;
m_ticketCopy = null;
try {
taxeslogic.calculateTaxes(m_ticket);
TicketTaxInfo[] taxlist = m_ticket.getTaxLines();
} catch (TaxesException ex) {
}
printTicket("Printer.ReprintTicket", m_ticket, null);
Notify("'Printed'");
}
} catch (BasicException e) {
MessageInf msg = new MessageInf(MessageInf.SGN_WARNING, AppLocal.getIntString("message.cannotloadticket"), e);
msg.show(this);
}
}
}//GEN-LAST:event_btnReprint1ActionPerformed
private void btnSplitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnSplitActionPerformed
if (m_oTicket.getLinesCount() > 0) {
ReceiptSplit splitdialog = ReceiptSplit.getDialog(this,
dlSystem.getResourceAsXML("Ticket.Line"), dlSales, dlCustomers, taxeslogic);
TicketInfo ticket1 = m_oTicket.copyTicket();
TicketInfo ticket2 = new TicketInfo();
ticket2.setCustomer(m_oTicket.getCustomer());
if (splitdialog.showDialog(ticket1, ticket2, m_oTicketExt)) {
if (closeTicket(ticket2, m_oTicketExt)) { // already checked that number of lines > 0
setActiveTicket(ticket1, m_oTicketExt);// set result ticket
}
}
}
}//GEN-LAST:event_btnSplitActionPerformed
private void jCheckStockActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jCheckStockActionPerformed
if (listener != null) {
listener.stop();
}
int i = m_ticketlines.getSelectedIndex();
if (i < 0) {
Toolkit.getDefaultToolkit().beep();
} else {
try {
TicketLineInfo line = m_oTicket.getLine(i);
String pId = line.getProductID();
String location = m_App.getInventoryLocation();
ProductStock checkProduct;
checkProduct = dlSales.getProductStockState(pId, location);
if (checkProduct != null) {
if (checkProduct.getUnits() <= 0) {
jCheckStock.setForeground(Color.magenta);
} else {
jCheckStock.setForeground(Color.darkGray);
}
String content;
if (!location.equals(checkProduct.getLocation())) {
content = AppLocal.getIntString("message.location.current");
JFrame frame = new JFrame();
JOptionPane.showMessageDialog(frame,
content,
"Info",
JOptionPane.INFORMATION_MESSAGE);
} else {
double dUnits = checkProduct.getUnits();
int iUnits;
iUnits = (int) dUnits;
jCheckStock.setText(Integer.toString(iUnits));
}
} else {
jCheckStock.setText(null);
}
} catch (BasicException ex) {
log.error(ex.getMessage());
}
}
if (listener != null) {
listener.restart();
}
}//GEN-LAST:event_jCheckStockActionPerformed
private void jCheckStockMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jCheckStockMouseClicked
if (evt.getClickCount() == 2) {
if (listener != null) {
listener.stop();
}
int i = m_ticketlines.getSelectedIndex();
if (i < 0) {
Toolkit.getDefaultToolkit().beep();
} else {
try {
TicketLineInfo line = m_oTicket.getLine(i);
String pId = line.getProductID();
String location = m_App.getInventoryLocation();
ProductStock checkProduct;
checkProduct = dlSales.getProductStockState(pId, location);
Double pMin;
Double pMax;
Double pUnits;
Date pMemoDate;
String content;
if (!location.equals(checkProduct.getLocation())) {
content = AppLocal.getIntString("message.location.current");
JFrame frame = new JFrame();
JOptionPane.showMessageDialog(frame,
content,
"Info",
JOptionPane.INFORMATION_MESSAGE);
} else {
if (checkProduct.getMinimum() != null) {
pMin = checkProduct.getMinimum();
} else {
pMin = 0.;
}
if (checkProduct.getMaximum() != null) {
pMax = checkProduct.getMaximum();
} else {
pMax = 0.;
}
if (checkProduct.getUnits() != null) {
pUnits = checkProduct.getUnits();
} else {
pUnits = 0.;
}
if (checkProduct.getMemoDate() != null) {
pMemoDate = checkProduct.getMemoDate();
} else {
pMemoDate = null;
}
content = "<html>" +
"<b>" + AppLocal.getIntString("label.currentstock") +
" : " + "</b>" + checkProduct.getUnits() + "<br>" +
"<b>" + AppLocal.getIntString("label.maximum") +
" : " + "</b>" + pMax + "<br>" +
"<b>" + AppLocal.getIntString("label.minimum") +
" : " + "</b>" + pMin + "<br>" +
"<b>" + AppLocal.getIntString("label.proddate") +
" : " + "</b>" + pMemoDate + "<br>";
JFrame frame = new JFrame();
JOptionPane.showMessageDialog(frame,
content,
"Info",
JOptionPane.INFORMATION_MESSAGE);
}
} catch (BasicException ex) {
log.error(ex.getMessage());
}
}
if (listener != null) {
listener.restart();
}
}
}//GEN-LAST:event_jCheckStockMouseClicked
private void m_jaddtaxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_m_jaddtaxActionPerformed
m_jKeyFactory.requestFocus();
}//GEN-LAST:event_m_jaddtaxActionPerformed
private void jTBtnShowActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jTBtnShowActionPerformed
if (jTBtnShow.isSelected()) {
m_jPanelScripts.setVisible(true);
m_jButtonsExt.setVisible(true);
} else {
m_jPanelScripts.setVisible(false);
m_jButtonsExt.setVisible(false);
}
refreshTicket();
m_jKeyFactory.requestFocus();
}//GEN-LAST:event_jTBtnShowActionPerformed
private void jBtnCustomerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jBtnCustomerActionPerformed
if (listener != null) {
listener.stop();
}
2024-05-20 17:03:58 +01:00
Object[] options = {
AppLocal.getIntString("label.create"),
AppLocal.getIntString("label.find"),
AppLocal.getIntString("label.cancel")
};
2023-04-06 18:58:04 +01:00
int n = JOptionPane.showOptionDialog(null,
AppLocal.getIntString("message.customeradd"),
AppLocal.getIntString("label.customer"),
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
options,
options[2]);
if (n == 0) {
JDialogNewCustomer dialog = JDialogNewCustomer.getDialog(this, m_App);
dialog.setVisible(true);
CustomerInfoExt m_customerInfo = dialog.getSelectedCustomer();
if (dialog.getSelectedCustomer() != null) {
try {
m_oTicket.setCustomer(dlSales.loadCustomerExt
(dialog.getSelectedCustomer().getId()));
} catch (BasicException ex) {
log.error(ex.getMessage());
}
}
}
if (n == 1) {
JCustomerFinder finder = JCustomerFinder.getCustomerFinder(this, dlCustomers);
if (m_oTicket.getCustomerId() == null) {
finder.setAppView(m_App);
finder.search(m_oTicket.getCustomer());
finder.executeSearch();
finder.setVisible(true);
if (finder.getSelectedCustomer() != null) {
try {
m_oTicket.setCustomer(dlSales.loadCustomerExt
(finder.getSelectedCustomer().getId()));
if ("restaurant".equals(m_App.getProperties().getProperty("machine.ticketsbag"))) {
restDB.setCustomerNameInTableByTicketId(dlSales.loadCustomerExt
(finder.getSelectedCustomer().getId()).toString(), m_oTicket.getId());
}
checkCustomer();
m_jTicketId.setText(m_oTicket.getName(m_oTicketExt));
} catch (BasicException e) {
MessageInf msg = new MessageInf(MessageInf.SGN_WARNING,
AppLocal.getIntString("message.cannotfindcustomer"), e);
msg.show(this);
}
} else {
restDB.setCustomerNameInTableByTicketId(null, m_oTicket.getId());
m_oTicket.setCustomer(null);
Notify("notify.customerremove");
}
} else {
if (JOptionPane.showConfirmDialog(this,
AppLocal.getIntString("message.customerchange"),
AppLocal.getIntString("title.editor"),
JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
finder.setAppView(m_App);
finder.search(m_oTicket.getCustomer());
finder.executeSearch();
finder.setVisible(true);
if (finder.getSelectedCustomer() != null) {
try {
m_oTicket.setCustomer(dlSales.loadCustomerExt
(finder.getSelectedCustomer().getId()));
if ("restaurant".equals(m_App.getProperties().getProperty("machine.ticketsbag"))) {
restDB.setCustomerNameInTableByTicketId(dlSales.loadCustomerExt
(finder.getSelectedCustomer().getId()).toString(), m_oTicket.getId());
}
checkCustomer();
m_jTicketId.setText(m_oTicket.getName());
} catch (BasicException e) {
MessageInf msg = new MessageInf(MessageInf.SGN_WARNING,
AppLocal.getIntString("message.cannotfindcustomer"), e);
msg.show(this);
}
} else {
restDB.setCustomerNameInTableByTicketId(null, m_oTicket.getId());
m_oTicket.setCustomer(null);
}
}
}
}
refreshTicket();
}//GEN-LAST:event_jBtnCustomerActionPerformed
private void m_jPanContainerFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_m_jPanContainerFocusLost
jPanContainerFocusLost(evt);
}//GEN-LAST:event_m_jPanContainerFocusLost
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnReprint1;
private javax.swing.JButton btnSplit;
private javax.swing.JPanel catcontainer;
private javax.swing.Box.Filler filler2;
private javax.swing.JButton jBtnCustomer;
private javax.swing.JButton jCheckStock;
private javax.swing.JButton jEditAttributes;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel4;
private javax.swing.JPanel jPanel5;
private javax.swing.JPanel jPanel9;
private javax.swing.JToggleButton jTBtnShow;
private javax.swing.JButton j_btnRemotePrt;
private javax.swing.JButton jbtnMooring;
private javax.swing.JPanel m_jButtons;
private javax.swing.JPanel m_jButtonsExt;
private javax.swing.JPanel m_jContEntries;
private javax.swing.JButton m_jDelete;
private javax.swing.JButton m_jEditLine;
private javax.swing.JButton m_jEnter;
private javax.swing.JTextField m_jKeyFactory;
private javax.swing.JLabel m_jLblTotalEuros1;
private javax.swing.JLabel m_jLblTotalEuros2;
private javax.swing.JLabel m_jLblTotalEuros3;
private javax.swing.JButton m_jList;
private com.unicenta.beans.JNumberKeys m_jNumberKeys;
private javax.swing.JPanel m_jOptions;
private javax.swing.JPanel m_jPanContainer;
private javax.swing.JPanel m_jPanEntries;
private javax.swing.JPanel m_jPanEntriesE;
private javax.swing.JPanel m_jPanTicket;
private javax.swing.JPanel m_jPanTotals;
private javax.swing.JPanel m_jPanelBag;
private javax.swing.JPanel m_jPanelCentral;
private javax.swing.JPanel m_jPanelScripts;
private javax.swing.JLabel m_jPor;
private javax.swing.JLabel m_jPrice;
private javax.swing.JLabel m_jSubtotalEuros;
private javax.swing.JComboBox m_jTax;
private javax.swing.JLabel m_jTaxesEuros;
private javax.swing.JLabel m_jTicketId;
private javax.swing.JLabel m_jTotalEuros;
private com.alee.extended.button.WebSwitch m_jaddtax;
private javax.swing.JButton m_jbtnScale;
// End of variables declaration//GEN-END:variables
/* Remote Orders Display
We only know about uniCenta oPOS orders and won't try and handle any
that are injected from an external source
*/
public void remoteOrderDisplay() {
remoteOrderDisplay(remoteOrderId(), 1, true);
}
public void remoteOrderDisplay(String id) {
remoteOrderDisplay(id, 1, true);
}
public void remoteOrderDisplay(Integer display) {
remoteOrderDisplay(remoteOrderId(), display, false);
}
public String remoteOrderId() {
String id = "";
if ((m_oTicket.getCustomer() != null)) {
return m_oTicket.getCustomer().getName();
} else if (m_oTicketExt != null) {
return m_oTicketExt.toString();
} else {
if (m_oTicket.getPickupId() == 0) {
try {
m_oTicket.setPickupId(dlSales.getNextPickupIndex());
} catch (BasicException e) {
m_oTicket.setPickupId(0);
}
}
return getPickupString(m_oTicket);
}
}
public void remoteOrderDisplay(String id, Integer display, boolean primary) {
try {
// may use later if/when external order injection
// String orderUUID = UUID.randomUUID().toString();
dlSystem.deleteOrder(id);
} catch (BasicException ex) {
log.error(ex.getMessage());
}
for (int i = 0; i < m_oTicket.getLinesCount(); i++) {
try {
if (primary) {
if ((m_oTicket.getLine(i).getProperty("display") == null)
|| ("".equals(m_oTicket.getLine(i).getProperty("display")))) {
display = 1;
} else {
display = Integer.parseInt(m_oTicket.getLine(i).getProperty("display"));
}
}
dlSystem.addOrder(getPickupString(m_oTicket)
, (int) m_oTicket.getLine(i).getMultiply()
, m_oTicket.getLine(i).getProductName()
, m_oTicket.getLine(i).getProductAttSetInstDesc()
, m_oTicket.getLine(i).getProperty("notes")
, id
, null
, display
, null
, null);
/* this block for future - right now we're deleting all ticketlines
and resending for consistency with actual ticketlines
dlSystem.updateOrder(getPickupString(m_oTicket)
, (int) m_oTicket.getLine(i).getMultiply()
, m_oTicket.getLine(i).getProductName()
, m_oTicket.getLine(i).getProductAttSetInstDesc()
, m_oTicket.getLine(i).getProperty("notes")
, id
, null
, display
, null
, null);
*/
} catch (BasicException ex) {
log.error(ex.getMessage());
}
}
}
}