⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 factline.java

📁 Java写的ERP系统
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************
 * 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 + -