📄 factline.java
字号:
setAmtAcctDr (getAmtAcctDr().subtract(deltaAmount));
else
setAmtAcctDr (getAmtAcctDr().subtract(deltaAmount));
else
if (negative)
setAmtAcctCr (getAmtAcctCr().add(deltaAmount));
else
setAmtAcctCr (getAmtAcctCr().add(deltaAmount));
log.fine("New-AcctDr=" + getAmtAcctDr() + ",AcctCr=" + getAmtAcctCr());
} // currencyCorrect
/**
* Convert to Accounted Currency
* @return true if converted
*/
public boolean convert ()
{
// Document has no currency
if (getC_Currency_ID() == Doc.NO_CURRENCY)
setC_Currency_ID (m_acctSchema.getC_Currency_ID());
if (m_acctSchema.getC_Currency_ID() == getC_Currency_ID())
{
setAmtAcctDr (getAmtSourceDr());
setAmtAcctCr (getAmtSourceCr());
return true;
}
// Get Conversion Type from Line or Header
int C_ConversionType_ID = 0;
int AD_Org_ID = 0;
if (m_docLine != null) // get from line
{
C_ConversionType_ID = m_docLine.getC_ConversionType_ID();
AD_Org_ID = m_docLine.getAD_Org_ID();
}
if (C_ConversionType_ID == 0) // get from header
{
if (m_doc == null)
{
log.severe ("No Document VO");
return false;
}
C_ConversionType_ID = m_doc.getC_ConversionType_ID();
if (AD_Org_ID == 0)
AD_Org_ID = m_doc.getAD_Org_ID();
}
setAmtAcctDr (MConversionRate.convert (getCtx(),
getAmtSourceDr(), getC_Currency_ID(), m_acctSchema.getC_Currency_ID(),
getDateAcct(), C_ConversionType_ID, m_doc.getAD_Client_ID(), AD_Org_ID));
if (getAmtAcctDr() == null)
return false;
setAmtAcctCr (MConversionRate.convert (getCtx(),
getAmtSourceCr(), getC_Currency_ID(), m_acctSchema.getC_Currency_ID(),
getDateAcct(), C_ConversionType_ID, m_doc.getAD_Client_ID(), AD_Org_ID));
return true;
} // convert
/**
* Get Account
* @return account
*/
public MAccount getAccount()
{
return m_acct;
} // getAccount
/**
* To String
* @return String
*/
public String toString()
{
StringBuffer sb = new StringBuffer("FactLine=[");
sb.append(getAD_Table_ID()).append(":").append(getRecord_ID())
.append(",").append(m_acct)
.append(",Cur=").append(getC_Currency_ID())
.append(", DR=").append(getAmtSourceDr()).append("|").append(getAmtAcctDr())
.append(", CR=").append(getAmtSourceCr()).append("|").append(getAmtAcctCr())
.append("]");
return sb.toString();
} // toString
/**
* Get AD_Org_ID (balancing segment).
* (if not set directly - from document line, document, account, locator)
* <p>
* Note that Locator needs to be set before - otherwise
* segment balancing might produce the wrong results
* @return AD_Org_ID
*/
public int getAD_Org_ID()
{
if (super.getAD_Org_ID() != 0) // set earlier
return super.getAD_Org_ID();
// Prio 1 - get from locator - if exist
if (getM_Locator_ID() != 0)
{
String sql = "SELECT AD_Org_ID FROM M_Locator WHERE M_Locator_ID=? AND AD_Client_ID=?";
try
{
PreparedStatement pstmt = DB.prepareStatement(sql, get_TrxName());
pstmt.setInt(1, getM_Locator_ID());
pstmt.setInt(2, getAD_Client_ID());
ResultSet rs = pstmt.executeQuery();
if (rs.next())
{
setAD_Org_ID (rs.getInt(1));
log.finer("AD_Org_ID=" + super.getAD_Org_ID() + " (1 from M_Locator_ID=" + getM_Locator_ID() + ")");
}
else
log.log(Level.SEVERE, "AD_Org_ID - Did not find M_Locator_ID=" + getM_Locator_ID());
rs.close();
pstmt.close();
}
catch (SQLException e)
{
log.log(Level.SEVERE, sql, e);
}
} // M_Locator_ID != 0
// Prio 2 - get from doc line - if exists (document context overwrites)
if (m_docLine != null && super.getAD_Org_ID() == 0)
{
setAD_Org_ID (m_docLine.getAD_Org_ID());
log.finer("AD_Org_ID=" + super.getAD_Org_ID() + " (2 from DocumentLine)");
}
// Prio 3 - get from doc - if not GL
if (m_doc != null && super.getAD_Org_ID() == 0)
{
if (Doc.DOCTYPE_GLJournal.equals (m_doc.getDocumentType()))
{
setAD_Org_ID (m_acct.getAD_Org_ID()); // inter-company GL
log.finer("AD_Org_ID=" + super.getAD_Org_ID() + " (3 from Acct)");
}
else
{
setAD_Org_ID (m_doc.getAD_Org_ID());
log.finer("AD_Org_ID=" + super.getAD_Org_ID() + " (3 from Document)");
}
}
// Prio 4 - get from account - if not GL
if (m_doc != null && super.getAD_Org_ID() == 0)
{
if (Doc.DOCTYPE_GLJournal.equals (m_doc.getDocumentType()))
{
setAD_Org_ID (m_doc.getAD_Org_ID());
log.finer("AD_Org_ID=" + super.getAD_Org_ID() + " (4 from Document)");
}
else
{
setAD_Org_ID (m_acct.getAD_Org_ID());
log.finer("AD_Org_ID=" + super.getAD_Org_ID() + " (4 from Acct)");
}
}
return super.getAD_Org_ID();
} // setAD_Org_ID
/**
* Get/derive Sales Region
* @return Sales Region
*/
public int getC_SalesRegion_ID ()
{
if (super.getC_SalesRegion_ID() != 0)
return super.getC_SalesRegion_ID();
//
if (m_docLine != null)
setC_SalesRegion_ID (m_docLine.getC_SalesRegion_ID());
if (m_doc != null)
{
if (super.getC_SalesRegion_ID() == 0)
setC_SalesRegion_ID (m_doc.getC_SalesRegion_ID());
if (super.getC_SalesRegion_ID() == 0 && m_doc.getBP_C_SalesRegion_ID() > 0)
setC_SalesRegion_ID (m_doc.getBP_C_SalesRegion_ID());
// derive SalesRegion if AcctSegment
if (super.getC_SalesRegion_ID() == 0
&& m_doc.getC_BPartner_Location_ID() != 0
&& m_doc.getBP_C_SalesRegion_ID() == -1) // never tried
// && m_acctSchema.isAcctSchemaElement(MAcctSchemaElement.ELEMENTTYPE_SalesRegion))
{
String sql = "SELECT COALESCE(C_SalesRegion_ID,0) FROM C_BPartner_Location WHERE C_BPartner_Location_ID=?";
setC_SalesRegion_ID (DB.getSQLValue(null,
sql, m_doc.getC_BPartner_Location_ID()));
if (super.getC_SalesRegion_ID() != 0) // save in VO
{
m_doc.setBP_C_SalesRegion_ID(super.getC_SalesRegion_ID());
log.fine("C_SalesRegion_ID=" + super.getC_SalesRegion_ID() + " (from BPL)" );
}
else // From Sales Rep of Document -> Sales Region
{
sql = "SELECT COALESCE(MAX(C_SalesRegion_ID),0) FROM C_SalesRegion WHERE SalesRep_ID=?";
setC_SalesRegion_ID (DB.getSQLValue(null,
sql, m_doc.getSalesRep_ID()));
if (super.getC_SalesRegion_ID() != 0) // save in VO
{
m_doc.setBP_C_SalesRegion_ID(super.getC_SalesRegion_ID());
log.fine("C_SalesRegion_ID=" + super.getC_SalesRegion_ID() + " (from SR)" );
}
else
m_doc.setBP_C_SalesRegion_ID(-2); // don't try again
}
}
if (m_acct != null && super.getC_SalesRegion_ID() == 0)
setC_SalesRegion_ID (m_acct.getC_SalesRegion_ID());
}
//
// log.fine("C_SalesRegion_ID=" + super.getC_SalesRegion_ID()
// + ", C_BPartner_Location_ID=" + m_docVO.C_BPartner_Location_ID
// + ", BP_C_SalesRegion_ID=" + m_docVO.BP_C_SalesRegion_ID
// + ", SR=" + m_acctSchema.isAcctSchemaElement(MAcctSchemaElement.ELEMENTTYPE_SalesRegion));
return super.getC_SalesRegion_ID();
} // getC_SalesRegion_ID
/**
* Before Save
* @param newRecord new
* @return true
*/
protected boolean beforeSave (boolean newRecord)
{
if (newRecord)
{
log.fine(toString());
//
getAD_Org_ID();
getC_SalesRegion_ID();
// Set Default Account Info
if (getM_Product_ID() == 0)
setM_Product_ID (m_acct.getM_Product_ID());
if (getC_LocFrom_ID() == 0)
setC_LocFrom_ID (m_acct.getC_LocFrom_ID());
if (getC_LocTo_ID() == 0)
setC_LocTo_ID (m_acct.getC_LocTo_ID());
if (getC_BPartner_ID() == 0)
setC_BPartner_ID (m_acct.getC_BPartner_ID());
if (getAD_OrgTrx_ID() == 0)
setAD_OrgTrx_ID (m_acct.getAD_OrgTrx_ID());
if (getC_Project_ID() == 0)
setC_Project_ID (m_acct.getC_Project_ID());
if (getC_Campaign_ID() == 0)
setC_Campaign_ID (m_acct.getC_Campaign_ID());
if (getC_Activity_ID() == 0)
setC_Activity_ID (m_acct.getC_Activity_ID());
if (getUser1_ID() == 0)
setUser1_ID (m_acct.getUser1_ID());
if (getUser2_ID() == 0)
setUser2_ID (m_acct.getUser2_ID());
// Revenue Recognition for AR Invoices
if (m_doc.getDocumentType().equals(Doc.DOCTYPE_ARInvoice)
&& m_docLine != null
&& m_docLine.getC_RevenueRecognition_ID() != 0)
{
int AD_User_ID = 0;
setAccount_ID (
createRevenueRecognition (
m_docLine.getC_RevenueRecognition_ID(), m_docLine.get_ID(),
getAD_Client_ID(), getAD_Org_ID(), AD_User_ID,
getAccount_ID(), getC_SubAcct_ID(),
getM_Product_ID(), getC_BPartner_ID(), getAD_OrgTrx_ID(),
getC_LocFrom_ID(), getC_LocTo_ID(),
getC_SalesRegion_ID(), getC_Project_ID(),
getC_Campaign_ID(), getC_Activity_ID(),
getUser1_ID(), getUser2_ID(),
getUserElement1_ID(), getUserElement2_ID())
);
}
}
return true;
} // beforeSave
/**************************************************************************
* Revenue Recognition.
* Called from FactLine.save
* <p>
* Create Revenue recognition plan and return Unearned Revenue account
* to be used instead of Revenue Account. If not found, it returns
* the revenue account.
*
* @param C_RevenueRecognition_ID revenue recognition
* @param C_InvoiceLine_ID invoice line
* @param AD_Client_ID client
* @param AD_Org_ID org
* @param AD_User_ID user
* @param Account_ID of Revenue Account
* @param M_Product_ID product
* @param C_BPartner_ID bpartner
* @param AD_OrgTrx_ID trx org
* @param C_LocFrom_ID loc from
* @param C_LocTo_ID loc to
* @param C_SRegion_ID sales region
* @param C_Project_ID project
* @param C_Campaign_ID campaign
* @param C_Activity_ID activity
* @param User1_ID user1
* @param User2_ID user2
* @return Account_ID for Unearned Revenue or Revenue Account if not found
*/
private int createRevenueRecognition (
int C_RevenueRecognition_ID, int C_InvoiceLine_ID,
int AD_Client_ID, int AD_Org_ID, int AD_User_ID,
int Account_ID, int C_SubAcct_ID,
int M_Product_ID, int C_BPartner_ID, int AD_OrgTrx_ID,
int C_LocFrom_ID, int C_LocTo_ID, int C_SRegion_ID, int C_Project_ID,
int C_Campaign_ID, int C_Activity_ID,
int User1_ID, int User2_ID, int UserElement1_ID, int UserElement2_ID)
{
log.fine("From Accout_ID=" + Account_ID);
// get VC for P_Revenue (from Product)
MAccount revenue = MAccount.get(getCtx(),
AD_Client_ID, AD_Org_ID, getC_AcctSchema_ID(), Account_ID, C_SubAcct_ID,
M_Product_ID, C_BPartner_ID, AD_OrgTrx_ID, C_LocFrom_ID, C_LocTo_ID, C_SRegion_ID,
C_Project_ID, C_Campaign_ID, C_Activity_ID,
User1_ID, User2_ID, UserElement1_ID, UserElement2_ID);
if (revenue != null && revenue.get_ID() == 0)
revenue.save();
if (revenue == null || revenue.get_ID() == 0)
{
log.severe ("Revenue_Acct not found");
return Account_ID;
}
int P_Revenue_Acct = revenue.get_ID();
// get Unearned Revenue Acct from BPartner Group
int UnearnedRevenue_Acct = 0;
int new_Account_ID = 0;
String sql = "SELECT ga.UnearnedRevenue_Acct, vc.Account_ID "
+ "FROM C_BP_Group_Acct ga, C_BPartner p, C_ValidCombination vc "
+ "WHERE ga.C_BP_Group_ID=p.C_BP_Group_ID"
+ " AND ga.UnearnedRevenue_Acct=vc.C_ValidCombination_ID"
+ " AND ga.C_AcctSchema_ID=? AND p.C_BPartner_ID=?";
try
{
PreparedStatement pstmt = DB.prepareStatement(sql, get_TrxName());
pstmt.setInt(1, getC_AcctSchema_ID());
pstmt.setInt(2, C_BPartner_ID);
ResultSet rs = pstmt.executeQuery();
if (rs.next())
{
UnearnedRevenue_Acct = rs.getInt(1);
new_Account_ID = rs.getInt(2);
}
rs.close();
pstmt.close();
}
catch (SQLException e)
{
log.log(Level.SEVERE, sql, e);
}
if (new_Account_ID == 0)
{
log.severe ("UnearnedRevenue_Acct not found");
return Account_ID;
}
MRevenueRecognitionPlan plan = new MRevenueRecognitionPlan(getCtx(), 0, null);
plan.setC_RevenueRecognition_ID (C_RevenueRecognition_ID);
plan.setC_AcctSchema_ID (getC_AcctSchema_ID());
plan.setC_InvoiceLine_ID (C_InvoiceLine_ID);
plan.setUnEarnedRevenue_Acct (UnearnedRevenue_Acct);
plan.setP_Revenue_Acct (P_Revenue_Acct);
plan.setC_Currency_ID (getC_Currency_ID());
plan.setTotalAmt (getAcctBalance());
if (!plan.save(get_TrxName()))
{
log.severe ("Plan NOT created");
return Account_ID;
}
log.fine("From Acctount_ID=" + Account_ID + " to " + new_Account_ID
+ " - Plan from UnearnedRevenue_Acct=" + UnearnedRevenue_Acct + " to Revenue_Acct=" + P_Revenue_Acct);
return new_Account_ID;
} // createRevenueRecognition
/**************************************************************************
* Update Line with reversed Original Amount in Accounting Currency.
* Also copies original dimensions like Project, etc.
* Called from Doc_MatchInv
* @param AD_Table_ID table
* @param Record_ID record
* @param Line_ID line
* @param multiplier targetQty/documentQty
* @return true if success
*/
public boolean updateReverseLine (int AD_Table_ID, int Record_ID, int Line_ID,
BigDecimal multiplier)
{
boolean success = false;
String sql = "SELECT * "
+ "FROM Fact_Acct "
+ "WHERE C_AcctSchema_ID=? AND AD_Table_ID=? AND Record_ID=?"
+ " AND Line_ID=? AND Account_ID=?";
try
{
PreparedStatement pstmt = DB.prepareStatement(sql, get_TrxName());
pstmt.setInt(1, getC_AcctSchema_ID());
pstmt.setInt(2, AD_Table_ID);
pstmt.setInt(3, Record_ID);
pstmt.setInt(4, Line_ID);
pstmt.setInt(5, m_acct.getAccount_ID());
ResultSet rs = pstmt.executeQuery();
if (rs.next())
{
MFactAcct fact = new MFactAcct(getCtx(), rs, get_TrxName());
// Accounted Amounts - reverse
BigDecimal dr = fact.getAmtAcctDr();
BigDecimal cr = fact.getAmtAcctCr();
setAmtAcctDr (cr.multiply(multiplier));
setAmtAcctCr (dr.multiply(multiplier));
// Source Amounts
setAmtSourceDr (getAmtAcctDr());
setAmtSourceCr (getAmtAcctCr());
//
success = true;
log.fine(new StringBuffer("(Table=").append(AD_Table_ID)
.append(",Record_ID=").append(Record_ID)
.append(",Line=").append(Record_ID)
.append(", Account=").append(m_acct)
.append(",dr=").append(dr).append(",cr=").append(cr)
.append(") - DR=").append(getAmtSourceDr()).append("|").append(getAmtAcctDr())
.append(", CR=").append(getAmtSourceCr()).append("|").append(getAmtAcctCr())
.toString());
// Dimensions
setAD_OrgTrx_ID(fact.getAD_OrgTrx_ID());
setC_Project_ID (fact.getC_Project_ID());
setC_Activity_ID(fact.getC_Activity_ID());
setC_Campaign_ID(fact.getC_Campaign_ID());
setC_SalesRegion_ID(fact.getC_SalesRegion_ID());
setC_LocFrom_ID(fact.getC_LocFrom_ID());
setC_LocTo_ID(fact.getC_LocTo_ID());
setM_Product_ID(fact.getM_Product_ID());
setM_Locator_ID(fact.getM_Locator_ID());
setUser1_ID(fact.getUser1_ID());
setUser2_ID(fact.getUser2_ID());
setC_UOM_ID(fact.getC_UOM_ID());
setC_Tax_ID(fact.getC_Tax_ID());
// Org for cross charge
setAD_Org_ID (fact.getAD_Org_ID());
}
else
log.warning(new StringBuffer("Not Found (try later) ")
.append(",C_AcctSchema_ID=").append(getC_AcctSchema_ID())
.append(", AD_Table_ID=").append(AD_Table_ID)
.append(",Record_ID=").append(Record_ID)
.append(",Line_ID=").append(Line_ID)
.append(", Account_ID=").append(m_acct.getAccount_ID()).toString());
rs.close();
pstmt.close();
}
catch (SQLException e)
{
log.log(Level.SEVERE, sql, e);
}
return success;
} // updateReverseLine
} // FactLine
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -