diff --git a/base/src/org/adempiere/process/ClientAcctProcessor.java b/base/src/org/adempiere/process/ClientAcctProcessor.java index b7a9b086a8..e47688cca7 100644 --- a/base/src/org/adempiere/process/ClientAcctProcessor.java +++ b/base/src/org/adempiere/process/ClientAcctProcessor.java @@ -115,10 +115,10 @@ public class ClientAcctProcessor extends SvrProcess */ private void postSession() { - for (int i = 0; i < Doc.documentsTableID.length; i++) + for (int i = 0; i < Doc.getDocumentsTableID().length; i++) { - int AD_Table_ID = Doc.documentsTableID[i]; - String TableName = Doc.documentsTableName[i]; + int AD_Table_ID = Doc.getDocumentsTableID()[i]; + String TableName = Doc.getDocumentsTableName()[i]; // Post only special documents if (p_AD_Table_ID != 0 && p_AD_Table_ID != AD_Table_ID) diff --git a/base/src/org/compiere/acct/Doc.java b/base/src/org/compiere/acct/Doc.java index 015d7e1801..13324c1dd1 100644 --- a/base/src/org/compiere/acct/Doc.java +++ b/base/src/org/compiere/acct/Doc.java @@ -28,32 +28,20 @@ import java.util.Iterator; import java.util.Properties; import java.util.logging.Level; +import org.adempiere.exceptions.DBException; import org.compiere.model.MAccount; import org.compiere.model.MAcctSchema; -import org.compiere.model.MAllocationHdr; -import org.compiere.model.MBankStatement; -import org.compiere.model.MCash; import org.compiere.model.MClient; import org.compiere.model.MConversionRate; import org.compiere.model.MDocType; -import org.compiere.model.MInOut; -import org.compiere.model.MInventory; -import org.compiere.model.MInvoice; -import org.compiere.model.MJournal; -import org.compiere.model.MMatchInv; -import org.compiere.model.MMatchPO; -import org.compiere.model.MMovement; import org.compiere.model.MNote; -import org.compiere.model.MOrder; -import org.compiere.model.MPayment; import org.compiere.model.MPeriod; -import org.compiere.model.MProjectIssue; -import org.compiere.model.MRequisition; +import org.compiere.model.MTable; import org.compiere.model.ModelValidationEngine; import org.compiere.model.ModelValidator; import org.compiere.model.PO; -import org.compiere.model.X_M_Production; import org.compiere.process.DocumentEngine; +import org.compiere.util.AdempiereUserError; import org.compiere.util.CLogger; import org.compiere.util.DB; import org.compiere.util.Env; @@ -122,42 +110,10 @@ import org.compiere.util.Trx; 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 - }; + private static int[] documentsTableID = null; /** 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 - }; + private static String[] documentsTableName = null; /************************************************************************** * Document Types @@ -251,11 +207,11 @@ public abstract class Doc 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++) + for (int i = 0; i < getDocumentsTableID().length; i++) { - if (documentsTableID[i] == AD_Table_ID) + if (getDocumentsTableID()[i] == AD_Table_ID) { - TableName = documentsTableName[i]; + TableName = getDocumentsTableName()[i]; break; } } @@ -303,40 +259,77 @@ public abstract class Doc * @param rs ResultSet * @param trxName transaction name * @return Document + * @throws AdempiereUserError */ - public static Doc get (MAcctSchema[] ass, int AD_Table_ID, ResultSet rs, String trxName) + public static Doc get (MAcctSchema[] ass, int AD_Table_ID, ResultSet rs, String trxName) throws AdempiereUserError { Doc doc = null; - if (AD_Table_ID == MInvoice.Table_ID) - doc = new Doc_Invoice (ass, rs, trxName); - else if (AD_Table_ID == MAllocationHdr.Table_ID) - doc = new Doc_Allocation (ass, rs, trxName); - else if (AD_Table_ID == MCash.Table_ID) - doc = new Doc_Cash (ass, rs, trxName); - else if (AD_Table_ID == MBankStatement.Table_ID) - doc = new Doc_Bank (ass, rs, trxName); - else if (AD_Table_ID == MOrder.Table_ID) - doc = new Doc_Order (ass, rs, trxName); - else if (AD_Table_ID == MPayment.Table_ID) - doc = new Doc_Payment (ass, rs, trxName); - else if (AD_Table_ID == MInOut.Table_ID) - doc = new Doc_InOut (ass, rs, trxName); - else if (AD_Table_ID == MInventory.Table_ID) - doc = new Doc_Inventory (ass, rs, trxName); - else if (AD_Table_ID == MMovement.Table_ID) - doc = new Doc_Movement (ass, rs, trxName); - else if (AD_Table_ID == X_M_Production.Table_ID) - doc = new Doc_Production (ass, rs, trxName); - else if (AD_Table_ID == MJournal.Table_ID) - doc = new Doc_GLJournal (ass, rs, trxName); - else if (AD_Table_ID == MMatchInv.Table_ID) - doc = new Doc_MatchInv (ass, rs, trxName); - else if (AD_Table_ID == MMatchPO.Table_ID) - doc = new Doc_MatchPO (ass, rs, trxName); - else if (AD_Table_ID == MProjectIssue.Table_ID) - doc = new Doc_ProjectIssue (ass, rs, trxName); - else if (AD_Table_ID == MRequisition.Table_ID) - doc = new Doc_Requisition (ass, rs, trxName); + + /* Classname of the Doc class follows this convention: + * if the prefix (letters before the first underscore _) is 1 character, then the class is Doc_TableWithoutPrefixWithoutUnderscores + * otherwise Doc_WholeTableWithoutUnderscores + * i.e. following this query + SELECT t.ad_table_id, tablename, + CASE + WHEN instr(tablename, '_') = 2 + THEN 'Doc_' || substr(tablename, 3) + WHEN instr(tablename, '_') > 2 + THEN 'Doc_' || + ELSE '' + REPLACE + ( + tablename, '_', '' + ) + END AS classname + FROM ad_table t, ad_column C + WHERE t.ad_table_id = C.ad_table_id AND + C.columnname = 'Posted' AND + isview = 'N' + ORDER BY 1 + * This is: + * 224 GL_Journal Doc_GLJournal + * 259 C_Order Doc_Order + * 318 C_Invoice Doc_Invoice + * 319 M_InOut Doc_InOut + * 321 M_Inventory Doc_Inventory + * 323 M_Movement Doc_Movement + * 325 M_Production Doc_Production + * 335 C_Payment Doc_Payment + * 392 C_BankStatement Doc_BankStatement + * 407 C_Cash Doc_Cash + * 472 M_MatchInv Doc_MatchInv + * 473 M_MatchPO Doc_MatchPO + * 623 C_ProjectIssue Doc_ProjectIssue + * 702 M_Requisition Doc_Requisition + * 735 C_AllocationHdr Doc_AllocationHdr + * 53027 PP_Order Doc_PPOrder + * 53035 PP_Cost_Collector Doc_PPCostCollector + * 53037 DD_Order Doc_DDOrder + * 53092 HR_Process Doc_HRProcess + */ + + String tableName = MTable.getTableName(Env.getCtx(), AD_Table_ID); + String packageName = "org.compiere.acct"; + String className = null; + + int firstUnderscore = tableName.indexOf("_"); + if (firstUnderscore == 1) + className = packageName + ".Doc_" + tableName.substring(2).replaceAll("_", ""); + else + className = packageName + ".Doc_" + tableName.replaceAll("_", ""); + + try + { + Class cClass = Class.forName(className); + Constructor cnstr = cClass.getConstructor(new Class[] {MAcctSchema[].class, ResultSet.class, String.class}); + doc = (Doc) cnstr.newInstance(ass, rs, trxName); + } + catch (Exception e) + { + s_log.log(Level.SEVERE, "Doc Class invalid: " + className + " (" + e.toString() + ")"); + throw new AdempiereUserError("Doc Class invalid: " + className + " (" + e.toString() + ")"); + } + if (doc == null) s_log.log(Level.SEVERE, "Unknown AD_Table_ID=" + AD_Table_ID); return doc; @@ -2241,5 +2234,60 @@ public abstract class Doc public ArrayList getFacts() { return m_fact; } + + /* + * Array of tables with Post column + */ + public static int[] getDocumentsTableID() { + fillDocumentsTableArrays(); + return documentsTableID; + } + + public static String[] getDocumentsTableName() { + fillDocumentsTableArrays(); + return documentsTableName; + } + + private static void fillDocumentsTableArrays() { + if (documentsTableID == null) { + String sql = "SELECT t.AD_Table_ID, t.TableName " + + "FROM AD_Table t, AD_Column c " + + "WHERE t.AD_Table_ID=c.AD_Table_ID AND " + + "c.ColumnName='Posted' AND " + + "IsView='N' " + + "ORDER BY t.AD_Table_ID"; + ArrayList tableIDs = new ArrayList(); + ArrayList tableNames = new ArrayList(); + PreparedStatement pstmt = null; + ResultSet rs = null; + try + { + pstmt = DB.prepareStatement(sql, null); + rs = pstmt.executeQuery(); + while (rs.next()) + { + tableIDs.add(rs.getInt(1)); + tableNames.add(rs.getString(2)); + } + } + catch (SQLException e) + { + throw new DBException(e, sql); + } + finally + { + DB.close(rs, pstmt); + rs = null; pstmt = null; + } + // Convert to array + documentsTableID = new int[tableIDs.size()]; + documentsTableName = new String[tableIDs.size()]; + for (int i = 0; i < documentsTableID.length; i++) + { + documentsTableID[i] = tableIDs.get(i); + documentsTableName[i] = tableNames.get(i); + } + } + } } // Doc diff --git a/base/src/org/compiere/acct/Doc_Allocation.java b/base/src/org/compiere/acct/Doc_Allocation.java index 953c9025ca..828df7c48a 100644 --- a/base/src/org/compiere/acct/Doc_Allocation.java +++ b/base/src/org/compiere/acct/Doc_Allocation.java @@ -63,7 +63,7 @@ public class Doc_Allocation extends Doc * @param rs record * @param trxName trx */ - protected Doc_Allocation (MAcctSchema[] ass, ResultSet rs, String trxName) + public Doc_Allocation (MAcctSchema[] ass, ResultSet rs, String trxName) { super (ass, MAllocationHdr.class, rs, DOCTYPE_Allocation, trxName); } // Doc_Allocation diff --git a/base/src/org/compiere/acct/Doc_Bank.java b/base/src/org/compiere/acct/Doc_Bank.java index 3bedeb7fbb..5478c47997 100644 --- a/base/src/org/compiere/acct/Doc_Bank.java +++ b/base/src/org/compiere/acct/Doc_Bank.java @@ -52,7 +52,7 @@ public class Doc_Bank extends Doc * @param rs record * @param trxName trx */ - protected Doc_Bank (MAcctSchema[] ass, ResultSet rs, String trxName) + public Doc_Bank (MAcctSchema[] ass, ResultSet rs, String trxName) { super (ass, MBankStatement.class, rs, DOCTYPE_BankStatement, trxName); } // Doc_Bank diff --git a/base/src/org/compiere/acct/Doc_Cash.java b/base/src/org/compiere/acct/Doc_Cash.java index a28bda1c02..b224c56559 100644 --- a/base/src/org/compiere/acct/Doc_Cash.java +++ b/base/src/org/compiere/acct/Doc_Cash.java @@ -44,7 +44,7 @@ public class Doc_Cash extends Doc * @param rs record * @param trxName trx */ - protected Doc_Cash (MAcctSchema[] ass, ResultSet rs, String trxName) + public Doc_Cash (MAcctSchema[] ass, ResultSet rs, String trxName) { super(ass, MCash.class, rs, DOCTYPE_CashJournal, trxName); } // Doc_Cash diff --git a/base/src/org/compiere/acct/Doc_GLJournal.java b/base/src/org/compiere/acct/Doc_GLJournal.java index 262625cdc9..74115fef61 100644 --- a/base/src/org/compiere/acct/Doc_GLJournal.java +++ b/base/src/org/compiere/acct/Doc_GLJournal.java @@ -44,7 +44,7 @@ public class Doc_GLJournal extends Doc * @param rs record * @param trxName trx */ - protected Doc_GLJournal (MAcctSchema[] ass, ResultSet rs, String trxName) + public Doc_GLJournal (MAcctSchema[] ass, ResultSet rs, String trxName) { super(ass, MJournal.class, rs, null, trxName); } // Doc_GL_Journal diff --git a/base/src/org/compiere/acct/Doc_Invoice.java b/base/src/org/compiere/acct/Doc_Invoice.java index 8a5036faf9..0eae82240d 100644 --- a/base/src/org/compiere/acct/Doc_Invoice.java +++ b/base/src/org/compiere/acct/Doc_Invoice.java @@ -57,7 +57,7 @@ public class Doc_Invoice extends Doc * @param rs record * @param trxName trx */ - protected Doc_Invoice(MAcctSchema[] ass, ResultSet rs, String trxName) + public Doc_Invoice(MAcctSchema[] ass, ResultSet rs, String trxName) { super (ass, MInvoice.class, rs, null, trxName); } // Doc_Invoice diff --git a/base/src/org/compiere/acct/Doc_MatchInv.java b/base/src/org/compiere/acct/Doc_MatchInv.java index f36f9e2650..887496688d 100644 --- a/base/src/org/compiere/acct/Doc_MatchInv.java +++ b/base/src/org/compiere/acct/Doc_MatchInv.java @@ -55,7 +55,7 @@ public class Doc_MatchInv extends Doc * @param rs record * @param trxName trx */ - protected Doc_MatchInv (MAcctSchema[] ass, ResultSet rs, String trxName) + public Doc_MatchInv (MAcctSchema[] ass, ResultSet rs, String trxName) { super(ass, MMatchInv.class, rs, DOCTYPE_MatMatchInv, trxName); } // Doc_MatchInv diff --git a/base/src/org/compiere/acct/Doc_MatchPO.java b/base/src/org/compiere/acct/Doc_MatchPO.java index 518a8d787a..6692e5164e 100644 --- a/base/src/org/compiere/acct/Doc_MatchPO.java +++ b/base/src/org/compiere/acct/Doc_MatchPO.java @@ -54,7 +54,7 @@ public class Doc_MatchPO extends Doc * @param rs record * @param trxName trx */ - protected Doc_MatchPO (MAcctSchema[] ass, ResultSet rs, String trxName) + public Doc_MatchPO (MAcctSchema[] ass, ResultSet rs, String trxName) { super(ass, MMatchPO.class, rs, DOCTYPE_MatMatchPO, trxName); } // Doc_MatchPO diff --git a/base/src/org/compiere/acct/Doc_Order.java b/base/src/org/compiere/acct/Doc_Order.java index e715379168..80e38c1c6f 100644 --- a/base/src/org/compiere/acct/Doc_Order.java +++ b/base/src/org/compiere/acct/Doc_Order.java @@ -53,7 +53,7 @@ public class Doc_Order extends Doc * @param rs record * @param trxName trx */ - protected Doc_Order (MAcctSchema[] ass, ResultSet rs, String trxName) + public Doc_Order (MAcctSchema[] ass, ResultSet rs, String trxName) { super (ass, MOrder.class, rs, null, trxName); } // Doc_Order diff --git a/base/src/org/compiere/acct/Doc_Payment.java b/base/src/org/compiere/acct/Doc_Payment.java index 508e70bb54..42bbd52b92 100644 --- a/base/src/org/compiere/acct/Doc_Payment.java +++ b/base/src/org/compiere/acct/Doc_Payment.java @@ -45,7 +45,7 @@ public class Doc_Payment extends Doc * @param rs record * @param trxName trx */ - protected Doc_Payment (MAcctSchema[] ass, ResultSet rs, String trxName) + public Doc_Payment (MAcctSchema[] ass, ResultSet rs, String trxName) { super (ass, MPayment.class, rs, null, trxName); } // Doc_Payment diff --git a/base/src/org/compiere/acct/Doc_Requisition.java b/base/src/org/compiere/acct/Doc_Requisition.java index aacf31901c..3754bbf12e 100644 --- a/base/src/org/compiere/acct/Doc_Requisition.java +++ b/base/src/org/compiere/acct/Doc_Requisition.java @@ -47,7 +47,7 @@ public class Doc_Requisition extends Doc * @param rs record * @param trxName trx */ - protected Doc_Requisition (MAcctSchema[] ass, ResultSet rs, String trxName) + public Doc_Requisition (MAcctSchema[] ass, ResultSet rs, String trxName) { super (ass, MRequisition.class, rs, DOCTYPE_PurchaseRequisition, trxName); } // Doc_Requisition diff --git a/base/src/org/compiere/wf/MWFActivity.java b/base/src/org/compiere/wf/MWFActivity.java index 5ea595d55e..402133def0 100644 --- a/base/src/org/compiere/wf/MWFActivity.java +++ b/base/src/org/compiere/wf/MWFActivity.java @@ -794,7 +794,11 @@ public class MWFActivity extends X_AD_WF_Activity implements Runnable //end vpj-cd e-evolution 03/08/2005 PostgreSQL if (m_postImmediate != null) - postImmediate(); + try { + postImmediate(); + } catch (Exception e) { + log.warning("Error posting document: " + e.toString()); + } // ignore any error in this posting } catch (Exception e) { diff --git a/serverRoot/src/main/server/org/compiere/server/AcctProcessor.java b/serverRoot/src/main/server/org/compiere/server/AcctProcessor.java index 335ee7abd2..078697159f 100644 --- a/serverRoot/src/main/server/org/compiere/server/AcctProcessor.java +++ b/serverRoot/src/main/server/org/compiere/server/AcctProcessor.java @@ -88,10 +88,10 @@ public class AcctProcessor extends AdempiereServer */ private void postSession() { - for (int i = 0; i < Doc.documentsTableID.length; i++) + for (int i = 0; i < Doc.getDocumentsTableID().length; i++) { - int AD_Table_ID = Doc.documentsTableID[i]; - String TableName = Doc.documentsTableName[i]; + int AD_Table_ID = Doc.getDocumentsTableID()[i]; + String TableName = Doc.getDocumentsTableName()[i]; // Post only special documents if (m_model.getAD_Table_ID() != 0 && m_model.getAD_Table_ID() != AD_Table_ID)