📄 stockmanagement.java
字号:
// Tina POS is a point of sales application designed for touch screens.
// Copyright (C) 2005 Adrian Romero Corchado.
// http://sourceforge.net/projects/tinapos
//
// This program 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 2 of the License, or
// (at your option) any later version.
//
// This program 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 this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
package net.adrianromero.tpv.inventory;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import net.adrianromero.basic.BasicException;
import net.adrianromero.beans.*;
import net.adrianromero.data.gui.*;
import net.adrianromero.data.loader.*;
import net.adrianromero.format.Formats;
import net.adrianromero.scripting.ScriptEngine;
import net.adrianromero.scripting.ScriptException;
import net.adrianromero.scripting.ScriptFactory;
import net.adrianromero.tpv.forms.*;
import net.adrianromero.tpv.panels.JCatalog;
import net.adrianromero.tpv.printer.TicketParser;
import net.adrianromero.tpv.printer.TicketPrinterException;
import net.adrianromero.tpv.scanpal2.DeviceScanner;
import net.adrianromero.tpv.scanpal2.DeviceScannerException;
import net.adrianromero.tpv.scanpal2.ProductDownloaded;
import net.adrianromero.tpv.ticket.ProductInfoExt;
public class StockManagement extends JPanel implements JPanelView {
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 AppView m_App;
private TicketParser m_TTP;
private JCatalog m_cat;
private ComboBoxValModel m_ReasonModel;
private SentenceList m_sentlocations;
// private IRenderString m_LocationsRender;
private ComboBoxValModel m_LocationsModel;
private ComboBoxValModel m_LocationsModelDes;
// Estas tres variables forman el estado...
private int m_iNumberStatus;
// private int m_iNumberStatusInput;
// private int m_iNumberStatusPor;
private StringBuffer m_sBarcode;
private JInventoryLines m_invlines;
/** Creates new form StockManagement */
public StockManagement(AppView oApp) {
m_App = oApp;
m_TTP = new TicketParser(m_App.getDeviceTicket(), m_App.lookupDataLogic(DataLogicSystem.class));
initComponents();
btnDownloadProducts.setEnabled(m_App.getDeviceScanner() != null);
// El modelo de locales
m_sentlocations = m_App.lookupDataLogic(SentenceContainer.class).getLocationsList();
m_LocationsModel = new ComboBoxValModel();
m_LocationsModelDes = new ComboBoxValModel();
m_ReasonModel = new ComboBoxValModel();
m_ReasonModel.add(MovementReason.IN_PURCHASE);
m_ReasonModel.add(MovementReason.IN_REFUND);
m_ReasonModel.add(MovementReason.IN_MOVEMENT);
m_ReasonModel.add(MovementReason.OUT_SALE);
m_ReasonModel.add(MovementReason.OUT_REFUND);
m_ReasonModel.add(MovementReason.OUT_BREAK);
m_ReasonModel.add(MovementReason.OUT_MOVEMENT);
m_ReasonModel.add(MovementReason.OUT_CROSSING);
m_jreason.setModel(m_ReasonModel);
m_cat = new JCatalog(m_App);
m_cat.addActionListener(new CatalogListener());
add(m_cat, BorderLayout.SOUTH);
// Las lineas de inventario
m_invlines = new JInventoryLines();
jPanel5.add(m_invlines, BorderLayout.CENTER);
}
public String getTitle() {
return AppLocal.getIntString("Menu.StockMovement");
}
public JComponent getComponent() {
return this;
}
public void activate() throws BasicException {
m_cat.loadCatalog();
java.util.List l = m_sentlocations.list();
m_LocationsModel = new ComboBoxValModel(l);
m_jLocation.setModel(m_LocationsModel); // para que lo refresque
m_LocationsModelDes = new ComboBoxValModel(l);
m_jLocationDes.setModel(m_LocationsModelDes); // para que lo refresque
stateToInsert();
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
m_jcodebar.requestFocus();
}
});
}
public void stateToInsert() {
// Inicializamos las cajas de texto
m_jdate.setText(Formats.TIMESTAMP.formatValue(DateUtils.getTodayMinutes()));
m_ReasonModel.setSelectedItem(MovementReason.OUT_CROSSING); // Antes Compras.
m_LocationsModel.setSelectedKey(m_App.getInventoryLocation());
m_LocationsModelDes.setSelectedKey(m_App.getInventoryLocation());
m_invlines.clear();
m_jcodebar.setText(null);
}
public boolean deactivate() {
if (m_invlines.getCount() > 0) {
int res = JOptionPane.showConfirmDialog(this, LocalRes.getIntString("message.wannasave"), LocalRes.getIntString("title.editor"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
if (res == JOptionPane.YES_OPTION) {
saveData();
return true;
} else if (res == JOptionPane.NO_OPTION) {
return true;
} else {
return false;
}
} else {
return true;
}
}
private void stateToZero(){
// m_jPor.setText("");
// m_jPrice.setText("");
m_sBarcode = new StringBuffer();
m_iNumberStatus = NUMBER_INPUTZERO;
// m_iNumberStatusInput = NUMBERZERO;
// m_iNumberStatusPor = NUMBERZERO;
}
private void addLine(ProductInfoExt oProduct, double dpor, double dprice) {
m_invlines.addLine(new InventoryLine(oProduct, dpor, dprice));
}
private void deleteLine(int index) {
if (index < 0){
Toolkit.getDefaultToolkit().beep(); // No hay ninguna seleccionada
} else {
m_invlines.deleteLine(index);
}
}
private void incProduct(double dPor, ProductInfoExt prod) {
// precondicion: prod != null
addLine(prod, dPor, prod.getPriceBuy());
}
private void incProductByCode(String sCode) {
incProductByCode(sCode, 1.0);
}
private void incProductByCode(String sCode, double dQuantity) {
// precondicion: sCode != null
try {
ProductInfoExt oProduct = m_App.lookupDataLogic(SentenceContainer.class).getProductInfo(sCode);
if (oProduct == null) {
Toolkit.getDefaultToolkit().beep();
stateToZero();
} else {
// Se anade directamente una unidad con el precio y todo
incProduct(dQuantity, oProduct);
}
} catch (BasicException eData) {
stateToZero();
MessageInf msg = new MessageInf(eData);
msg.show(this);
}
}
private void addUnits(double dUnits) {
int i = m_invlines.getSelectedRow();
if (i >= 0 ) {
InventoryLine inv = m_invlines.getLine(i);
double dunits = inv.getMultiply() + dUnits;
if (dunits == 0.0) {
deleteLine(i);
} else {
inv.setMultiply(inv.getMultiply() + dUnits);
m_invlines.setLine(i, inv);
}
}
}
private void stateTransition(char cTrans) {
if (cTrans == '\u007f') {
m_jcodebar.setText(null);
} else if (cTrans == '+') {
if (m_jcodebar.getText() == null || m_jcodebar.getText().equals("")) {
// anadimos una unidad
addUnits(1.0);
} else {
addUnits(Double.parseDouble(m_jcodebar.getText()));
m_jcodebar.setText(null);
}
} else if (cTrans == '-') {
if (m_jcodebar.getText() == null || m_jcodebar.getText().equals("")) {
// anadimos una unidad
addUnits(-1.0);
} else {
addUnits(-Double.parseDouble(m_jcodebar.getText()));
m_jcodebar.setText(null);
}
} else if (cTrans == ' ' || cTrans == '=') {
if (m_invlines.getCount() == 0) {
// No podemos grabar, no hay ningun registro.
Toolkit.getDefaultToolkit().beep();
} else {
saveData();
}
} else {
m_jcodebar.setText(m_jcodebar.getText() + cTrans);
}
}
private void saveData() {
try {
Date d = (Date) Formats.TIMESTAMP.parseValue(m_jdate.getText());
MovementReason reason = (MovementReason) m_ReasonModel.getSelectedItem();
if (reason == MovementReason.OUT_CROSSING) {
// Es una doble entrada
saveData(new InventoryRecord(
d, MovementReason.OUT_MOVEMENT,
(LocationInfo) m_LocationsModel.getSelectedItem(),
m_invlines.getLines()
));
saveData(new InventoryRecord(
d, MovementReason.IN_MOVEMENT,
(LocationInfo) m_LocationsModelDes.getSelectedItem(),
m_invlines.getLines()
));
} else {
// Es un movimiento
saveData(new InventoryRecord(
d, reason,
(LocationInfo) m_LocationsModel.getSelectedItem(),
m_invlines.getLines()
));
}
stateToInsert();
} catch (BasicException eData) {
MessageInf msg = new MessageInf(MessageInf.SGN_NOTICE, "No se ha podido guardar la informacion de movimiento de inventario", eData);
msg.show(this);
}
}
private void saveData(InventoryRecord rec) throws BasicException {
// A grabar.
SentenceExec sent = m_App.lookupDataLogic(SentenceContainer.class).getStockDiaryInsert();
for (int i = 0; i < m_invlines.getCount(); i++) {
Object[] diary = new Object[7];
diary[0] = m_App.lookupDataLogic(SentenceContainer.class).getNextStockDiary(); // si casca que suba la excepcion hacia arriba.
diary[1] = rec.getDate();
diary[2] = rec.getReason().getKey();
diary[3] = rec.getLocation().getID();
InventoryLine inv = rec.getLines().get(i);
diary[4] = inv.getProductReference();
diary[5] = rec.getReason().samesignum(inv.getMultiply());
diary[6] = inv.getPrice();
sent.exec(diary);
}
// si se ha grabado se imprime, si no, no.
printTicket(rec);
}
private void printTicket(InventoryRecord invrec) {
String sresource = m_App.lookupDataLogic(DataLogicSystem.class).getResourceAsXML("Printer.Inventory");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -