/****************************************************************************** * Copyright (C) 2009 Low Heng Sin * * Copyright (C) 2009 Idalica Corporation * * This program is free software; you can redistribute it and/or modify it * * under the terms version 2 of the GNU General Public License as published * * by the Free Software Foundation. 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 org.adempiere.webui.apps.form; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.Vector; import java.util.logging.Level; import org.adempiere.webui.apps.AEnv; import org.adempiere.webui.component.Checkbox; import org.adempiere.webui.component.Grid; import org.adempiere.webui.component.GridFactory; import org.adempiere.webui.component.Label; import org.adempiere.webui.component.ListModelTable; import org.adempiere.webui.component.Listbox; import org.adempiere.webui.component.ListboxFactory; import org.adempiere.webui.component.Panel; import org.adempiere.webui.component.Row; import org.adempiere.webui.component.Rows; import org.adempiere.webui.editor.WEditor; import org.adempiere.webui.editor.WLocatorEditor; import org.adempiere.webui.editor.WSearchEditor; import org.adempiere.webui.editor.WStringEditor; import org.adempiere.webui.event.ValueChangeEvent; import org.adempiere.webui.event.ValueChangeListener; import org.compiere.grid.CreateFromShipment; import org.compiere.model.GridTab; import org.compiere.model.MInvoice; import org.compiere.model.MLocatorLookup; import org.compiere.model.MLookup; import org.compiere.model.MLookupFactory; import org.compiere.model.MProduct; import org.compiere.model.MRMA; import org.compiere.util.CLogger; import org.compiere.util.DisplayType; import org.compiere.util.Env; import org.compiere.util.KeyNamePair; import org.compiere.util.Msg; import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zk.ui.event.Events; import org.zkoss.zkex.zul.Borderlayout; import org.zkoss.zkex.zul.Center; import org.zkoss.zul.Space; public class WCreateFromShipmentUI extends CreateFromShipment implements EventListener, ValueChangeListener { private static final int WINDOW_CUSTOMER_RETURN = 53097; private static final int WINDOW_RETURN_TO_VENDOR = 53098; private WCreateFromWindow window; public WCreateFromShipmentUI(GridTab tab) { super(tab); log.info(getGridTab().toString()); window = new WCreateFromWindow(this, getGridTab().getWindowNo()); p_WindowNo = getGridTab().getWindowNo(); try { if (!dynInit()) return; zkInit(); setInitOK(true); } catch(Exception e) { log.log(Level.SEVERE, "", e); setInitOK(false); } AEnv.showWindow(window); } /** Window No */ private int p_WindowNo; /** Logger */ private CLogger log = CLogger.getCLogger(getClass()); protected Label bPartnerLabel = new Label(); protected WEditor bPartnerField; protected Label orderLabel = new Label(); protected Listbox orderField = ListboxFactory.newDropdownListbox(); /** Label for the rma selection */ protected Label rmaLabel = new Label(); /** Combo box for selecting RMA document */ protected Listbox rmaField = ListboxFactory.newDropdownListbox(); protected Label invoiceLabel = new Label(); protected Listbox invoiceField = ListboxFactory.newDropdownListbox(); protected Checkbox sameWarehouseCb = new Checkbox(); protected Label locatorLabel = new Label(); protected WLocatorEditor locatorField = new WLocatorEditor(); protected Label upcLabel = new Label(); protected WStringEditor upcField = new WStringEditor(); /** Loaded Invoice */ private MInvoice m_invoice = null; /** Loaded RMA */ private MRMA m_rma = null; /** * Dynamic Init * @throws Exception if Lookups cannot be initialized * @return true if initialized */ public boolean dynInit() throws Exception { log.config(""); super.dynInit(); window.setTitle(getTitle()); sameWarehouseCb.setSelected(true); sameWarehouseCb.addActionListener(this); // load Locator MLocatorLookup locator = new MLocatorLookup(Env.getCtx(), p_WindowNo); locatorField = new WLocatorEditor ("M_Locator_ID", true, false, true, locator, p_WindowNo); initBPartner(false); bPartnerField.addValueChangeListener(this); locatorLabel.setMandatory(true); upcField = new WStringEditor ("UPC", false, false, true, 10, 30, null, null); upcField.getComponent().addEventListener(Events.ON_CHANGE, this); return true; } // dynInit protected void zkInit() throws Exception { boolean isRMAWindow = ((getGridTab().getAD_Window_ID() == WINDOW_RETURN_TO_VENDOR) || (getGridTab().getAD_Window_ID() == WINDOW_CUSTOMER_RETURN)); bPartnerLabel.setText(Msg.getElement(Env.getCtx(), "C_BPartner_ID")); orderLabel.setText(Msg.getElement(Env.getCtx(), "C_Order_ID", false)); invoiceLabel.setText(Msg.getElement(Env.getCtx(), "C_Invoice_ID", false)); rmaLabel.setText(Msg.translate(Env.getCtx(), "M_RMA_ID")); locatorLabel.setText(Msg.translate(Env.getCtx(), "M_Locator_ID")); sameWarehouseCb.setText(Msg.getMsg(Env.getCtx(), "FromSameWarehouseOnly", true)); sameWarehouseCb.setTooltiptext(Msg.getMsg(Env.getCtx(), "FromSameWarehouseOnly", false)); upcLabel.setText(Msg.getElement(Env.getCtx(), "UPC", false)); Borderlayout parameterLayout = new Borderlayout(); parameterLayout.setHeight("110px"); parameterLayout.setWidth("100%"); Panel parameterPanel = window.getParameterPanel(); parameterPanel.appendChild(parameterLayout); Grid parameterStdLayout = GridFactory.newGridLayout(); Panel parameterStdPanel = new Panel(); parameterStdPanel.appendChild(parameterStdLayout); Center center = new Center(); parameterLayout.appendChild(center); center.appendChild(parameterStdPanel); parameterStdPanel.appendChild(parameterStdLayout); Rows rows = (Rows) parameterStdLayout.newRows(); Row row = rows.newRow(); row.appendChild(bPartnerLabel.rightAlign()); if (bPartnerField != null) row.appendChild(bPartnerField.getComponent()); if (! isRMAWindow) { row.appendChild(orderLabel.rightAlign()); row.appendChild(orderField); } row = rows.newRow(); row.appendChild(locatorLabel.rightAlign()); row.appendChild(locatorField.getComponent()); if (! isRMAWindow) { row.appendChild(invoiceLabel.rightAlign()); row.appendChild(invoiceField); } row = rows.newRow(); row.appendChild(new Space()); row.appendChild(sameWarehouseCb); row = rows.newRow(); row.appendChild(upcLabel.rightAlign()); row.appendChild(upcField.getComponent()); if (isRMAWindow) { // Add RMA document selection to panel row.appendChild(rmaLabel.rightAlign()); row.appendChild(rmaField); } } private boolean m_actionActive = false; /** * Action Listener * @param e event * @throws Exception */ public void onEvent(Event e) throws Exception { if (m_actionActive) return; m_actionActive = true; /* // Order if (e.getTarget().equals(orderField)) { ListItem li = orderField.getSelectedItem(); int C_Order_ID = 0; if (li != null && li.getValue() != null) C_Order_ID = ((Integer) li.getValue()).intValue(); // set Invoice, RMA and Shipment to Null rmaField.setSelectedIndex(-1); //shipmentField.setSelectedIndex(-1); loadOrder(C_Order_ID, true); } // Shipment else if (e.getTarget().equals(invoiceField)) { ListItem li = shipmentField.getSelectedItem(); int M_InOut_ID = 0; if (li != null && li.getValue() != null) M_InOut_ID = ((Integer) li.getValue()).intValue(); // set Order, RMA and Invoice to Null orderField.setSelectedIndex(-1); rmaField.setSelectedIndex(-1); loadShipment(M_InOut_ID); } // RMA else if (e.getTarget().equals(rmaField)) { ListItem li = rmaField.getSelectedItem(); int M_RMA_ID = 0; if (li != null && li.getValue() != null) M_RMA_ID = ((Integer) li.getValue()).intValue(); // set Order and Invoice to Null orderField.setSelectedIndex(-1); //shipmentField.setSelectedIndex(-1); loadRMA(M_RMA_ID); } m_actionActive = false; */ // Order if (e.getTarget().equals(orderField)) { KeyNamePair pp = orderField.getSelectedItem().toKeyNamePair(); if (pp == null || pp.getKey() == 0) ; else { int C_Order_ID = pp.getKey(); // set Invoice and Shipment to Null invoiceField.setSelectedIndex(-1); rmaField.setSelectedIndex(-1); loadOrder(C_Order_ID, false, locatorField.getValue()!=null?((Integer)locatorField.getValue()).intValue():0); m_invoice = null; } } // Invoice else if (e.getTarget().equals(invoiceField)) { KeyNamePair pp = invoiceField.getSelectedItem().toKeyNamePair(); if (pp == null || pp.getKey() == 0) ; else { int C_Invoice_ID = pp.getKey(); // set Order and Shipment to Null orderField.setSelectedIndex(-1); rmaField.setSelectedIndex(-1); loadInvoice(C_Invoice_ID, locatorField.getValue()!=null?((Integer)locatorField.getValue()).intValue():0); } } // RMA else if (e.getTarget().equals(rmaField)) { KeyNamePair pp = rmaField.getSelectedItem().toKeyNamePair(); if (pp == null || pp.getKey() == 0) ; else { int M_RMA_ID = pp.getKey(); // set Order and Shipment to Null orderField.setSelectedIndex(-1); invoiceField.setSelectedIndex(-1); loadRMA(M_RMA_ID, locatorField.getValue()!=null?((Integer)locatorField.getValue()).intValue():0); } } //sameWarehouseCb else if (e.getTarget().equals(sameWarehouseCb)) { initBPOrderDetails(((Integer)bPartnerField.getValue()).intValue(), false); } else if (e.getTarget().equals(upcField.getComponent())) { checkProductUsingUPC(); } m_actionActive = false; } /** * Checks the UPC value and checks if the UPC matches any of the products in the * list. */ private void checkProductUsingUPC() { String upc = upcField.getDisplay(); //DefaultTableModel model = (DefaultTableModel) dialog.getMiniTable().getModel(); ListModelTable model = (ListModelTable) window.getWListbox().getModel(); // Lookup UPC List<MProduct> products = MProduct.getByUPC(Env.getCtx(), upc, null); for (MProduct product : products) { int row = findProductRow(product.get_ID()); if (row >= 0) { BigDecimal qty = (BigDecimal)model.getValueAt(row, 1); model.setValueAt(qty, row, 1); model.setValueAt(Boolean.TRUE, row, 0); model.updateComponent(row, row); } } upcField.setValue(""); upcField.setHasFocus(true); } /** * Finds the row where a given product is. If the product is not found * in the table -1 is returned. * @param M_Product_ID * @return Row of the product or -1 if non existing. * */ private int findProductRow(int M_Product_ID) { //DefaultTableModel model = (DefaultTableModel)dialog.getMiniTable().getModel(); ListModelTable model = (ListModelTable) window.getWListbox().getModel(); KeyNamePair kp; for (int i=0; i<model.getRowCount(); i++) { kp = (KeyNamePair)model.getValueAt(i, 4); if (kp.getKey()==M_Product_ID) { return(i); } } return(-1); } /** * Change Listener * @param e event */ public void valueChange (ValueChangeEvent e) { log.config(e.getPropertyName() + "=" + e.getNewValue()); // BPartner - load Order/Invoice/Shipment if (e.getPropertyName().equals("C_BPartner_ID")) { int C_BPartner_ID = ((Integer)e.getNewValue()).intValue(); initBPOrderDetails (C_BPartner_ID, true); } window.tableChanged(null); } // vetoableChange /************************************************************************** * Load BPartner Field * @param forInvoice true if Invoices are to be created, false receipts * @throws Exception if Lookups cannot be initialized */ protected void initBPartner (boolean forInvoice) throws Exception { // load BPartner int AD_Column_ID = 3499; // C_Invoice.C_BPartner_ID MLookup lookup = MLookupFactory.get (Env.getCtx(), p_WindowNo, 0, AD_Column_ID, DisplayType.Search); bPartnerField = new WSearchEditor ("C_BPartner_ID", true, false, true, lookup); // int C_BPartner_ID = Env.getContextAsInt(Env.getCtx(), p_WindowNo, "C_BPartner_ID"); bPartnerField.setValue(new Integer(C_BPartner_ID)); // initial loading initBPOrderDetails(C_BPartner_ID, forInvoice); } // initBPartner /** * Init Details - load invoices not shipped * @param C_BPartner_ID BPartner */ private void initBPInvoiceDetails(int C_BPartner_ID) { log.config("C_BPartner_ID" + C_BPartner_ID); // load Shipments (Receipts) - Completed, Closed invoiceField.removeActionListener(this); invoiceField.removeAllItems(); // None KeyNamePair pp = new KeyNamePair(0,""); invoiceField.addItem(pp); ArrayList<KeyNamePair> list = loadInvoiceData(C_BPartner_ID); for(KeyNamePair knp : list) invoiceField.addItem(knp); invoiceField.setSelectedIndex(0); invoiceField.addActionListener(this); upcField.addValueChangeListener(this); } /** * Load PBartner dependent Order/Invoice/Shipment Field. * @param C_BPartner_ID BPartner * @param forInvoice for invoice */ protected void initBPOrderDetails (int C_BPartner_ID, boolean forInvoice) { log.config("C_BPartner_ID=" + C_BPartner_ID); KeyNamePair pp = new KeyNamePair(0,""); // load PO Orders - Closed, Completed orderField.removeActionListener(this); orderField.removeAllItems(); orderField.addItem(pp); ArrayList<KeyNamePair> list = loadOrderData(C_BPartner_ID, forInvoice, sameWarehouseCb.isSelected()); for(KeyNamePair knp : list) orderField.addItem(knp); orderField.setSelectedIndex(0); orderField.addActionListener(this); initBPDetails(C_BPartner_ID); } // initBPartnerOIS public void initBPDetails(int C_BPartner_ID) { initBPInvoiceDetails(C_BPartner_ID); initBPRMADetails(C_BPartner_ID); } /** * Load RMA that are candidates for shipment * @param C_BPartner_ID BPartner */ private void initBPRMADetails(int C_BPartner_ID) { rmaField.removeActionListener(this); rmaField.removeAllItems(); // None KeyNamePair pp = new KeyNamePair(0,""); rmaField.addItem(pp); ArrayList<KeyNamePair> list = loadRMAData(C_BPartner_ID); for(KeyNamePair knp : list) rmaField.addItem(knp); rmaField.setSelectedIndex(0); rmaField.addActionListener(this); } /** * Load Data - Order * @param C_Order_ID Order * @param forInvoice true if for invoice vs. delivery qty */ /* protected void loadOrder (int C_Order_ID, boolean forInvoice) { loadTableOIS(getOrderData(C_Order_ID, forInvoice)); } // LoadOrder protected void loadRMA (int M_RMA_ID) { loadTableOIS(getRMAData(M_RMA_ID)); } protected void loadShipment (int M_InOut_ID) { loadTableOIS(getShipmentData(M_InOut_ID)); }*/ /** * Load Data - Order * @param C_Order_ID Order * @param forInvoice true if for invoice vs. delivery qty * @param M_Locator_ID */ protected void loadOrder (int C_Order_ID, boolean forInvoice, int M_Locator_ID) { loadTableOIS(getOrderData(C_Order_ID, forInvoice, M_Locator_ID)); } // LoadOrder /** * Load Data - RMA * @param M_RMA_ID RMA * @param M_Locator_ID */ protected void loadRMA (int M_RMA_ID, int M_Locator_ID) { loadTableOIS(getRMAData(M_RMA_ID, M_Locator_ID)); } /** * Load Data - Invoice * @param C_Invoice_ID Invoice * @param M_Locator_ID */ protected void loadInvoice (int C_Invoice_ID, int M_Locator_ID) { loadTableOIS(getInvoiceData(C_Invoice_ID, M_Locator_ID)); } /** * Load Order/Invoice/Shipment data into Table * @param data data */ protected void loadTableOIS (Vector<?> data) { window.getWListbox().clear(); // Remove previous listeners window.getWListbox().getModel().removeTableModelListener(window); // Set Model ListModelTable model = new ListModelTable(data); model.addTableModelListener(window); window.getWListbox().setData(model, getOISColumnNames()); // configureMiniTable(window.getWListbox()); } // loadOrder public void showWindow() { window.setVisible(true); } public void closeWindow() { window.dispose(); } }