diff --git a/base/src/org/compiere/model/CalloutOrder.java b/base/src/org/compiere/model/CalloutOrder.java index 36a1b2337b..43f3486476 100644 --- a/base/src/org/compiere/model/CalloutOrder.java +++ b/base/src/org/compiere/model/CalloutOrder.java @@ -3,103 +3,103 @@ * Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. * * 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. * - * For the text or an alternative of this public license, you may reach us * - * ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA * - * or via info@compiere.org or http://www.compiere.org/license.html * - *****************************************************************************/ -package org.compiere.model; - -import java.math.*; -import java.sql.*; -import java.util.*; -import java.util.logging.*; -import org.compiere.util.*; - -/** - * Order Callouts. - * - * @author Jorg Janke - * @version $Id: CalloutOrder.java,v 1.5 2006/10/08 06:57:33 comdivision Exp $ - */ -public class CalloutOrder extends CalloutEngine -{ - /** Debug Steps */ - private boolean steps = false; - - /** - * Order Header Change - DocType. - * - InvoiceRuld/DeliveryRule/PaymentRule - * - temporary Document - * Context: - * - DocSubTypeSO - * - HasCharges - * - (re-sets Business Partner info of required) - * - * @param ctx Context - * @param WindowNo current Window No - * @param mTab Model Tab - * @param mField Model Field - * @param value The new value - * @return Error message or "" - */ - public String docType (Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value) - { - Integer C_DocType_ID = (Integer)value; // Actually C_DocTypeTarget_ID - if (C_DocType_ID == null || C_DocType_ID.intValue() == 0) - return ""; - - // Re-Create new DocNo, if there is a doc number already - // and the existing source used a different Sequence number - String oldDocNo = (String)mTab.getValue("DocumentNo"); - boolean newDocNo = (oldDocNo == null); - if (!newDocNo && oldDocNo.startsWith("<") && oldDocNo.endsWith(">")) - newDocNo = true; - Integer oldC_DocType_ID = (Integer)mTab.getValue("C_DocType_ID"); - - String sql = "SELECT d.DocSubTypeSO,d.HasCharges,'N'," // 1..3 - + "d.IsDocNoControlled,s.CurrentNext,s.CurrentNextSys," // 4..6 - + "s.AD_Sequence_ID,d.IsSOTrx " // 7..8 - + "FROM C_DocType d, AD_Sequence s " - + "WHERE C_DocType_ID=?" // #1 - + " AND d.DocNoSequence_ID=s.AD_Sequence_ID(+)"; - try - { - int AD_Sequence_ID = 0; - - // Get old AD_SeqNo for comparison - if (!newDocNo && oldC_DocType_ID.intValue() != 0) - { - PreparedStatement pstmt = DB.prepareStatement(sql, null); - pstmt.setInt(1, oldC_DocType_ID.intValue()); - ResultSet rs = pstmt.executeQuery(); - if (rs.next()) - AD_Sequence_ID = rs.getInt(6); - rs.close(); - pstmt.close(); - } - - PreparedStatement pstmt = DB.prepareStatement(sql, null); - pstmt.setInt(1, C_DocType_ID.intValue()); - ResultSet rs = pstmt.executeQuery(); - String DocSubTypeSO = ""; - boolean IsSOTrx = true; - if (rs.next()) // we found document type - { - // Set Context: Document Sub Type for Sales Orders - DocSubTypeSO = rs.getString(1); - if (DocSubTypeSO == null) - DocSubTypeSO = "--"; - Env.setContext(ctx, WindowNo, "OrderType", DocSubTypeSO); - // No Drop Ship other than Standard - if (!DocSubTypeSO.equals(MOrder.DocSubTypeSO_Standard)) - mTab.setValue ("IsDropShip", "N"); + * 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. * + * For the text or an alternative of this public license, you may reach us * + * ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA * + * or via info@compiere.org or http://www.compiere.org/license.html * + *****************************************************************************/ +package org.compiere.model; + +import java.math.*; +import java.sql.*; +import java.util.*; +import java.util.logging.*; +import org.compiere.util.*; + +/** + * Order Callouts. + * + * @author Jorg Janke + * @version $Id: CalloutOrder.java,v 1.5 2006/10/08 06:57:33 comdivision Exp $ + */ +public class CalloutOrder extends CalloutEngine +{ + /** Debug Steps */ + private boolean steps = false; + + /** + * Order Header Change - DocType. + * - InvoiceRuld/DeliveryRule/PaymentRule + * - temporary Document + * Context: + * - DocSubTypeSO + * - HasCharges + * - (re-sets Business Partner info of required) + * + * @param ctx Context + * @param WindowNo current Window No + * @param mTab Model Tab + * @param mField Model Field + * @param value The new value + * @return Error message or "" + */ + public String docType (Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value) + { + Integer C_DocType_ID = (Integer)value; // Actually C_DocTypeTarget_ID + if (C_DocType_ID == null || C_DocType_ID.intValue() == 0) + return ""; + + // Re-Create new DocNo, if there is a doc number already + // and the existing source used a different Sequence number + String oldDocNo = (String)mTab.getValue("DocumentNo"); + boolean newDocNo = (oldDocNo == null); + if (!newDocNo && oldDocNo.startsWith("<") && oldDocNo.endsWith(">")) + newDocNo = true; + Integer oldC_DocType_ID = (Integer)mTab.getValue("C_DocType_ID"); + + String sql = "SELECT d.DocSubTypeSO,d.HasCharges,'N'," // 1..3 + + "d.IsDocNoControlled,s.CurrentNext,s.CurrentNextSys," // 4..6 + + "s.AD_Sequence_ID,d.IsSOTrx " // 7..8 + + "FROM C_DocType d, AD_Sequence s " + + "WHERE C_DocType_ID=?" // #1 + + " AND d.DocNoSequence_ID=s.AD_Sequence_ID(+)"; + try + { + int AD_Sequence_ID = 0; + + // Get old AD_SeqNo for comparison + if (!newDocNo && oldC_DocType_ID.intValue() != 0) + { + PreparedStatement pstmt = DB.prepareStatement(sql, null); + pstmt.setInt(1, oldC_DocType_ID.intValue()); + ResultSet rs = pstmt.executeQuery(); + if (rs.next()) + AD_Sequence_ID = rs.getInt(6); + rs.close(); + pstmt.close(); + } + + PreparedStatement pstmt = DB.prepareStatement(sql, null); + pstmt.setInt(1, C_DocType_ID.intValue()); + ResultSet rs = pstmt.executeQuery(); + String DocSubTypeSO = ""; + boolean IsSOTrx = true; + if (rs.next()) // we found document type + { + // Set Context: Document Sub Type for Sales Orders + DocSubTypeSO = rs.getString(1); + if (DocSubTypeSO == null) + DocSubTypeSO = "--"; + Env.setContext(ctx, WindowNo, "OrderType", DocSubTypeSO); + // No Drop Ship other than Standard + if (!DocSubTypeSO.equals(MOrder.DocSubTypeSO_Standard)) + mTab.setValue ("IsDropShip", "N"); // Delivery Rule if (DocSubTypeSO.equals(MOrder.DocSubTypeSO_POS)) @@ -125,13 +125,13 @@ public class CalloutOrder extends CalloutEngine // IsSOTrx if ("N".equals(rs.getString(8))) - IsSOTrx = false; - - // Set Context: - Env.setContext(ctx, WindowNo, "HasCharges", rs.getString(2)); - // DocumentNo - if (rs.getString(4).equals("Y")) // IsDocNoControlled - { + IsSOTrx = false; + + // Set Context: + Env.setContext(ctx, WindowNo, "HasCharges", rs.getString(2)); + // DocumentNo + if (rs.getString(4).equals("Y")) // IsDocNoControlled + { if (!newDocNo && AD_Sequence_ID != rs.getInt(7)) newDocNo = true; if (newDocNo) @@ -139,175 +139,183 @@ public class CalloutOrder extends CalloutEngine mTab.setValue("DocumentNo", "<" + rs.getString(6) + ">"); else mTab.setValue("DocumentNo", "<" + rs.getString(5) + ">"); - } - } - rs.close(); - pstmt.close(); - // When BPartner is changed, the Rules are not set if - // it is a POS or Credit Order (i.e. defaults from Standard BPartner) - // This re-reads the Rules and applies them. - if (DocSubTypeSO.equals(MOrder.DocSubTypeSO_POS) - || DocSubTypeSO.equals(MOrder.DocSubTypeSO_Prepay)) // not for POS/PrePay - ; - else - { - sql = "SELECT PaymentRule,C_PaymentTerm_ID," // 1..2 - + "InvoiceRule,DeliveryRule," // 3..4 - + "FreightCostRule,DeliveryViaRule, " // 5..6 - + "PaymentRulePO,PO_PaymentTerm_ID " - + "FROM C_BPartner " - + "WHERE C_BPartner_ID=?"; // #1 - pstmt = DB.prepareStatement(sql, null); - int C_BPartner_ID = Env.getContextAsInt(ctx, WindowNo, "C_BPartner_ID"); - pstmt.setInt(1, C_BPartner_ID); - // - rs = pstmt.executeQuery(); - if (rs.next()) - { - // PaymentRule - String s = rs.getString(IsSOTrx ? "PaymentRule" : "PaymentRulePO"); - if (s != null && s.length() != 0) - { - if (IsSOTrx && (s.equals("B") || s.equals("S") || s.equals("U"))) // No Cash/Check/Transfer for SO_Trx - s = "P"; // Payment Term - if (!IsSOTrx && (s.equals("B"))) // No Cash for PO_Trx - s = "P"; // Payment Term - mTab.setValue("PaymentRule", s); - } - // Payment Term - Integer ii =new Integer(rs.getInt(IsSOTrx ? "C_PaymentTerm_ID" : "PO_PaymentTerm_ID")); - if (!rs.wasNull()) - mTab.setValue("C_PaymentTerm_ID", ii); - // InvoiceRule - s = rs.getString(3); - if (s != null && s.length() != 0) - mTab.setValue("InvoiceRule", s); - // DeliveryRule - s = rs.getString(4); - if (s != null && s.length() != 0) - mTab.setValue("DeliveryRule", s); - // FreightCostRule - s = rs.getString(5); - if (s != null && s.length() != 0) - mTab.setValue("FreightCostRule", s); - // DeliveryViaRule - s = rs.getString(6); - if (s != null && s.length() != 0) - mTab.setValue("DeliveryViaRule", s); - } - rs.close(); - pstmt.close(); - } // re-read customer rules - } - catch (SQLException e) - { - log.log(Level.SEVERE, sql, e); - return e.getLocalizedMessage(); - } - - return ""; - } // docType - - - /** - * Order Header - BPartner. - * - M_PriceList_ID (+ Context) - * - C_BPartner_Location_ID - * - Bill_BPartner_ID/Bill_Location_ID - * - AD_User_ID - * - POReference - * - SO_Description - * - IsDiscountPrinted - * - InvoiceRule/DeliveryRule/PaymentRule/FreightCost/DeliveryViaRule - * - C_PaymentTerm_ID - * @param ctx Context - * @param WindowNo current Window No - * @param mTab Model Tab - * @param mField Model Field - * @param value The new value - * @return Error message or "" - */ - public String bPartner (Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value) - { - Integer C_BPartner_ID = (Integer)value; - if (C_BPartner_ID == null || C_BPartner_ID.intValue() == 0) - return ""; - setCalloutActive(true); - - String sql = "SELECT p.AD_Language,p.C_PaymentTerm_ID," - + " COALESCE(p.M_PriceList_ID,g.M_PriceList_ID) AS M_PriceList_ID, p.PaymentRule,p.POReference," - + " p.SO_Description,p.IsDiscountPrinted," - + " p.InvoiceRule,p.DeliveryRule,p.FreightCostRule,DeliveryViaRule," - + " p.SO_CreditLimit, p.SO_CreditLimit-p.SO_CreditUsed AS CreditAvailable," - + " lship.C_BPartner_Location_ID,c.AD_User_ID," - + " COALESCE(p.PO_PriceList_ID,g.PO_PriceList_ID) AS PO_PriceList_ID, p.PaymentRulePO,p.PO_PaymentTerm_ID," - + " lbill.C_BPartner_Location_ID AS Bill_Location_ID, p.SOCreditStatus " - + "FROM C_BPartner p" - + " INNER JOIN C_BP_Group g ON (p.C_BP_Group_ID=g.C_BP_Group_ID)" - + " LEFT OUTER JOIN C_BPartner_Location lbill ON (p.C_BPartner_ID=lbill.C_BPartner_ID AND lbill.IsBillTo='Y' AND lbill.IsActive='Y')" - + " LEFT OUTER JOIN C_BPartner_Location lship ON (p.C_BPartner_ID=lship.C_BPartner_ID AND lship.IsShipTo='Y' AND lship.IsActive='Y')" - + " LEFT OUTER JOIN AD_User c ON (p.C_BPartner_ID=c.C_BPartner_ID) " - + "WHERE p.C_BPartner_ID=? AND p.IsActive='Y'"; // #1 - - boolean IsSOTrx = "Y".equals(Env.getContext(ctx, WindowNo, "IsSOTrx")); - - try - { - PreparedStatement pstmt = DB.prepareStatement(sql, null); - pstmt.setInt(1, C_BPartner_ID.intValue()); - ResultSet rs = pstmt.executeQuery(); - if (rs.next()) - { - // PriceList (indirect: IsTaxIncluded & Currency) - Integer ii = new Integer(rs.getInt(IsSOTrx ? "M_PriceList_ID" : "PO_PriceList_ID")); - if (!rs.wasNull()) - mTab.setValue("M_PriceList_ID", ii); - else - { // get default PriceList - int i = Env.getContextAsInt(ctx, "#M_PriceList_ID"); - if (i != 0) - mTab.setValue("M_PriceList_ID", new Integer(i)); - } - - // Bill-To - mTab.setValue("Bill_BPartner_ID", C_BPartner_ID); - int bill_Location_ID = rs.getInt("Bill_Location_ID"); - if (bill_Location_ID == 0) - mTab.setValue("Bill_Location_ID", null); - else - mTab.setValue("Bill_Location_ID", new Integer(bill_Location_ID)); - // Ship-To Location - int shipTo_ID = rs.getInt("C_BPartner_Location_ID"); - // overwritten by InfoBP selection - works only if InfoWindow - // was used otherwise creates error (uses last value, may belong to differnt BP) - if (C_BPartner_ID.toString().equals(Env.getContext(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "C_BPartner_ID"))) - { - String loc = Env.getContext(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "C_BPartner_Location_ID"); - if (loc.length() > 0) - shipTo_ID = Integer.parseInt(loc); - } - if (shipTo_ID == 0) - mTab.setValue("C_BPartner_Location_ID", null); - else - mTab.setValue("C_BPartner_Location_ID", new Integer(shipTo_ID)); - - // Contact - overwritten by InfoBP selection - int contID = rs.getInt("AD_User_ID"); - if (C_BPartner_ID.toString().equals(Env.getContext(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "C_BPartner_ID"))) - { - String cont = Env.getContext(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "AD_User_ID"); - if (cont.length() > 0) - contID = Integer.parseInt(cont); - } - if (contID == 0) - mTab.setValue("AD_User_ID", null); - else - { - mTab.setValue("AD_User_ID", new Integer(contID)); - mTab.setValue("Bill_User_ID", new Integer(contID)); - } - - // CreditAvailable + } + } + rs.close(); + pstmt.close(); + // When BPartner is changed, the Rules are not set if + // it is a POS or Credit Order (i.e. defaults from Standard BPartner) + // This re-reads the Rules and applies them. + if (DocSubTypeSO.equals(MOrder.DocSubTypeSO_POS) + || DocSubTypeSO.equals(MOrder.DocSubTypeSO_Prepay)) // not for POS/PrePay + ; + else + { + sql = "SELECT PaymentRule,C_PaymentTerm_ID," // 1..2 + + "InvoiceRule,DeliveryRule," // 3..4 + + "FreightCostRule,DeliveryViaRule, " // 5..6 + + "PaymentRulePO,PO_PaymentTerm_ID " + + "FROM C_BPartner " + + "WHERE C_BPartner_ID=?"; // #1 + pstmt = DB.prepareStatement(sql, null); + int C_BPartner_ID = Env.getContextAsInt(ctx, WindowNo, "C_BPartner_ID"); + pstmt.setInt(1, C_BPartner_ID); + // + rs = pstmt.executeQuery(); + if (rs.next()) + { + // PaymentRule + String s = rs.getString(IsSOTrx ? "PaymentRule" : "PaymentRulePO"); + if (s != null && s.length() != 0) + { + if (IsSOTrx && (s.equals("B") || s.equals("S") || s.equals("U"))) // No Cash/Check/Transfer for SO_Trx + s = "P"; // Payment Term + if (!IsSOTrx && (s.equals("B"))) // No Cash for PO_Trx + s = "P"; // Payment Term + mTab.setValue("PaymentRule", s); + } + // Payment Term + Integer ii =new Integer(rs.getInt(IsSOTrx ? "C_PaymentTerm_ID" : "PO_PaymentTerm_ID")); + if (!rs.wasNull()) + mTab.setValue("C_PaymentTerm_ID", ii); + // InvoiceRule + s = rs.getString(3); + if (s != null && s.length() != 0) + mTab.setValue("InvoiceRule", s); + // DeliveryRule + s = rs.getString(4); + if (s != null && s.length() != 0) + mTab.setValue("DeliveryRule", s); + // FreightCostRule + s = rs.getString(5); + if (s != null && s.length() != 0) + mTab.setValue("FreightCostRule", s); + // DeliveryViaRule + s = rs.getString(6); + if (s != null && s.length() != 0) + mTab.setValue("DeliveryViaRule", s); + } + rs.close(); + pstmt.close(); + } // re-read customer rules + } + catch (SQLException e) + { + log.log(Level.SEVERE, sql, e); + return e.getLocalizedMessage(); + } + + return ""; + } // docType + + + /** + * Order Header - BPartner. + * - M_PriceList_ID (+ Context) + * - C_BPartner_Location_ID + * - Bill_BPartner_ID/Bill_Location_ID + * - AD_User_ID + * - POReference + * - SO_Description + * - IsDiscountPrinted + * - InvoiceRule/DeliveryRule/PaymentRule/FreightCost/DeliveryViaRule + * - C_PaymentTerm_ID + * @param ctx Context + * @param WindowNo current Window No + * @param mTab Model Tab + * @param mField Model Field + * @param value The new value + * @return Error message or "" + */ + public String bPartner (Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value) + { + Integer C_BPartner_ID = (Integer)value; + if (C_BPartner_ID == null || C_BPartner_ID.intValue() == 0) + return ""; + setCalloutActive(true); + + String sql = "SELECT p.AD_Language,p.C_PaymentTerm_ID," + + " COALESCE(p.M_PriceList_ID,g.M_PriceList_ID) AS M_PriceList_ID, p.PaymentRule,p.POReference," + + " p.SO_Description,p.IsDiscountPrinted," + + " p.InvoiceRule,p.DeliveryRule,p.FreightCostRule,DeliveryViaRule," + + " p.SO_CreditLimit, p.SO_CreditLimit-p.SO_CreditUsed AS CreditAvailable," + + " lship.C_BPartner_Location_ID,c.AD_User_ID," + + " COALESCE(p.PO_PriceList_ID,g.PO_PriceList_ID) AS PO_PriceList_ID, p.PaymentRulePO,p.PO_PaymentTerm_ID," + + " lbill.C_BPartner_Location_ID AS Bill_Location_ID, p.SOCreditStatus, " + + " p.SalesRep_ID " + + "FROM C_BPartner p" + + " INNER JOIN C_BP_Group g ON (p.C_BP_Group_ID=g.C_BP_Group_ID)" + + " LEFT OUTER JOIN C_BPartner_Location lbill ON (p.C_BPartner_ID=lbill.C_BPartner_ID AND lbill.IsBillTo='Y' AND lbill.IsActive='Y')" + + " LEFT OUTER JOIN C_BPartner_Location lship ON (p.C_BPartner_ID=lship.C_BPartner_ID AND lship.IsShipTo='Y' AND lship.IsActive='Y')" + + " LEFT OUTER JOIN AD_User c ON (p.C_BPartner_ID=c.C_BPartner_ID) " + + "WHERE p.C_BPartner_ID=? AND p.IsActive='Y'"; // #1 + + boolean IsSOTrx = "Y".equals(Env.getContext(ctx, WindowNo, "IsSOTrx")); + + try + { + PreparedStatement pstmt = DB.prepareStatement(sql, null); + pstmt.setInt(1, C_BPartner_ID.intValue()); + ResultSet rs = pstmt.executeQuery(); + if (rs.next()) + { + // Sales Rep - If BP has a default SalesRep then default it + Integer salesRep = rs.getInt("SalesRep_ID"); + if (IsSOTrx && salesRep != 0 ) + { + mTab.setValue("SalesRep_ID", salesRep); + } + + // PriceList (indirect: IsTaxIncluded & Currency) + Integer ii = new Integer(rs.getInt(IsSOTrx ? "M_PriceList_ID" : "PO_PriceList_ID")); + if (!rs.wasNull()) + mTab.setValue("M_PriceList_ID", ii); + else + { // get default PriceList + int i = Env.getContextAsInt(ctx, "#M_PriceList_ID"); + if (i != 0) + mTab.setValue("M_PriceList_ID", new Integer(i)); + } + + // Bill-To + mTab.setValue("Bill_BPartner_ID", C_BPartner_ID); + int bill_Location_ID = rs.getInt("Bill_Location_ID"); + if (bill_Location_ID == 0) + mTab.setValue("Bill_Location_ID", null); + else + mTab.setValue("Bill_Location_ID", new Integer(bill_Location_ID)); + // Ship-To Location + int shipTo_ID = rs.getInt("C_BPartner_Location_ID"); + // overwritten by InfoBP selection - works only if InfoWindow + // was used otherwise creates error (uses last value, may belong to differnt BP) + if (C_BPartner_ID.toString().equals(Env.getContext(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "C_BPartner_ID"))) + { + String loc = Env.getContext(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "C_BPartner_Location_ID"); + if (loc.length() > 0) + shipTo_ID = Integer.parseInt(loc); + } + if (shipTo_ID == 0) + mTab.setValue("C_BPartner_Location_ID", null); + else + mTab.setValue("C_BPartner_Location_ID", new Integer(shipTo_ID)); + + // Contact - overwritten by InfoBP selection + int contID = rs.getInt("AD_User_ID"); + if (C_BPartner_ID.toString().equals(Env.getContext(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "C_BPartner_ID"))) + { + String cont = Env.getContext(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "AD_User_ID"); + if (cont.length() > 0) + contID = Integer.parseInt(cont); + } + if (contID == 0) + mTab.setValue("AD_User_ID", null); + else + { + mTab.setValue("AD_User_ID", new Integer(contID)); + mTab.setValue("Bill_User_ID", new Integer(contID)); + } + + // CreditAvailable if (IsSOTrx) { double CreditLimit = rs.getDouble("SO_CreditLimit"); @@ -315,32 +323,32 @@ public class CalloutOrder extends CalloutEngine if (CreditLimit != 0) { double CreditAvailable = rs.getDouble("CreditAvailable"); - if (!rs.wasNull() && CreditAvailable < 0) - mTab.fireDataStatusEEvent("CreditLimitOver", - DisplayType.getNumberFormat(DisplayType.Amount).format(CreditAvailable), - false); - } - } - - // PO Reference - String s = rs.getString("POReference"); - if (s != null && s.length() != 0) - mTab.setValue("POReference", s); - // should not be reset to null if we entered already value! VHARCQ, accepted YS makes sense that way - // TODO: should get checked and removed if no longer needed! - /*else - mTab.setValue("POReference", null);*/ - - // SO Description - s = rs.getString("SO_Description"); - if (s != null && s.trim().length() != 0) - mTab.setValue("Description", s); - // IsDiscountPrinted - s = rs.getString("IsDiscountPrinted"); - if (s != null && s.length() != 0) - mTab.setValue("IsDiscountPrinted", s); - else - mTab.setValue("IsDiscountPrinted", "N"); + if (!rs.wasNull() && CreditAvailable < 0) + mTab.fireDataStatusEEvent("CreditLimitOver", + DisplayType.getNumberFormat(DisplayType.Amount).format(CreditAvailable), + false); + } + } + + // PO Reference + String s = rs.getString("POReference"); + if (s != null && s.length() != 0) + mTab.setValue("POReference", s); + // should not be reset to null if we entered already value! VHARCQ, accepted YS makes sense that way + // TODO: should get checked and removed if no longer needed! + /*else + mTab.setValue("POReference", null);*/ + + // SO Description + s = rs.getString("SO_Description"); + if (s != null && s.trim().length() != 0) + mTab.setValue("Description", s); + // IsDiscountPrinted + s = rs.getString("IsDiscountPrinted"); + if (s != null && s.length() != 0) + mTab.setValue("IsDiscountPrinted", s); + else + mTab.setValue("IsDiscountPrinted", "N"); // Defaults, if not Walkin Receipt or Walkin Invoice String OrderType = Env.getContext(ctx, WindowNo, "OrderType"); @@ -357,165 +365,165 @@ public class CalloutOrder extends CalloutEngine else { // PaymentRule - s = rs.getString(IsSOTrx ? "PaymentRule" : "PaymentRulePO"); - if (s != null && s.length() != 0) - { - if (s.equals("B")) // No Cache in Non POS - s = "P"; - if (IsSOTrx && (s.equals("S") || s.equals("U"))) // No Check/Transfer for SO_Trx - s = "P"; // Payment Term - mTab.setValue("PaymentRule", s); - } - // Payment Term - ii = new Integer(rs.getInt(IsSOTrx ? "C_PaymentTerm_ID" : "PO_PaymentTerm_ID")); - if (!rs.wasNull()) - mTab.setValue("C_PaymentTerm_ID", ii); - // InvoiceRule - s = rs.getString("InvoiceRule"); - if (s != null && s.length() != 0) - mTab.setValue("InvoiceRule", s); - // DeliveryRule - s = rs.getString("DeliveryRule"); - if (s != null && s.length() != 0) - mTab.setValue("DeliveryRule", s); - // FreightCostRule - s = rs.getString("FreightCostRule"); - if (s != null && s.length() != 0) - mTab.setValue("FreightCostRule", s); - // DeliveryViaRule - s = rs.getString("DeliveryViaRule"); - if (s != null && s.length() != 0) - mTab.setValue("DeliveryViaRule", s); - } - } - rs.close(); - pstmt.close(); - } - catch (SQLException e) - { - log.log(Level.SEVERE, sql, e); - setCalloutActive(false); - return e.getLocalizedMessage(); - } - setCalloutActive(false); - return ""; - } // bPartner - - /** - * Order Header - Invoice BPartner. - * - M_PriceList_ID (+ Context) - * - Bill_Location_ID - * - Bill_User_ID - * - POReference - * - SO_Description - * - IsDiscountPrinted - * - InvoiceRule/PaymentRule - * - C_PaymentTerm_ID - * @param ctx Context - * @param WindowNo current Window No - * @param mTab Model Tab - * @param mField Model Field - * @param value The new value - * @return Error message or "" - */ - public String bPartnerBill (Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value) - { - if (isCalloutActive()) - return ""; - Integer bill_BPartner_ID = (Integer)value; - if (bill_BPartner_ID == null || bill_BPartner_ID.intValue() == 0) - return ""; - - String sql = "SELECT p.AD_Language,p.C_PaymentTerm_ID," - + "p.M_PriceList_ID,p.PaymentRule,p.POReference," - + "p.SO_Description,p.IsDiscountPrinted," - + "p.InvoiceRule,p.DeliveryRule,p.FreightCostRule,DeliveryViaRule," - + "p.SO_CreditLimit, p.SO_CreditLimit-p.SO_CreditUsed AS CreditAvailable," - + "c.AD_User_ID," - + "p.PO_PriceList_ID, p.PaymentRulePO, p.PO_PaymentTerm_ID," - + "lbill.C_BPartner_Location_ID AS Bill_Location_ID " - + "FROM C_BPartner p" - + " LEFT OUTER JOIN C_BPartner_Location lbill ON (p.C_BPartner_ID=lbill.C_BPartner_ID AND lbill.IsBillTo='Y' AND lbill.IsActive='Y')" - + " LEFT OUTER JOIN AD_User c ON (p.C_BPartner_ID=c.C_BPartner_ID) " - + "WHERE p.C_BPartner_ID=? AND p.IsActive='Y'"; // #1 - - boolean IsSOTrx = "Y".equals(Env.getContext(ctx, WindowNo, "IsSOTrx")); - - try - { - PreparedStatement pstmt = DB.prepareStatement(sql, null); - pstmt.setInt(1, bill_BPartner_ID.intValue()); - ResultSet rs = pstmt.executeQuery(); - if (rs.next()) - { - // PriceList (indirect: IsTaxIncluded & Currency) - Integer ii = new Integer(rs.getInt(IsSOTrx ? "M_PriceList_ID" : "PO_PriceList_ID")); - if (!rs.wasNull()) - mTab.setValue("M_PriceList_ID", ii); - else - { // get default PriceList - int i = Env.getContextAsInt(ctx, "#M_PriceList_ID"); - if (i != 0) - mTab.setValue("M_PriceList_ID", new Integer(i)); - } - - int bill_Location_ID = rs.getInt("Bill_Location_ID"); - // overwritten by InfoBP selection - works only if InfoWindow - // was used otherwise creates error (uses last value, may belong to differnt BP) - if (bill_BPartner_ID.toString().equals(Env.getContext(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "C_BPartner_ID"))) - { - String loc = Env.getContext(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "C_BPartner_Location_ID"); - if (loc.length() > 0) - bill_Location_ID = Integer.parseInt(loc); - } - if (bill_Location_ID == 0) - mTab.setValue("Bill_Location_ID", null); - else - mTab.setValue("Bill_Location_ID", new Integer(bill_Location_ID)); - - // Contact - overwritten by InfoBP selection - int contID = rs.getInt("AD_User_ID"); - if (bill_BPartner_ID.toString().equals(Env.getContext(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "C_BPartner_ID"))) - { - String cont = Env.getContext(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "AD_User_ID"); - if (cont.length() > 0) - contID = Integer.parseInt(cont); - } - if (contID == 0) - mTab.setValue("Bill_User_ID", null); - else - mTab.setValue("Bill_User_ID", new Integer(contID)); - - // CreditAvailable - if (IsSOTrx) - { - double CreditLimit = rs.getDouble("SO_CreditLimit"); - if (CreditLimit != 0) - { - double CreditAvailable = rs.getDouble("CreditAvailable"); - if (!rs.wasNull() && CreditAvailable < 0) - mTab.fireDataStatusEEvent("CreditLimitOver", - DisplayType.getNumberFormat(DisplayType.Amount).format(CreditAvailable), - false); - } - } - - // PO Reference - String s = rs.getString("POReference"); - if (s != null && s.length() != 0) - mTab.setValue("POReference", s); - else - mTab.setValue("POReference", null); - // SO Description - s = rs.getString("SO_Description"); - if (s != null && s.trim().length() != 0) - mTab.setValue("Description", s); - // IsDiscountPrinted - s = rs.getString("IsDiscountPrinted"); - if (s != null && s.length() != 0) - mTab.setValue("IsDiscountPrinted", s); - else - mTab.setValue("IsDiscountPrinted", "N"); + s = rs.getString(IsSOTrx ? "PaymentRule" : "PaymentRulePO"); + if (s != null && s.length() != 0) + { + if (s.equals("B")) // No Cache in Non POS + s = "P"; + if (IsSOTrx && (s.equals("S") || s.equals("U"))) // No Check/Transfer for SO_Trx + s = "P"; // Payment Term + mTab.setValue("PaymentRule", s); + } + // Payment Term + ii = new Integer(rs.getInt(IsSOTrx ? "C_PaymentTerm_ID" : "PO_PaymentTerm_ID")); + if (!rs.wasNull()) + mTab.setValue("C_PaymentTerm_ID", ii); + // InvoiceRule + s = rs.getString("InvoiceRule"); + if (s != null && s.length() != 0) + mTab.setValue("InvoiceRule", s); + // DeliveryRule + s = rs.getString("DeliveryRule"); + if (s != null && s.length() != 0) + mTab.setValue("DeliveryRule", s); + // FreightCostRule + s = rs.getString("FreightCostRule"); + if (s != null && s.length() != 0) + mTab.setValue("FreightCostRule", s); + // DeliveryViaRule + s = rs.getString("DeliveryViaRule"); + if (s != null && s.length() != 0) + mTab.setValue("DeliveryViaRule", s); + } + } + rs.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, sql, e); + setCalloutActive(false); + return e.getLocalizedMessage(); + } + setCalloutActive(false); + return ""; + } // bPartner + + /** + * Order Header - Invoice BPartner. + * - M_PriceList_ID (+ Context) + * - Bill_Location_ID + * - Bill_User_ID + * - POReference + * - SO_Description + * - IsDiscountPrinted + * - InvoiceRule/PaymentRule + * - C_PaymentTerm_ID + * @param ctx Context + * @param WindowNo current Window No + * @param mTab Model Tab + * @param mField Model Field + * @param value The new value + * @return Error message or "" + */ + public String bPartnerBill (Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value) + { + if (isCalloutActive()) + return ""; + Integer bill_BPartner_ID = (Integer)value; + if (bill_BPartner_ID == null || bill_BPartner_ID.intValue() == 0) + return ""; + + String sql = "SELECT p.AD_Language,p.C_PaymentTerm_ID," + + "p.M_PriceList_ID,p.PaymentRule,p.POReference," + + "p.SO_Description,p.IsDiscountPrinted," + + "p.InvoiceRule,p.DeliveryRule,p.FreightCostRule,DeliveryViaRule," + + "p.SO_CreditLimit, p.SO_CreditLimit-p.SO_CreditUsed AS CreditAvailable," + + "c.AD_User_ID," + + "p.PO_PriceList_ID, p.PaymentRulePO, p.PO_PaymentTerm_ID," + + "lbill.C_BPartner_Location_ID AS Bill_Location_ID " + + "FROM C_BPartner p" + + " LEFT OUTER JOIN C_BPartner_Location lbill ON (p.C_BPartner_ID=lbill.C_BPartner_ID AND lbill.IsBillTo='Y' AND lbill.IsActive='Y')" + + " LEFT OUTER JOIN AD_User c ON (p.C_BPartner_ID=c.C_BPartner_ID) " + + "WHERE p.C_BPartner_ID=? AND p.IsActive='Y'"; // #1 + + boolean IsSOTrx = "Y".equals(Env.getContext(ctx, WindowNo, "IsSOTrx")); + + try + { + PreparedStatement pstmt = DB.prepareStatement(sql, null); + pstmt.setInt(1, bill_BPartner_ID.intValue()); + ResultSet rs = pstmt.executeQuery(); + if (rs.next()) + { + // PriceList (indirect: IsTaxIncluded & Currency) + Integer ii = new Integer(rs.getInt(IsSOTrx ? "M_PriceList_ID" : "PO_PriceList_ID")); + if (!rs.wasNull()) + mTab.setValue("M_PriceList_ID", ii); + else + { // get default PriceList + int i = Env.getContextAsInt(ctx, "#M_PriceList_ID"); + if (i != 0) + mTab.setValue("M_PriceList_ID", new Integer(i)); + } + + int bill_Location_ID = rs.getInt("Bill_Location_ID"); + // overwritten by InfoBP selection - works only if InfoWindow + // was used otherwise creates error (uses last value, may belong to differnt BP) + if (bill_BPartner_ID.toString().equals(Env.getContext(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "C_BPartner_ID"))) + { + String loc = Env.getContext(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "C_BPartner_Location_ID"); + if (loc.length() > 0) + bill_Location_ID = Integer.parseInt(loc); + } + if (bill_Location_ID == 0) + mTab.setValue("Bill_Location_ID", null); + else + mTab.setValue("Bill_Location_ID", new Integer(bill_Location_ID)); + + // Contact - overwritten by InfoBP selection + int contID = rs.getInt("AD_User_ID"); + if (bill_BPartner_ID.toString().equals(Env.getContext(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "C_BPartner_ID"))) + { + String cont = Env.getContext(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "AD_User_ID"); + if (cont.length() > 0) + contID = Integer.parseInt(cont); + } + if (contID == 0) + mTab.setValue("Bill_User_ID", null); + else + mTab.setValue("Bill_User_ID", new Integer(contID)); + + // CreditAvailable + if (IsSOTrx) + { + double CreditLimit = rs.getDouble("SO_CreditLimit"); + if (CreditLimit != 0) + { + double CreditAvailable = rs.getDouble("CreditAvailable"); + if (!rs.wasNull() && CreditAvailable < 0) + mTab.fireDataStatusEEvent("CreditLimitOver", + DisplayType.getNumberFormat(DisplayType.Amount).format(CreditAvailable), + false); + } + } + + // PO Reference + String s = rs.getString("POReference"); + if (s != null && s.length() != 0) + mTab.setValue("POReference", s); + else + mTab.setValue("POReference", null); + // SO Description + s = rs.getString("SO_Description"); + if (s != null && s.trim().length() != 0) + mTab.setValue("Description", s); + // IsDiscountPrinted + s = rs.getString("IsDiscountPrinted"); + if (s != null && s.length() != 0) + mTab.setValue("IsDiscountPrinted", s); + else + mTab.setValue("IsDiscountPrinted", "N"); // Defaults, if not Walkin Receipt or Walkin Invoice String OrderType = Env.getContext(ctx, WindowNo, "OrderType"); @@ -528,139 +536,139 @@ public class CalloutOrder extends CalloutEngine else { // PaymentRule - s = rs.getString(IsSOTrx ? "PaymentRule" : "PaymentRulePO"); - if (s != null && s.length() != 0) - { - if (s.equals("B")) // No Cache in Non POS - s = "P"; - if (IsSOTrx && (s.equals("S") || s.equals("U"))) // No Check/Transfer for SO_Trx - s = "P"; // Payment Term - mTab.setValue("PaymentRule", s); - } - // Payment Term - ii = new Integer(rs.getInt(IsSOTrx ? "C_PaymentTerm_ID" : "PO_PaymentTerm_ID")); - if (!rs.wasNull()) - mTab.setValue("C_PaymentTerm_ID", ii); - // InvoiceRule - s = rs.getString("InvoiceRule"); - if (s != null && s.length() != 0) - mTab.setValue("InvoiceRule", s); - } - } - rs.close(); - pstmt.close(); - } - catch (SQLException e) - { - log.log(Level.SEVERE, "bPartnerBill", e); - return e.getLocalizedMessage(); - } - - return ""; - } // bPartnerBill - - - /** - * Order Header - PriceList. - * (used also in Invoice) - * - C_Currency_ID - * - IsTaxIncluded - * Window Context: - * - EnforcePriceLimit - * - StdPrecision - * - M_PriceList_Version_ID - * @param ctx context - * @param WindowNo current Window No - * @param mTab Grid Tab - * @param mField Grid Field - * @param value New Value - * @return null or error message - */ - public String priceList (Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value) - { - Integer M_PriceList_ID = (Integer)value; - if (M_PriceList_ID == null || M_PriceList_ID.intValue()== 0) - return ""; - if (steps) log.warning("init"); - - String sql = "SELECT pl.IsTaxIncluded,pl.EnforcePriceLimit,pl.C_Currency_ID,c.StdPrecision," - + "plv.M_PriceList_Version_ID,plv.ValidFrom " - + "FROM M_PriceList pl,C_Currency c,M_PriceList_Version plv " - + "WHERE pl.C_Currency_ID=c.C_Currency_ID" - + " AND pl.M_PriceList_ID=plv.M_PriceList_ID" - + " AND pl.M_PriceList_ID=? " // 1 - + "ORDER BY plv.ValidFrom DESC"; - // Use newest price list - may not be future - try - { - PreparedStatement pstmt = DB.prepareStatement(sql, null); - pstmt.setInt(1, M_PriceList_ID.intValue()); - ResultSet rs = pstmt.executeQuery(); - if (rs.next()) - { - // Tax Included - mTab.setValue("IsTaxIncluded", new Boolean("Y".equals(rs.getString(1)))); - // Price Limit Enforce - Env.setContext(ctx, WindowNo, "EnforcePriceLimit", rs.getString(2)); - // Currency - Integer ii = new Integer(rs.getInt(3)); - mTab.setValue("C_Currency_ID", ii); - // PriceList Version - Env.setContext(ctx, WindowNo, "M_PriceList_Version_ID", rs.getInt(5)); - } - rs.close(); - pstmt.close(); - } - catch (SQLException e) - { - log.log(Level.SEVERE, sql, e); - return e.getLocalizedMessage(); - } - if (steps) log.warning("fini"); - - return ""; - } // priceList - - - /************************************************************************* - * Order Line - Product. - * - reset C_Charge_ID / M_AttributeSetInstance_ID - * - PriceList, PriceStd, PriceLimit, C_Currency_ID, EnforcePriceLimit - * - UOM - * Calls Tax - * - * @param ctx context - * @param WindowNo current Window No - * @param mTab Grid Tab - * @param mField Grid Field - * @param value New Value - * @return null or error message - */ - public String product (Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value) - { - Integer M_Product_ID = (Integer)value; - if (M_Product_ID == null || M_Product_ID.intValue() == 0) - return ""; - setCalloutActive(true); - if (steps) log.warning("init"); - // - mTab.setValue("C_Charge_ID", null); - // Set Attribute - if (Env.getContextAsInt(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "M_Product_ID") == M_Product_ID.intValue() - && Env.getContextAsInt(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "M_AttributeSetInstance_ID") != 0) - mTab.setValue("M_AttributeSetInstance_ID", new Integer(Env.getContextAsInt(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "M_AttributeSetInstance_ID"))); - else - mTab.setValue("M_AttributeSetInstance_ID", null); - - /***** Price Calculation see also qty ****/ - int C_BPartner_ID = Env.getContextAsInt(ctx, WindowNo, "C_BPartner_ID"); - BigDecimal Qty = (BigDecimal)mTab.getValue("QtyOrdered"); - boolean IsSOTrx = Env.getContext(ctx, WindowNo, "IsSOTrx").equals("Y"); - MProductPricing pp = new MProductPricing (M_Product_ID.intValue(), C_BPartner_ID, Qty, IsSOTrx); - // - int M_PriceList_ID = Env.getContextAsInt(ctx, WindowNo, "M_PriceList_ID"); - pp.setM_PriceList_ID(M_PriceList_ID); - /** PLV is only accurate if PL selected in header */ + s = rs.getString(IsSOTrx ? "PaymentRule" : "PaymentRulePO"); + if (s != null && s.length() != 0) + { + if (s.equals("B")) // No Cache in Non POS + s = "P"; + if (IsSOTrx && (s.equals("S") || s.equals("U"))) // No Check/Transfer for SO_Trx + s = "P"; // Payment Term + mTab.setValue("PaymentRule", s); + } + // Payment Term + ii = new Integer(rs.getInt(IsSOTrx ? "C_PaymentTerm_ID" : "PO_PaymentTerm_ID")); + if (!rs.wasNull()) + mTab.setValue("C_PaymentTerm_ID", ii); + // InvoiceRule + s = rs.getString("InvoiceRule"); + if (s != null && s.length() != 0) + mTab.setValue("InvoiceRule", s); + } + } + rs.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, "bPartnerBill", e); + return e.getLocalizedMessage(); + } + + return ""; + } // bPartnerBill + + + /** + * Order Header - PriceList. + * (used also in Invoice) + * - C_Currency_ID + * - IsTaxIncluded + * Window Context: + * - EnforcePriceLimit + * - StdPrecision + * - M_PriceList_Version_ID + * @param ctx context + * @param WindowNo current Window No + * @param mTab Grid Tab + * @param mField Grid Field + * @param value New Value + * @return null or error message + */ + public String priceList (Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value) + { + Integer M_PriceList_ID = (Integer)value; + if (M_PriceList_ID == null || M_PriceList_ID.intValue()== 0) + return ""; + if (steps) log.warning("init"); + + String sql = "SELECT pl.IsTaxIncluded,pl.EnforcePriceLimit,pl.C_Currency_ID,c.StdPrecision," + + "plv.M_PriceList_Version_ID,plv.ValidFrom " + + "FROM M_PriceList pl,C_Currency c,M_PriceList_Version plv " + + "WHERE pl.C_Currency_ID=c.C_Currency_ID" + + " AND pl.M_PriceList_ID=plv.M_PriceList_ID" + + " AND pl.M_PriceList_ID=? " // 1 + + "ORDER BY plv.ValidFrom DESC"; + // Use newest price list - may not be future + try + { + PreparedStatement pstmt = DB.prepareStatement(sql, null); + pstmt.setInt(1, M_PriceList_ID.intValue()); + ResultSet rs = pstmt.executeQuery(); + if (rs.next()) + { + // Tax Included + mTab.setValue("IsTaxIncluded", new Boolean("Y".equals(rs.getString(1)))); + // Price Limit Enforce + Env.setContext(ctx, WindowNo, "EnforcePriceLimit", rs.getString(2)); + // Currency + Integer ii = new Integer(rs.getInt(3)); + mTab.setValue("C_Currency_ID", ii); + // PriceList Version + Env.setContext(ctx, WindowNo, "M_PriceList_Version_ID", rs.getInt(5)); + } + rs.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, sql, e); + return e.getLocalizedMessage(); + } + if (steps) log.warning("fini"); + + return ""; + } // priceList + + + /************************************************************************* + * Order Line - Product. + * - reset C_Charge_ID / M_AttributeSetInstance_ID + * - PriceList, PriceStd, PriceLimit, C_Currency_ID, EnforcePriceLimit + * - UOM + * Calls Tax + * + * @param ctx context + * @param WindowNo current Window No + * @param mTab Grid Tab + * @param mField Grid Field + * @param value New Value + * @return null or error message + */ + public String product (Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value) + { + Integer M_Product_ID = (Integer)value; + if (M_Product_ID == null || M_Product_ID.intValue() == 0) + return ""; + setCalloutActive(true); + if (steps) log.warning("init"); + // + mTab.setValue("C_Charge_ID", null); + // Set Attribute + if (Env.getContextAsInt(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "M_Product_ID") == M_Product_ID.intValue() + && Env.getContextAsInt(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "M_AttributeSetInstance_ID") != 0) + mTab.setValue("M_AttributeSetInstance_ID", new Integer(Env.getContextAsInt(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "M_AttributeSetInstance_ID"))); + else + mTab.setValue("M_AttributeSetInstance_ID", null); + + /***** Price Calculation see also qty ****/ + int C_BPartner_ID = Env.getContextAsInt(ctx, WindowNo, "C_BPartner_ID"); + BigDecimal Qty = (BigDecimal)mTab.getValue("QtyOrdered"); + boolean IsSOTrx = Env.getContext(ctx, WindowNo, "IsSOTrx").equals("Y"); + MProductPricing pp = new MProductPricing (M_Product_ID.intValue(), C_BPartner_ID, Qty, IsSOTrx); + // + int M_PriceList_ID = Env.getContextAsInt(ctx, WindowNo, "M_PriceList_ID"); + pp.setM_PriceList_ID(M_PriceList_ID); + /** PLV is only accurate if PL selected in header */ // globalqss - fix reported bug [ 1643489 ] PriceListVersion misfunctionality int M_PriceList_Version_ID; // try to get the price list version from info product tab @@ -669,260 +677,260 @@ public class CalloutOrder extends CalloutEngine if (M_PriceList_Version_ID == 0) M_PriceList_Version_ID = Env.getContextAsInt(ctx, WindowNo, "M_PriceList_Version_ID"); // end globalqss - pp.setM_PriceList_Version_ID(M_PriceList_Version_ID); - Timestamp orderDate = (Timestamp)mTab.getValue("DateOrdered"); - pp.setPriceDate(orderDate); - // - mTab.setValue("PriceList", pp.getPriceList()); - mTab.setValue("PriceLimit", pp.getPriceLimit()); - mTab.setValue("PriceActual", pp.getPriceStd()); - mTab.setValue("PriceEntered", pp.getPriceStd()); - mTab.setValue("C_Currency_ID", new Integer(pp.getC_Currency_ID())); - mTab.setValue("Discount", pp.getDiscount()); - mTab.setValue("C_UOM_ID", new Integer(pp.getC_UOM_ID())); - mTab.setValue("QtyOrdered", mTab.getValue("QtyEntered")); - Env.setContext(ctx, WindowNo, "EnforcePriceLimit", pp.isEnforcePriceLimit() ? "Y" : "N"); - Env.setContext(ctx, WindowNo, "DiscountSchema", pp.isDiscountSchema() ? "Y" : "N"); - - // Check/Update Warehouse Setting - // int M_Warehouse_ID = Env.getContextAsInt(ctx, Env.WINDOW_INFO, "M_Warehouse_ID"); - // Integer wh = (Integer)mTab.getValue("M_Warehouse_ID"); - // if (wh.intValue() != M_Warehouse_ID) - // { - // mTab.setValue("M_Warehouse_ID", new Integer(M_Warehouse_ID)); - // ADialog.warn(,WindowNo, "WarehouseChanged"); - // } - - - if (Env.isSOTrx(ctx, WindowNo)) - { - MProduct product = MProduct.get (ctx, M_Product_ID.intValue()); - if (product.isStocked()) - { - BigDecimal QtyOrdered = (BigDecimal)mTab.getValue("QtyOrdered"); - int M_Warehouse_ID = Env.getContextAsInt(ctx, WindowNo, "M_Warehouse_ID"); - int M_AttributeSetInstance_ID = Env.getContextAsInt(ctx, WindowNo, "M_AttributeSetInstance_ID"); - BigDecimal available = MStorage.getQtyAvailable - (M_Warehouse_ID, M_Product_ID.intValue(), M_AttributeSetInstance_ID, null); - if (available == null) - available = Env.ZERO; - if (available.signum() == 0) - mTab.fireDataStatusEEvent ("NoQtyAvailable", "0", false); - else if (available.compareTo(QtyOrdered) < 0) - mTab.fireDataStatusEEvent ("InsufficientQtyAvailable", available.toString(), false); - else - { - Integer C_OrderLine_ID = (Integer)mTab.getValue("C_OrderLine_ID"); - if (C_OrderLine_ID == null) - C_OrderLine_ID = new Integer(0); - BigDecimal notReserved = MOrderLine.getNotReserved(ctx, - M_Warehouse_ID, M_Product_ID, M_AttributeSetInstance_ID, - C_OrderLine_ID.intValue()); - if (notReserved == null) - notReserved = Env.ZERO; - BigDecimal total = available.subtract(notReserved); - if (total.compareTo(QtyOrdered) < 0) - { - String info = Msg.parseTranslation(ctx, "@QtyAvailable@=" + available - + " - @QtyNotReserved@=" + notReserved + " = " + total); - mTab.fireDataStatusEEvent ("InsufficientQtyAvailable", - info, false); - } - } - } - } - // - setCalloutActive(false); - if (steps) log.warning("fini"); - return tax (ctx, WindowNo, mTab, mField, value); - } // product - - /** - * Order Line - Charge. - * - updates PriceActual from Charge - * - sets PriceLimit, PriceList to zero - * Calles tax - * @param ctx context - * @param WindowNo current Window No - * @param mTab Grid Tab - * @param mField Grid Field - * @param value New Value - * @return null or error message - */ - public String charge (Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value) - { - Integer C_Charge_ID = (Integer)value; - if (C_Charge_ID == null || C_Charge_ID.intValue() == 0) - return ""; - // No Product defined - if (mTab.getValue("M_Product_ID") != null) - { - mTab.setValue("C_Charge_ID", null); - return "ChargeExclusively"; - } - mTab.setValue("M_AttributeSetInstance_ID", null); - mTab.setValue("S_ResourceAssignment_ID", null); - mTab.setValue("C_UOM_ID", new Integer(100)); // EA - - Env.setContext(ctx, WindowNo, "DiscountSchema", "N"); - String sql = "SELECT ChargeAmt FROM C_Charge WHERE C_Charge_ID=?"; - try - { - PreparedStatement pstmt = DB.prepareStatement(sql, null); - pstmt.setInt(1, C_Charge_ID.intValue()); - ResultSet rs = pstmt.executeQuery(); - if (rs.next()) - { - mTab.setValue ("PriceEntered", rs.getBigDecimal (1)); - mTab.setValue ("PriceActual", rs.getBigDecimal (1)); - mTab.setValue ("PriceLimit", Env.ZERO); - mTab.setValue ("PriceList", Env.ZERO); - mTab.setValue ("Discount", Env.ZERO); - } - rs.close(); - pstmt.close(); - } - catch (SQLException e) - { - log.log(Level.SEVERE, sql, e); - return e.getLocalizedMessage(); - } - // - return tax (ctx, WindowNo, mTab, mField, value); - } // charge - - - /** - * Order Line - Tax. - * - basis: Product, Charge, BPartner Location - * - sets C_Tax_ID - * Calles Amount - * @param ctx context - * @param WindowNo current Window No - * @param mTab Grid Tab - * @param mField Grid Field - * @param value New Value - * @return null or error message - */ - public String tax (Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value) - { - String column = mField.getColumnName(); - if (value == null) - return ""; - if (steps) log.warning("init"); - - // Check Product - int M_Product_ID = 0; - if (column.equals("M_Product_ID")) - M_Product_ID = ((Integer)value).intValue(); - else - M_Product_ID = Env.getContextAsInt(ctx, WindowNo, "M_Product_ID"); - int C_Charge_ID = 0; - if (column.equals("C_Charge_ID")) - C_Charge_ID = ((Integer)value).intValue(); - else - C_Charge_ID = Env.getContextAsInt(ctx, WindowNo, "C_Charge_ID"); - log.fine("Product=" + M_Product_ID + ", C_Charge_ID=" + C_Charge_ID); - if (M_Product_ID == 0 && C_Charge_ID == 0) - return amt(ctx, WindowNo, mTab, mField, value); // - - // Check Partner Location - int shipC_BPartner_Location_ID = 0; - if (column.equals("C_BPartner_Location_ID")) - shipC_BPartner_Location_ID = ((Integer)value).intValue(); - else - shipC_BPartner_Location_ID = Env.getContextAsInt(ctx, WindowNo, "C_BPartner_Location_ID"); - if (shipC_BPartner_Location_ID == 0) - return amt(ctx, WindowNo, mTab, mField, value); // - log.fine("Ship BP_Location=" + shipC_BPartner_Location_ID); - - // - Timestamp billDate = Env.getContextAsDate(ctx, WindowNo, "DateOrdered"); - log.fine("Bill Date=" + billDate); - - Timestamp shipDate = Env.getContextAsDate(ctx, WindowNo, "DatePromised"); - log.fine("Ship Date=" + shipDate); - - int AD_Org_ID = Env.getContextAsInt(ctx, WindowNo, "AD_Org_ID"); - log.fine("Org=" + AD_Org_ID); - - int M_Warehouse_ID = Env.getContextAsInt(ctx, WindowNo, "M_Warehouse_ID"); - log.fine("Warehouse=" + M_Warehouse_ID); - - int billC_BPartner_Location_ID = Env.getContextAsInt(ctx, WindowNo, "Bill_Location_ID"); - if (billC_BPartner_Location_ID == 0) - billC_BPartner_Location_ID = shipC_BPartner_Location_ID; - log.fine("Bill BP_Location=" + billC_BPartner_Location_ID); - - // - int C_Tax_ID = Tax.get (ctx, M_Product_ID, C_Charge_ID, billDate, shipDate, - AD_Org_ID, M_Warehouse_ID, billC_BPartner_Location_ID, shipC_BPartner_Location_ID, - "Y".equals(Env.getContext(ctx, WindowNo, "IsSOTrx"))); - log.info("Tax ID=" + C_Tax_ID); - // - if (C_Tax_ID == 0) - mTab.fireDataStatusEEvent(CLogger.retrieveError()); - else - mTab.setValue("C_Tax_ID", new Integer(C_Tax_ID)); - // - if (steps) log.warning("fini"); - return amt(ctx, WindowNo, mTab, mField, value); - } // tax - - - /** - * Order Line - Amount. - * - called from QtyOrdered, Discount and PriceActual - * - calculates Discount or Actual Amount - * - calculates LineNetAmt - * - enforces PriceLimit - * @param ctx context - * @param WindowNo current Window No - * @param mTab Grid Tab - * @param mField Grid Field - * @param value New Value - * @return null or error message - */ - public String amt (Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value) - { - if (isCalloutActive() || value == null) - return ""; - setCalloutActive(true); - - if (steps) log.warning("init"); - int C_UOM_To_ID = Env.getContextAsInt(ctx, WindowNo, "C_UOM_ID"); - int M_Product_ID = Env.getContextAsInt(ctx, WindowNo, "M_Product_ID"); - int M_PriceList_ID = Env.getContextAsInt(ctx, WindowNo, "M_PriceList_ID"); - int StdPrecision = MPriceList.getStandardPrecision(ctx, M_PriceList_ID); - BigDecimal QtyEntered, QtyOrdered, PriceEntered, PriceActual, PriceLimit, Discount, PriceList; - // get values - QtyEntered = (BigDecimal)mTab.getValue("QtyEntered"); - QtyOrdered = (BigDecimal)mTab.getValue("QtyOrdered"); - log.fine("QtyEntered=" + QtyEntered + ", Ordered=" + QtyOrdered + ", UOM=" + C_UOM_To_ID); - // - PriceEntered = (BigDecimal)mTab.getValue("PriceEntered"); - PriceActual = (BigDecimal)mTab.getValue("PriceActual"); - Discount = (BigDecimal)mTab.getValue("Discount"); - PriceLimit = (BigDecimal)mTab.getValue("PriceLimit"); - PriceList = (BigDecimal)mTab.getValue("PriceList"); - log.fine("PriceList=" + PriceList + ", Limit=" + PriceLimit + ", Precision=" + StdPrecision); - log.fine("PriceEntered=" + PriceEntered + ", Actual=" + PriceActual + ", Discount=" + Discount); - - // Qty changed - recalc price - if ((mField.getColumnName().equals("QtyOrdered") - || mField.getColumnName().equals("QtyEntered") - || mField.getColumnName().equals("M_Product_ID")) - && !"N".equals(Env.getContext(ctx, WindowNo, "DiscountSchema"))) - { - int C_BPartner_ID = Env.getContextAsInt(ctx, WindowNo, "C_BPartner_ID"); - if (mField.getColumnName().equals("QtyEntered")) - QtyOrdered = MUOMConversion.convertProductTo (ctx, M_Product_ID, - C_UOM_To_ID, QtyEntered); - if (QtyOrdered == null) - QtyOrdered = QtyEntered; - boolean IsSOTrx = Env.getContext(ctx, WindowNo, "IsSOTrx").equals("Y"); - MProductPricing pp = new MProductPricing (M_Product_ID, C_BPartner_ID, QtyOrdered, IsSOTrx); - pp.setM_PriceList_ID(M_PriceList_ID); + pp.setM_PriceList_Version_ID(M_PriceList_Version_ID); + Timestamp orderDate = (Timestamp)mTab.getValue("DateOrdered"); + pp.setPriceDate(orderDate); + // + mTab.setValue("PriceList", pp.getPriceList()); + mTab.setValue("PriceLimit", pp.getPriceLimit()); + mTab.setValue("PriceActual", pp.getPriceStd()); + mTab.setValue("PriceEntered", pp.getPriceStd()); + mTab.setValue("C_Currency_ID", new Integer(pp.getC_Currency_ID())); + mTab.setValue("Discount", pp.getDiscount()); + mTab.setValue("C_UOM_ID", new Integer(pp.getC_UOM_ID())); + mTab.setValue("QtyOrdered", mTab.getValue("QtyEntered")); + Env.setContext(ctx, WindowNo, "EnforcePriceLimit", pp.isEnforcePriceLimit() ? "Y" : "N"); + Env.setContext(ctx, WindowNo, "DiscountSchema", pp.isDiscountSchema() ? "Y" : "N"); + + // Check/Update Warehouse Setting + // int M_Warehouse_ID = Env.getContextAsInt(ctx, Env.WINDOW_INFO, "M_Warehouse_ID"); + // Integer wh = (Integer)mTab.getValue("M_Warehouse_ID"); + // if (wh.intValue() != M_Warehouse_ID) + // { + // mTab.setValue("M_Warehouse_ID", new Integer(M_Warehouse_ID)); + // ADialog.warn(,WindowNo, "WarehouseChanged"); + // } + + + if (Env.isSOTrx(ctx, WindowNo)) + { + MProduct product = MProduct.get (ctx, M_Product_ID.intValue()); + if (product.isStocked()) + { + BigDecimal QtyOrdered = (BigDecimal)mTab.getValue("QtyOrdered"); + int M_Warehouse_ID = Env.getContextAsInt(ctx, WindowNo, "M_Warehouse_ID"); + int M_AttributeSetInstance_ID = Env.getContextAsInt(ctx, WindowNo, "M_AttributeSetInstance_ID"); + BigDecimal available = MStorage.getQtyAvailable + (M_Warehouse_ID, M_Product_ID.intValue(), M_AttributeSetInstance_ID, null); + if (available == null) + available = Env.ZERO; + if (available.signum() == 0) + mTab.fireDataStatusEEvent ("NoQtyAvailable", "0", false); + else if (available.compareTo(QtyOrdered) < 0) + mTab.fireDataStatusEEvent ("InsufficientQtyAvailable", available.toString(), false); + else + { + Integer C_OrderLine_ID = (Integer)mTab.getValue("C_OrderLine_ID"); + if (C_OrderLine_ID == null) + C_OrderLine_ID = new Integer(0); + BigDecimal notReserved = MOrderLine.getNotReserved(ctx, + M_Warehouse_ID, M_Product_ID, M_AttributeSetInstance_ID, + C_OrderLine_ID.intValue()); + if (notReserved == null) + notReserved = Env.ZERO; + BigDecimal total = available.subtract(notReserved); + if (total.compareTo(QtyOrdered) < 0) + { + String info = Msg.parseTranslation(ctx, "@QtyAvailable@=" + available + + " - @QtyNotReserved@=" + notReserved + " = " + total); + mTab.fireDataStatusEEvent ("InsufficientQtyAvailable", + info, false); + } + } + } + } + // + setCalloutActive(false); + if (steps) log.warning("fini"); + return tax (ctx, WindowNo, mTab, mField, value); + } // product + + /** + * Order Line - Charge. + * - updates PriceActual from Charge + * - sets PriceLimit, PriceList to zero + * Calles tax + * @param ctx context + * @param WindowNo current Window No + * @param mTab Grid Tab + * @param mField Grid Field + * @param value New Value + * @return null or error message + */ + public String charge (Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value) + { + Integer C_Charge_ID = (Integer)value; + if (C_Charge_ID == null || C_Charge_ID.intValue() == 0) + return ""; + // No Product defined + if (mTab.getValue("M_Product_ID") != null) + { + mTab.setValue("C_Charge_ID", null); + return "ChargeExclusively"; + } + mTab.setValue("M_AttributeSetInstance_ID", null); + mTab.setValue("S_ResourceAssignment_ID", null); + mTab.setValue("C_UOM_ID", new Integer(100)); // EA + + Env.setContext(ctx, WindowNo, "DiscountSchema", "N"); + String sql = "SELECT ChargeAmt FROM C_Charge WHERE C_Charge_ID=?"; + try + { + PreparedStatement pstmt = DB.prepareStatement(sql, null); + pstmt.setInt(1, C_Charge_ID.intValue()); + ResultSet rs = pstmt.executeQuery(); + if (rs.next()) + { + mTab.setValue ("PriceEntered", rs.getBigDecimal (1)); + mTab.setValue ("PriceActual", rs.getBigDecimal (1)); + mTab.setValue ("PriceLimit", Env.ZERO); + mTab.setValue ("PriceList", Env.ZERO); + mTab.setValue ("Discount", Env.ZERO); + } + rs.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, sql, e); + return e.getLocalizedMessage(); + } + // + return tax (ctx, WindowNo, mTab, mField, value); + } // charge + + + /** + * Order Line - Tax. + * - basis: Product, Charge, BPartner Location + * - sets C_Tax_ID + * Calles Amount + * @param ctx context + * @param WindowNo current Window No + * @param mTab Grid Tab + * @param mField Grid Field + * @param value New Value + * @return null or error message + */ + public String tax (Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value) + { + String column = mField.getColumnName(); + if (value == null) + return ""; + if (steps) log.warning("init"); + + // Check Product + int M_Product_ID = 0; + if (column.equals("M_Product_ID")) + M_Product_ID = ((Integer)value).intValue(); + else + M_Product_ID = Env.getContextAsInt(ctx, WindowNo, "M_Product_ID"); + int C_Charge_ID = 0; + if (column.equals("C_Charge_ID")) + C_Charge_ID = ((Integer)value).intValue(); + else + C_Charge_ID = Env.getContextAsInt(ctx, WindowNo, "C_Charge_ID"); + log.fine("Product=" + M_Product_ID + ", C_Charge_ID=" + C_Charge_ID); + if (M_Product_ID == 0 && C_Charge_ID == 0) + return amt(ctx, WindowNo, mTab, mField, value); // + + // Check Partner Location + int shipC_BPartner_Location_ID = 0; + if (column.equals("C_BPartner_Location_ID")) + shipC_BPartner_Location_ID = ((Integer)value).intValue(); + else + shipC_BPartner_Location_ID = Env.getContextAsInt(ctx, WindowNo, "C_BPartner_Location_ID"); + if (shipC_BPartner_Location_ID == 0) + return amt(ctx, WindowNo, mTab, mField, value); // + log.fine("Ship BP_Location=" + shipC_BPartner_Location_ID); + + // + Timestamp billDate = Env.getContextAsDate(ctx, WindowNo, "DateOrdered"); + log.fine("Bill Date=" + billDate); + + Timestamp shipDate = Env.getContextAsDate(ctx, WindowNo, "DatePromised"); + log.fine("Ship Date=" + shipDate); + + int AD_Org_ID = Env.getContextAsInt(ctx, WindowNo, "AD_Org_ID"); + log.fine("Org=" + AD_Org_ID); + + int M_Warehouse_ID = Env.getContextAsInt(ctx, WindowNo, "M_Warehouse_ID"); + log.fine("Warehouse=" + M_Warehouse_ID); + + int billC_BPartner_Location_ID = Env.getContextAsInt(ctx, WindowNo, "Bill_Location_ID"); + if (billC_BPartner_Location_ID == 0) + billC_BPartner_Location_ID = shipC_BPartner_Location_ID; + log.fine("Bill BP_Location=" + billC_BPartner_Location_ID); + + // + int C_Tax_ID = Tax.get (ctx, M_Product_ID, C_Charge_ID, billDate, shipDate, + AD_Org_ID, M_Warehouse_ID, billC_BPartner_Location_ID, shipC_BPartner_Location_ID, + "Y".equals(Env.getContext(ctx, WindowNo, "IsSOTrx"))); + log.info("Tax ID=" + C_Tax_ID); + // + if (C_Tax_ID == 0) + mTab.fireDataStatusEEvent(CLogger.retrieveError()); + else + mTab.setValue("C_Tax_ID", new Integer(C_Tax_ID)); + // + if (steps) log.warning("fini"); + return amt(ctx, WindowNo, mTab, mField, value); + } // tax + + + /** + * Order Line - Amount. + * - called from QtyOrdered, Discount and PriceActual + * - calculates Discount or Actual Amount + * - calculates LineNetAmt + * - enforces PriceLimit + * @param ctx context + * @param WindowNo current Window No + * @param mTab Grid Tab + * @param mField Grid Field + * @param value New Value + * @return null or error message + */ + public String amt (Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value) + { + if (isCalloutActive() || value == null) + return ""; + setCalloutActive(true); + + if (steps) log.warning("init"); + int C_UOM_To_ID = Env.getContextAsInt(ctx, WindowNo, "C_UOM_ID"); + int M_Product_ID = Env.getContextAsInt(ctx, WindowNo, "M_Product_ID"); + int M_PriceList_ID = Env.getContextAsInt(ctx, WindowNo, "M_PriceList_ID"); + int StdPrecision = MPriceList.getStandardPrecision(ctx, M_PriceList_ID); + BigDecimal QtyEntered, QtyOrdered, PriceEntered, PriceActual, PriceLimit, Discount, PriceList; + // get values + QtyEntered = (BigDecimal)mTab.getValue("QtyEntered"); + QtyOrdered = (BigDecimal)mTab.getValue("QtyOrdered"); + log.fine("QtyEntered=" + QtyEntered + ", Ordered=" + QtyOrdered + ", UOM=" + C_UOM_To_ID); + // + PriceEntered = (BigDecimal)mTab.getValue("PriceEntered"); + PriceActual = (BigDecimal)mTab.getValue("PriceActual"); + Discount = (BigDecimal)mTab.getValue("Discount"); + PriceLimit = (BigDecimal)mTab.getValue("PriceLimit"); + PriceList = (BigDecimal)mTab.getValue("PriceList"); + log.fine("PriceList=" + PriceList + ", Limit=" + PriceLimit + ", Precision=" + StdPrecision); + log.fine("PriceEntered=" + PriceEntered + ", Actual=" + PriceActual + ", Discount=" + Discount); + + // Qty changed - recalc price + if ((mField.getColumnName().equals("QtyOrdered") + || mField.getColumnName().equals("QtyEntered") + || mField.getColumnName().equals("M_Product_ID")) + && !"N".equals(Env.getContext(ctx, WindowNo, "DiscountSchema"))) + { + int C_BPartner_ID = Env.getContextAsInt(ctx, WindowNo, "C_BPartner_ID"); + if (mField.getColumnName().equals("QtyEntered")) + QtyOrdered = MUOMConversion.convertProductTo (ctx, M_Product_ID, + C_UOM_To_ID, QtyEntered); + if (QtyOrdered == null) + QtyOrdered = QtyEntered; + boolean IsSOTrx = Env.getContext(ctx, WindowNo, "IsSOTrx").equals("Y"); + MProductPricing pp = new MProductPricing (M_Product_ID, C_BPartner_ID, QtyOrdered, IsSOTrx); + pp.setM_PriceList_ID(M_PriceList_ID); // globalqss - fix reported bug [ 1643489 ] PriceListVersion misfunctionality int M_PriceList_Version_ID; // try to get the price list version from info product tab @@ -931,272 +939,272 @@ public class CalloutOrder extends CalloutEngine if (M_PriceList_Version_ID == 0) M_PriceList_Version_ID = Env.getContextAsInt(ctx, WindowNo, "M_PriceList_Version_ID"); // end globalqss - pp.setM_PriceList_Version_ID(M_PriceList_Version_ID); - Timestamp date = (Timestamp)mTab.getValue("DateOrdered"); - pp.setPriceDate(date); - // - PriceEntered = MUOMConversion.convertProductFrom (ctx, M_Product_ID, - C_UOM_To_ID, pp.getPriceStd()); - if (PriceEntered == null) - PriceEntered = pp.getPriceStd(); - // - log.fine("QtyChanged -> PriceActual=" + pp.getPriceStd() - + ", PriceEntered=" + PriceEntered + ", Discount=" + pp.getDiscount()); - mTab.setValue("PriceActual", pp.getPriceStd()); - mTab.setValue("Discount", pp.getDiscount()); - mTab.setValue("PriceEntered", PriceEntered); - Env.setContext(ctx, WindowNo, "DiscountSchema", pp.isDiscountSchema() ? "Y" : "N"); - } - else if (mField.getColumnName().equals("PriceActual")) - { - PriceActual = (BigDecimal)value; - PriceEntered = MUOMConversion.convertProductFrom (ctx, M_Product_ID, - C_UOM_To_ID, PriceActual); - if (PriceEntered == null) - PriceEntered = PriceActual; - // - log.fine("PriceActual=" + PriceActual - + " -> PriceEntered=" + PriceEntered); - mTab.setValue("PriceEntered", PriceEntered); - } - else if (mField.getColumnName().equals("PriceEntered")) - { - PriceEntered = (BigDecimal)value; - PriceActual = MUOMConversion.convertProductTo (ctx, M_Product_ID, - C_UOM_To_ID, PriceEntered); - if (PriceActual == null) - PriceActual = PriceEntered; - // - log.fine("PriceEntered=" + PriceEntered - + " -> PriceActual=" + PriceActual); - mTab.setValue("PriceActual", PriceActual); - } - - // Discount entered - Calculate Actual/Entered - if (mField.getColumnName().equals("Discount")) - { - PriceActual = new BigDecimal ((100.0 - Discount.doubleValue()) / 100.0 * PriceList.doubleValue()); - if (PriceActual.scale() > StdPrecision) - PriceActual = PriceActual.setScale(StdPrecision, BigDecimal.ROUND_HALF_UP); - PriceEntered = MUOMConversion.convertProductFrom (ctx, M_Product_ID, - C_UOM_To_ID, PriceActual); - if (PriceEntered == null) - PriceEntered = PriceActual; - mTab.setValue("PriceActual", PriceActual); - mTab.setValue("PriceEntered", PriceEntered); - } - // calculate Discount - else - { - if (PriceList.intValue() == 0) - Discount = Env.ZERO; - else - Discount = new BigDecimal ((PriceList.doubleValue() - PriceActual.doubleValue()) / PriceList.doubleValue() * 100.0); - if (Discount.scale() > 2) - Discount = Discount.setScale(2, BigDecimal.ROUND_HALF_UP); - mTab.setValue("Discount", Discount); - } - log.fine("PriceEntered=" + PriceEntered + ", Actual=" + PriceActual + ", Discount=" + Discount); - - // Check PriceLimit - String epl = Env.getContext(ctx, WindowNo, "EnforcePriceLimit"); - boolean enforce = Env.isSOTrx(ctx, WindowNo) && epl != null && epl.equals("Y"); - if (enforce && MRole.getDefault().isOverwritePriceLimit()) - enforce = false; - // Check Price Limit? - if (enforce && PriceLimit.doubleValue() != 0.0 - && PriceActual.compareTo(PriceLimit) < 0) - { - PriceActual = PriceLimit; - PriceEntered = MUOMConversion.convertProductFrom (ctx, M_Product_ID, - C_UOM_To_ID, PriceLimit); - if (PriceEntered == null) - PriceEntered = PriceLimit; - log.fine("(under) PriceEntered=" + PriceEntered + ", Actual" + PriceLimit); - mTab.setValue ("PriceActual", PriceLimit); - mTab.setValue ("PriceEntered", PriceEntered); - mTab.fireDataStatusEEvent ("UnderLimitPrice", "", false); - // Repeat Discount calc - if (PriceList.intValue() != 0) - { - Discount = new BigDecimal ((PriceList.doubleValue () - PriceActual.doubleValue ()) / PriceList.doubleValue () * 100.0); - if (Discount.scale () > 2) - Discount = Discount.setScale (2, BigDecimal.ROUND_HALF_UP); - mTab.setValue ("Discount", Discount); - } - } - - // Line Net Amt - BigDecimal LineNetAmt = QtyOrdered.multiply(PriceActual); - if (LineNetAmt.scale() > StdPrecision) - LineNetAmt = LineNetAmt.setScale(StdPrecision, BigDecimal.ROUND_HALF_UP); - log.info("LineNetAmt=" + LineNetAmt); - mTab.setValue("LineNetAmt", LineNetAmt); - // - setCalloutActive(false); - return ""; - } // amt - - /** - * Order Line - Quantity. - * - called from C_UOM_ID, QtyEntered, QtyOrdered - * - enforces qty UOM relationship - * @param ctx context - * @param WindowNo current Window No - * @param mTab Grid Tab - * @param mField Grid Field - * @param value New Value - * @return null or error message - */ - public String qty (Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value) - { - if (isCalloutActive() || value == null) - return ""; - setCalloutActive(true); - - int M_Product_ID = Env.getContextAsInt(ctx, WindowNo, "M_Product_ID"); - if (steps) log.warning("init - M_Product_ID=" + M_Product_ID + " - " ); - BigDecimal QtyOrdered = Env.ZERO; - BigDecimal QtyEntered, PriceActual, PriceEntered; - - // No Product - if (M_Product_ID == 0) - { - QtyEntered = (BigDecimal)mTab.getValue("QtyEntered"); - QtyOrdered = QtyEntered; - mTab.setValue("QtyOrdered", QtyOrdered); - } - // UOM Changed - convert from Entered -> Product - else if (mField.getColumnName().equals("C_UOM_ID")) - { - int C_UOM_To_ID = ((Integer)value).intValue(); - QtyEntered = (BigDecimal)mTab.getValue("QtyEntered"); - BigDecimal QtyEntered1 = QtyEntered.setScale(MUOM.getPrecision(ctx, C_UOM_To_ID), BigDecimal.ROUND_HALF_UP); - if (QtyEntered.compareTo(QtyEntered1) != 0) - { - log.fine("Corrected QtyEntered Scale UOM=" + C_UOM_To_ID - + "; QtyEntered=" + QtyEntered + "->" + QtyEntered1); - QtyEntered = QtyEntered1; - mTab.setValue("QtyEntered", QtyEntered); - } - QtyOrdered = MUOMConversion.convertProductFrom (ctx, M_Product_ID, - C_UOM_To_ID, QtyEntered); - if (QtyOrdered == null) - QtyOrdered = QtyEntered; - boolean conversion = QtyEntered.compareTo(QtyOrdered) != 0; - PriceActual = (BigDecimal)mTab.getValue("PriceActual"); - PriceEntered = MUOMConversion.convertProductFrom (ctx, M_Product_ID, - C_UOM_To_ID, PriceActual); - if (PriceEntered == null) - PriceEntered = PriceActual; - log.fine("UOM=" + C_UOM_To_ID - + ", QtyEntered/PriceActual=" + QtyEntered + "/" + PriceActual - + " -> " + conversion - + " QtyOrdered/PriceEntered=" + QtyOrdered + "/" + PriceEntered); - Env.setContext(ctx, WindowNo, "UOMConversion", conversion ? "Y" : "N"); - mTab.setValue("QtyOrdered", QtyOrdered); - mTab.setValue("PriceEntered", PriceEntered); - } - // QtyEntered changed - calculate QtyOrdered - else if (mField.getColumnName().equals("QtyEntered")) - { - int C_UOM_To_ID = Env.getContextAsInt(ctx, WindowNo, "C_UOM_ID"); - QtyEntered = (BigDecimal)value; - BigDecimal QtyEntered1 = QtyEntered.setScale(MUOM.getPrecision(ctx, C_UOM_To_ID), BigDecimal.ROUND_HALF_UP); - if (QtyEntered.compareTo(QtyEntered1) != 0) - { - log.fine("Corrected QtyEntered Scale UOM=" + C_UOM_To_ID - + "; QtyEntered=" + QtyEntered + "->" + QtyEntered1); - QtyEntered = QtyEntered1; - mTab.setValue("QtyEntered", QtyEntered); - } - QtyOrdered = MUOMConversion.convertProductFrom (ctx, M_Product_ID, - C_UOM_To_ID, QtyEntered); - if (QtyOrdered == null) - QtyOrdered = QtyEntered; - boolean conversion = QtyEntered.compareTo(QtyOrdered) != 0; - log.fine("UOM=" + C_UOM_To_ID - + ", QtyEntered=" + QtyEntered - + " -> " + conversion - + " QtyOrdered=" + QtyOrdered); - Env.setContext(ctx, WindowNo, "UOMConversion", conversion ? "Y" : "N"); - mTab.setValue("QtyOrdered", QtyOrdered); - } - // QtyOrdered changed - calculate QtyEntered (should not happen) - else if (mField.getColumnName().equals("QtyOrdered")) - { - int C_UOM_To_ID = Env.getContextAsInt(ctx, WindowNo, "C_UOM_ID"); - QtyOrdered = (BigDecimal)value; - int precision = MProduct.get(ctx, M_Product_ID).getUOMPrecision(); - BigDecimal QtyOrdered1 = QtyOrdered.setScale(precision, BigDecimal.ROUND_HALF_UP); - if (QtyOrdered.compareTo(QtyOrdered1) != 0) - { - log.fine("Corrected QtyOrdered Scale " - + QtyOrdered + "->" + QtyOrdered1); - QtyOrdered = QtyOrdered1; - mTab.setValue("QtyOrdered", QtyOrdered); - } - QtyEntered = MUOMConversion.convertProductTo (ctx, M_Product_ID, - C_UOM_To_ID, QtyOrdered); - if (QtyEntered == null) - QtyEntered = QtyOrdered; - boolean conversion = QtyOrdered.compareTo(QtyEntered) != 0; - log.fine("UOM=" + C_UOM_To_ID - + ", QtyOrdered=" + QtyOrdered - + " -> " + conversion - + " QtyEntered=" + QtyEntered); - Env.setContext(ctx, WindowNo, "UOMConversion", conversion ? "Y" : "N"); - mTab.setValue("QtyEntered", QtyEntered); - } - else - { - // QtyEntered = (BigDecimal)mTab.getValue("QtyEntered"); - QtyOrdered = (BigDecimal)mTab.getValue("QtyOrdered"); - } - - // Storage - if (M_Product_ID != 0 - && Env.isSOTrx(ctx, WindowNo) - && QtyOrdered.signum() > 0) // no negative (returns) - { - MProduct product = MProduct.get (ctx, M_Product_ID); - if (product.isStocked()) - { - int M_Warehouse_ID = Env.getContextAsInt(ctx, WindowNo, "M_Warehouse_ID"); - int M_AttributeSetInstance_ID = Env.getContextAsInt(ctx, WindowNo, "M_AttributeSetInstance_ID"); - BigDecimal available = MStorage.getQtyAvailable - (M_Warehouse_ID, M_Product_ID, M_AttributeSetInstance_ID, null); - if (available == null) - available = Env.ZERO; - if (available.signum() == 0) - mTab.fireDataStatusEEvent ("NoQtyAvailable", "0", false); - else if (available.compareTo(QtyOrdered) < 0) - mTab.fireDataStatusEEvent ("InsufficientQtyAvailable", available.toString(), false); - else - { - Integer C_OrderLine_ID = (Integer)mTab.getValue("C_OrderLine_ID"); - if (C_OrderLine_ID == null) - C_OrderLine_ID = new Integer(0); - BigDecimal notReserved = MOrderLine.getNotReserved(ctx, - M_Warehouse_ID, M_Product_ID, M_AttributeSetInstance_ID, - C_OrderLine_ID.intValue()); - if (notReserved == null) - notReserved = Env.ZERO; - BigDecimal total = available.subtract(notReserved); - if (total.compareTo(QtyOrdered) < 0) - { - String info = Msg.parseTranslation(ctx, "@QtyAvailable@=" + available - + " - @QtyNotReserved@=" + notReserved + " = " + total); - mTab.fireDataStatusEEvent ("InsufficientQtyAvailable", - info, false); - } - } - } - } - // - setCalloutActive(false); - return ""; - } // qty - -} // CalloutOrder - + pp.setM_PriceList_Version_ID(M_PriceList_Version_ID); + Timestamp date = (Timestamp)mTab.getValue("DateOrdered"); + pp.setPriceDate(date); + // + PriceEntered = MUOMConversion.convertProductFrom (ctx, M_Product_ID, + C_UOM_To_ID, pp.getPriceStd()); + if (PriceEntered == null) + PriceEntered = pp.getPriceStd(); + // + log.fine("QtyChanged -> PriceActual=" + pp.getPriceStd() + + ", PriceEntered=" + PriceEntered + ", Discount=" + pp.getDiscount()); + mTab.setValue("PriceActual", pp.getPriceStd()); + mTab.setValue("Discount", pp.getDiscount()); + mTab.setValue("PriceEntered", PriceEntered); + Env.setContext(ctx, WindowNo, "DiscountSchema", pp.isDiscountSchema() ? "Y" : "N"); + } + else if (mField.getColumnName().equals("PriceActual")) + { + PriceActual = (BigDecimal)value; + PriceEntered = MUOMConversion.convertProductFrom (ctx, M_Product_ID, + C_UOM_To_ID, PriceActual); + if (PriceEntered == null) + PriceEntered = PriceActual; + // + log.fine("PriceActual=" + PriceActual + + " -> PriceEntered=" + PriceEntered); + mTab.setValue("PriceEntered", PriceEntered); + } + else if (mField.getColumnName().equals("PriceEntered")) + { + PriceEntered = (BigDecimal)value; + PriceActual = MUOMConversion.convertProductTo (ctx, M_Product_ID, + C_UOM_To_ID, PriceEntered); + if (PriceActual == null) + PriceActual = PriceEntered; + // + log.fine("PriceEntered=" + PriceEntered + + " -> PriceActual=" + PriceActual); + mTab.setValue("PriceActual", PriceActual); + } + + // Discount entered - Calculate Actual/Entered + if (mField.getColumnName().equals("Discount")) + { + PriceActual = new BigDecimal ((100.0 - Discount.doubleValue()) / 100.0 * PriceList.doubleValue()); + if (PriceActual.scale() > StdPrecision) + PriceActual = PriceActual.setScale(StdPrecision, BigDecimal.ROUND_HALF_UP); + PriceEntered = MUOMConversion.convertProductFrom (ctx, M_Product_ID, + C_UOM_To_ID, PriceActual); + if (PriceEntered == null) + PriceEntered = PriceActual; + mTab.setValue("PriceActual", PriceActual); + mTab.setValue("PriceEntered", PriceEntered); + } + // calculate Discount + else + { + if (PriceList.intValue() == 0) + Discount = Env.ZERO; + else + Discount = new BigDecimal ((PriceList.doubleValue() - PriceActual.doubleValue()) / PriceList.doubleValue() * 100.0); + if (Discount.scale() > 2) + Discount = Discount.setScale(2, BigDecimal.ROUND_HALF_UP); + mTab.setValue("Discount", Discount); + } + log.fine("PriceEntered=" + PriceEntered + ", Actual=" + PriceActual + ", Discount=" + Discount); + + // Check PriceLimit + String epl = Env.getContext(ctx, WindowNo, "EnforcePriceLimit"); + boolean enforce = Env.isSOTrx(ctx, WindowNo) && epl != null && epl.equals("Y"); + if (enforce && MRole.getDefault().isOverwritePriceLimit()) + enforce = false; + // Check Price Limit? + if (enforce && PriceLimit.doubleValue() != 0.0 + && PriceActual.compareTo(PriceLimit) < 0) + { + PriceActual = PriceLimit; + PriceEntered = MUOMConversion.convertProductFrom (ctx, M_Product_ID, + C_UOM_To_ID, PriceLimit); + if (PriceEntered == null) + PriceEntered = PriceLimit; + log.fine("(under) PriceEntered=" + PriceEntered + ", Actual" + PriceLimit); + mTab.setValue ("PriceActual", PriceLimit); + mTab.setValue ("PriceEntered", PriceEntered); + mTab.fireDataStatusEEvent ("UnderLimitPrice", "", false); + // Repeat Discount calc + if (PriceList.intValue() != 0) + { + Discount = new BigDecimal ((PriceList.doubleValue () - PriceActual.doubleValue ()) / PriceList.doubleValue () * 100.0); + if (Discount.scale () > 2) + Discount = Discount.setScale (2, BigDecimal.ROUND_HALF_UP); + mTab.setValue ("Discount", Discount); + } + } + + // Line Net Amt + BigDecimal LineNetAmt = QtyOrdered.multiply(PriceActual); + if (LineNetAmt.scale() > StdPrecision) + LineNetAmt = LineNetAmt.setScale(StdPrecision, BigDecimal.ROUND_HALF_UP); + log.info("LineNetAmt=" + LineNetAmt); + mTab.setValue("LineNetAmt", LineNetAmt); + // + setCalloutActive(false); + return ""; + } // amt + + /** + * Order Line - Quantity. + * - called from C_UOM_ID, QtyEntered, QtyOrdered + * - enforces qty UOM relationship + * @param ctx context + * @param WindowNo current Window No + * @param mTab Grid Tab + * @param mField Grid Field + * @param value New Value + * @return null or error message + */ + public String qty (Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value) + { + if (isCalloutActive() || value == null) + return ""; + setCalloutActive(true); + + int M_Product_ID = Env.getContextAsInt(ctx, WindowNo, "M_Product_ID"); + if (steps) log.warning("init - M_Product_ID=" + M_Product_ID + " - " ); + BigDecimal QtyOrdered = Env.ZERO; + BigDecimal QtyEntered, PriceActual, PriceEntered; + + // No Product + if (M_Product_ID == 0) + { + QtyEntered = (BigDecimal)mTab.getValue("QtyEntered"); + QtyOrdered = QtyEntered; + mTab.setValue("QtyOrdered", QtyOrdered); + } + // UOM Changed - convert from Entered -> Product + else if (mField.getColumnName().equals("C_UOM_ID")) + { + int C_UOM_To_ID = ((Integer)value).intValue(); + QtyEntered = (BigDecimal)mTab.getValue("QtyEntered"); + BigDecimal QtyEntered1 = QtyEntered.setScale(MUOM.getPrecision(ctx, C_UOM_To_ID), BigDecimal.ROUND_HALF_UP); + if (QtyEntered.compareTo(QtyEntered1) != 0) + { + log.fine("Corrected QtyEntered Scale UOM=" + C_UOM_To_ID + + "; QtyEntered=" + QtyEntered + "->" + QtyEntered1); + QtyEntered = QtyEntered1; + mTab.setValue("QtyEntered", QtyEntered); + } + QtyOrdered = MUOMConversion.convertProductFrom (ctx, M_Product_ID, + C_UOM_To_ID, QtyEntered); + if (QtyOrdered == null) + QtyOrdered = QtyEntered; + boolean conversion = QtyEntered.compareTo(QtyOrdered) != 0; + PriceActual = (BigDecimal)mTab.getValue("PriceActual"); + PriceEntered = MUOMConversion.convertProductFrom (ctx, M_Product_ID, + C_UOM_To_ID, PriceActual); + if (PriceEntered == null) + PriceEntered = PriceActual; + log.fine("UOM=" + C_UOM_To_ID + + ", QtyEntered/PriceActual=" + QtyEntered + "/" + PriceActual + + " -> " + conversion + + " QtyOrdered/PriceEntered=" + QtyOrdered + "/" + PriceEntered); + Env.setContext(ctx, WindowNo, "UOMConversion", conversion ? "Y" : "N"); + mTab.setValue("QtyOrdered", QtyOrdered); + mTab.setValue("PriceEntered", PriceEntered); + } + // QtyEntered changed - calculate QtyOrdered + else if (mField.getColumnName().equals("QtyEntered")) + { + int C_UOM_To_ID = Env.getContextAsInt(ctx, WindowNo, "C_UOM_ID"); + QtyEntered = (BigDecimal)value; + BigDecimal QtyEntered1 = QtyEntered.setScale(MUOM.getPrecision(ctx, C_UOM_To_ID), BigDecimal.ROUND_HALF_UP); + if (QtyEntered.compareTo(QtyEntered1) != 0) + { + log.fine("Corrected QtyEntered Scale UOM=" + C_UOM_To_ID + + "; QtyEntered=" + QtyEntered + "->" + QtyEntered1); + QtyEntered = QtyEntered1; + mTab.setValue("QtyEntered", QtyEntered); + } + QtyOrdered = MUOMConversion.convertProductFrom (ctx, M_Product_ID, + C_UOM_To_ID, QtyEntered); + if (QtyOrdered == null) + QtyOrdered = QtyEntered; + boolean conversion = QtyEntered.compareTo(QtyOrdered) != 0; + log.fine("UOM=" + C_UOM_To_ID + + ", QtyEntered=" + QtyEntered + + " -> " + conversion + + " QtyOrdered=" + QtyOrdered); + Env.setContext(ctx, WindowNo, "UOMConversion", conversion ? "Y" : "N"); + mTab.setValue("QtyOrdered", QtyOrdered); + } + // QtyOrdered changed - calculate QtyEntered (should not happen) + else if (mField.getColumnName().equals("QtyOrdered")) + { + int C_UOM_To_ID = Env.getContextAsInt(ctx, WindowNo, "C_UOM_ID"); + QtyOrdered = (BigDecimal)value; + int precision = MProduct.get(ctx, M_Product_ID).getUOMPrecision(); + BigDecimal QtyOrdered1 = QtyOrdered.setScale(precision, BigDecimal.ROUND_HALF_UP); + if (QtyOrdered.compareTo(QtyOrdered1) != 0) + { + log.fine("Corrected QtyOrdered Scale " + + QtyOrdered + "->" + QtyOrdered1); + QtyOrdered = QtyOrdered1; + mTab.setValue("QtyOrdered", QtyOrdered); + } + QtyEntered = MUOMConversion.convertProductTo (ctx, M_Product_ID, + C_UOM_To_ID, QtyOrdered); + if (QtyEntered == null) + QtyEntered = QtyOrdered; + boolean conversion = QtyOrdered.compareTo(QtyEntered) != 0; + log.fine("UOM=" + C_UOM_To_ID + + ", QtyOrdered=" + QtyOrdered + + " -> " + conversion + + " QtyEntered=" + QtyEntered); + Env.setContext(ctx, WindowNo, "UOMConversion", conversion ? "Y" : "N"); + mTab.setValue("QtyEntered", QtyEntered); + } + else + { + // QtyEntered = (BigDecimal)mTab.getValue("QtyEntered"); + QtyOrdered = (BigDecimal)mTab.getValue("QtyOrdered"); + } + + // Storage + if (M_Product_ID != 0 + && Env.isSOTrx(ctx, WindowNo) + && QtyOrdered.signum() > 0) // no negative (returns) + { + MProduct product = MProduct.get (ctx, M_Product_ID); + if (product.isStocked()) + { + int M_Warehouse_ID = Env.getContextAsInt(ctx, WindowNo, "M_Warehouse_ID"); + int M_AttributeSetInstance_ID = Env.getContextAsInt(ctx, WindowNo, "M_AttributeSetInstance_ID"); + BigDecimal available = MStorage.getQtyAvailable + (M_Warehouse_ID, M_Product_ID, M_AttributeSetInstance_ID, null); + if (available == null) + available = Env.ZERO; + if (available.signum() == 0) + mTab.fireDataStatusEEvent ("NoQtyAvailable", "0", false); + else if (available.compareTo(QtyOrdered) < 0) + mTab.fireDataStatusEEvent ("InsufficientQtyAvailable", available.toString(), false); + else + { + Integer C_OrderLine_ID = (Integer)mTab.getValue("C_OrderLine_ID"); + if (C_OrderLine_ID == null) + C_OrderLine_ID = new Integer(0); + BigDecimal notReserved = MOrderLine.getNotReserved(ctx, + M_Warehouse_ID, M_Product_ID, M_AttributeSetInstance_ID, + C_OrderLine_ID.intValue()); + if (notReserved == null) + notReserved = Env.ZERO; + BigDecimal total = available.subtract(notReserved); + if (total.compareTo(QtyOrdered) < 0) + { + String info = Msg.parseTranslation(ctx, "@QtyAvailable@=" + available + + " - @QtyNotReserved@=" + notReserved + " = " + total); + mTab.fireDataStatusEEvent ("InsufficientQtyAvailable", + info, false); + } + } + } + } + // + setCalloutActive(false); + return ""; + } // qty + +} // CalloutOrder +