diff --git a/migration/i9/oracle/202203260025_IDEMPIERE-3219.sql b/migration/i9/oracle/202203260025_IDEMPIERE-3219.sql new file mode 100644 index 0000000000..d84ba13951 --- /dev/null +++ b/migration/i9/oracle/202203260025_IDEMPIERE-3219.sql @@ -0,0 +1,22 @@ +-- IDEMPIERE-3219 Reset Accounting can't reset documents without fact acct +SELECT register_migration_script('202203260025_IDEMPIERE-3219.sql') FROM dual; + +SET SQLBLANKLINES ON +SET DEFINE OFF + +-- Mar 26, 2022, 12:25:29 AM CET +INSERT INTO AD_Element (AD_Element_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,ColumnName,Name,Description,Help,PrintName,EntityType,AD_Element_UU) VALUES (203567,0,0,'Y',TO_TIMESTAMP('2022-03-26 00:24:59','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2022-03-26 00:24:59','YYYY-MM-DD HH24:MI:SS'),100,'AlsoWithoutPostings','Also Without Postings',NULL,NULL,'Also Without Postings','D','3b693bd3-2827-4788-b722-82dd8a6c9d22') +; + +-- Mar 26, 2022, 12:26:04 AM CET +INSERT INTO AD_Process_Para (AD_Process_Para_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,Help,AD_Process_ID,SeqNo,AD_Reference_ID,IsRange,FieldLength,IsMandatory,DefaultValue,ColumnName,IsCentrallyMaintained,EntityType,AD_Element_ID,DisplayLogic,AD_Process_Para_UU,IsEncrypted,Placeholder,Placeholder2,IsAutocomplete) VALUES (200384,0,0,'Y',TO_TIMESTAMP('2022-03-26 00:26:03','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2022-03-26 00:26:03','YYYY-MM-DD HH24:MI:SS'),100,'Also Without Postings',NULL,NULL,176,50,20,'N',1,'Y','N','AlsoWithoutPostings','N','D',203567,'@DeletePosting@=Y','c410828b-129c-4c9e-aa49-be37c53fa664','N',NULL,NULL,'N') +; + +-- Mar 26, 2022, 12:36:34 AM CET +UPDATE AD_Process_Para SET DefaultValue='@#AD_Client_ID@', IsCentrallyMaintained='N', ReadOnlyLogic='1=1',Updated=TO_TIMESTAMP('2022-03-26 00:36:34','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Process_Para_ID=225 +; + +-- Mar 26, 2022, 12:36:50 AM CET +UPDATE AD_Process_Para SET DefaultValue='@#AD_Client_ID@', IsCentrallyMaintained='N', ReadOnlyLogic='1=1',Updated=TO_TIMESTAMP('2022-03-26 00:36:50','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Process_Para_ID=223 +; + diff --git a/migration/i9/postgresql/202203260025_IDEMPIERE-3219.sql b/migration/i9/postgresql/202203260025_IDEMPIERE-3219.sql new file mode 100644 index 0000000000..1d404f544a --- /dev/null +++ b/migration/i9/postgresql/202203260025_IDEMPIERE-3219.sql @@ -0,0 +1,19 @@ +-- IDEMPIERE-3219 Reset Accounting can't reset documents without fact acct +SELECT register_migration_script('202203260025_IDEMPIERE-3219.sql') FROM dual; + +-- Mar 26, 2022, 12:25:29 AM CET +INSERT INTO AD_Element (AD_Element_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,ColumnName,Name,Description,Help,PrintName,EntityType,AD_Element_UU) VALUES (203567,0,0,'Y',TO_TIMESTAMP('2022-03-26 00:24:59','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2022-03-26 00:24:59','YYYY-MM-DD HH24:MI:SS'),100,'AlsoWithoutPostings','Also Without Postings',NULL,NULL,'Also Without Postings','D','3b693bd3-2827-4788-b722-82dd8a6c9d22') +; + +-- Mar 26, 2022, 12:26:04 AM CET +INSERT INTO AD_Process_Para (AD_Process_Para_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,Help,AD_Process_ID,SeqNo,AD_Reference_ID,IsRange,FieldLength,IsMandatory,DefaultValue,ColumnName,IsCentrallyMaintained,EntityType,AD_Element_ID,DisplayLogic,AD_Process_Para_UU,IsEncrypted,Placeholder,Placeholder2,IsAutocomplete) VALUES (200384,0,0,'Y',TO_TIMESTAMP('2022-03-26 00:26:03','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2022-03-26 00:26:03','YYYY-MM-DD HH24:MI:SS'),100,'Also Without Postings',NULL,NULL,176,50,20,'N',1,'Y','N','AlsoWithoutPostings','N','D',203567,'@DeletePosting@=Y','c410828b-129c-4c9e-aa49-be37c53fa664','N',NULL,NULL,'N') +; + +-- Mar 26, 2022, 12:36:34 AM CET +UPDATE AD_Process_Para SET DefaultValue='@#AD_Client_ID@', IsCentrallyMaintained='N', ReadOnlyLogic='1=1',Updated=TO_TIMESTAMP('2022-03-26 00:36:34','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Process_Para_ID=225 +; + +-- Mar 26, 2022, 12:36:50 AM CET +UPDATE AD_Process_Para SET DefaultValue='@#AD_Client_ID@', IsCentrallyMaintained='N', ReadOnlyLogic='1=1',Updated=TO_TIMESTAMP('2022-03-26 00:36:50','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Process_Para_ID=223 +; + diff --git a/org.adempiere.base.process/src/org/compiere/process/FactAcctReset.java b/org.adempiere.base.process/src/org/compiere/process/FactAcctReset.java index 71b41112a7..e2f7025926 100644 --- a/org.adempiere.base.process/src/org/compiere/process/FactAcctReset.java +++ b/org.adempiere.base.process/src/org/compiere/process/FactAcctReset.java @@ -24,6 +24,10 @@ import java.util.logging.Level; import org.compiere.model.MAcctSchema; import org.compiere.model.MAllocationHdr; +import org.compiere.model.MAssetAddition; +import org.compiere.model.MAssetDisposed; +import org.compiere.model.MAssetReval; +import org.compiere.model.MAssetTransfer; import org.compiere.model.MBankStatement; import org.compiere.model.MCash; import org.compiere.model.MClient; @@ -37,6 +41,7 @@ import org.compiere.model.MMovement; import org.compiere.model.MOrder; import org.compiere.model.MPayment; import org.compiere.model.MPeriodControl; +import org.compiere.model.MProduction; import org.compiere.model.MProjectIssue; import org.compiere.model.MRequisition; import org.compiere.model.X_M_Production; @@ -62,6 +67,8 @@ public class FactAcctReset extends SvrProcess private int p_AD_Table_ID = 0; /** Delete Parameter */ private boolean p_DeletePosting = false; + /** Also Without Postings */ + private boolean p_AlsoWithoutPostings = false; private int m_countReset = 0; private int m_countDelete = 0; @@ -90,6 +97,8 @@ public class FactAcctReset extends SvrProcess p_DateAcct_From = (Timestamp)para[i].getParameter(); p_DateAcct_To = (Timestamp)para[i].getParameter_To(); } + else if (name.equals("AlsoWithoutPostings")) + p_AlsoWithoutPostings = "Y".equals(para[i].getParameter()); else log.log(Level.SEVERE, "Unknown Parameter: " + name); } @@ -189,7 +198,6 @@ public class FactAcctReset extends SvrProcess } reset(TableName); - m_countReset = 0; // String docBaseType = null; if (AD_Table_ID == MInvoice.Table_ID) @@ -215,7 +223,7 @@ public class FactAcctReset extends SvrProcess docBaseType = "= '" + MPeriodControl.DOCBASETYPE_CashJournal + "'"; else if (AD_Table_ID == MAllocationHdr.Table_ID) docBaseType = "= '" + MPeriodControl.DOCBASETYPE_PaymentAllocation + "'"; - else if (AD_Table_ID == MJournal.Table_ID) + else if (AD_Table_ID == MJournal.Table_ID || AD_Table_ID == MAssetReval.Table_ID || AD_Table_ID == MAssetTransfer.Table_ID) docBaseType = "= '" + MPeriodControl.DOCBASETYPE_GLJournal + "'"; else if (AD_Table_ID == MMovement.Table_ID) docBaseType = "= '" + MPeriodControl.DOCBASETYPE_MaterialMovement + "'"; @@ -239,6 +247,8 @@ public class FactAcctReset extends SvrProcess docBaseType = "= '" + MPeriodControl.DOCBASETYPE_Payroll+ "'"; else if (AD_Table_ID == X_PP_Cost_Collector.Table_ID) docBaseType = "= '" + MPeriodControl.DOCBASETYPE_ManufacturingCostCollector+ "'"; + else if (AD_Table_ID == MAssetAddition.Table_ID || AD_Table_ID == MAssetDisposed.Table_ID) + docBaseType = "= '" + MPeriodControl.DOCBASETYPE_GLDocument+ "'"; // if (docBaseType == null) { @@ -291,11 +301,57 @@ public class FactAcctReset extends SvrProcess int deleted = DB.executeUpdate(sql2, get_TrxName()); // - if (log.isLoggable(Level.INFO)) log.info(TableName + "(" + AD_Table_ID + ") - Reset=" + reset + " - Deleted=" + deleted); - String s = TableName + " - Reset=" + reset + " - Deleted=" + deleted; - addLog(s); - // m_countReset += reset; + + String dateColumn = "DateAcct"; + switch (AD_Table_ID) { + case MInventory.Table_ID: + case MMovement.Table_ID: + case MProduction.Table_ID: + case MProjectIssue.Table_ID: + dateColumn = "MovementDate"; + break; + case MRequisition.Table_ID: + dateColumn = "DateDoc"; + break; + case X_DD_Order.Table_ID: + case X_PP_Order.Table_ID: + dateColumn = "DateOrdered"; + break; + } + + int reset3 = 0; + if (p_AlsoWithoutPostings) { + // Docs without Fact_Acct + String sql3 = "UPDATE " + TableName + + " SET Posted='N', Processing='N' " + + "WHERE AD_Client_ID=" + p_AD_Client_ID + + " AND IsActive='Y'" + + " AND (Posted<>'N' OR Posted IS NULL OR Processing<>'N' OR Processing IS NULL)" + + " AND NOT EXISTS (SELECT 1 FROM Fact_Acct fact" + + " WHERE fact.AD_Table_ID=" + AD_Table_ID + + " AND fact.Record_ID=" + TableName + "." + TableName + "_ID)"; + if ( !autoPeriod ) + sql3 += " AND EXISTS (SELECT 1 FROM C_PeriodControl pc" + + " JOIN C_Period p ON (pc.C_Period_ID=p.C_Period_ID)" + + " WHERE TRUNC(" + TableName + "." + dateColumn + ") BETWEEN p.StartDate AND p.EndDate" + + " AND pc.PeriodStatus = 'O'" + docBaseType + ")"; + if (p_DateAcct_From != null) + sql3 += " AND TRUNC(" + TableName + "." + dateColumn + ") >= " + DB.TO_DATE(p_DateAcct_From); + if (p_DateAcct_To != null) + sql3 += " AND TRUNC(" + TableName + "." + dateColumn + ") <= " + DB.TO_DATE(p_DateAcct_To); + + if (log.isLoggable(Level.FINE))log.log(Level.FINE, sql3); + reset3 = DB.executeUpdate(sql3, get_TrxName()); + } + + // + if (log.isLoggable(Level.INFO)) log.info(TableName + "(" + AD_Table_ID + ") - Reset=" + (reset+reset3) + " - Deleted=" + deleted); + String s = TableName + " - Reset=" + (reset+reset3) + " - Deleted=" + deleted; + addLog(s); + + m_countReset += reset3; + m_countDelete += deleted; } // delete