📄 factline.java
字号:
/******************************************************************************
* The contents of this file are subject to the Compiere License Version 1.1
* ("License"); You may not use this file except in compliance with the License
* You may obtain a copy of the License at http://www.compiere.org/license.html
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
* The Original Code is Compiere ERP & CRM Business Solution
* The Initial Developer of the Original Code is Jorg Janke and ComPiere, Inc.
* Portions created by Jorg Janke are Copyright (C) 1999-2001 Jorg Janke, parts
* created by ComPiere are Copyright (C) ComPiere, Inc.; All Rights Reserved.
* Contributor(s): ______________________________________.
*****************************************************************************/
package org.compiere.acct;
import java.math.*;
import java.sql.*;
import org.apache.log4j.Logger;
import org.compiere.util.Env;
import org.compiere.util.DB;
import org.compiere.model.*;
/**
* Accounting Fact Entry.
*
* @author Jorg Janke
* @version $Id: FactLine.java,v 1.17 2003/03/21 02:38:47 jjanke Exp $
*/
public final class FactLine
{
/**
* Constructor
*
* @param AD_Table_ID - Table of Document Source
* @param Record_ID - Record of document
* @param Line_ID - Optional line id
*/
public FactLine (int AD_Table_ID, int Record_ID, int Line_ID)
{
// Log.trace(this,Log.l1_User, "FactLine " + AD_Table_ID + ":" + Record_ID);
m_AD_Table_ID = AD_Table_ID;
m_Record_ID = Record_ID;
m_Line_ID = Line_ID;
} // FactLine
/**
* Public variables are set by Fact.createLine
*/
private int m_Fact_Acct_ID;
// Doc ID
private int m_AD_Table_ID;
private int m_Record_ID;
private int m_Line_ID;
// Account
private Account m_acct = null;
private int m_C_AcctSchema_ID = 0;
// Source Amt
private int m_C_Currency_ID = 0;
private BigDecimal m_AmtSourceDr = null;
private BigDecimal m_AmtSourceCr = null;
// Acct Amt
private BigDecimal m_AmtAcctDr = null;
private BigDecimal m_AmtAcctCr = null;
// General Info
private DocVO m_docVO = null;
private DocLine m_docLine = null;
// Journal Info
private String m_PostingType = null;
private int m_GL_Budget_ID = 0;
private int m_GL_Category_ID = 0;
// Direstly set
private int m_M_Locator_ID = 0;
private int m_C_LocFrom_ID = 0;
private int m_C_LocTo_ID = 0;
// Balancing Segments
private int m_AD_Org_ID = -1;
private Logger log = Logger.getLogger(getClass());
/**
* Dispose
*/
public void dispose()
{
m_docVO = null;
m_docLine = null;
m_acct = null;
} // dispose
/**
* Set Account Info
* @param C_AcctSchema_ID acct schema
* @param acct account
*/
public void setAccount (int C_AcctSchema_ID, Account acct)
{
m_C_AcctSchema_ID = C_AcctSchema_ID;
m_acct = acct;
} // setAccount
/**
* Set Source Amounts
* @param C_Currency_ID currency
* @param AmtSourceDr source amount dr
* @param AmtSourceCr source amount cr
* @return true, if any if the amount is not zero
*/
public boolean setAmtSource (int C_Currency_ID, BigDecimal AmtSourceDr, BigDecimal AmtSourceCr)
{
m_C_Currency_ID = C_Currency_ID;
m_AmtSourceDr = AmtSourceDr;
if (m_AmtSourceDr == null)
m_AmtSourceDr = Env.ZERO;
m_AmtSourceCr = AmtSourceCr;
if (m_AmtSourceCr == null)
m_AmtSourceCr = Env.ZERO;
// one needs to be non zero
if (m_AmtSourceDr.equals(Env.ZERO) && m_AmtSourceCr.equals(Env.ZERO))
return false;
return true;
} // setAmtSource
/**
* Set Accounted Amounts (alternative: call convert)
* @param AmtAcctDr acct amount dr
* @param AmtAcctCr acct amount cr
*/
public void setAmtAcct(BigDecimal AmtAcctDr, BigDecimal AmtAcctCr)
{
m_AmtAcctDr = AmtAcctDr;
m_AmtAcctCr = AmtAcctCr;
} // setAmtAcct
/**
* Set Document Info
* @param docVO document value object
* @param docLine doc line
*/
public void setDocumentInfo(DocVO docVO, DocLine docLine)
{
m_docVO = docVO;
m_docLine = docLine;
} // setDocumentInfo
/**
* Set Journal Info
* @param GL_Budget_ID budget
* @param GL_Category_ID category
*/
public void setJournalInfo(int GL_Budget_ID, int GL_Category_ID)
{
m_GL_Budget_ID = GL_Budget_ID;
m_GL_Category_ID = GL_Category_ID;
} // setJournalInfo
/**
* Set Posting Type
* @param PostingType posting type
*/
public void setPostingType(String PostingType)
{
m_PostingType = PostingType;
} // setPostingType
/**
* Set Warehouse Locator.
* - will overwrite Organization -
* @param M_Locator_ID locator
*/
public void setM_Locator_ID (int M_Locator_ID)
{
m_M_Locator_ID = M_Locator_ID;
// should not happen - consequence is potentially screwed Org segment balancing
if (m_AD_Org_ID != -1)
log.error("setM_Locator_ID - Organization already calculated");
} // setM_Locator_ID
/*************************************************************************/
/**
* Set Location
* @param C_Location_ID location
* @param isFrom from
*/
public void setLocation (int C_Location_ID, boolean isFrom)
{
if (isFrom)
m_C_LocFrom_ID = C_Location_ID;
else
m_C_LocTo_ID = C_Location_ID;
} // setLocator
/**
* Set Location from Locator
* @param M_Locator_ID locator
* @param isFrom from
*/
public void setLocationFromLocator (int M_Locator_ID, boolean isFrom)
{
if (M_Locator_ID == 0)
return;
int C_Location_ID = 0;
String sql = "SELECT w.C_Location_ID FROM M_Warehouse w, M_Locator l "
+ "WHERE w.M_Warehouse_ID=l.M_Warehouse_ID AND l.M_Locator_ID=?";
try
{
PreparedStatement pstmt = DB.prepareStatement(sql);
pstmt.setInt(1, M_Locator_ID);
ResultSet rs = pstmt.executeQuery();
if (rs.next())
C_Location_ID = rs.getInt(1);
rs.close();
pstmt.close();
}
catch (SQLException e)
{
log.error ("setLocationFromLocator", e);
return;
}
if (C_Location_ID != 0)
setLocation (C_Location_ID, isFrom);
} // setLocationFromLocator
/**
* Set Location from Busoness Partner Location
* @param C_BPartner_Location_ID bp location
* @param isFrom from
*/
public void setLocationFromBPartner (int C_BPartner_Location_ID, boolean isFrom)
{
if (C_BPartner_Location_ID == 0)
return;
int C_Location_ID = 0;
String sql = "SELECT C_Location_ID FROM C_BPartner_Location WHERE C_BPartner_Location_ID=?";
try
{
PreparedStatement pstmt = DB.prepareStatement(sql);
pstmt.setInt(1, C_BPartner_Location_ID);
ResultSet rs = pstmt.executeQuery();
if (rs.next())
C_Location_ID = rs.getInt(1);
rs.close();
pstmt.close();
}
catch (SQLException e)
{
log.error ("setLocationFromBPartner", e);
return;
}
if (C_Location_ID != 0)
setLocation (C_Location_ID, isFrom);
} // setLocationFromBPartner
/**
* Set Location from Organization
* @param AD_Org_ID org
* @param isFrom from
*/
public void setLocationFromOrg (int AD_Org_ID, boolean isFrom)
{
if (AD_Org_ID == 0)
return;
int C_Location_ID = 0;
String sql = "SELECT C_Location_ID FROM AD_OrgInfo WHERE AD_Org_ID=?";
try
{
PreparedStatement pstmt = DB.prepareStatement(sql);
pstmt.setInt(1, AD_Org_ID);
ResultSet rs = pstmt.executeQuery();
if (rs.next())
C_Location_ID = rs.getInt(1);
rs.close();
pstmt.close();
}
catch (SQLException e)
{
log.error ("setLocationFromBPartner", e);
return;
}
if (C_Location_ID != 0)
setLocation (C_Location_ID, isFrom);
} // setLocationFromOrg
/*************************************************************************/
/**
* Returns Source Balance of line
* @return source balance
*/
public BigDecimal getSourceBalance()
{
if (m_AmtSourceDr == null)
m_AmtSourceDr = Env.ZERO;
if (m_AmtSourceCr == null)
m_AmtSourceCr = Env.ZERO;
//
return m_AmtSourceDr.subtract(m_AmtSourceCr);
} // getSourceBalance
/**
* Is Debit Source Balance
* @return true if DR source balance
*/
public boolean isDrSourceBalance()
{
return getSourceBalance().compareTo(Env.ZERO) != -1;
} // isDrSourceBalance
/**
* Get Accounted Balance
* @return accounting balance
*/
public BigDecimal getAcctBalance()
{
if (m_AmtAcctDr == null)
m_AmtAcctDr = Env.ZERO;
if (m_AmtAcctCr == null)
m_AmtAcctCr = Env.ZERO;
return m_AmtAcctDr.subtract(m_AmtAcctCr);
} // getAcctBalance
/**
* Is Account on Balance Sheet
* @return true if account is a balance sheet account
*/
public boolean isBalanceSheet()
{
return m_acct.isBalanceSheet();
} // isBalanceSheet
/**
* Currect Accounting Amount.
* <pre>
* Example: 1 -1 1 -1
* Old 100/0 100/0 0/100 0/100
* New 101/0 99/0 0/99 0/101
* </pre>
* @param deltaAmount delta amount
*/
public void currencyCorrect (BigDecimal deltaAmount)
{
boolean negative = deltaAmount.compareTo(Env.ZERO) < 0;
boolean adjustDr = m_AmtAcctDr.compareTo(m_AmtAcctCr) > 0;
log.debug ("currencyCorrect - " + deltaAmount.toString()
+ "; Old-AcctDr=" + m_AmtAcctDr.toString() + ",AcctCr=" + m_AmtAcctCr.toString()
+ "; Negative=" + negative + "; AdjustDr=" + adjustDr);
if (adjustDr)
if (negative)
m_AmtAcctDr = m_AmtAcctDr.subtract(deltaAmount);
else
m_AmtAcctDr = m_AmtAcctDr.add(deltaAmount);
else
if (negative)
m_AmtAcctCr = m_AmtAcctCr.add(deltaAmount);
else
m_AmtAcctCr = m_AmtAcctCr.subtract(deltaAmount);
log.debug("currencyCorrect - New-AcctDr=" + m_AmtAcctDr.toString() + ",AcctCr=" + m_AmtAcctCr.toString());
} // currencyCorrect
/**
* Convert to Accounted Currency
*
* @param Acct_Currency_ID acct currency
* @param ConversionDate conversion date
* @param CurrencyRateType rate type
* @return true if converted
*/
public boolean convert (int Acct_Currency_ID, Timestamp ConversionDate, String CurrencyRateType)
{
// Document has no currency
if (m_C_Currency_ID == Doc.NO_CURRENCY)
m_C_Currency_ID = Acct_Currency_ID;
if (Acct_Currency_ID == m_C_Currency_ID)
{
m_AmtAcctDr = m_AmtSourceDr;
m_AmtAcctCr = m_AmtSourceCr;
return true;
}
if (m_docVO == null)
{
log.error ("convert - No Document VO");
return false;
}
m_AmtAcctDr = DB.getConvertedAmt (m_AmtSourceDr, m_C_Currency_ID, Acct_Currency_ID,
ConversionDate, CurrencyRateType, m_docVO.AD_Client_ID, m_docVO.AD_Org_ID);
if (m_AmtAcctDr == null)
return false;
m_AmtAcctCr = DB.getConvertedAmt (m_AmtSourceCr, m_C_Currency_ID, Acct_Currency_ID,
ConversionDate, CurrencyRateType, m_docVO.AD_Client_ID, m_docVO.AD_Org_ID);
return true;
} // convert
/**
* To String
* @return String
*/
public String toString()
{
StringBuffer sb = new StringBuffer("FactLine=[");
sb.append(m_AD_Table_ID).append(":").append(m_Record_ID);
sb.append(",").append(m_acct);
sb.append(",Cur=").append(m_C_Currency_ID);
sb.append(", DR=").append(m_AmtSourceDr).append("|").append(m_AmtAcctDr);
sb.append(", CR=").append(m_AmtSourceCr).append("|").append(m_AmtAcctCr);
sb.append("]");
return sb.toString();
} // toString
/*************************************************************************/
/**
* Get AD_Client
* @return AD_Client_ID
*/
private int getAD_Client_ID()
{
int AD_Client_ID = m_docVO.AD_Client_ID;
if (AD_Client_ID == 0)
AD_Client_ID = m_acct.getAD_Client_ID();
return AD_Client_ID;
} // getAD_Client_ID
/**
* 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 (m_AD_Org_ID != -1) // set earlier
return m_AD_Org_ID;
// Prio 1 - get from locator - if exist
if (m_M_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);
pstmt.setInt(1, m_M_Locator_ID);
pstmt.setInt(2, getAD_Client_ID());
ResultSet rs = pstmt.executeQuery();
if (rs.next())
m_AD_Org_ID = rs.getInt(1);
rs.close();
pstmt.close();
}
catch (SQLException e)
{
log.error ("getAD_Org_ID", e);
}
} // M_Locator_ID != 0
// Prio 2 - get from doc line - if exists (document context overwrites)
if (m_AD_Org_ID <= 0 && m_docLine != null)
m_AD_Org_ID = m_docLine.getAD_Org_ID();
// Prio 3 - get from account (inter-company)
if (m_AD_Org_ID <= 0)
m_AD_Org_ID = m_acct.getAD_Org_ID();
// Prio 4 - get from doc
if (m_AD_Org_ID <= 0)
m_AD_Org_ID = m_docVO.AD_Org_ID;
//
return m_AD_Org_ID;
} // getAD_Org_ID
/**
* Set AD_Org_ID (balancing segment)
* @param AD_Org_ID org
*/
public void setAD_Org_ID (int AD_Org_ID)
{
if (AD_Org_ID > 0)
m_AD_Org_ID = AD_Org_ID;
} // setAD_Org_ID
/*************************************************************************/
/**
* Save to Disk.
* Get Info from this, doc-line, document, account
* Optionally create Revenue Recognition Plan
* @param con connection
* @return true if saved
*/
public boolean save (Connection con)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -