CalloutOrder.java
| Index Score | ||
|---|---|---|
![]() |
![]() |
org.compiere.model |
![]() |
![]() |
Compiere |
View: Reasons, Metrics, Source Code
These are the metrics that contribute to the Enerjy Score for this file, ranked by impact. So the metrics listed at the top influence the score to a greater extent that the metrics listed at the bottom.
| Metric | Description | |
|---|---|---|
/******************************************************************************
* Product: Compiere ERP & CRM Smart Business Solution *
* Copyright (C) 1999-2007 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., 3600 Bridge Parkway #102, Redwood City, CA 94065, 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.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 $
* @deprecated
*/
@Deprecated
public class CalloutOrder extends CalloutEngine
{
/** Logger */
private CLogger log = CLogger.getCLogger(getClass());
/** 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 (Ctx ctx, int WindowNo, GridTab mTab, GridField mField,
Object value, Object oldValue)
{
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");
if ((oldC_DocType_ID == null || oldC_DocType_ID.intValue() == 0)
&& oldValue != null) // get old Target
oldC_DocType_ID = (Integer)oldValue;
String sql = "SELECT d.DocSubTypeSO,d.HasCharges,'N'," // 1..3
+ "d.IsDocNoControlled,s.CurrentNext,s.CurrentNextSys," // 4..6
+ "s.AD_Sequence_ID,d.IsSOTrx, d.IsReturnTrx " // 7..9
+ "FROM C_DocType d "
+ "LEFT OUTER JOIN AD_Sequence s ON (d.DocNoSequence_ID=s.AD_Sequence_ID) "
+ "WHERE C_DocType_ID=?"; // #1
try
{
int AD_Sequence_ID = 0;
// Get old AD_SeqNo for comparison
if (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(7);
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;
boolean isReturnTrx = false;
if (rs.next()) // we found document type
{
// Set Context: Document Sub Type for Sales Orders
DocSubTypeSO = rs.getString(1);
if (DocSubTypeSO == null)
DocSubTypeSO = "--";
ctx.setContext( WindowNo, "OrderType", DocSubTypeSO);
// No Drop Ship other than Standard
if (!DocSubTypeSO.equals(MOrder.DocSubTypeSO_Standard))
mTab.setValue ("IsDropShip", "N");
// IsSOTrx
if ("N".equals(rs.getString(8)))
IsSOTrx = false;
//IsReturnTrx
isReturnTrx = "Y".equals(rs.getString(9));
// Skip these steps for RMA. These are copied from the Original Order
if(!isReturnTrx)
{
if (DocSubTypeSO.equals(MOrder.DocSubTypeSO_POS))
mTab.setValue ("DeliveryRule", X_C_Order.DELIVERYRULE_Force);
else if (DocSubTypeSO.equals(MOrder.DocSubTypeSO_Prepay))
mTab.setValue ("DeliveryRule", X_C_Order.DELIVERYRULE_AfterReceipt);
else
mTab.setValue ("DeliveryRule", X_C_Order.DELIVERYRULE_Availability);
// Invoice Rule
if (DocSubTypeSO.equals(MOrder.DocSubTypeSO_POS)
|| DocSubTypeSO.equals(MOrder.DocSubTypeSO_Prepay)
|| DocSubTypeSO.equals(MOrder.DocSubTypeSO_OnCredit) )
mTab.setValue ("InvoiceRule", X_C_Order.INVOICERULE_Immediate);
else
mTab.setValue ("InvoiceRule", X_C_Order.INVOICERULE_AfterDelivery);
// Payment Rule - POS Order
if (DocSubTypeSO.equals(MOrder.DocSubTypeSO_POS))
mTab.setValue("PaymentRule", X_C_Order.PAYMENTRULE_Cash);
else
mTab.setValue("PaymentRule", X_C_Order.PAYMENTRULE_OnCredit);
// Set Context:
ctx.setContext( WindowNo, "HasCharges", rs.getString(2));
}
else // Returns
{
if (DocSubTypeSO.equals(MOrder.DocSubTypeSO_POS))
mTab.setValue ("DeliveryRule", X_C_Order.DELIVERYRULE_Force);
else
mTab.setValue ("DeliveryRule", X_C_Order.DELIVERYRULE_Manual);
}
// DocumentNo
if (rs.getString(4).equals("Y")) // IsDocNoControlled
{
if (AD_Sequence_ID != rs.getInt(7))
newDocNo = true;
if (newDocNo)
if (Ini.isPropertyBool(Ini.P_COMPIERESYS) && Env.getCtx().getAD_Client_ID() < 1000000)
mTab.setValue("DocumentNo", "<" + rs.getString(6) + ">");
else
mTab.setValue("DocumentNo", "<" + rs.getString(5) + ">");
}
}
rs.close();
pstmt.close();
// Skip remaining steps for RMA
if (isReturnTrx)
return "";
// 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 = ctx.getContextAsInt( 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 (Ctx 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 "";
// Skip rest of steps for RMA. These fields are copied over from the orignal order instead.
boolean isReturnTrx = (Boolean)mTab.getValue("IsReturnTrx");
if (isReturnTrx)
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.SalesRep_ID,"
+ " 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, lship.IsBillTo ShipToIsBillTo "
+ "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 AND c.IsActive='Y') "
+ "WHERE p.C_BPartner_ID=? AND p.IsActive='Y'"; // #1
boolean IsSOTrx = ctx.isSOTrx(WindowNo);
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 = ctx.getContextAsInt( "#M_PriceList_ID");
if (i != 0)
mTab.setValue("M_PriceList_ID", new Integer(i));
}
// Bill-To BPartner
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(ctx.getContext( Env.WINDOW_INFO, Env.TAB_INFO, "C_BPartner_ID")))
{
String loc = ctx.getContext( 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));
if ("Y".equals(rs.getString("ShipToIsBillTo"))) // set the same
mTab.setValue("Bill_Location_ID", new Integer(shipTo_ID));
}
// Contact - overwritten by InfoBP selection
int contID = rs.getInt("AD_User_ID");
if (C_BPartner_ID.toString().equals(ctx.getContext( Env.WINDOW_INFO, Env.TAB_INFO, "C_BPartner_ID")))
{
String cont = ctx.getContext( 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));
}
/* If user logged in is not a SalesRep, default the SalesRep associated with
* the customer.
*/
if(!MUser.isSalesRep(ctx.getAD_User_ID()) && IsSOTrx)
{
int SalesRep_ID=rs.getInt("SalesRep_ID");
if(SalesRep_ID!=0)
mTab.setValue("SalesRep_ID", SalesRep_ID);
}
// CreditAvailable
if (IsSOTrx)
{
double CreditLimit = rs.getDouble("SO_CreditLimit");
// String SOCreditStatus = rs.getString("SOCreditStatus");
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");
// Defaults, if not Walkin Receipt or Walkin Invoice
String OrderType = ctx.getContext( WindowNo, "OrderType");
mTab.setValue("InvoiceRule", X_C_Order.INVOICERULE_AfterDelivery);
mTab.setValue("DeliveryRule", X_C_Order.DELIVERYRULE_Availability);
mTab.setValue("PaymentRule", X_C_Order.PAYMENTRULE_OnCredit);
if (OrderType.equals(MOrder.DocSubTypeSO_Prepay))
{
mTab.setValue("InvoiceRule", X_C_Order.INVOICERULE_Immediate);
mTab.setValue("DeliveryRule", X_C_Order.DELIVERYRULE_AfterReceipt);
}
else if (OrderType.equals(MOrder.DocSubTypeSO_POS)) // for POS
mTab.setValue("PaymentRule", X_C_Order.PAYMENTRULE_Cash);
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);
//
mTab.setValue("C_Project_ID", null);
}
}
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 (Ctx 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 "";
// Skip rest of steps for RMA
boolean isReturnTrx = (Boolean)mTab.getValue("IsReturnTrx");
if (isReturnTrx)
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(ctx.getContext( 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 = ctx.getContextAsInt( "#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(ctx.getContext( Env.WINDOW_INFO, Env.TAB_INFO, "C_BPartner_ID")))
{
String loc = ctx.getContext( 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(ctx.getContext( Env.WINDOW_INFO, Env.TAB_INFO, "C_BPartner_ID")))
{
String cont = ctx.getContext( 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");
// Order Reference should not be set by Bill To BPartner; only by BPartner.
/* 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 = ctx.getContext( WindowNo, "OrderType");
mTab.setValue("InvoiceRule", X_C_Order.INVOICERULE_AfterDelivery);
mTab.setValue("PaymentRule", X_C_Order.PAYMENTRULE_OnCredit);
if (OrderType.equals(MOrder.DocSubTypeSO_Prepay))
mTab.setValue("InvoiceRule", X_C_Order.INVOICERULE_Immediate);
else if (OrderType.equals(MOrder.DocSubTypeSO_POS)) // for POS
mTab.setValue("PaymentRule", X_C_Order.PAYMENTRULE_Cash);
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
/**
* Set Delivery Rule if Warehouse is changed.
* @param ctx context
* @param WindowNo window no
* @param mTab tab
* @param mField field
* @param value value
* @return null or error message
*/
public String warehouse (Ctx ctx, int WindowNo, GridTab mTab, GridField mField, Object value)
{
if (isCalloutActive()) // assuming it is resetting value
return "";
Integer M_Warehouse_ID = (Integer)value;
if (M_Warehouse_ID == null || M_Warehouse_ID.intValue() == 0)
return "";
MWarehouse wh = new MWarehouse(ctx, M_Warehouse_ID, null);
String DeliveryRule = mTab.get_ValueAsString("DeliveryRule");
if((wh.isDisallowNegativeInv() && DeliveryRule.equals(MOrder.DELIVERYRULE_Force)) ||
(DeliveryRule == null || DeliveryRule.length()==0))
mTab.setValue("DeliveryRule",MOrder.DELIVERYRULE_Availability);
return "";
} // warehouse
/**
* Set PriceList parameters based on the date ordered.
* org.compiere.model.CalloutOrder.dateOrdered
* @param ctx context
* @param WindowNo window no
* @param mTab tab
* @param mField field
* @param value value
* @return null or error message
*/
public String dateOrdered (Ctx ctx, int WindowNo, GridTab mTab, GridField mField, Object value)
{
if (isCalloutActive()) // assuming it is resetting value
return "";
if (value == null || !(value instanceof Timestamp))
return "";
mTab.setValue("DateAcct", value);
return(setPriceListVersion(ctx, WindowNo, mTab));
} // dateAcct
private String setPriceListVersion(Ctx ctx, int WindowNo, GridTab mTab)
{
Integer M_PriceList_ID = ctx.getContextAsInt( WindowNo, "M_PriceList_ID");
if (M_PriceList_ID == null || M_PriceList_ID.intValue()== 0)
return "";
Timestamp orderDate = new Timestamp(ctx.getContextAsTime( WindowNo, "DateOrdered"));
if (orderDate == null || !(orderDate instanceof Timestamp))
return "";
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
+ " AND plv.ValidFrom <=? " // 2
+ " AND plv.IsActive='Y' "
+ "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());
pstmt.setTimestamp(2, orderDate);
ResultSet rs = pstmt.executeQuery();
if (rs.next())
{
// Tax Included
mTab.setValue("IsTaxIncluded", new Boolean("Y".equals(rs.getString(1))));
// Price Limit Enforce
ctx.setContext(WindowNo, "EnforcePriceLimit", rs.getString(2));
// Currency
Integer ii = new Integer(rs.getInt(3));
mTab.setValue("C_Currency_ID", ii);
// PriceList Version
ctx.setContext(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 "";
}
/**
* 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 (Ctx 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");
return(setPriceListVersion(ctx, WindowNo, mTab));
} // 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 (Ctx 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 "";
boolean isReturnTrx = "Y".equals(ctx.getContext(WindowNo,"IsReturnTrx"));
if (isReturnTrx)
return "";
setCalloutActive(true);
if (steps) log.warning("init");
//
mTab.setValue("C_Charge_ID", null);
// Set Attribute
if (ctx.getContextAsInt( Env.WINDOW_INFO, Env.TAB_INFO, "M_Product_ID") == M_Product_ID.intValue()
&& ctx.getContextAsInt( Env.WINDOW_INFO, Env.TAB_INFO, "M_AttributeSetInstance_ID") != 0)
mTab.setValue("M_AttributeSetInstance_ID", new Integer(ctx.getContextAsInt( 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 = ctx.getContextAsInt( WindowNo, "C_BPartner_ID");
BigDecimal Qty = (BigDecimal)mTab.getValue("QtyOrdered");
boolean IsSOTrx = ctx.getContext( WindowNo, "IsSOTrx").equals("Y");
MProductPricing pp = new MProductPricing (ctx.getAD_Client_ID(), ctx.getAD_Org_ID(),
M_Product_ID.intValue(), C_BPartner_ID, Qty, IsSOTrx);
setPriceListVersion(ctx, WindowNo, mTab);
int M_PriceList_ID = ctx.getContextAsInt( WindowNo, "M_PriceList_ID");
int M_PriceList_Version_ID = ctx.getContextAsInt( WindowNo, "M_PriceList_Version_ID");
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);
pp.calculatePrice();
if (!pp.isCalculated())
{
mTab.setValue("PriceList", BigDecimal.ZERO);
mTab.setValue("PriceLimit", BigDecimal.ZERO);
mTab.setValue("PriceActual", BigDecimal.ZERO);
mTab.setValue("PriceEntered", BigDecimal.ZERO);
setCalloutActive(false);
return Msg.getMsg(ctx, "ProductNotOnPriceList");
}
//
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"));
ctx.setContext( WindowNo, "EnforcePriceLimit", pp.isEnforcePriceLimit() ? "Y" : "N");
ctx.setContext( WindowNo, "DiscountSchema", pp.isDiscountSchema() ? "Y" : "N");
// Check/Update Warehouse Setting
// int M_Warehouse_ID = ctx.getContextAsInt( 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 (ctx.isSOTrx(WindowNo))
{
MProduct product = MProduct.get (ctx, M_Product_ID.intValue());
if (product.isStocked())
{
BigDecimal QtyOrdered = (BigDecimal)mTab.getValue("QtyOrdered");
int M_Warehouse_ID = ctx.getContextAsInt( WindowNo, "M_Warehouse_ID");
int M_AttributeSetInstance_ID = ctx.getContextAsInt( 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 (Ctx 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 "";
boolean isReturnTrx = "Y".equals(ctx.getContext("IsReturnTrx"));
if (isReturnTrx)
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
ctx.setContext( 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 (Ctx 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 = ctx.getContextAsInt( 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 = ctx.getContextAsInt( 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 = ctx.getContextAsInt( 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 = new Timestamp(ctx.getContextAsTime( WindowNo, "DateOrdered"));
log.fine("Bill Date=" + billDate);
Timestamp shipDate = new Timestamp(ctx.getContextAsTime( WindowNo, "DatePromised"));
log.fine("Ship Date=" + shipDate);
int AD_Org_ID = ctx.getContextAsInt( WindowNo, "AD_Org_ID");
log.fine("Org=" + AD_Org_ID);
int M_Warehouse_ID = ctx.getContextAsInt( WindowNo, "M_Warehouse_ID");
log.fine("Warehouse=" + M_Warehouse_ID);
int billC_BPartner_Location_ID = ctx.getContextAsInt( 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(ctx.getContext( 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 (Ctx 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 = ctx.getContextAsInt( WindowNo, "C_UOM_ID");
int M_Product_ID = ctx.getContextAsInt( WindowNo, "M_Product_ID");
int M_PriceList_ID = ctx.getContextAsInt( WindowNo, "M_PriceList_ID");
int StdPrecision = MPriceList.getPricePrecision(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(ctx.getContext( WindowNo, "DiscountSchema")))
{
int C_BPartner_ID = ctx.getContextAsInt( 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 = ctx.getContext( WindowNo, "IsSOTrx").equals("Y");
MProductPricing pp = new MProductPricing (ctx.getAD_Client_ID(), ctx.getAD_Org_ID(),
M_Product_ID, C_BPartner_ID, QtyOrdered, IsSOTrx);
pp.setM_PriceList_ID(M_PriceList_ID);
int M_PriceList_Version_ID = ctx.getContextAsInt( WindowNo, "M_PriceList_Version_ID");
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());
PriceActual = pp.getPriceStd();
mTab.setValue("PriceActual", PriceActual);
mTab.setValue("Discount", pp.getDiscount());
mTab.setValue("PriceEntered", PriceEntered);
ctx.setContext( 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 = ctx.getContext( WindowNo, "EnforcePriceLimit");
boolean enforce = ctx.isSOTrx(WindowNo) && epl != null && epl.equals("Y");
boolean isReturnTrx = "Y".equals(ctx.getContext(WindowNo, "IsReturnTrx"));
if (enforce && (MRole.getDefault().isOverwritePriceLimit() || isReturnTrx))
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 (Ctx ctx, int WindowNo, GridTab mTab, GridField mField, Object value)
{
if (isCalloutActive() || value == null)
return "";
setCalloutActive(true);
int M_Product_ID = ctx.getContextAsInt( WindowNo, "M_Product_ID");
if (steps) log.warning("init - M_Product_ID=" + M_Product_ID + " - " );
BigDecimal QtyOrdered = Env.ZERO;
BigDecimal QtyEntered = Env.ZERO;
BigDecimal PriceActual, PriceEntered;
// Check for RMA
boolean isReturnTrx = "Y".equals(ctx.getContext(WindowNo, "IsReturnTrx"));
// 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);
ctx.setContext( 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 = ctx.getContextAsInt( 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);
ctx.setContext( 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 = ctx.getContextAsInt( 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);
ctx.setContext( WindowNo, "UOMConversion", conversion ? "Y" : "N");
mTab.setValue("QtyEntered", QtyEntered);
}
else
{
// QtyEntered = (BigDecimal)mTab.getValue("QtyEntered");
QtyOrdered = (BigDecimal)mTab.getValue("QtyOrdered");
}
if(M_Product_ID != 0
&& isReturnTrx)
{
Integer inOutLine_ID = (Integer)mTab.getValue("Orig_InOutLine_ID");
if(inOutLine_ID != 0)
{
MInOutLine inOutLine = new MInOutLine (ctx, inOutLine_ID, null);
BigDecimal shippedQty = inOutLine.getMovementQty();
QtyOrdered = (BigDecimal)mTab.getValue("QtyOrdered");
if(shippedQty.compareTo(QtyOrdered)<0)
{
if(ctx.isSOTrx(WindowNo))
mTab.fireDataStatusEEvent ("QtyShippedLessThanQtyReturned", shippedQty.toString(), false);
else
mTab.fireDataStatusEEvent ("QtyReceivedLessThanQtyReturned", shippedQty.toString(), false);
mTab.setValue ("QtyOrdered",shippedQty);
QtyOrdered = shippedQty;
int C_UOM_To_ID = ctx.getContextAsInt( WindowNo, "C_UOM_ID");
QtyEntered = MUOMConversion.convertProductTo (ctx, M_Product_ID,
C_UOM_To_ID, QtyOrdered);
if (QtyEntered == null)
QtyEntered = QtyOrdered;
mTab.setValue ("QtyEntered",QtyEntered);
log.fine("QtyEntered : "+ QtyEntered.toString() +
"QtyOrdered : " + QtyOrdered.toString());
}
}
}
// Storage
if (M_Product_ID != 0
&& ctx.isSOTrx(WindowNo)
&& QtyOrdered.signum() > 0
&& !isReturnTrx) // no negative (returns)
{
MProduct product = MProduct.get (ctx, M_Product_ID);
if (product.isStocked())
{
int M_Warehouse_ID = ctx.getContextAsInt( WindowNo, "M_Warehouse_ID");
int M_AttributeSetInstance_ID = ctx.getContextAsInt( 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
/**
* Orig_Order - Orig Order Defaults.
* @param ctx
* @param WindowNo
* @param mTab
* @param mField
* @param value
* @return error message or ""
*/
public String Orig_Order (Ctx ctx, int WindowNo, GridTab mTab, GridField mField, Object value)
{
Integer C_Order_ID = (Integer)value;
if (C_Order_ID == null || C_Order_ID.intValue() == 0)
return "";
// Get Details from Original Order
MOrder order = new MOrder (ctx, C_Order_ID, null);
MBPartner bpartner = new MBPartner (ctx, order.getC_BPartner_ID(), null);
// Reset Orig Shipment
mTab.setValue("Orig_InOut_ID", null);
mTab.setValue("C_BPartner_ID", order.getC_BPartner_ID());
mTab.setValue("C_BPartner_Location_ID", order.getC_BPartner_Location_ID());
mTab.setValue("Bill_BPartner_ID",order.getBill_BPartner_ID());
mTab.setValue("Bill_Location_ID", order.getBill_Location_ID());
if(order.getAD_User_ID()!=0)
mTab.setValue("AD_User_ID", order.getAD_User_ID());
if(order.getBill_User_ID()!=0)
mTab.setValue("Bill_User_ID", order.getBill_User_ID());
if(ctx.isSOTrx(WindowNo))
mTab.setValue("M_ReturnPolicy_ID", bpartner.getM_ReturnPolicy_ID());
else
mTab.setValue("M_ReturnPolicy_ID", bpartner.getPO_ReturnPolicy_ID());
//mTab.setValue("DateOrdered", order.getDateOrdered());
mTab.setValue("M_PriceList_ID", order.getM_PriceList_ID());
mTab.setValue("PaymentRule", order.getPaymentRule());
mTab.setValue("C_PaymentTerm_ID", order.getC_PaymentTerm_ID());
//mTab.setValue ("DeliveryRule", X_C_Order.DELIVERYRULE_Manual);
mTab.setValue("Bill_Location_ID", order.getBill_Location_ID());
mTab.setValue("InvoiceRule", order.getInvoiceRule());
mTab.setValue("PaymentRule", order.getPaymentRule());
mTab.setValue("DeliveryViaRule", order.getDeliveryViaRule());
mTab.setValue("FreightCostRule",order.getFreightCostRule());
return "";
} /* Orig Order */
/**
* Orig_InOut - Shipment Line Defaults.
* @param ctx
* @param WindowNo
* @param mTab
* @param mField
* @param value
* @return error message or ""
*/
public String Orig_InOut (Ctx ctx, int WindowNo, GridTab mTab, GridField mField, Object value)
{
Integer Orig_InOut_ID = (Integer)value;
if (Orig_InOut_ID == null || Orig_InOut_ID.intValue() == 0)
return "";
// Get Details from Original Shipment
MInOut io = new MInOut (ctx, Orig_InOut_ID, null);
mTab.setValue("C_Project_ID", io.getC_Project_ID());
mTab.setValue("C_Campaign_ID", io.getC_Campaign_ID());
mTab.setValue("C_Activity_ID", io.getC_Activity_ID());
mTab.setValue("AD_OrgTrx_ID", io.getAD_OrgTrx_ID());
mTab.setValue("User1_ID", io.getUser1_ID());
mTab.setValue("User2_ID", io.getUser2_ID());
return "";
}
/**
* Orig_Order - Orig Order Defaults.
* @param ctx
* @param WindowNo
* @param mTab
* @param mField
* @param value
* @return error message or ""
*/
public String Orig_OrderLine (Ctx ctx, int WindowNo, GridTab mTab, GridField mField, Object value)
{
Integer Orig_OrderLine_ID = (Integer)value;
if (Orig_OrderLine_ID == null || Orig_OrderLine_ID.intValue() == 0)
return "";
MOrderLine orderline = new MOrderLine (ctx, Orig_OrderLine_ID, null);
mTab.setValue("Orig_InOutLine_ID", null);
mTab.setValue("C_Tax_ID", orderline.getC_Tax_ID());
mTab.setValue("PriceList", orderline.getPriceList());
mTab.setValue("PriceLimit", orderline.getPriceLimit());
mTab.setValue("PriceActual", orderline.getPriceActual());
mTab.setValue("PriceEntered", orderline.getPriceEntered());
mTab.setValue("C_Currency_ID", orderline.getC_Currency_ID());
mTab.setValue("Discount", orderline.getDiscount());
mTab.setValue("Discount",orderline.getDiscount());
return "";
}
/**
* Orig_InOutLine - Shipment Line Defaults.
* @param ctx
* @param WindowNo
* @param mTab
* @param mField
* @param value
* @return error message or ""
*/
public String Orig_InOutLine (Ctx ctx, int WindowNo, GridTab mTab, GridField mField, Object value)
{
Integer Orig_InOutLine_ID = (Integer)value;
if (Orig_InOutLine_ID == null || Orig_InOutLine_ID.intValue() == 0)
return "";
// Get Details
MInOutLine Orig_InOutLine = new MInOutLine (ctx, Orig_InOutLine_ID.intValue(), null);
if (Orig_InOutLine != null && Orig_InOutLine.get_ID()!=0)
{
mTab.setValue("C_Project_ID",Orig_InOutLine.getC_Project_ID());
mTab.setValue("C_Campaign_ID",Orig_InOutLine.getC_Campaign_ID());
mTab.setValue("M_Product_ID", Orig_InOutLine.getM_Product_ID());
mTab.setValue("M_AttributeSetInstance_ID", Orig_InOutLine.getM_AttributeSetInstance_ID());
mTab.setValue("C_UOM_ID", Orig_InOutLine.getC_UOM_ID());
}
return "";
} // Orig_InOutLine
} // CalloutOrder
The table below shows all metrics for CalloutOrder.java.
| Metric | Value | Description | |
|---|---|---|---|



