📄 calloutinvoice.java
字号:
* - basis: Product, Charge, BPartner Location
* - sets C_Tax_ID
* Calles Amount
* @param ctx Context
* @param WindowNo current Window No
* @param mTab Model Tab
* @param mField Model Field
* @param value The new value
*/
public String tax (Properties ctx, int WindowNo, MTab mTab, MField mField, Object value)
{
String column = mField.getColumnName();
if (value == null)
return "";
// 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 = 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);
int billC_BPartner_Location_ID = shipC_BPartner_Location_ID;
log.fine("Bill BP_Location=" + billC_BPartner_Location_ID);
// Dates
Timestamp billDate = Env.getContextAsDate(ctx, WindowNo, "DateInvoiced");
log.fine("Bill Date=" + billDate);
Timestamp shipDate = billDate;
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, "#M_Warehouse_ID");
log.fine("Warehouse=" + M_Warehouse_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,
Env.getContext(ctx, WindowNo, "IsSOTrx").equals("Y"));
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));
//
return amt (ctx, WindowNo, mTab, mField, value);
} // tax
/**
* Invoice - Amount.
* - called from QtyInvoiced, PriceActual
* - calculates LineNetAmt
* @param ctx Context
* @param WindowNo current Window No
* @param mTab Model Tab
* @param mField Model Field
* @param value The new value
*/
public String amt (Properties ctx, int WindowNo, MTab mTab, MField mField, Object value)
{
if (isCalloutActive() || value == null)
return "";
setCalloutActive(true);
// log.log(Level.WARNING,"amt - 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, QtyInvoiced, PriceEntered, PriceActual, PriceLimit, Discount, PriceList;
// get values
QtyEntered = (BigDecimal)mTab.getValue("QtyEntered");
QtyInvoiced = (BigDecimal)mTab.getValue("QtyInvoiced");
log.fine("QtyEntered=" + QtyEntered + ", Invoiced=" + QtyInvoiced + ", 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("QtyInvoiced")
|| 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"))
QtyInvoiced = MUOMConversion.convertProductTo (ctx, M_Product_ID,
C_UOM_To_ID, QtyEntered);
if (QtyInvoiced == null)
QtyInvoiced = QtyEntered;
boolean IsSOTrx = Env.getContext(ctx, WindowNo, "IsSOTrx").equals("Y");
MProductPricing pp = new MProductPricing (M_Product_ID, C_BPartner_ID, QtyInvoiced, IsSOTrx);
pp.setM_PriceList_ID(M_PriceList_ID);
int M_PriceList_Version_ID = Env.getContextAsInt(ctx, WindowNo, "M_PriceList_Version_ID");
pp.setM_PriceList_Version_ID(M_PriceList_Version_ID);
Timestamp date = (Timestamp)mTab.getValue("DateInvoiced");
pp.setPriceDate(date);
//
PriceEntered = MUOMConversion.convertProductFrom (ctx, M_Product_ID,
C_UOM_To_ID, pp.getPriceStd());
if (PriceEntered == null)
PriceEntered = pp.getPriceStd();
//
log.fine("amt - 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("amt - 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("amt - 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("amt = 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("amt =(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 = QtyInvoiced.multiply(PriceActual);
if (LineNetAmt.scale() > StdPrecision)
LineNetAmt = LineNetAmt.setScale(StdPrecision, BigDecimal.ROUND_HALF_UP);
log.info("amt = LineNetAmt=" + LineNetAmt);
mTab.setValue("LineNetAmt", LineNetAmt);
// Calculate Tax Amount for PO
boolean IsSOTrx = "Y".equals(Env.getContext(Env.getCtx(), WindowNo, "IsSOTrx"));
if (!IsSOTrx)
{
BigDecimal TaxAmt = null;
if (mField.getColumnName().equals("TaxAmt"))
{
TaxAmt = (BigDecimal)mTab.getValue("TaxAmt");
}
else
{
Integer taxID = (Integer)mTab.getValue("C_Tax_ID");
if (taxID != null)
{
int C_Tax_ID = taxID.intValue();
MTax tax = new MTax (ctx, C_Tax_ID, null);
TaxAmt = tax.calculateTax(LineNetAmt, isTaxIncluded(WindowNo), StdPrecision);
mTab.setValue("TaxAmt", TaxAmt);
}
}
// Add it up
mTab.setValue("LineTotalAmt", LineNetAmt.add(TaxAmt));
}
setCalloutActive(false);
return "";
} // amt
/**
* Is Tax Included
* @param WindowNo window no
* @return tax included (default: false)
*/
private boolean isTaxIncluded (int WindowNo)
{
String ss = Env.getContext(Env.getCtx(), WindowNo, "IsTaxIncluded");
// Not Set Yet
if (ss.length() == 0)
{
int M_PriceList_ID = Env.getContextAsInt(Env.getCtx(), WindowNo, "M_PriceList_ID");
if (M_PriceList_ID == 0)
return false;
ss = DB.getSQLValueString(null,
"SELECT IsTaxIncluded FROM M_PriceList WHERE M_PriceList_ID=?",
M_PriceList_ID);
if (ss == null)
ss = "N";
Env.setContext(Env.getCtx(), WindowNo, "IsTaxIncluded", ss);
}
return "Y".equals(ss);
} // isTaxIncluded
/**
* Invoice Line - Quantity.
* - called from C_UOM_ID, QtyEntered, QtyInvoiced
* - enforces qty UOM relationship
* @param ctx Context
* @param WindowNo current Window No
* @param mTab Model Tab
* @param mField Model Field
* @param value The new value
*/
public String qty (Properties ctx, int WindowNo, MTab mTab, MField mField, Object value)
{
if (isCalloutActive() || value == null)
return "";
setCalloutActive(true);
int M_Product_ID = Env.getContextAsInt(ctx, WindowNo, "M_Product_ID");
// log.log(Level.WARNING,"qty - init - M_Product_ID=" + M_Product_ID);
BigDecimal QtyInvoiced, QtyEntered, PriceActual, PriceEntered;
// No Product
if (M_Product_ID == 0)
{
QtyEntered = (BigDecimal)mTab.getValue("QtyEntered");
mTab.setValue("QtyInvoiced", QtyEntered);
}
// 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");
QtyInvoiced = MUOMConversion.convertProductFrom (ctx, M_Product_ID,
C_UOM_To_ID, QtyEntered);
if (QtyInvoiced == null)
QtyInvoiced = QtyEntered;
boolean conversion = QtyEntered.compareTo(QtyInvoiced) != 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("qty - UOM=" + C_UOM_To_ID
+ ", QtyEntered/PriceActual=" + QtyEntered + "/" + PriceActual
+ " -> " + conversion
+ " QtyInvoiced/PriceEntered=" + QtyInvoiced + "/" + PriceEntered);
Env.setContext(ctx, WindowNo, "UOMConversion", conversion ? "Y" : "N");
mTab.setValue("QtyInvoiced", QtyInvoiced);
mTab.setValue("PriceEntered", PriceEntered);
}
// QtyEntered changed - calculate QtyInvoiced
else if (mField.getColumnName().equals("QtyEntered"))
{
int C_UOM_To_ID = Env.getContextAsInt(ctx, WindowNo, "C_UOM_ID");
QtyEntered = (BigDecimal)value;
QtyInvoiced = MUOMConversion.convertProductFrom (ctx, M_Product_ID,
C_UOM_To_ID, QtyEntered);
if (QtyInvoiced == null)
QtyInvoiced = QtyEntered;
boolean conversion = QtyEntered.compareTo(QtyInvoiced) != 0;
log.fine("qty - UOM=" + C_UOM_To_ID
+ ", QtyEntered=" + QtyEntered
+ " -> " + conversion
+ " QtyInvoiced=" + QtyInvoiced);
Env.setContext(ctx, WindowNo, "UOMConversion", conversion ? "Y" : "N");
mTab.setValue("QtyInvoiced", QtyInvoiced);
}
// QtyInvoiced changed - calculate QtyEntered
else if (mField.getColumnName().equals("QtyInvoiced"))
{
int C_UOM_To_ID = Env.getContextAsInt(ctx, WindowNo, "C_UOM_ID");
QtyInvoiced = (BigDecimal)value;
QtyEntered = MUOMConversion.convertProductTo (ctx, M_Product_ID,
C_UOM_To_ID, QtyInvoiced);
if (QtyEntered == null)
QtyEntered = QtyInvoiced;
boolean conversion = QtyInvoiced.compareTo(QtyEntered) != 0;
log.fine("qty - UOM=" + C_UOM_To_ID
+ ", QtyInvoiced=" + QtyInvoiced
+ " -> " + conversion
+ " QtyEntered=" + QtyEntered);
Env.setContext(ctx, WindowNo, "UOMConversion", conversion ? "Y" : "N");
mTab.setValue("QtyEntered", QtyEntered);
}
//
setCalloutActive(false);
return "";
} // qty
} // CalloutInvoice
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -