📄 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 Smart Business Solution. The Initial
* Developer of the Original Code is Jorg Janke. Portions created by Jorg Janke
* are Copyright (C) 1999-2005 Jorg Janke.
* All parts are Copyright (C) 1999-2005 ComPiere, Inc. All Rights Reserved.
* Contributor(s): ______________________________________.
*****************************************************************************/
package org.compiere.acct;
import java.math.*;
import java.sql.*;
import java.util.*;
import java.util.logging.*;
import org.compiere.model.*;
import org.compiere.util.*;
/**
* Accounting Fact Entry.
*
* @author Jorg Janke
* @version $Id: FactLine.java,v 1.22 2005/12/13 00:17:13 jjanke Exp $
*/
public final class FactLine extends X_Fact_Acct
{
/**
* Constructor
*
* @param AD_Table_ID - Table of Document Source
* @param Record_ID - Record of document
* @param Line_ID - Optional line id
*/
public FactLine (Properties ctx, int AD_Table_ID, int Record_ID, int Line_ID, String trxName)
{
super(ctx, 0, trxName);
setAD_Client_ID(0); // do not derive
setAD_Org_ID(0); // do not derive
//
setAmtAcctCr (Env.ZERO);
setAmtAcctDr (Env.ZERO);
setAmtSourceCr (Env.ZERO);
setAmtSourceDr (Env.ZERO);
// Log.trace(this,Log.l1_User, "FactLine " + AD_Table_ID + ":" + Record_ID);
setAD_Table_ID (AD_Table_ID);
setRecord_ID (Record_ID);
setLine_ID (Line_ID);
} // FactLine
/** Account */
private MAccount m_acct = null;
/** Accounting Schema */
private MAcctSchema m_acctSchema = null;
/** Document Header */
private Doc m_doc = null;
/** Document Line */
private DocLine m_docLine = null;
/**
* Create Reversal (negate DR/CR) of the line
* @param description new description
* @return reversal line
*/
public FactLine reverse (String description)
{
FactLine reversal = new FactLine (getCtx(), getAD_Table_ID(), getRecord_ID(), getLine_ID(), get_TrxName());
reversal.setClientOrg(this); // needs to be set explicitly
reversal.setDocumentInfo(m_doc, m_docLine);
reversal.setAccount(m_acctSchema, m_acct);
reversal.setPostingType(getPostingType());
//
reversal.setAmtSource(getC_Currency_ID(), getAmtSourceDr().negate(), getAmtSourceCr().negate());
reversal.convert();
reversal.setDescription(description);
return reversal;
} // reverse
/**
* Create Accrual (flip CR/DR) of the line
* @param description new description
* @return accrual line
*/
public FactLine accrue (String description)
{
FactLine accrual = new FactLine (getCtx(), getAD_Table_ID(), getRecord_ID(), getLine_ID(), get_TrxName());
accrual.setClientOrg(this); // needs to be set explicitly
accrual.setDocumentInfo(m_doc, m_docLine);
accrual.setAccount(m_acctSchema, m_acct);
accrual.setPostingType(getPostingType());
//
accrual.setAmtSource(getC_Currency_ID(), getAmtSourceCr(), getAmtSourceDr());
accrual.convert();
accrual.setDescription(description);
return accrual;
} // reverse
/**
* Set Account Info
* @param acctSchema account schema
* @param acct account
*/
public void setAccount (MAcctSchema acctSchema, MAccount acct)
{
m_acctSchema = acctSchema;
setC_AcctSchema_ID (acctSchema.getC_AcctSchema_ID());
//
m_acct = acct;
if (getAD_Client_ID() == 0)
setAD_Client_ID(m_acct.getAD_Client_ID());
setAccount_ID (m_acct.getAccount_ID());
setC_SubAcct_ID(m_acct.getC_SubAcct_ID());
} // 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)
{
setC_Currency_ID (C_Currency_ID);
if (AmtSourceDr != null)
setAmtSourceDr (AmtSourceDr);
if (AmtSourceCr != null)
setAmtSourceCr (AmtSourceCr);
// one needs to be non zero
if (getAmtSourceDr().equals(Env.ZERO) && getAmtSourceCr().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)
{
setAmtAcctDr (AmtAcctDr);
setAmtAcctCr (AmtAcctCr);
} // setAmtAcct
/**
* Set Document Info
* @param doc document
* @param docLine doc line
*/
public void setDocumentInfo(Doc doc, DocLine docLine)
{
m_doc = doc;
m_docLine = docLine;
// reset
setAD_Org_ID(0);
setC_SalesRegion_ID(0);
// Client
if (getAD_Client_ID() == 0)
setAD_Client_ID (m_doc.getAD_Client_ID());
// Date Trx
setDateTrx (m_doc.getDateDoc());
if (m_docLine != null && m_docLine.getDateDoc() != null)
setDateTrx (m_docLine.getDateDoc());
// Date Acct
setDateAcct (m_doc.getDateAcct());
if (m_docLine != null && m_docLine.getDateAcct() != null)
setDateAcct (m_docLine.getDateAcct());
// Period, Tax
if (m_docLine != null && m_docLine.getC_Period_ID() != 0)
setC_Period_ID(m_docLine.getC_Period_ID());
else
setC_Period_ID (m_doc.getC_Period_ID());
if (m_docLine != null)
setC_Tax_ID (m_docLine.getC_Tax_ID());
// Description
StringBuffer description = new StringBuffer(m_doc.getDocumentNo());
if (m_docLine != null)
{
description.append(" #").append(m_docLine.getLine());
if (m_docLine.getDescription() != null)
description.append(" (").append(m_docLine.getDescription()).append(")");
else if (m_doc.getDescription() != null && m_doc.getDescription().length() > 0)
description.append(" (").append(m_doc.getDescription()).append(")");
}
else if (m_doc.getDescription() != null && m_doc.getDescription().length() > 0)
description.append(" (").append(m_doc.getDescription()).append(")");
setDescription(description.toString());
// Journal Info
setGL_Budget_ID (m_doc.getGL_Budget_ID());
setGL_Category_ID (m_doc.getGL_Category_ID());
// Product
if (m_docLine != null)
setM_Product_ID (m_docLine.getM_Product_ID());
if (getM_Product_ID() == 0)
setM_Product_ID (m_doc.getM_Product_ID());
// UOM
if (m_docLine != null)
setC_UOM_ID (m_docLine.getC_UOM_ID());
// Qty
if (get_Value("Qty") == null) // not previously set
{
setQty (m_doc.getQty()); // neg = outgoing
if (m_docLine != null)
setQty (m_docLine.getQty());
}
// Loc From (maybe set earlier)
if (getC_LocFrom_ID() == 0 && m_docLine != null)
setC_LocFrom_ID (m_docLine.getC_LocFrom_ID());
if (getC_LocFrom_ID() == 0)
setC_LocFrom_ID (m_doc.getC_LocFrom_ID());
// Loc To (maybe set earlier)
if (getC_LocTo_ID() == 0 && m_docLine != null)
setC_LocTo_ID (m_docLine.getC_LocTo_ID());
if (getC_LocTo_ID() == 0)
setC_LocTo_ID (m_doc.getC_LocTo_ID());
// BPartner
if (m_docLine != null)
setC_BPartner_ID (m_docLine.getC_BPartner_ID());
if (getC_BPartner_ID() == 0)
setC_BPartner_ID (m_doc.getC_BPartner_ID());
// Sales Region from BPLocation/Sales Rep
// Trx Org
if (m_docLine != null)
setAD_OrgTrx_ID (m_docLine.getAD_OrgTrx_ID());
if (getAD_OrgTrx_ID() == 0)
setAD_OrgTrx_ID (m_doc.getAD_OrgTrx_ID());
// Project
if (m_docLine != null)
setC_Project_ID (m_docLine.getC_Project_ID());
if (getC_Project_ID() == 0)
setC_Project_ID (m_doc.getC_Project_ID());
// Campaign
if (m_docLine != null)
setC_Campaign_ID (m_docLine.getC_Campaign_ID());
if (getC_Campaign_ID() == 0)
setC_Campaign_ID (m_doc.getC_Campaign_ID());
// Activity
if (m_docLine != null)
setC_Activity_ID (m_docLine.getC_Activity_ID());
if (getC_Activity_ID() == 0)
setC_Activity_ID (m_doc.getC_Activity_ID());
// User List 1
if (m_docLine != null)
setUser1_ID (m_docLine.getUser1_ID());
if (getUser1_ID() == 0)
setUser1_ID (m_doc.getUser1_ID());
// User List 2
if (m_docLine != null)
setUser2_ID (m_docLine.getUser2_ID());
if (getUser2_ID() == 0)
setUser2_ID (m_doc.getUser2_ID());
// User Defined
} // setDocumentInfo
/**
* Get Document Line
* @return doc line
*/
protected DocLine getDocLine()
{
return m_docLine;
} // getDocLine
/**
* Set Description
* @param description description
*/
public void addDescription (String description)
{
String original = getDescription();
if (original == null || original.trim().length() == 0)
super.setDescription(description);
else
super.setDescription(original + " - " + description);
} // addDescription
/**
* Set Warehouse Locator.
* - will overwrite Organization -
* @param M_Locator_ID locator
*/
public void setM_Locator_ID (int M_Locator_ID)
{
super.setM_Locator_ID (M_Locator_ID);
setAD_Org_ID(0); // reset
} // setM_Locator_ID
/**************************************************************************
* Set Location
* @param C_Location_ID location
* @param isFrom from
*/
public void setLocation (int C_Location_ID, boolean isFrom)
{
if (isFrom)
setC_LocFrom_ID (C_Location_ID);
else
setC_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, get_TrxName());
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.log(Level.SEVERE, sql, 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, get_TrxName());
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.log(Level.SEVERE, sql, 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, get_TrxName());
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.log(Level.SEVERE, sql, 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 (getAmtSourceDr() == null)
setAmtSourceDr (Env.ZERO);
if (getAmtSourceCr() == null)
setAmtSourceCr (Env.ZERO);
//
return getAmtSourceDr().subtract(getAmtSourceCr());
} // 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 (getAmtAcctDr() == null)
setAmtAcctDr (Env.ZERO);
if (getAmtAcctCr() == null)
setAmtAcctCr (Env.ZERO);
return getAmtAcctDr().subtract(getAmtAcctCr());
} // 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 99/0 101/0 0/99 0/101
* </pre>
* @param deltaAmount delta amount
*/
public void currencyCorrect (BigDecimal deltaAmount)
{
boolean negative = deltaAmount.compareTo(Env.ZERO) < 0;
boolean adjustDr = getAmtAcctDr().abs().compareTo(getAmtAcctCr().abs()) > 0;
log.fine(deltaAmount.toString()
+ "; Old-AcctDr=" + getAmtAcctDr() + ",AcctCr=" + getAmtAcctCr()
+ "; Negative=" + negative + "; AdjustDr=" + adjustDr);
if (adjustDr)
if (negative)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -