From 426951381c070ed129d77fc0a5c1cbb54268b34c Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Tue, 25 Dec 2018 21:39:51 +0100 Subject: [PATCH] IDEMPIERE-3854 Conversion rate must validate period overlapping --- .../oracle/201812252049_IDEMPIERE-3853.sql | 55 ++++++++++++++++++ .../201812252049_IDEMPIERE-3853.sql | 52 +++++++++++++++++ .../org/compiere/model/MConversionRate.java | 58 ++++++++++++++++++- 3 files changed, 162 insertions(+), 3 deletions(-) create mode 100644 migration/i6.1/oracle/201812252049_IDEMPIERE-3853.sql create mode 100644 migration/i6.1/postgresql/201812252049_IDEMPIERE-3853.sql diff --git a/migration/i6.1/oracle/201812252049_IDEMPIERE-3853.sql b/migration/i6.1/oracle/201812252049_IDEMPIERE-3853.sql new file mode 100644 index 0000000000..6e268fd366 --- /dev/null +++ b/migration/i6.1/oracle/201812252049_IDEMPIERE-3853.sql @@ -0,0 +1,55 @@ +SET SQLBLANKLINES ON +SET DEFINE OFF + +-- IDEMPIERE-3853 Bug in Auto Allocation +-- Dec 25, 2018, 8:48:26 PM CET +UPDATE C_Conversion_Rate SET IsActive='N',Updated=TO_DATE('2018-12-25 20:48:26','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE C_Conversion_Rate_ID=137 +; + +-- Dec 25, 2018, 8:48:28 PM CET +UPDATE C_Conversion_Rate SET IsActive='N',Updated=TO_DATE('2018-12-25 20:48:28','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE C_Conversion_Rate_ID=138 +; + +-- Dec 25, 2018, 8:56:17 PM CET +UPDATE AD_TableIndex SET IsUnique='Y',Updated=TO_DATE('2018-12-25 20:56:17','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_TableIndex_ID=200400 +; + +-- Dec 25, 2018, 8:56:20 PM CET +DROP INDEX c_conversionrate_once +; + +-- Dec 25, 2018, 8:56:20 PM CET +CREATE UNIQUE INDEX c_conversionrate_once ON C_Conversion_Rate (AD_Client_ID,AD_Org_ID,C_Currency_ID,C_Currency_ID_To,C_ConversionType_ID,ValidFrom) +; + +-- Dec 25, 2018, 9:34:13 PM CET +UPDATE AD_Column SET IsUpdateable='N',Updated=TO_DATE('2018-12-25 21:34:13','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=10294 +; + +-- Dec 25, 2018, 9:34:19 PM CET +UPDATE AD_Column SET IsUpdateable='N',Updated=TO_DATE('2018-12-25 21:34:19','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=786 +; + +-- Dec 25, 2018, 9:34:23 PM CET +UPDATE AD_Column SET IsUpdateable='N',Updated=TO_DATE('2018-12-25 21:34:23','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=787 +; + +-- Dec 25, 2018, 9:34:34 PM CET +UPDATE AD_Column SET IsUpdateable='N',Updated=TO_DATE('2018-12-25 21:34:34','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=453 +; + +-- Dec 25, 2018, 9:34:49 PM CET +UPDATE AD_Column SET IsUpdateable='N',Updated=TO_DATE('2018-12-25 21:34:49','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=454 +; + +-- Dec 25, 2018, 9:35:46 PM CET +UPDATE AD_Field SET IsMandatory='Y', AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, IsToolbarButton=NULL,Updated=TO_DATE('2018-12-25 21:35:46','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=436 +; + +-- Dec 25, 2018, 9:35:47 PM CET +UPDATE AD_Field SET IsMandatory='Y', AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, IsToolbarButton=NULL,Updated=TO_DATE('2018-12-25 21:35:47','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=1339 +; + +SELECT register_migration_script('201812252049_IDEMPIERE-3853.sql') FROM dual +; + diff --git a/migration/i6.1/postgresql/201812252049_IDEMPIERE-3853.sql b/migration/i6.1/postgresql/201812252049_IDEMPIERE-3853.sql new file mode 100644 index 0000000000..858659c18f --- /dev/null +++ b/migration/i6.1/postgresql/201812252049_IDEMPIERE-3853.sql @@ -0,0 +1,52 @@ +-- IDEMPIERE-3853 Bug in Auto Allocation +-- Dec 25, 2018, 8:48:26 PM CET +UPDATE C_Conversion_Rate SET IsActive='N',Updated=TO_TIMESTAMP('2018-12-25 20:48:26','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE C_Conversion_Rate_ID=137 +; + +-- Dec 25, 2018, 8:48:28 PM CET +UPDATE C_Conversion_Rate SET IsActive='N',Updated=TO_TIMESTAMP('2018-12-25 20:48:28','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE C_Conversion_Rate_ID=138 +; + +-- Dec 25, 2018, 8:56:17 PM CET +UPDATE AD_TableIndex SET IsUnique='Y',Updated=TO_TIMESTAMP('2018-12-25 20:56:17','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_TableIndex_ID=200400 +; + +-- Dec 25, 2018, 8:56:20 PM CET +DROP INDEX c_conversionrate_once +; + +-- Dec 25, 2018, 8:56:20 PM CET +CREATE UNIQUE INDEX c_conversionrate_once ON C_Conversion_Rate (AD_Client_ID,AD_Org_ID,C_Currency_ID,C_Currency_ID_To,C_ConversionType_ID,ValidFrom) +; + +-- Dec 25, 2018, 9:34:13 PM CET +UPDATE AD_Column SET IsUpdateable='N',Updated=TO_TIMESTAMP('2018-12-25 21:34:13','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=10294 +; + +-- Dec 25, 2018, 9:34:19 PM CET +UPDATE AD_Column SET IsUpdateable='N',Updated=TO_TIMESTAMP('2018-12-25 21:34:19','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=786 +; + +-- Dec 25, 2018, 9:34:23 PM CET +UPDATE AD_Column SET IsUpdateable='N',Updated=TO_TIMESTAMP('2018-12-25 21:34:23','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=787 +; + +-- Dec 25, 2018, 9:34:34 PM CET +UPDATE AD_Column SET IsUpdateable='N',Updated=TO_TIMESTAMP('2018-12-25 21:34:34','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=453 +; + +-- Dec 25, 2018, 9:34:49 PM CET +UPDATE AD_Column SET IsUpdateable='N',Updated=TO_TIMESTAMP('2018-12-25 21:34:49','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=454 +; + +-- Dec 25, 2018, 9:35:46 PM CET +UPDATE AD_Field SET IsMandatory='Y', AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2018-12-25 21:35:46','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=436 +; + +-- Dec 25, 2018, 9:35:47 PM CET +UPDATE AD_Field SET IsMandatory='Y', AD_Reference_Value_ID=NULL, AD_Val_Rule_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2018-12-25 21:35:47','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=1339 +; + +SELECT register_migration_script('201812252049_IDEMPIERE-3853.sql') FROM dual +; + diff --git a/org.adempiere.base/src/org/compiere/model/MConversionRate.java b/org.adempiere.base/src/org/compiere/model/MConversionRate.java index 74c8de8287..f16016bc98 100644 --- a/org.adempiere.base/src/org/compiere/model/MConversionRate.java +++ b/org.adempiere.base/src/org/compiere/model/MConversionRate.java @@ -46,7 +46,7 @@ public class MConversionRate extends X_C_Conversion_Rate /** * */ - private static final long serialVersionUID = -7938144674700640228L; + private static final long serialVersionUID = -3866898973541150020L; /** Logger */ private static CLogger s_log = CLogger.getCLogger (MConversionRate.class); @@ -441,8 +441,60 @@ public class MConversionRate extends X_C_Conversion_Rate log.saveError("Error", df.format(to) + " < " + df.format(from)); return false; } - + + if (isActive()) { + String whereClause = "(? BETWEEN ValidFrom AND ValidTo OR ? BETWEEN ValidFrom AND ValidTo) " + + "AND C_Currency_ID=? AND C_Currency_ID_To=? " + + "AND C_Conversiontype_ID=? " + + "AND AD_Client_ID=? AND AD_Org_ID=?"; + List convs = new Query(getCtx(), MConversionRate.Table_Name, whereClause, get_TrxName()) + .setOnlyActiveRecords(true) + .setParameters(getValidFrom(), getValidTo(), + getC_Currency_ID(), getC_Currency_ID_To(), + getC_ConversionType_ID(), + getAD_Client_ID(), getAD_Org_ID()) + .list(); + for (MConversionRate conv : convs) { + if (conv.getC_Conversion_Rate_ID() != getC_Conversion_Rate_ID()) { + log.saveError("Error", "Conversion rate overlaps with: " + conv.getValidFrom()); + return false; + } + } + } + return true; } // beforeSave - + + @Override + protected boolean afterSave(boolean newRecord, boolean success) { + if (success) { + String whereClause = "ValidFrom=? AND ValidTo=? " + + "AND C_Currency_ID=? AND C_Currency_ID_To=? " + + "AND C_ConversionType_ID=? " + + "AND AD_Client_ID=? AND AD_Org_ID=?"; + MConversionRate reciprocal = new Query(getCtx(), MConversionRate.Table_Name, whereClause, get_TrxName()) + .setParameters(getValidFrom(), getValidTo(), + getC_Currency_ID_To(), getC_Currency_ID(), + getC_ConversionType_ID(), + getAD_Client_ID(), getAD_Org_ID()) + .firstOnly(); + if (reciprocal == null) { + // create reciprocal rate + reciprocal = new MConversionRate(getCtx(), 0, get_TrxName()); + reciprocal.setValidFrom(getValidFrom()); + reciprocal.setValidTo(getValidTo()); + reciprocal.setC_ConversionType_ID(getC_ConversionType_ID()); + reciprocal.setAD_Client_ID(getAD_Client_ID()); + reciprocal.setAD_Org_ID(getAD_Org_ID()); + // invert + reciprocal.setC_Currency_ID(getC_Currency_ID_To()); + reciprocal.setC_Currency_ID_To(getC_Currency_ID()); + } + reciprocal.setDivideRate(getMultiplyRate()); + reciprocal.setMultiplyRate(getDivideRate()); + reciprocal.saveEx(); + } + return success; + } + } // MConversionRate