📄 doc.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.lang.reflect.*;
import java.math.*;
import java.sql.*;
import java.util.*;
import java.util.logging.*;
import org.compiere.model.*;
import org.compiere.report.*;
import org.compiere.util.*;
/**
* Posting Document Root.
*
* <pre>
* Table Base Document Types (C_DocType.DocBaseType & AD_Reference_ID=183)
* Class AD_Table_ID
* ------------------ ------------------------------
* C_Invoice: ARI, ARC, ARF, API, APC
* Doc_Invoice 318 - has C_DocType_ID
*
* C_Payment: ARP, APP
* Doc_Payment 335 - has C_DocType_ID
*
* C_Order: SOO, POO, POR (Requisition)
* Doc_Order 259 - has C_DocType_ID
*
* M_InOut: MMS, MMR
* Doc_InOut 319 - DocType derived
*
* M_Inventory: MMI
* Doc_Inventory 321 - DocType fixed
*
* M_Movement: MMM
* Doc_Movement 323 - DocType fixed
*
* M_Production: MMP
* Doc_Production 325 - DocType fixed
*
* C_BankStatement: CMB
* Doc_Bank 392 - DocType fixed
*
* C_Cash: CMC
* Doc_Cash 407 - DocType fixed
*
* C_Allocation: CMA
* Doc_Allocation 390 - DocType fixed
*
* GL_Journal: GLJ
* Doc_GLJournal 224 = has C_DocType_ID
*
* Matching Invoice MXI
* M_MatchInv 472 - DocType fixed
*
* Matching PO MXP
* M_MatchPO 473 - DocType fixed
*
* Project Issue PJI
* C_ProjectIssue 623 - DocType fixed
*
* </pre>
* @author Jorg Janke
* @version $Id: Doc.java,v 1.24 2005/12/27 06:20:45 jjanke Exp $
*/
public abstract class Doc
{
/** AD_Table_ID's of documents */
public static int[] documentsTableID = new int[] {
MInvoice.Table_ID, // C_Invoice
MAllocationHdr.Table_ID, // C_Allocation
MCash.Table_ID, // C_Cash
MBankStatement.Table_ID, // C_BankStatement
MOrder.Table_ID, // C_Order
MPayment.Table_ID, // C_Payment
MInOut.Table_ID, // M_InOut
MInventory.Table_ID, // M_Inventory
MMovement.Table_ID, // M_Movement
X_M_Production.Table_ID, // M_Production
MJournal.Table_ID, // GL_Journal
MMatchInv.Table_ID, // M_MatchInv
MMatchPO.Table_ID, // M_MatchPO
MProjectIssue.Table_ID, // C_ProjectIssue
MRequisition.Table_ID // M_Requisition
};
/** Table Names of documents */
public static String[] documentsTableName = new String[] {
MInvoice.Table_Name, // C_Invoice
MAllocationHdr.Table_Name, // C_Allocation
MCash.Table_Name, // C_Cash
MBankStatement.Table_Name, // C_BankStatement
MOrder.Table_Name, // C_Order
MPayment.Table_Name, // C_Payment
MInOut.Table_Name, // M_InOut
MInventory.Table_Name, // M_Inventory
MMovement.Table_Name, // M_Movement
X_M_Production.Table_Name, // M_Production
MJournal.Table_Name, // GL_Journal
MMatchInv.Table_Name, // M_MatchInv
MMatchPO.Table_Name, // M_MatchPO
MProjectIssue.Table_Name, // C_ProjectIssue
MRequisition.Table_Name // M_Requisition
};
/**************************************************************************
* Document Types
* --------------
* C_DocType.DocBaseType & AD_Reference_ID=183
* C_Invoice: ARI, ARC, ARF, API, APC
* C_Payment: ARP, APP
* C_Order: SOO, POO
* M_Transaction: MMI, MMM, MMS, MMR
* C_BankStatement: CMB
* C_Cash: CMC
* C_Allocation: CMA
* GL_Journal: GLJ
* C_ProjectIssue PJI
* M_Requisition POR
**************************************************************************/
/** AR Invoices - ARI */
public static final String DOCTYPE_ARInvoice = MDocType.DOCBASETYPE_ARInvoice;
/** AR Credit Memo */
public static final String DOCTYPE_ARCredit = "ARC";
/** AR Receipt */
public static final String DOCTYPE_ARReceipt = "ARR";
/** AR ProForma */
public static final String DOCTYPE_ARProForma = "ARF";
/** AP Invoices */
public static final String DOCTYPE_APInvoice = "API";
/** AP Credit Memo */
public static final String DOCTYPE_APCredit = "APC";
/** AP Payment */
public static final String DOCTYPE_APPayment = "APP";
/** CashManagement Bank Statement */
public static final String DOCTYPE_BankStatement = "CMB";
/** CashManagement Cash Journals */
public static final String DOCTYPE_CashJournal = "CMC";
/** CashManagement Allocations */
public static final String DOCTYPE_Allocation = "CMA";
/** Material Shipment */
public static final String DOCTYPE_MatShipment = "MMS";
/** Material Receipt */
public static final String DOCTYPE_MatReceipt = "MMR";
/** Material Inventory */
public static final String DOCTYPE_MatInventory = "MMI";
/** Material Movement */
public static final String DOCTYPE_MatMovement = "MMM";
/** Material Production */
public static final String DOCTYPE_MatProduction = "MMP";
/** Match Invoice */
public static final String DOCTYPE_MatMatchInv = "MXI";
/** Match PO */
public static final String DOCTYPE_MatMatchPO = "MXP";
/** GL Journal */
public static final String DOCTYPE_GLJournal = "GLJ";
/** Purchase Order */
public static final String DOCTYPE_POrder = "POO";
/** Sales Order */
public static final String DOCTYPE_SOrder = "SOO";
/** Project Issue */
public static final String DOCTYPE_ProjectIssue = "PJI";
/** Purchase Requisition */
public static final String DOCTYPE_PurchaseRequisition = "POR";
// Posting Status - AD_Reference_ID=234 //
/** Document Status */
public static final String STATUS_NotPosted = "N";
/** Document Status */
public static final String STATUS_NotBalanced = "b";
/** Document Status */
public static final String STATUS_NotConvertible = "c";
/** Document Status */
public static final String STATUS_PeriodClosed = "p";
/** Document Status */
public static final String STATUS_InvalidAccount = "i";
/** Document Status */
public static final String STATUS_PostPrepared = "y";
/** Document Status */
public static final String STATUS_Posted = "Y";
/** Document Status */
public static final String STATUS_Error = "E";
/**
* Create Posting document
* @param ass accounting schema
* @param AD_Table_ID Table ID of Documents
* @param Record_ID record ID to load
* @param trxName transaction name
* @return Document or null
*/
public static Doc get (MAcctSchema[] ass, int AD_Table_ID, int Record_ID, String trxName)
{
String TableName = null;
for (int i = 0; i < documentsTableID.length; i++)
{
if (documentsTableID[i] == AD_Table_ID)
{
TableName = documentsTableName[i];
break;
}
}
if (TableName == null)
{
s_log.severe("Not found AD_Table_ID=" + AD_Table_ID);
return null;
}
//
Doc doc = null;
StringBuffer sql = new StringBuffer("SELECT * FROM ")
.append(TableName)
.append(" WHERE ").append(TableName).append("_ID=? AND Processed='Y'");
PreparedStatement pstmt = null;
try
{
pstmt = DB.prepareStatement (sql.toString(), trxName);
pstmt.setInt (1, Record_ID);
ResultSet rs = pstmt.executeQuery ();
if (rs.next ())
{
doc = get (ass, AD_Table_ID, rs, trxName);
}
else
s_log.severe("Not Found: " + TableName + "_ID=" + Record_ID);
rs.close ();
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
s_log.log (Level.SEVERE, sql.toString(), e);
}
try
{
if (pstmt != null)
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
pstmt = null;
}
return doc;
} // get
/**
* Create Posting document
* @param ass accounting schema
* @param AD_Table_ID Table ID of Documents
* @param rs ResultSet
* @param trxName transaction name
* @return Document
*/
public static Doc get (MAcctSchema[] ass, int AD_Table_ID, ResultSet rs, String trxName)
{
Doc doc = null;
switch (AD_Table_ID)
{
case MInvoice.Table_ID:
doc = new Doc_Invoice (ass, rs, trxName);
break;
case MAllocationHdr.Table_ID:
doc = new Doc_Allocation (ass, rs, trxName);
break;
case MCash.Table_ID:
doc = new Doc_Cash (ass, rs, trxName);
break;
case MBankStatement.Table_ID:
doc = new Doc_Bank (ass, rs, trxName);
break;
case MOrder.Table_ID:
doc = new Doc_Order (ass, rs, trxName);
break;
case MPayment.Table_ID:
doc = new Doc_Payment (ass, rs, trxName);
break;
case MInOut.Table_ID:
doc = new Doc_InOut (ass, rs, trxName);
break;
case MInventory.Table_ID:
doc = new Doc_Inventory (ass, rs, trxName);
break;
case MMovement.Table_ID:
doc = new Doc_Movement (ass, rs, trxName);
break;
case X_M_Production.Table_ID:
doc = new Doc_Production (ass, rs, trxName);
break;
case MJournal.Table_ID:
doc = new Doc_GLJournal (ass, rs, trxName);
break;
case MMatchInv.Table_ID:
doc = new Doc_MatchInv (ass, rs, trxName);
break;
case MMatchPO.Table_ID:
doc = new Doc_MatchPO (ass, rs, trxName);
break;
case MProjectIssue.Table_ID:
doc = new Doc_ProjectIssue (ass, rs, trxName);
break;
case MRequisition.Table_ID:
doc = new Doc_Requisition (ass, rs, trxName);
break;
}
if (doc == null)
s_log.log(Level.SEVERE, "Unknown AD_Table_ID=" + AD_Table_ID);
return doc;
} // get
/**
* Post Document
* @param ass accounting schemata
* @param AD_Table_ID Transaction table
* @param Record_ID Record ID of this document
* @param force force posting
* @return null if the document was posted or error message
*/
public static String postImmediate (MAcctSchema[] ass,
int AD_Table_ID, int Record_ID, boolean force, String trxName)
{
Doc doc = get (ass, AD_Table_ID, Record_ID, trxName);
if (doc != null)
return doc.post (force, true); // repost
return "NoDoc";
} // post
/** Static Log */
protected static CLogger s_log = CLogger.getCLogger(Doc.class);
/** Log per Document */
protected CLogger log = CLogger.getCLogger(getClass());
/**************************************************************************
* Constructor
* @param ass accounting schemata
* @param clazz Document Class
* @param rs result set
* @param defaultDocumentType default document type or null
* @param trxName trx
*/
Doc (MAcctSchema[] ass, Class clazz, ResultSet rs, String defaultDocumentType, String trxName)
{
p_Status = STATUS_Error;
m_ass = ass;
m_ctx = new Properties(m_ass[0].getCtx());
m_ctx.setProperty("#AD_Client_ID", String.valueOf(m_ass[0].getAD_Client_ID()));
String className = clazz.getName();
className = className.substring(className.lastIndexOf('.')+1);
try
{
Constructor constructor = clazz.getConstructor(new Class[]{Properties.class, ResultSet.class, String.class});
p_po = (PO)constructor.newInstance(new Object[]{m_ctx, rs, trxName});
}
catch (Exception e)
{
String msg = className + ": " + e.getLocalizedMessage();
log.severe(msg);
throw new IllegalArgumentException(msg);
}
// Document Type
setDocumentType (defaultDocumentType);
m_trxName = trxName;
if (m_trxName == null)
m_trxName = "Post" + getDocumentType() + p_po.get_ID();
p_po.set_TrxName(m_trxName);
// Amounts
m_Amounts[0] = Env.ZERO;
m_Amounts[1] = Env.ZERO;
m_Amounts[2] = Env.ZERO;
m_Amounts[3] = Env.ZERO;
} // Doc
/** Accounting Schema Array */
private MAcctSchema[] m_ass = null;
/** Properties */
private Properties m_ctx = null;
/** Transaction Name */
private String m_trxName = null;
/** The Document */
protected PO p_po = null;
/** Document Type */
private String m_DocumentType = null;
/** Document No */
private String m_DocumentNo = null;
/** Description */
private String m_Description = null;
/** GL Category */
private int m_GL_Category_ID = 0;
/** GL Period */
private MPeriod m_period = null;
/** Period ID */
private int m_C_Period_ID = 0;
/** Location From */
private int m_C_LocFrom_ID = 0;
/** Location To */
private int m_C_LocTo_ID = 0;
/** Accounting Date */
private Timestamp m_DateAcct = null;
/** Document Date */
private Timestamp m_DateDoc = null;
/** Tax Included */
private boolean m_TaxIncluded = false;
/** Is (Source) Multi-Currency Document - i.e. the document has different currencies
* (if true, the document will not be source balanced) */
private boolean m_MultiCurrency = false;
/** BP Sales Region */
private int m_BP_C_SalesRegion_ID = -1;
/** B Partner */
private int m_C_BPartner_ID = -1;
/** Bank Account */
private int m_C_BankAccount_ID = -1;
/** Cach Book */
private int m_C_CashBook_ID = -1;
/** Currency */
private int m_C_Currency_ID = -1;
/** Contained Doc Lines */
protected DocLine[] p_lines;
/** Facts */
private ArrayList<Fact> m_fact = null;
/** No Currency in Document Indicator (-1) */
protected static final int NO_CURRENCY = -2;
/** Actual Document Status */
protected String p_Status = null;
/** Error Message */
protected String p_Error = null;
/**
* Get Context
* @return context
*/
protected Properties getCtx()
{
return m_ctx;
} // getCtx
/**
* Get Table Name
* @return table name
*/
public String get_TableName()
{
return p_po.get_TableName();
} // get_TableName
/**
* Get Table ID
* @return table id
*/
public int get_Table_ID()
{
return p_po.get_Table_ID();
} // get_Table_ID
/**
* Get Record_ID
* @return record id
*/
public int get_ID()
{
return p_po.get_ID();
} // get_ID
/**
* Get Persistent Object
* @return po
*/
protected PO getPO()
{
return p_po;
} // getPO
/**
* Post Document.
* <pre>
* - try to lock document (Processed='Y' (AND Processing='N' AND Posted='N'))
* - if not ok - return false
* - postlogic (for all Accounting Schema)
* - create Fact lines
* - postCommit
* - commits Fact lines and Document & sets Processing = 'N'
* - if error - create Note
* </pre>
* @param force if true ignore that locked
* @param repost if true ignore that already posted
* @return null if posted error otherwise
*/
public final String post (boolean force, boolean repost)
{
if (p_po.getAD_Client_ID() != m_ass[0].getAD_Client_ID())
{
String error = "AD_Client_ID Conflict - Document=" + p_po.getAD_Client_ID()
+ ", AcctSchema=" + m_ass[0].getAD_Client_ID();
log.severe(error);
return error;
}
// Lock Record ----
StringBuffer sql = new StringBuffer ("UPDATE ");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -