📄 doc_invoice.java
字号:
* Receivables DR
* Charge CR
* TaxDue CR
* Revenue CR
*
* ARC
* Receivables CR
* Charge DR
* TaxDue DR
* Revenue RR
*
* API
* Payables CR
* Charge DR
* TaxCredit DR
* Expense DR
*
* APC
* Payables DR
* Charge CR
* TaxCredit CR
* Expense CR
* </pre>
* @param as accounting schema
* @return Fact
*/
public Fact createFact (AcctSchema as)
{
// create Fact Header
Fact fact = new Fact(this, as, Fact.POST_Actual);
// Cash based accounting
if (!as.isAccrual())
{
p_vo.Error = "Not Accrual";
log.error("createFact - " + p_vo.Error);
return null;
}
/** @todo Assumes TaxIncluded = N */
// ARI, ARF
if (p_vo.DocumentType.equals(DocVO.DOCTYPE_ARInvoice) || p_vo.DocumentType.equals(DocVO.DOCTYPE_ARProForma))
{
// Receivables DR
fact.createLine(null, getAccount(Doc.ACCTTYPE_C_Receivable, as),
p_vo.C_Currency_ID, getAmount(Doc.AMTTYPE_Gross), null);
// Charge CR
fact.createLine(null, getAccount(Doc.ACCTTYPE_Charge, as),
p_vo.C_Currency_ID, null, getAmount(Doc.AMTTYPE_Charge));
// TaxDue CR
for (int i = 0; i < m_taxes.length; i++)
{
fact.createLine(null, m_taxes[i].getAccount(DocTax.ACCTTYPE_TaxDue, as),
p_vo.C_Currency_ID, null, m_taxes[i].getAmount());
}
// Revenue CR
for (int i = 0; i < p_lines.length; i++)
fact.createLine(p_lines[i],
((DocLine_Invoice)p_lines[i]).getAccount(ProductInfo.ACCTTYPE_P_Revenue, as),
p_vo.C_Currency_ID, null, p_lines[i].getAmount());
// Set Locations
FactLine[] fLines = fact.getLines();
for (int i = 0; i < fLines.length; i++)
{
if (fLines[i] != null)
{
fLines[i].setLocationFromOrg(fLines[i].getAD_Org_ID(), true); // from Loc
fLines[i].setLocationFromBPartner(C_BPartner_Location_ID, false); // to Loc
}
}
}
// ARC
else if (p_vo.DocumentType.equals(DocVO.DOCTYPE_ARCredit))
{
// Receivables CR
fact.createLine(null, getAccount(Doc.ACCTTYPE_C_Receivable, as),
p_vo.C_Currency_ID, null, getAmount(Doc.AMTTYPE_Gross));
// Charge DR
fact.createLine(null, getAccount(Doc.ACCTTYPE_Charge, as),
p_vo.C_Currency_ID, getAmount(Doc.AMTTYPE_Charge), null);
// TaxDue DR
for (int i = 0; i < m_taxes.length; i++)
fact.createLine(null, m_taxes[i].getAccount(DocTax.ACCTTYPE_TaxDue, as),
p_vo.C_Currency_ID, m_taxes[i].getAmount(), null);
// Revenue CR
for (int i = 0; i < p_lines.length; i++)
fact.createLine(p_lines[i],
((DocLine_Invoice)p_lines[i]).getAccount(ProductInfo.ACCTTYPE_P_Revenue, as),
p_vo.C_Currency_ID, p_lines[i].getAmount(), null);
// Set Locations
FactLine[] fLines = fact.getLines();
for (int i = 0; i < fLines.length; i++)
{
if (fLines[i] != null)
{
fLines[i].setLocationFromOrg(fLines[i].getAD_Org_ID(), true); // from Loc
fLines[i].setLocationFromBPartner(C_BPartner_Location_ID, false); // to Loc
}
}
}
// API
else if (p_vo.DocumentType.equals(DocVO.DOCTYPE_APInvoice))
{
// Liability CR
fact.createLine(null, getAccount(Doc.ACCTTYPE_V_Liability, as),
p_vo.C_Currency_ID, null, getAmount(Doc.AMTTYPE_Gross));
// Charge DR
fact.createLine(null, getAccount(Doc.ACCTTYPE_Charge, as),
p_vo.C_Currency_ID, getAmount(Doc.AMTTYPE_Charge), null);
// TaxCredit DR
for (int i = 0; i < m_taxes.length; i++)
fact.createLine(null, m_taxes[i].getAccount(DocTax.ACCTTYPE_TaxCredit, as),
p_vo.C_Currency_ID, m_taxes[i].getAmount(), null);
// Expense DR
for (int i = 0; i < p_lines.length; i++)
fact.createLine(p_lines[i],
((DocLine_Invoice)p_lines[i]).getAccount(ProductInfo.ACCTTYPE_P_Expense, as),
p_vo.C_Currency_ID, p_lines[i].getAmount(), null);
// Set Locations
FactLine[] fLines = fact.getLines();
for (int i = 0; i < fLines.length; i++)
{
if (fLines[i] != null)
{
fLines[i].setLocationFromBPartner(C_BPartner_Location_ID, true); // from Loc
fLines[i].setLocationFromOrg(fLines[i].getAD_Org_ID(), false); // to Loc
}
}
updateProductInfo (as.getC_AcctSchema_ID()); // only API
}
// APC
else if (p_vo.DocumentType.equals(DocVO.DOCTYPE_APCredit))
{
// Liability DR
fact.createLine (null, getAccount(Doc.ACCTTYPE_V_Liability, as),
p_vo.C_Currency_ID, getAmount(Doc.AMTTYPE_Gross), null);
// Charge CR
fact.createLine (null, getAccount(Doc.ACCTTYPE_Charge, as),
p_vo.C_Currency_ID, null, getAmount(Doc.AMTTYPE_Charge));
// TaxCredit CR
for (int i = 0; i < m_taxes.length; i++)
fact.createLine (null, m_taxes[i].getAccount(DocTax.ACCTTYPE_TaxCredit, as),
p_vo.C_Currency_ID, null, m_taxes[i].getAmount());
// Expense CR
for (int i = 0; i < p_lines.length; i++)
fact.createLine (p_lines[i],
((DocLine_Invoice)p_lines[i]).getAccount(ProductInfo.ACCTTYPE_P_Expense, as),
p_vo.C_Currency_ID, null, p_lines[i].getAmount());
// Set Locations
FactLine[] fLines = fact.getLines();
for (int i = 0; i < fLines.length; i++)
{
if (fLines[i] != null)
{
fLines[i].setLocationFromBPartner(C_BPartner_Location_ID, true); // from Loc
fLines[i].setLocationFromOrg(fLines[i].getAD_Org_ID(), false); // to Loc
}
}
}
else
{
p_vo.Error = "DocumentType unknown: " + p_vo.DocumentType;
log.error("createFact - " + p_vo.Error);
fact = null;
}
return fact;
} // createFact
/**
* Update Product Info.
* - Costing (PriceLastInv)
* - PO (PriceLastInv)
* @param C_AcctSchema_ID accounting schema
*/
private void updateProductInfo (int C_AcctSchema_ID)
{
log.debug("updateProductInfo - C_Invoice_ID=" + p_vo.Record_ID);
/** @todo Last.. would need to compare document/last updated date
* would need to maintain LastPriceUpdateDate on _PO and _Costing */
// update Product PO info
// should only be once, but here for every AcctSchema
// ignores multiple lines with same product - just uses first
StringBuffer sql = new StringBuffer (
"UPDATE M_Product_PO po "
+ "SET PriceLastInv = "
// select
+ "(SELECT C_Currency_Convert(il.PriceActual,i.C_Currency_ID,po.C_Currency_ID,i.DateInvoiced,null,i.AD_Client_ID,i.AD_Org_ID) "
+ "FROM C_Invoice i, C_InvoiceLine il "
+ "WHERE i.C_Invoice_ID=il.C_Invoice_ID"
+ " AND po.M_Product_ID=il.M_Product_ID AND po.C_BPartner_ID=i.C_BPartner_ID"
+ " AND ROWNUM=1 AND i.C_Invoice_ID=").append(p_vo.Record_ID).append(") ")
// update
.append("WHERE EXISTS (SELECT * "
+ "FROM C_Invoice i, C_InvoiceLine il "
+ "WHERE i.C_Invoice_ID=il.C_Invoice_ID"
+ " AND po.M_Product_ID=il.M_Product_ID AND po.C_BPartner_ID=i.C_BPartner_ID"
+ " AND i.C_Invoice_ID=").append(p_vo.Record_ID).append(")");
int no = DB.executeUpdate(sql.toString());
log.debug("M_Product_PO - Updated=" + no);
// update Product Costing
// requires existence of currency conversion !!
// if there are multiple lines of the same product last price uses first
sql = new StringBuffer (
"UPDATE M_Product_Costing pc "
+ "SET (PriceLastInv, TotalInvAmt,TotalInvQty) = "
// select
+ "(SELECT C_Currency_Convert(il.PriceActual,i.C_Currency_ID,a.C_Currency_ID,i.DateInvoiced,null,i.AD_Client_ID,i.AD_Org_ID),"
+ " C_Currency_Convert(il.LineNetAmt,i.C_Currency_ID,a.C_Currency_ID,i.DateInvoiced,null),il.QtyInvoiced "
+ "FROM C_Invoice i, C_InvoiceLine il, C_AcctSchema a "
+ "WHERE i.C_Invoice_ID=il.C_Invoice_ID"
+ " AND pc.M_Product_ID=il.M_Product_ID AND pc.C_AcctSchema_ID=a.C_AcctSchema_ID"
+ " AND ROWNUM=1"
+ " AND pc.C_AcctSchema_ID=").append(C_AcctSchema_ID).append(" AND i.C_Invoice_ID=")
.append(p_vo.Record_ID).append(") ")
// update
.append("WHERE EXISTS (SELECT * "
+ "FROM C_Invoice i, C_InvoiceLine il, C_AcctSchema a "
+ "WHERE i.C_Invoice_ID=il.C_Invoice_ID"
+ " AND pc.M_Product_ID=il.M_Product_ID AND pc.C_AcctSchema_ID=a.C_AcctSchema_ID"
+ " AND pc.C_AcctSchema_ID=").append(C_AcctSchema_ID).append(" AND i.C_Invoice_ID=").append(p_vo.Record_ID).append(")");
no = DB.executeUpdate(sql.toString());
log.debug("M_Product_Costing - Updated=" + no);
} // updateProductInfo
} // Doc_Invoice
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -