📄 muomconversion.java
字号:
*/
public static BigDecimal convert (int C_UOM_From_ID, int C_UOM_To_ID,
BigDecimal qty, boolean StdPrecision)
{
// Nothing to do
if (qty == null || qty.equals(Env.ZERO)
|| C_UOM_From_ID == C_UOM_To_ID)
return qty;
//
BigDecimal retValue = null;
int precision = 2;
String sql = "SELECT c.MultiplyRate, uomTo.StdPrecision, uomTo.CostingPrecision "
+ "FROM C_UOM_Conversion c"
+ " INNER JOIN C_UOM uomTo ON (c.C_UOM_TO_ID=uomTo.C_UOM_ID) "
+ "WHERE c.IsActive='Y' AND c.C_UOM_ID=? AND c.C_UOM_TO_ID=? " // #1/2
+ " AND c.M_Product_ID IS NULL"
+ "ORDER BY c.AD_Client_ID DESC, c.AD_Org_ID DESC";
PreparedStatement pstmt = null;
try
{
pstmt = DB.prepareStatement(sql, null);
pstmt.setInt(1, C_UOM_From_ID);
pstmt.setInt(2, C_UOM_To_ID);
ResultSet rs = pstmt.executeQuery();
if (rs.next())
{
retValue = rs.getBigDecimal(1);
precision = rs.getInt(StdPrecision ? 2 : 3);
}
rs.close();
pstmt.close();
pstmt = null;
}
catch (Exception e)
{
s_log.log(Level.SEVERE, sql, e);
}
try
{
if (pstmt != null)
pstmt.close();
pstmt = null;
}
catch (Exception e)
{
pstmt = null;
}
if (retValue == null)
{
s_log.info ("NOT found - FromUOM=" + C_UOM_From_ID
+ ", ToUOM=" + C_UOM_To_ID);
return null;
}
// Just get Rate
if (GETRATE.equals(qty))
return retValue;
// Calculate & Scale
retValue = retValue.multiply(qty);
if (retValue.scale() > precision)
retValue = retValue.setScale(precision, BigDecimal.ROUND_HALF_UP);
return retValue;
} // convert
/**************************************************************************
* Convert Qty/Amt from entered UOM TO product UoM and round.
* @param ctx context
* @param M_Product_ID product
* @param C_UOM_To_ID entered UOM
* @param qtyPrice entered quantity or price
* @return Product: Qty/Amt in product UoM (precision rounded)
*/
static public BigDecimal convertProductTo (Properties ctx,
int M_Product_ID, int C_UOM_To_ID, BigDecimal qtyPrice)
{
if (qtyPrice == null || qtyPrice.signum() == 0
|| M_Product_ID == 0 || C_UOM_To_ID == 0)
return qtyPrice;
BigDecimal retValue = getProductRateTo (ctx, M_Product_ID, C_UOM_To_ID);
if (retValue != null)
{
if (Env.ONE.compareTo(retValue) == 0)
return qtyPrice;
MUOM uom = MUOM.get (ctx, C_UOM_To_ID);
if (uom != null)
return uom.round(retValue.multiply(qtyPrice), true);
return retValue.multiply(qtyPrice);
}
return null;
} // convertProductTo
/**
* Get Multiplier Rate from entered UOM TO product UoM
* @param ctx context
* @param M_Product_ID product
* @param C_UOM_To_ID entered UOM
* @return multiplier or null
*/
static public BigDecimal getProductRateTo (Properties ctx,
int M_Product_ID, int C_UOM_To_ID)
{
if (M_Product_ID == 0)
return null;
MUOMConversion[] rates = getProductConversions(ctx, M_Product_ID);
if (rates.length == 0)
{
s_log.fine("None found");
return null;
}
for (int i = 0; i < rates.length; i++)
{
MUOMConversion rate = rates[i];
if (rate.getC_UOM_To_ID() == C_UOM_To_ID)
return rate.getMultiplyRate();
}
s_log.fine("None applied");
return null;
} // getProductRateTo
/**
* Convert Qty/Amt FROM product UOM to entered UOM and round.
* @param ctx context
* @param M_Product_ID product
* @param C_UOM_To_ID entered UOM
* @param qtyPrice quantity or price
* @return Entered: Qty in entered UoM (precision rounded)
*/
static public BigDecimal convertProductFrom (Properties ctx,
int M_Product_ID, int C_UOM_To_ID, BigDecimal qtyPrice)
{
// No conversion
if (qtyPrice == null || qtyPrice.equals(Env.ZERO)
|| C_UOM_To_ID == 0|| M_Product_ID == 0)
{
s_log.fine("No Conversion - QtyPrice=" + qtyPrice);
return qtyPrice;
}
BigDecimal retValue = getProductRateFrom (ctx, M_Product_ID, C_UOM_To_ID);
if (retValue != null)
{
if (Env.ONE.compareTo(retValue) == 0)
return qtyPrice;
MUOM uom = MUOM.get (ctx, C_UOM_To_ID);
if (uom != null)
return uom.round(retValue.multiply(qtyPrice), true);
return retValue.multiply(qtyPrice);
}
s_log.fine("No Rate M_Product_ID=" + M_Product_ID);
return null;
} // convertProductFrom
/**
* Get Divide Rate FROM product UOM to entered UOM and round.
* @param ctx context
* @param M_Product_ID product
* @param C_UOM_To_ID entered UOM
* @return divisor or null
*/
static public BigDecimal getProductRateFrom (Properties ctx,
int M_Product_ID, int C_UOM_To_ID)
{
MUOMConversion[] rates = getProductConversions(ctx, M_Product_ID);
if (rates.length == 0)
{
s_log.fine("getProductRateFrom - none found");
return null;
}
for (int i = 0; i < rates.length; i++)
{
MUOMConversion rate = rates[i];
if (rate.getC_UOM_To_ID() == C_UOM_To_ID)
return rate.getDivideRate();
}
s_log.fine("None applied");
return null;
} // getProductRateFrom
/**
* Get Product Conversions (cached)
* @param ctx context
* @param M_Product_ID product
* @return array of conversions
*/
static public MUOMConversion[] getProductConversions (Properties ctx, int M_Product_ID)
{
if (M_Product_ID == 0)
return new MUOMConversion[0];
Integer key = new Integer (M_Product_ID);
MUOMConversion[] result = (MUOMConversion[])s_conversionProduct.get(key);
if (result != null)
return result;
ArrayList<MUOMConversion> list = new ArrayList<MUOMConversion>();
// Add default conversion
MUOMConversion defRate = new MUOMConversion (MProduct.get(ctx, M_Product_ID));
list.add(defRate);
//
String sql = "SELECT * FROM C_UOM_Conversion c "
+ "WHERE c.M_Product_ID=?"
+ " AND EXISTS (SELECT * FROM M_Product p "
+ "WHERE c.M_Product_ID=p.M_Product_ID AND c.C_UOM_ID=p.C_UOM_ID)"
+ " AND c.IsActive='Y'";
PreparedStatement pstmt = null;
try
{
pstmt = DB.prepareStatement (sql, null);
pstmt.setInt (1, M_Product_ID);
ResultSet rs = pstmt.executeQuery ();
while (rs.next ())
list.add(new MUOMConversion(ctx, rs, null));
rs.close ();
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
s_log.log(Level.SEVERE, sql, e);
}
try
{
if (pstmt != null)
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
pstmt = null;
}
// Convert & save
result = new MUOMConversion[list.size ()];
list.toArray (result);
s_conversionProduct.put(key, result);
s_log.fine("getProductConversions - M_Product_ID=" + M_Product_ID + " #" + result.length);
return result;
} // getProductConversions
/** Static Logger */
private static CLogger s_log = CLogger.getCLogger(MUOMConversion.class);
/** Indicator for Rate */
private static BigDecimal GETRATE = new BigDecimal(123.456);
/** Conversion Map: Key=Point(from,to) Value=BigDecimal */
private static CCache<Point,BigDecimal> s_conversions = null;
/** Product Conversion Map */
private static CCache<Integer,MUOMConversion[]> s_conversionProduct
= new CCache<Integer,MUOMConversion[]>("C_UOMConversion", 20);
/**************************************************************************
* Default Constructor
* @param ctx context
* @param C_UOM_Conversion_ID id
*/
public MUOMConversion (Properties ctx, int C_UOM_Conversion_ID, String trxName)
{
super(ctx, C_UOM_Conversion_ID, trxName);
} // MUOMConversion
/**
* Load Constructor
* @param ctx context
* @param rs result set
*/
public MUOMConversion(Properties ctx, ResultSet rs, String trxName)
{
super(ctx, rs, trxName);
} // MUOMConversion
/**
* Parent Constructor
* @param parent uom parent
*/
public MUOMConversion (MUOM parent)
{
this(parent.getCtx(), 0, parent.get_TrxName());
setClientOrg (parent);
setC_UOM_ID (parent.getC_UOM_ID());
setM_Product_ID(0);
//
setC_UOM_To_ID (parent.getC_UOM_ID());
setMultiplyRate(Env.ONE);
setDivideRate(Env.ONE);
} // MUOMConversion
/**
* Parent Constructor
* @param parent product parent
*/
public MUOMConversion (MProduct parent)
{
this(parent.getCtx(), 0, parent.get_TrxName());
setClientOrg (parent);
setC_UOM_ID (parent.getC_UOM_ID());
setM_Product_ID(parent.getM_Product_ID());
//
setC_UOM_To_ID (parent.getC_UOM_ID());
setMultiplyRate(Env.ONE);
setDivideRate(Env.ONE);
} // MUOMConversion
/**
* Before Save
* @param newRecord new
* @return true if can be saved
*/
protected boolean beforeSave (boolean newRecord)
{
// From - To is the same
if (getC_UOM_ID() == getC_UOM_To_ID())
{
log.saveError("Error", Msg.parseTranslation(getCtx(), "@C_UOM_ID@ = @C_UOM_ID@"));
return false;
}
// Nothing to convert
if (getMultiplyRate().compareTo(Env.ZERO) <= 0)
{
log.saveError("Error", Msg.parseTranslation(getCtx(), "@MultiplyRate@ <= 0"));
return false;
}
// Enforce Product UOM
if (getM_Product_ID() != 0
&& (newRecord || is_ValueChanged("M_Product_ID")))
{
MProduct product = MProduct.get(getCtx(), getM_Product_ID());
if (product.getC_UOM_ID() != getC_UOM_ID())
{
MUOM uom = MUOM.get(getCtx(), product.getC_UOM_ID());
log.saveError("ProductUOMConversionUOMError", uom.getName());
return false;
}
}
// The Product UoM needs to be the smallest UoM - Multiplier must be > 0
if (getM_Product_ID() != 0 && getDivideRate().compareTo(Env.ONE) < 0)
{
log.saveError("ProductUOMConversionRateError", "");
return false;
}
return true;
} // beforeSave
/**
* String Representation
* @return info
*/
public String toString ()
{
StringBuffer sb = new StringBuffer ("MUOMConversion[");
sb.append(get_ID()).append("-C_UOM_ID=").append(getC_UOM_ID())
.append(",C_UOM_To_ID=").append(getC_UOM_To_ID())
.append(",M_Product_ID=").append(getM_Product_ID())
.append("-Multiply=").append(getMultiplyRate())
.append("/Divide=").append(getDivideRate())
.append ("]");
return sb.toString ();
} // toString
} // UOMConversion
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -