📄 minvoiceline.java
字号:
ii = getParent().getC_Activity_ID();
return ii;
} // getC_Activity_ID
/**
* Get C_Campaign_ID
* @return Campaign
*/
public int getC_Campaign_ID()
{
int ii = 0; // super.getC_Campaign_ID ();
if (ii == 0)
ii = getParent().getC_Campaign_ID();
return ii;
} // getC_Campaign_ID
/**
* Get User2_ID
* @return User2
*/
public int getUser1_ID ()
{
int ii = 0; // super.getUser1_ID ();
if (ii == 0)
ii = getParent().getUser1_ID();
return ii;
} // getUser1_ID
/**
* Get User2_ID
* @return User2
*/
public int getUser2_ID ()
{
int ii = 0; // super.getUser2_ID ();
if (ii == 0)
ii = getParent().getUser2_ID();
return ii;
} // getUser2_ID
/**
* String Representation
* @return info
*/
public String toString ()
{
StringBuffer sb = new StringBuffer ("MInvoiceLine[")
.append(get_ID()).append(",").append(getLine())
.append(",QtyInvoiced=").append(getQtyInvoiced())
.append(",LineNetAmt=").append(getLineNetAmt())
.append ("]");
return sb.toString ();
} // toString
/**
* Get (Product/Charge) Name
* @return name
*/
public String getName ()
{
if (m_name == null)
{
String sql = "SELECT COALESCE (p.Name, c.Name) "
+ "FROM C_InvoiceLine il"
+ " LEFT OUTER JOIN M_Product p ON (il.M_Product_ID=p.M_Product_ID)"
+ " LEFT OUTER JOIN C_Charge C ON (il.C_Charge_ID=c.C_Charge_ID) "
+ "WHERE C_InvoiceLine_ID=?";
PreparedStatement pstmt = null;
try
{
pstmt = DB.prepareStatement(sql, get_TrxName());
pstmt.setInt(1, getC_InvoiceLine_ID());
ResultSet rs = pstmt.executeQuery();
if (rs.next())
m_name = rs.getString(1);
rs.close();
pstmt.close();
pstmt = null;
if (m_name == null)
m_name = "??";
}
catch (Exception e)
{
log.log(Level.SEVERE, "getName", e);
}
finally
{
try
{
if (pstmt != null)
pstmt.close ();
}
catch (Exception e)
{}
pstmt = null;
}
}
return m_name;
} // getName
/**
* Set Temporary (cached) Name
* @param tempName Cached Name
*/
public void setName (String tempName)
{
m_name = tempName;
} // setName
/**
* Get Description Text.
* For jsp access (vs. isDescription)
* @return description
*/
public String getDescriptionText()
{
return super.getDescription();
} // getDescriptionText
/**
* Get Currency Precision
* @return precision
*/
public int getPrecision()
{
if (m_precision != null)
return m_precision.intValue();
String sql = "SELECT c.StdPrecision "
+ "FROM C_Currency c INNER JOIN C_Invoice x ON (x.C_Currency_ID=c.C_Currency_ID) "
+ "WHERE x.C_Invoice_ID=?";
int i = DB.getSQLValue(get_TrxName(), sql, getC_Invoice_ID());
if (i < 0)
{
log.warning("getPrecision = " + i + " - set to 2");
i = 2;
}
m_precision = new Integer(i);
return m_precision.intValue();
} // getPrecision
/**
* Is Tax Included in Amount
*/
public boolean isTaxIncluded()
{
if (m_M_PriceList_ID == 0)
{
m_M_PriceList_ID = DB.getSQLValue(get_TrxName(),
"SELECT M_PriceList_ID FROM C_Invoice WHERE C_Invoice_ID=?",
getC_Invoice_ID());
}
MPriceList pl = MPriceList.get(getCtx(), m_M_PriceList_ID, get_TrxName());
return pl.isTaxIncluded();
} // isTaxIncluded
/**************************************************************************
* Before Save
* @param newRecord
* @return true if save
*/
protected boolean beforeSave (boolean newRecord)
{
log.fine("New=" + newRecord);
// Charge
if (getC_Charge_ID() != 0)
{
if (getM_Product_ID() != 0)
setM_Product_ID(0);
}
else // Set Product Price
{
if (!m_priceSet
&& Env.ZERO.compareTo(getPriceActual()) == 0
&& Env.ZERO.compareTo(getPriceList()) == 0)
setPrice();
}
// Set Tax
if (getC_Tax_ID() == 0)
setTax();
// Get Line No
if (getLine() == 0)
{
String sql = "SELECT COALESCE(MAX(Line),0)+10 FROM C_InvoiceLine WHERE C_Invoice_ID=?";
int ii = DB.getSQLValue (get_TrxName(), sql, getC_Invoice_ID());
setLine (ii);
}
// UOM
if (getC_UOM_ID() == 0)
{
int C_UOM_ID = MUOM.getDefault_UOM_ID(getCtx());
if (C_UOM_ID > 0)
setC_UOM_ID (C_UOM_ID);
}
// Calculations & Rounding
setLineNetAmt();
if (getTaxAmt().compareTo(Env.ZERO) == 0)
setTaxAmt();
//
return true;
} // beforeSave
/**
* After Save
* @param newRecord new
* @param success success
* @return saved
*/
protected boolean afterSave (boolean newRecord, boolean success)
{
if (!success)
return success;
if (!newRecord && is_ValueChanged("C_Tax_ID"))
{
// Recalculate Tax for old Tax
MInvoiceTax tax = MInvoiceTax.get (this, getPrecision(),
true, get_TrxName()); // old Tax
if (tax != null)
{
if (!tax.calculateTaxFromLines())
return false;
if (!tax.save(get_TrxName()))
return true;
}
}
return updateHeaderTax();
} // afterSave
/**
* After Delete
* @param success success
* @return deleted
*/
protected boolean afterDelete (boolean success)
{
if (!success)
return success;
return updateHeaderTax();
} // afterDelete
/**
* Update Tax & Header
*/
private boolean updateHeaderTax()
{
// Recalculate Tax for this Tax
MInvoiceTax tax = MInvoiceTax.get (this, getPrecision(),
false, get_TrxName()); // current Tax
if (tax != null)
{
if (!tax.calculateTaxFromLines())
return false;
if (!tax.save(get_TrxName()))
return false;
}
// Update Invoice Header
String sql = "UPDATE C_Invoice i"
+ " SET TotalLines="
+ "(SELECT COALESCE(SUM(LineNetAmt),0) FROM C_InvoiceLine il WHERE i.C_Invoice_ID=il.C_Invoice_ID) "
+ "WHERE C_Invoice_ID=" + getC_Invoice_ID();
int no = DB.executeUpdate(sql, get_TrxName());
if (no != 1)
log.warning("(1) #" + no);
if (isTaxIncluded())
sql = "UPDATE C_Invoice i "
+ " SET GrandTotal=TotalLines "
+ "WHERE C_Invoice_ID=" + getC_Invoice_ID();
else
sql = "UPDATE C_Invoice i "
+ " SET GrandTotal=TotalLines+"
+ "(SELECT COALESCE(SUM(TaxAmt),0) FROM C_InvoiceTax it WHERE i.C_Invoice_ID=it.C_Invoice_ID) "
+ "WHERE C_Invoice_ID=" + getC_Invoice_ID();
no = DB.executeUpdate(sql, get_TrxName());
if (no != 1)
log.warning("(2) #" + no);
m_parent = null;
return no == 1;
} // updateHeaderTax
/**************************************************************************
* Allocate Landed Costs
* @return error message or ""
*/
public String allocateLandedCosts()
{
if (isProcessed())
return "Processed";
MLandedCost[] lcs = MLandedCost.getLandedCosts(this);
if (lcs.length == 0)
return "";
String sql = "DELETE C_LandedCostAllocation WHERE C_InvoiceLine_ID=" + getC_InvoiceLine_ID();
int no = DB.executeUpdate(sql, get_TrxName());
if (no != 0)
log.info("Deleted #" + no);
int inserted = 0;
// *** Single Criteria ***
if (lcs.length == 1)
{
MLandedCost lc = lcs[0];
if (lc.getM_InOut_ID() != 0)
{
// Create List
ArrayList<MInOutLine> list = new ArrayList<MInOutLine>();
MInOut ship = new MInOut (getCtx(), lc.getM_InOut_ID(), get_TrxName());
MInOutLine[] lines = ship.getLines();
for (int i = 0; i < lines.length; i++)
{
if (lines[i].isDescription() || lines[i].getM_Product_ID() == 0)
continue;
if (lc.getM_Product_ID() == 0
|| lc.getM_Product_ID() == lines[i].getM_Product_ID())
list.add(lines[i]);
}
if (list.size() == 0)
return "No Matching Lines (with Product) in Shipment";
// Calculate total & base
BigDecimal total = Env.ZERO;
for (int i = 0; i < list.size(); i++)
{
MInOutLine iol = (MInOutLine)list.get(i);
total = total.add(iol.getBase(lc.getLandedCostDistribution()));
}
if (total.signum() == 0)
return "Total of Base values is 0 - " + lc.getLandedCostDistribution();
// Create Allocations
for (int i = 0; i < list.size(); i++)
{
MInOutLine iol = (MInOutLine)list.get(i);
MLandedCostAllocation lca = new MLandedCostAllocation (this, lc.getM_CostElement_ID());
lca.setM_Product_ID(iol.getM_Product_ID());
lca.setM_AttributeSetInstance_ID(iol.getM_AttributeSetInstance_ID());
BigDecimal base = iol.getBase(lc.getLandedCostDistribution());
lca.setBase(base);
if (base.signum() != 0)
{
double result = getLineNetAmt().multiply(base).doubleValue();
result /= total.doubleValue();
lca.setAmt(result, getPrecision());
}
if (!lca.save())
return "Cannot save line Allocation = " + lca;
inserted++;
}
log.info("Inserted " + inserted);
allocateLandedCostRounding();
return "";
}
// Single Line
else if (lc.getM_InOutLine_ID() != 0)
{
MInOutLine iol = new MInOutLine (getCtx(), lc.getM_InOutLine_ID(), get_TrxName());
if (iol.isDescription() || iol.getM_Product_ID() == 0)
return "Invalid Receipt Line - " + iol;
MLandedCostAllocation lca = new MLandedCostAllocation (this, lc.getM_CostElement_ID());
lca.setM_Product_ID(iol.getM_Product_ID());
lca.setM_AttributeSetInstance_ID(iol.getM_AttributeSetInstance_ID());
lca.setAmt(getLineNetAmt());
if (lca.save())
return "";
return "Cannot save single line Allocation = " + lc;
}
// Single Product
else if (lc.getM_Product_ID() != 0)
{
MLandedCostAllocation lca = new MLandedCostAllocation (this, lc.getM_CostElement_ID());
lca.setM_Product_ID(lc.getM_Product_ID()); // No ASI
lca.setAmt(getLineNetAmt());
if (lca.save())
return "";
return "Cannot save Product Allocation = " + lc;
}
else
return "No Reference for " + lc;
}
// *** Multiple Criteria ***
String LandedCostDistribution = lcs[0].getLandedCostDistribution();
int M_CostElement_ID = lcs[0].getM_CostElement_ID();
for (int i = 0; i < lcs.length; i++)
{
MLandedCost lc = lcs[i];
if (!LandedCostDistribution.equals(lc.getLandedCostDistribution()))
return "Multiple Landed Cost Rules must have consistent Landed Cost Distribution";
if (lc.getM_Product_ID() != 0 && lc.getM_InOut_ID() == 0 && lc.getM_InOutLine_ID() == 0)
return "Multiple Landed Cost Rules cannot directly allocate to a Product";
if (M_CostElement_ID != lc.getM_CostElement_ID())
return "Multiple Landed Cost Rules cannot different Cost Elements";
}
// Create List
ArrayList<MInOutLine> list = new ArrayList<MInOutLine>();
for (int ii = 0; ii < lcs.length; ii++)
{
MLandedCost lc = lcs[ii];
if (lc.getM_InOut_ID() != 0 && lc.getM_InOutLine_ID() == 0) // entire receipt
{
MInOut ship = new MInOut (getCtx(), lc.getM_InOut_ID(), get_TrxName());
MInOutLine[] lines = ship.getLines();
for (int i = 0; i < lines.length; i++)
{
if (lines[i].isDescription() // decription or no product
|| lines[i].getM_Product_ID() == 0)
continue;
if (lc.getM_Product_ID() == 0 // no restriction or product match
|| lc.getM_Product_ID() == lines[i].getM_Product_ID())
list.add(lines[i]);
}
}
else if (lc.getM_InOutLine_ID() != 0) // receipt line
{
MInOutLine iol = new MInOutLine (getCtx(), lc.getM_InOutLine_ID(), get_TrxName());
if (!iol.isDescription() && iol.getM_Product_ID() != 0)
list.add(iol);
}
}
if (list.size() == 0)
return "No Matching Lines (with Product)";
// Calculate total & base
BigDecimal total = Env.ZERO;
for (int i = 0; i < list.size(); i++)
{
MInOutLine iol = (MInOutLine)list.get(i);
total = total.add(iol.getBase(LandedCostDistribution));
}
if (total.signum() == 0)
return "Total of Base values is 0 - " + LandedCostDistribution;
// Create Allocations
for (int i = 0; i < list.size(); i++)
{
MInOutLine iol = (MInOutLine)list.get(i);
MLandedCostAllocation lca = new MLandedCostAllocation (this, lcs[0].getM_CostElement_ID());
lca.setM_Product_ID(iol.getM_Product_ID());
lca.setM_AttributeSetInstance_ID(iol.getM_AttributeSetInstance_ID());
BigDecimal base = iol.getBase(LandedCostDistribution);
lca.setBase(base);
if (base.signum() != 0)
{
double result = getLineNetAmt().multiply(base).doubleValue();
result /= total.doubleValue();
lca.setAmt(result, getPrecision());
}
if (!lca.save())
return "Cannot save line Allocation = " + lca;
inserted++;
}
log.info("Inserted " + inserted);
allocateLandedCostRounding();
return "";
} // allocate Costs
/**
* Allocate Landed Cost - Enforce Rounding
*/
private void allocateLandedCostRounding()
{
MLandedCostAllocation[] allocations = MLandedCostAllocation.getOfInvoiceLine(
getCtx(), getC_InvoiceLine_ID(), get_TrxName());
MLandedCostAllocation largestAmtAllocation = null;
BigDecimal allocationAmt = Env.ZERO;
for (int i = 0; i < allocations.length; i++)
{
MLandedCostAllocation allocation = allocations[i];
if (largestAmtAllocation == null
|| allocation.getAmt().compareTo(largestAmtAllocation.getAmt()) > 0)
largestAmtAllocation = allocation;
allocationAmt = allocationAmt.add(allocation.getAmt());
}
BigDecimal difference = getLineNetAmt().subtract(allocationAmt);
if (difference.signum() != 0)
{
largestAmtAllocation.setAmt(largestAmtAllocation.getAmt().add(difference));
largestAmtAllocation.save();
log.config("Difference=" + difference
+ ", C_LandedCostAllocation_ID=" + largestAmtAllocation.getC_LandedCostAllocation_ID()
+ ", Amt" + largestAmtAllocation.getAmt());
}
} // allocateLandedCostRounding
} // MInvoiceLine
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -