From 0fa717cf0ae52374ab31c50f4467dacc90918fbe Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Thu, 30 Jul 2020 09:46:43 +0200 Subject: [PATCH] IDEMPIERE-4083 currency rate by document or by transaction (#182) Integrating a contribution from TrekGlobal developed by Heng Sin --- .../functions/currencyConvertInvoice.sql | 36 ++++ .../functions/currencyConvertPayment.sql | 44 +++++ .../functions/currencyConvertInvoice.sql | 43 +++++ .../functions/currencyConvertPayment.sql | 43 +++++ .../oracle/202007211800_IDEMPIERE-4083.sql | 45 +++++ .../oracle/202007211900_IDEMPIERE-4083.sql | 106 +++++++++++ .../oracle/202007212000_IDEMPIERE-4083.sql | 95 ++++++++++ .../202007211800_IDEMPIERE-4083.sql | 42 +++++ .../202007211900_IDEMPIERE-4083.sql | 102 ++++++++++ .../202007212000_IDEMPIERE-4083.sql | 99 ++++++++++ .../compiere/model/CalloutPaySelection.java | 5 +- .../org/compiere/model/CalloutPayment.java | 177 +++++++++++++++--- .../src/org/compiere/process/Aging.java | 14 +- .../process/PaySelectionCreateFrom.java | 10 +- .../src/org/compiere/acct/Doc.java | 18 +- .../src/org/compiere/acct/DocLine.java | 11 ++ .../org/compiere/acct/Doc_AllocationHdr.java | 10 + .../src/org/compiere/acct/Doc_Invoice.java | 32 +++- .../src/org/compiere/acct/Doc_Payment.java | 31 +++ .../src/org/compiere/acct/FactLine.java | 52 +++-- .../src/org/compiere/model/I_C_Invoice.java | 26 +++ .../src/org/compiere/model/I_C_Payment.java | 39 ++++ .../src/org/compiere/model/MCost.java | 2 +- .../src/org/compiere/model/MInvoice.java | 42 ++++- .../src/org/compiere/model/MPayment.java | 57 +++++- .../src/org/compiere/model/X_C_Invoice.java | 48 ++++- .../src/org/compiere/model/X_C_Payment.java | 68 ++++++- .../org/compiere/apps/form/Allocation.java | 16 +- .../src/org/compiere/apps/form/PaySelect.java | 6 +- .../apps/form/StatementCreateFromBatch.java | 4 +- .../compiere/grid/CreateFromDepositBatch.java | 2 +- .../compiere/grid/CreateFromStatement.java | 2 +- 32 files changed, 1240 insertions(+), 87 deletions(-) create mode 100644 db/ddlutils/oracle/functions/currencyConvertInvoice.sql create mode 100644 db/ddlutils/oracle/functions/currencyConvertPayment.sql create mode 100644 db/ddlutils/postgresql/functions/currencyConvertInvoice.sql create mode 100644 db/ddlutils/postgresql/functions/currencyConvertPayment.sql create mode 100644 migration/i7.1z/oracle/202007211800_IDEMPIERE-4083.sql create mode 100644 migration/i7.1z/oracle/202007211900_IDEMPIERE-4083.sql create mode 100644 migration/i7.1z/oracle/202007212000_IDEMPIERE-4083.sql create mode 100644 migration/i7.1z/postgresql/202007211800_IDEMPIERE-4083.sql create mode 100644 migration/i7.1z/postgresql/202007211900_IDEMPIERE-4083.sql create mode 100644 migration/i7.1z/postgresql/202007212000_IDEMPIERE-4083.sql diff --git a/db/ddlutils/oracle/functions/currencyConvertInvoice.sql b/db/ddlutils/oracle/functions/currencyConvertInvoice.sql new file mode 100644 index 0000000000..bdae52737f --- /dev/null +++ b/db/ddlutils/oracle/functions/currencyConvertInvoice.sql @@ -0,0 +1,36 @@ +CREATE OR REPLACE FUNCTION currencyConvertInvoice( + p_c_invoice_id in number, + p_currency_to_id in number, + p_amt in number DEFAULT NULL, + p_conversiondate in date DEFAULT NULL) + RETURNS number +AS + v_GrandTotal NUMBER; + v_ConversionType_ID NUMBER; + v_Client_ID NUMBER; + v_Org_ID NUMBER; + v_Currency_ID NUMBER; + v_CurrencyRate NUMBER; + v_DateAcct DATE; + v_BaseCurrency_ID NUMBER; + v_IsOverrideCurrencyRate CHAR(1); +BEGIN + SELECT AD_Client_ID, AD_Org_ID, DateAcct, C_Currency_ID, C_ConversionType_ID, CurrencyRate, GrandTotal, IsOverrideCurrencyRate + INTO v_Client_ID, v_Org_ID, v_DateAcct, v_Currency_ID, v_ConversionType_ID, v_CurrencyRate, v_GrandTotal, v_IsOverrideCurrencyRate + FROM C_Invoice + WHERE C_Invoice_ID=p_C_Invoice_ID; + + SELECT sc.C_Currency_ID + INTO v_BaseCurrency_ID + FROM AD_ClientInfo ci + JOIN C_AcctSchema sc ON ci.C_AcctSchema1_ID=sc.C_AcctSchema_ID + WHERE ci.AD_Client_ID=v_Client_ID; + + IF v_BaseCurrency_ID=p_Currency_To_id AND Coalesce(v_CurrencyRate,0) > 0 AND v_Currency_ID != p_Currency_To_id AND v_IsOverrideCurrencyRate='Y' THEN + RETURN currencyRound(Coalesce(p_Amt,v_GrandTotal)*v_CurrencyRate, p_Currency_To_id, null); + END IF; + + RETURN currencyConvert(Coalesce(p_Amt,v_GrandTotal), v_Currency_ID, p_Currency_To_id, Coalesce(p_conversionDate,v_DateAcct), v_ConversionType_ID, v_Client_ID, v_Org_ID); +END currencyConvertInvoice; +/ + diff --git a/db/ddlutils/oracle/functions/currencyConvertPayment.sql b/db/ddlutils/oracle/functions/currencyConvertPayment.sql new file mode 100644 index 0000000000..b6ca912939 --- /dev/null +++ b/db/ddlutils/oracle/functions/currencyConvertPayment.sql @@ -0,0 +1,44 @@ +CREATE OR REPLACE FUNCTION currencyConvertPayment +( + p_C_Payment_ID IN NUMBER, + p_CurTo_ID IN NUMBER, + p_Amt IN NUMBER DEFAULT NULL, + p_conversionDate IN DATE DEFAULT NULL +) +RETURN NUMBER +AS + v_Rate NUMBER; + v_PayAmt NUMBER; + v_ConversionType_ID NUMBER; + v_Client_ID NUMBER; + v_Org_ID NUMBER; + v_Currency_ID NUMBER; + v_CurrencyRate NUMBER; + v_ConvertedAmt NUMBER; + v_DateAcct DATE; + v_BaseCurrency_ID NUMBER; + v_IsOverrideCurrencyRate Char(1); +BEGIN + SELECT AD_Client_ID, AD_Org_ID, DateAcct, C_Currency_ID, C_ConversionType_ID, CurrencyRate, ConvertedAmt, PayAmt, IsOverrideCurrencyRate + INTO v_Client_ID, v_Org_ID, v_DateAcct, v_Currency_ID, v_ConversionType_ID, v_CurrencyRate, v_ConvertedAmt, v_PayAmt, v_IsOverrideCurrencyRate + FROM C_Payment + WHERE C_Payment_ID=p_C_Payment_ID; + + SELECT sc.C_Currency_ID + INTO v_BaseCurrency_ID + FROM AD_ClientInfo ci + JOIN C_AcctSchema sc ON ci.C_AcctSchema1_ID=sc.C_AcctSchema_ID + WHERE ci.AD_Client_ID=v_Client_ID; + + IF v_BaseCurrency_ID=p_Currency_To_id AND Coalesce(v_CurrencyRate,0) > 0 AND Coalesce(v_ConvertedAmt,0) != 0 AND v_Currency_ID != p_Currency_To_id AND v_IsOverrideCurrencyRate='Y' THEN + IF p_Amt IS NULL THEN + RETURN v_ConvertedAmt; + ELSE + RETURN currencyRound(p_Amt*v_CurrencyRate, p_Currency_To_id, null); + END IF; + END IF; + + RETURN currencyConvert(Coalesce(p_Amt,v_PayAmt), v_Currency_ID, p_Currency_To_id, Coalesce(p_conversionDate,v_DateAcct), v_ConversionType_ID, v_Client_ID, v_Org_ID); +END currencyConvertPayment; +/ + diff --git a/db/ddlutils/postgresql/functions/currencyConvertInvoice.sql b/db/ddlutils/postgresql/functions/currencyConvertInvoice.sql new file mode 100644 index 0000000000..e8370045cc --- /dev/null +++ b/db/ddlutils/postgresql/functions/currencyConvertInvoice.sql @@ -0,0 +1,43 @@ +CREATE OR REPLACE FUNCTION currencyConvertInvoice( + p_c_invoice_id numeric, + p_currency_to_id numeric, + p_amt numeric DEFAULT NULL::numeric, + p_conversiondate timestamp with time zone DEFAULT NULL::timestamp with time zone) + RETURNS numeric + LANGUAGE 'plpgsql' + + COST 100 + VOLATILE +AS $BODY$ + +DECLARE + v_GrandTotal NUMERIC; + v_ConversionType_ID NUMERIC; + v_Client_ID NUMERIC; + v_Org_ID NUMERIC; + v_Currency_ID NUMERIC; + v_CurrencyRate NUMERIC; + v_DateAcct timestamp with time zone; + v_BaseCurrency_ID NUMERIC; + v_IsOverrideCurrencyRate character(1); +BEGIN + SELECT AD_Client_ID, AD_Org_ID, DateAcct, C_Currency_ID, C_ConversionType_ID, CurrencyRate, GrandTotal, IsOverrideCurrencyRate + INTO v_Client_ID, v_Org_ID, v_DateAcct, v_Currency_ID, v_ConversionType_ID, v_CurrencyRate, v_GrandTotal, v_IsOverrideCurrencyRate + FROM C_Invoice + WHERE C_Invoice_ID=p_C_Invoice_ID; + + SELECT sc.C_Currency_ID + INTO v_BaseCurrency_ID + FROM AD_ClientInfo ci + JOIN C_AcctSchema sc ON ci.C_AcctSchema1_ID=sc.C_AcctSchema_ID + WHERE ci.AD_Client_ID=v_Client_ID; + + IF v_BaseCurrency_ID=p_Currency_To_id AND Coalesce(v_CurrencyRate,0) > 0 AND v_Currency_ID != p_Currency_To_id AND v_IsOverrideCurrencyRate='Y' THEN + RETURN currencyRound(Coalesce(p_Amt,v_GrandTotal)*v_CurrencyRate, p_Currency_To_id, null); + END IF; + + RETURN currencyConvert(Coalesce(p_Amt,v_GrandTotal), v_Currency_ID, p_Currency_To_id, Coalesce(p_conversionDate,v_DateAcct), v_ConversionType_ID, v_Client_ID, v_Org_ID); +END; + +$BODY$; + diff --git a/db/ddlutils/postgresql/functions/currencyConvertPayment.sql b/db/ddlutils/postgresql/functions/currencyConvertPayment.sql new file mode 100644 index 0000000000..b6498e4dca --- /dev/null +++ b/db/ddlutils/postgresql/functions/currencyConvertPayment.sql @@ -0,0 +1,43 @@ +CREATE OR REPLACE FUNCTION currencyConvertPayment( + p_C_Payment_ID numeric, + p_Currency_To_id numeric, + p_Amt numeric default null, + p_conversionDate timestamp with time zone default null) + RETURNS numeric + LANGUAGE 'plpgsql' +AS $BODY$ +DECLARE + v_PayAmt NUMERIC; + v_ConversionType_ID NUMERIC; + v_Client_ID NUMERIC; + v_Org_ID NUMERIC; + v_Currency_ID NUMERIC; + v_CurrencyRate NUMERIC; + v_ConvertedAmt NUMERIC; + v_DateAcct timestamp with time zone; + v_BaseCurrency_ID NUMERIC; + v_IsOverrideCurrencyRate character(1); +BEGIN + SELECT AD_Client_ID, AD_Org_ID, DateAcct, C_Currency_ID, C_ConversionType_ID, CurrencyRate, ConvertedAmt, PayAmt, IsOverrideCurrencyRate + INTO v_Client_ID, v_Org_ID, v_DateAcct, v_Currency_ID, v_ConversionType_ID, v_CurrencyRate, v_ConvertedAmt, v_PayAmt, v_IsOverrideCurrencyRate + FROM C_Payment + WHERE C_Payment_ID=p_C_Payment_ID; + + SELECT sc.C_Currency_ID + INTO v_BaseCurrency_ID + FROM AD_ClientInfo ci + JOIN C_AcctSchema sc ON ci.C_AcctSchema1_ID=sc.C_AcctSchema_ID + WHERE ci.AD_Client_ID=v_Client_ID; + + IF v_BaseCurrency_ID=p_Currency_To_id AND Coalesce(v_CurrencyRate,0) > 0 AND Coalesce(v_ConvertedAmt,0) != 0 AND v_Currency_ID != p_Currency_To_id AND v_IsOverrideCurrencyRate='Y' THEN + IF p_Amt IS NULL THEN + RETURN v_ConvertedAmt; + ELSE + RETURN currencyRound(p_Amt*v_CurrencyRate, p_Currency_To_id, null); + END IF; + END IF; + + RETURN currencyConvert(Coalesce(p_Amt,v_PayAmt), v_Currency_ID, p_Currency_To_id, Coalesce(p_conversionDate,v_DateAcct), v_ConversionType_ID, v_Client_ID, v_Org_ID); +END; +$BODY$; + diff --git a/migration/i7.1z/oracle/202007211800_IDEMPIERE-4083.sql b/migration/i7.1z/oracle/202007211800_IDEMPIERE-4083.sql new file mode 100644 index 0000000000..6a0be4a800 --- /dev/null +++ b/migration/i7.1z/oracle/202007211800_IDEMPIERE-4083.sql @@ -0,0 +1,45 @@ +SET SQLBLANKLINES ON +SET DEFINE OFF + +-- Jul 25, 2018 6:27:49 PM MYT +-- AP2-473 Improve handling of Spot Rate +INSERT INTO AD_Column (AD_Column_ID,SeqNoSelection,IsSyncDatabase,Version,IsMandatory,IsTranslated,IsIdentifier,SeqNo,IsParent,FieldLength,IsSelectionColumn,IsKey,IsAutocomplete,IsAllowLogging,AD_Column_UU,Updated,IsUpdateable,ColumnName,Description,DefaultValue,Help,Name,IsAllowCopy,IsActive,CreatedBy,UpdatedBy,IsAlwaysUpdateable,AD_Client_ID,Created,IsSecure,EntityType,IsEncrypted,AD_Element_ID,AD_Table_ID,AD_Reference_ID,IsToolbarButton,AD_Org_ID,IsHtml) VALUES (213623,0,'N',0,'N','N','N',0,'N',22,'N','N','N','Y','2c7aa027-bb65-45f3-b584-7471b4db2589',TO_DATE('2018-07-25 18:27:43','YYYY-MM-DD HH24:MI:SS'),'Y','CurrencyRate','Currency Conversion Rate',NULL,'The Currency Conversion Rate indicates the rate to use when converting the source currency to the accounting currency','Rate','Y','Y',100,100,'N',0,TO_DATE('2018-07-25 18:27:43','YYYY-MM-DD HH24:MI:SS'),'N','D','N',253,335,22,'N',0,'N') +; + +-- Jul 25, 2018 6:27:58 PM MYT +ALTER TABLE C_Payment ADD CurrencyRate NUMBER DEFAULT NULL +; + +-- Jul 25, 2018 6:28:37 PM MYT +INSERT INTO AD_Column (AD_Column_ID,SeqNoSelection,IsSyncDatabase,Version,IsMandatory,IsTranslated,IsIdentifier,SeqNo,IsParent,FieldLength,IsSelectionColumn,IsKey,IsAutocomplete,IsAllowLogging,AD_Column_UU,Updated,IsUpdateable,ColumnName,Description,Help,Name,IsAllowCopy,IsActive,CreatedBy,UpdatedBy,IsAlwaysUpdateable,AD_Client_ID,Created,IsSecure,EntityType,IsEncrypted,AD_Element_ID,AD_Table_ID,AD_Reference_ID,IsToolbarButton,AD_Org_ID,IsHtml) VALUES (213624,0,'N',0,'N','N','N',0,'N',22,'N','N','N','Y','d1ef932b-5a7d-4d3a-b6c9-d92b02c440f9',TO_DATE('2018-07-25 18:28:37','YYYY-MM-DD HH24:MI:SS'),'Y','ConvertedAmt','Converted Amount','The Converted Amount is the result of multiplying the Source Amount by the Conversion Rate for this target currency.','Converted Amount','Y','Y',100,100,'N',0,TO_DATE('2018-07-25 18:28:37','YYYY-MM-DD HH24:MI:SS'),'N','D','N',1555,335,12,'N',0,'N') +; + +-- Jul 25, 2018 6:28:44 PM MYT +ALTER TABLE C_Payment ADD ConvertedAmt NUMBER DEFAULT NULL +; + +-- Jul 25, 2018 6:35:47 PM MYT +INSERT INTO AD_Field (SortNo,AD_Field_ID,IsEncrypted,DisplayLength,IsSameLine,IsHeading,SeqNo,IsCentrallyMaintained,IsReadOnly,Help,DisplayLogic,Updated,Description,Name,AD_Field_UU,IsDisplayed,IsFieldOnly,CreatedBy,UpdatedBy,IsActive,IsDisplayedGrid,SeqNoGrid,XPosition,IsQuickEntry,AD_Client_ID,Created,ColumnSpan,NumLines,IsAdvancedField,IsDefaultFocus,AD_Column_ID,EntityType,AD_Tab_ID,AD_Org_ID) VALUES (0,205669,'N',0,'N','N',231,'Y','N','The Currency Conversion Rate indicates the rate to use when converting the source currency to the accounting currency','@C_Currency_ID@!@$C_Currency_ID@ & @C_ConversionType_ID@=114',TO_DATE('2018-07-25 18:35:41','YYYY-MM-DD HH24:MI:SS'),'Currency Conversion Rate','Rate','085538d5-fa30-454f-9efa-46d7f03ec2bf','Y','N',100,100,'Y','Y',221,4,'N',0,TO_DATE('2018-07-25 18:35:41','YYYY-MM-DD HH24:MI:SS'),2,1,'N','N',213623,'D',330,0) +; + +-- Jul 25, 2018 6:36:28 PM MYT +INSERT INTO AD_Field (SortNo,AD_Field_ID,IsEncrypted,DisplayLength,IsSameLine,IsHeading,SeqNo,IsCentrallyMaintained,IsReadOnly,Help,DisplayLogic,Updated,Description,Name,AD_Field_UU,IsDisplayed,IsFieldOnly,CreatedBy,UpdatedBy,IsActive,IsDisplayedGrid,SeqNoGrid,XPosition,IsQuickEntry,AD_Client_ID,Created,ColumnSpan,NumLines,IsAdvancedField,IsDefaultFocus,AD_Column_ID,EntityType,AD_Tab_ID,AD_Org_ID) VALUES (0,205670,'N',0,'N','N',232,'Y','N','The Converted Amount is the result of multiplying the Source Amount by the Conversion Rate for this target currency.','@C_Currency_ID@!@$C_Currency_ID@ & @C_ConversionType_ID@=114',TO_DATE('2018-07-25 18:36:22','YYYY-MM-DD HH24:MI:SS'),'Converted Amount','Converted Amount','a7312ba2-8cd8-4c8c-ac60-24559140372a','Y','N',100,100,'Y','Y',222,1,'N',0,TO_DATE('2018-07-25 18:36:22','YYYY-MM-DD HH24:MI:SS'),2,1,'N','N',213624,'D',330,0) +; + +-- Jul 26, 2018 5:47:16 PM MYT +-- AP2-473 Improve handling of Spot Rate +UPDATE AD_Column SET Callout='org.compiere.model.CalloutPayment.amounts',Updated=TO_DATE('2018-07-26 17:47:16','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=213623 +; + +-- Jul 26, 2018 5:47:50 PM MYT +UPDATE AD_Column SET Callout='org.compiere.model.CalloutPayment.amounts',Updated=TO_DATE('2018-07-26 17:47:50','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=213624 +; + +-- Jul 26, 2018 8:42:12 PM MYT +-- AP2-473 Improve handling of Spot Rate +UPDATE AD_Column SET Callout='org.compiere.model.CalloutPayment.amounts',Updated=TO_DATE('2018-07-26 20:42:12','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=12128 +; + +SELECT register_migration_script('202007211800_IDEMPIERE-4083.sql') FROM dual +; + diff --git a/migration/i7.1z/oracle/202007211900_IDEMPIERE-4083.sql b/migration/i7.1z/oracle/202007211900_IDEMPIERE-4083.sql new file mode 100644 index 0000000000..a2fae9385a --- /dev/null +++ b/migration/i7.1z/oracle/202007211900_IDEMPIERE-4083.sql @@ -0,0 +1,106 @@ +SET SQLBLANKLINES ON +SET DEFINE OFF + +-- Aug 6, 2018 12:04:56 PM MYT +-- AP2-473 Improve handling of Spot Rate +INSERT INTO AD_Element (AD_Element_ID,ColumnName,Updated,Name,Description,PrintName,AD_Element_UU,IsActive,Created,CreatedBy,UpdatedBy,AD_Client_ID,EntityType,AD_Org_ID) VALUES (203258,'IsOverrideCurrencyRate',TO_DATE('2018-08-06 12:04:54','YYYY-MM-DD HH24:MI:SS'),'Override Currency Conversion Rate','Override Currency Conversion Rate','Override Currency Conversion Rate','fa5158e6-cd76-4b51-a423-0e61f1174402','Y',TO_DATE('2018-08-06 12:04:54','YYYY-MM-DD HH24:MI:SS'),100,100,0,'D',0) +; + +-- Aug 6, 2018 12:06:46 PM MYT +INSERT INTO AD_Column (AD_Column_ID,SeqNoSelection,IsSyncDatabase,Version,IsMandatory,IsTranslated,IsIdentifier,SeqNo,IsParent,FieldLength,IsSelectionColumn,IsKey,IsAutocomplete,IsAllowLogging,AD_Column_UU,Updated,IsUpdateable,ColumnName,Description,DefaultValue,Name,IsAllowCopy,IsActive,CreatedBy,UpdatedBy,IsAlwaysUpdateable,AD_Client_ID,Created,IsSecure,EntityType,IsEncrypted,FKConstraintType,AD_Element_ID,AD_Table_ID,AD_Reference_ID,IsToolbarButton,AD_Org_ID,IsHtml) VALUES (213664,0,'N',0,'Y','N','N',0,'N',1,'N','N','N','Y','694d7baf-3218-4940-a32e-439a8a8c0fdf',TO_DATE('2018-08-06 12:06:45','YYYY-MM-DD HH24:MI:SS'),'Y','IsOverrideCurrencyRate','Override Currency Conversion Rate','N','Override Currency Conversion Rate','Y','Y',100,100,'N',0,TO_DATE('2018-08-06 12:06:45','YYYY-MM-DD HH24:MI:SS'),'N','D','N','N',203258,335,20,'N',0,'N') +; + +-- Aug 6, 2018 12:07:00 PM MYT +UPDATE AD_Column SET IsAllowCopy='N',Updated=TO_DATE('2018-08-06 12:07:00','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=213664 +; + +-- Aug 6, 2018 12:07:06 PM MYT +ALTER TABLE C_Payment ADD IsOverrideCurrencyRate CHAR(1) DEFAULT 'N' CHECK (IsOverrideCurrencyRate IN ('Y','N')) NOT NULL +; + +-- Aug 6, 2018 12:11:52 PM MYT +UPDATE AD_Field SET SeqNo=233, DisplayLogic='@C_Currency_ID@!@$C_Currency_ID@ & @IsOverrideCurrencyRateO@=Y', AD_Val_Rule_ID=NULL, SeqNoGrid=223, XPosition=4, AD_Reference_Value_ID=NULL, IsToolbarButton=NULL,Updated=TO_DATE('2018-08-06 12:11:52','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=205670 +; + +-- Aug 6, 2018 12:12:40 PM MYT +UPDATE AD_Field SET SeqNo=232, DisplayLogic='@C_Currency_ID@!@$C_Currency_ID@ & @IsOverrideCurrencyRate@=Y', AD_Val_Rule_ID=NULL, SeqNoGrid=222, XPosition=1, AD_Reference_Value_ID=NULL, IsToolbarButton=NULL,Updated=TO_DATE('2018-08-06 12:12:40','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=205669 +; + +-- Aug 6, 2018 12:13:30 PM MYT +INSERT INTO AD_Field (SortNo,AD_Field_ID,IsEncrypted,DisplayLength,IsSameLine,IsHeading,SeqNo,IsCentrallyMaintained,IsReadOnly,DisplayLogic,Updated,Description,Name,AD_Field_UU,IsDisplayed,IsFieldOnly,CreatedBy,UpdatedBy,IsActive,IsDisplayedGrid,SeqNoGrid,XPosition,IsQuickEntry,AD_Client_ID,Created,ColumnSpan,NumLines,IsAdvancedField,IsDefaultFocus,AD_Column_ID,EntityType,AD_Tab_ID,AD_Org_ID) VALUES (0,205706,'N',0,'N','N',231,'Y','N','@C_Currency_ID@!@$C_Currency_ID@',TO_DATE('2018-08-06 12:13:30','YYYY-MM-DD HH24:MI:SS'),'Override Currency Conversion Rate','Override Currency Conversion Rate','29fffeb3-e9dc-4a9d-813f-e54782b9dc19','Y','N',100,100,'Y','Y',221,1,'N',0,TO_DATE('2018-08-06 12:13:30','YYYY-MM-DD HH24:MI:SS'),2,1,'N','N',213664,'D',330,0) +; + +-- Aug 6, 2018 12:14:06 PM MYT +UPDATE AD_Field SET DisplayLogic='@C_Currency_ID@!@$C_Currency_ID@ & @IsOverrideCurrencyRate@=N', AD_Val_Rule_ID=NULL, AD_Reference_Value_ID=NULL, IsToolbarButton=NULL,Updated=TO_DATE('2018-08-06 12:14:06','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=8651 +; + +-- Aug 6, 2018 12:14:39 PM MYT +UPDATE AD_Field SET AD_Val_Rule_ID=NULL, XPosition=2, AD_Reference_Value_ID=NULL, IsToolbarButton=NULL,Updated=TO_DATE('2018-08-06 12:14:39','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=205706 +; + +-- Aug 6, 2018 3:36:31 PM MYT +-- AP2-473 Improve handling of Spot Rate +UPDATE AD_Field SET DisplayLogic='@C_Currency_ID@!@$C_Currency_ID@', AD_Val_Rule_ID=NULL, AD_Reference_Value_ID=NULL, IsToolbarButton=NULL,Updated=TO_DATE('2018-08-06 15:36:31','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=8651 +; + +-- Aug 6, 2018 4:34:56 PM MYT +-- AP2-473 Improve handling of Spot Rate +UPDATE AD_Column SET Callout=NULL,Updated=TO_DATE('2018-08-06 16:34:56','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=12128 +; + +-- Aug 6, 2018 4:35:17 PM MYT +UPDATE AD_Column SET Callout='org.compiere.model.CalloutPayment.amounts',Updated=TO_DATE('2018-08-06 16:35:17','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=213664 +; + +-- Aug 6, 2018 6:16:52 PM MYT +-- AP2-473 Improve handling of Spot Rate +UPDATE AD_Field SET DisplayLogic='@C_Currency_ID@!@$C_Currency_ID@ & @IsOverrideCurrencyRate@=Y', AD_Val_Rule_ID=NULL, AD_Reference_Value_ID=NULL, IsToolbarButton=NULL,Updated=TO_DATE('2018-08-06 18:16:52','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=205670 +; + +CREATE OR REPLACE FUNCTION currencyConvertPayment +( + p_C_Payment_ID IN NUMBER, + p_CurTo_ID IN NUMBER, + p_Amt IN NUMBER DEFAULT NULL, + p_conversionDate IN DATE DEFAULT NULL +) +RETURN NUMBER +AS + v_Rate NUMBER; + v_PayAmt NUMBER; + v_ConversionType_ID NUMBER; + v_Client_ID NUMBER; + v_Org_ID NUMBER; + v_Currency_ID NUMBER; + v_CurrencyRate NUMBER; + v_ConvertedAmt NUMBER; + v_DateAcct DATE; + v_BaseCurrency_ID NUMBER; + v_IsOverrideCurrencyRate Char(1); +BEGIN + SELECT AD_Client_ID, AD_Org_ID, DateAcct, C_Currency_ID, C_ConversionType_ID, CurrencyRate, ConvertedAmt, PayAmt, IsOverrideCurrencyRate + INTO v_Client_ID, v_Org_ID, v_DateAcct, v_Currency_ID, v_ConversionType_ID, v_CurrencyRate, v_ConvertedAmt, v_PayAmt, v_IsOverrideCurrencyRate + FROM C_Payment + WHERE C_Payment_ID=p_C_Payment_ID; + + SELECT sc.C_Currency_ID + INTO v_BaseCurrency_ID + FROM AD_ClientInfo ci + JOIN C_AcctSchema sc ON ci.C_AcctSchema1_ID=sc.C_AcctSchema_ID + WHERE ci.AD_Client_ID=v_Client_ID; + + IF v_BaseCurrency_ID=p_Currency_To_id AND Coalesce(v_CurrencyRate,0) > 0 AND Coalesce(v_ConvertedAmt,0) != 0 AND v_Currency_ID != p_Currency_To_id AND v_IsOverrideCurrencyRate='Y' THEN + IF p_Amt IS NULL THEN + RETURN v_ConvertedAmt; + ELSE + RETURN currencyRound(p_Amt*v_CurrencyRate, p_Currency_To_id, null); + END IF; + END IF; + + RETURN currencyConvert(Coalesce(p_Amt,v_PayAmt), v_Currency_ID, p_Currency_To_id, Coalesce(p_conversionDate,v_DateAcct), v_ConversionType_ID, v_Client_ID, v_Org_ID); +END currencyConvertPayment; +/ + +SELECT register_migration_script('202007211900_IDEMPIERE-4083.sql') FROM dual +; + diff --git a/migration/i7.1z/oracle/202007212000_IDEMPIERE-4083.sql b/migration/i7.1z/oracle/202007212000_IDEMPIERE-4083.sql new file mode 100644 index 0000000000..cd5425940b --- /dev/null +++ b/migration/i7.1z/oracle/202007212000_IDEMPIERE-4083.sql @@ -0,0 +1,95 @@ +SET SQLBLANKLINES ON +SET DEFINE OFF + +-- Aug 7, 2018 12:11:37 PM MYT +-- AP2-473 Improve handling of Spot Rate +INSERT INTO AD_Column (AD_Column_ID,SeqNoSelection,IsSyncDatabase,Version,IsMandatory,IsTranslated,IsIdentifier,SeqNo,IsParent,FieldLength,IsSelectionColumn,IsKey,IsAutocomplete,IsAllowLogging,AD_Column_UU,Updated,IsUpdateable,ColumnName,Description,DefaultValue,Name,IsAllowCopy,IsActive,CreatedBy,UpdatedBy,IsAlwaysUpdateable,AD_Client_ID,Created,IsSecure,EntityType,IsEncrypted,FKConstraintType,AD_Element_ID,AD_Table_ID,AD_Reference_ID,IsToolbarButton,AD_Org_ID,IsHtml) VALUES (213667,0,'N',0,'Y','N','N',0,'N',1,'N','N','N','Y','49dfde99-b3e4-48df-b2dc-d178a7ba8391',TO_DATE('2018-08-07 12:11:31','YYYY-MM-DD HH24:MI:SS'),'Y','IsOverrideCurrencyRate','Override Currency Conversion Rate','N','Override Currency Conversion Rate','Y','Y',100,100,'N',0,TO_DATE('2018-08-07 12:11:31','YYYY-MM-DD HH24:MI:SS'),'N','D','N','N',203258,318,20,'N',0,'N') +; + +-- Aug 7, 2018 12:11:44 PM MYT +ALTER TABLE C_Invoice ADD IsOverrideCurrencyRate CHAR(1) DEFAULT 'N' CHECK (IsOverrideCurrencyRate IN ('Y','N')) NOT NULL +; + +-- Aug 7, 2018 12:12:34 PM MYT +INSERT INTO AD_Column (AD_Column_ID,SeqNoSelection,IsSyncDatabase,Version,IsMandatory,IsTranslated,IsIdentifier,SeqNo,IsParent,FieldLength,IsSelectionColumn,IsKey,IsAutocomplete,IsAllowLogging,AD_Column_UU,Updated,IsUpdateable,ColumnName,Description,Help,Name,IsAllowCopy,IsActive,CreatedBy,UpdatedBy,IsAlwaysUpdateable,AD_Client_ID,Created,IsSecure,EntityType,IsEncrypted,AD_Element_ID,AD_Table_ID,AD_Reference_ID,IsToolbarButton,AD_Org_ID,IsHtml) VALUES (213668,0,'N',0,'N','N','N',0,'N',22,'N','N','N','Y','a73b45e7-f38f-4447-8657-1eb475e6e153',TO_DATE('2018-08-07 12:12:28','YYYY-MM-DD HH24:MI:SS'),'Y','CurrencyRate','Currency Conversion Rate','The Currency Conversion Rate indicates the rate to use when converting the source currency to the accounting currency','Rate','Y','Y',100,100,'N',0,TO_DATE('2018-08-07 12:12:28','YYYY-MM-DD HH24:MI:SS'),'N','D','N',253,318,22,'N',0,'N') +; + +-- Aug 7, 2018 12:12:40 PM MYT +ALTER TABLE C_Invoice ADD CurrencyRate NUMBER DEFAULT NULL +; + +-- Aug 7, 2018 12:50:00 PM MYT +-- AP2-473 Improve handling of Spot Rate +INSERT INTO AD_Field (SortNo,AD_Field_ID,IsEncrypted,DisplayLength,IsSameLine,IsHeading,SeqNo,IsCentrallyMaintained,IsReadOnly,DisplayLogic,Updated,Description,Name,AD_Field_UU,IsDisplayed,IsFieldOnly,CreatedBy,UpdatedBy,IsActive,IsDisplayedGrid,SeqNoGrid,XPosition,IsQuickEntry,AD_Client_ID,Created,ColumnSpan,NumLines,IsAdvancedField,IsDefaultFocus,AD_Column_ID,EntityType,AD_Tab_ID,AD_Org_ID) VALUES (0,205806,'N',0,'N','N',171,'Y','N','@C_Currency_ID@!@$C_Currency_ID@',TO_DATE('2018-08-07 12:49:55','YYYY-MM-DD HH24:MI:SS'),'Override Currency Conversion Rate','Override Currency Conversion Rate','a28728cb-1b43-493f-bf29-481604eb1dcb','Y','N',100,100,'Y','Y',171,2,'N',0,TO_DATE('2018-08-07 12:49:55','YYYY-MM-DD HH24:MI:SS'),2,1,'N','N',213667,'D',263,0) +; + +-- Aug 7, 2018 12:51:28 PM MYT +INSERT INTO AD_Field (SortNo,AD_Field_ID,IsEncrypted,DisplayLength,IsSameLine,IsHeading,SeqNo,IsCentrallyMaintained,IsReadOnly,Help,DisplayLogic,Updated,Description,Name,AD_Field_UU,IsDisplayed,IsFieldOnly,CreatedBy,UpdatedBy,IsActive,IsDisplayedGrid,SeqNoGrid,XPosition,IsQuickEntry,AD_Client_ID,Created,ColumnSpan,NumLines,IsAdvancedField,IsDefaultFocus,AD_Column_ID,EntityType,AD_Tab_ID,AD_Org_ID) VALUES (0,205807,'N',0,'N','N',172,'Y','N','The Currency Conversion Rate indicates the rate to use when converting the source currency to the accounting currency','@C_Currency_ID@!@$C_Currency_ID@ & @IsOverrideCurrencyRate@=Y',TO_DATE('2018-08-07 12:51:22','YYYY-MM-DD HH24:MI:SS'),'Currency Conversion Rate','Rate','c8f3055c-77ff-4fa8-bf79-fa1e60f8693f','Y','N',100,100,'Y','Y',172,4,'N',0,TO_DATE('2018-08-07 12:51:22','YYYY-MM-DD HH24:MI:SS'),2,1,'N','N',213668,'D',263,0) +; + +-- Aug 7, 2018 12:53:55 PM MYT +INSERT INTO AD_Field (SortNo,AD_Field_ID,IsEncrypted,DisplayLength,IsSameLine,IsHeading,SeqNo,IsCentrallyMaintained,IsReadOnly,DisplayLogic,Updated,Description,Name,AD_Field_UU,IsDisplayed,IsFieldOnly,CreatedBy,UpdatedBy,IsActive,IsDisplayedGrid,SeqNoGrid,XPosition,IsQuickEntry,AD_Client_ID,Created,ColumnSpan,NumLines,IsAdvancedField,IsDefaultFocus,AD_Column_ID,EntityType,AD_Tab_ID,AD_Org_ID) VALUES (0,205808,'N',0,'N','N',171,'Y','N','@C_Currency_ID@!@$C_Currency_ID@',TO_DATE('2018-08-07 12:53:50','YYYY-MM-DD HH24:MI:SS'),'Override Currency Conversion Rate','Override Currency Conversion Rate','8adaa192-2b66-477c-a442-4902fcc8a377','Y','N',100,100,'Y','Y',171,2,'N',0,TO_DATE('2018-08-07 12:53:50','YYYY-MM-DD HH24:MI:SS'),2,1,'N','N',213667,'D',290,0) +; + +-- Aug 7, 2018 12:55:15 PM MYT +INSERT INTO AD_Field (SortNo,AD_Field_ID,IsEncrypted,DisplayLength,IsSameLine,IsHeading,SeqNo,IsCentrallyMaintained,IsReadOnly,Help,DisplayLogic,Updated,Description,Name,AD_Field_UU,IsDisplayed,IsFieldOnly,CreatedBy,UpdatedBy,IsActive,IsDisplayedGrid,SeqNoGrid,XPosition,IsQuickEntry,AD_Client_ID,Created,ColumnSpan,NumLines,IsAdvancedField,IsDefaultFocus,AD_Column_ID,EntityType,AD_Tab_ID,AD_Org_ID) VALUES (0,205809,'N',0,'N','N',172,'Y','N','The Currency Conversion Rate indicates the rate to use when converting the source currency to the accounting currency','@C_Currency_ID@!@$C_Currency_ID@ & @IsOverrideCurrencyRate@=Y',TO_DATE('2018-08-07 12:55:09','YYYY-MM-DD HH24:MI:SS'),'Currency Conversion Rate','Rate','654aef87-77d6-4640-9366-4e2d16de610c','Y','N',100,100,'Y','Y',1,4,'N',0,TO_DATE('2018-08-07 12:55:09','YYYY-MM-DD HH24:MI:SS'),2,1,'N','N',213668,'D',290,0) +; + +-- Aug 7, 2018 5:24:49 PM MYT +-- AP2-473 Improve handling of Spot Rate +UPDATE AD_StatusLine SET SQLStatement='SELECT COUNT(DISTINCT C_InvoiceLine_ID) AS Lines,o.TotalLines,o.GrandTotal,c.ISO_Code, currencyConvertInvoice(o.C_Invoice_ID,@$C_Currency_ID@,o.GrandTotal,o.DateAcct) AS ConvAmt, o.GrandTotal-o.TotalLines AS TaxAmt +FROM C_Invoice o +INNER JOIN C_Currency c ON (o.C_Currency_ID=c.C_Currency_ID) +LEFT JOIN C_InvoiceLine l ON (o.C_Invoice_ID=l.C_Invoice_ID) +WHERE o.C_Invoice_ID=@C_Invoice_ID@ +GROUP BY o.C_Currency_ID, c.ISO_Code, o.TotalLines, o.GrandTotal, o.DateAcct, o.AD_Client_ID, o.AD_Org_ID',Updated=TO_DATE('2018-08-07 17:24:49','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_StatusLine_ID=200002 +; + +-- Aug 7, 2018 5:26:55 PM MYT +UPDATE AD_StatusLine SET SQLStatement='SELECT COUNT(DISTINCT C_InvoiceLine_ID) AS Lines,o.TotalLines,o.GrandTotal,c.ISO_Code, currencyConvertInvoice(o.C_Invoice_ID,@$C_Currency_ID@,o.GrandTotal,o.DateAcct) AS ConvAmt, o.GrandTotal-o.TotalLines AS TaxAmt +FROM C_Invoice o +INNER JOIN C_Currency c ON (o.C_Currency_ID=c.C_Currency_ID) +LEFT JOIN C_InvoiceLine l ON (o.C_Invoice_ID=l.C_Invoice_ID) +WHERE o.C_Invoice_ID=@C_Invoice_ID@ +GROUP BY o.C_Invoice_ID, c.ISO_Code, o.TotalLines, o.GrandTotal, o.DateAcct, o.AD_Client_ID, o.AD_Org_ID',Updated=TO_DATE('2018-08-07 17:26:55','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_StatusLine_ID=200002 +; + +CREATE OR REPLACE FUNCTION currencyConvertInvoice( + p_c_invoice_id in number, + p_currency_to_id in number, + p_amt in number DEFAULT NULL, + p_conversiondate in date DEFAULT NULL) + RETURNS number +AS + v_GrandTotal NUMBER; + v_ConversionType_ID NUMBER; + v_Client_ID NUMBER; + v_Org_ID NUMBER; + v_Currency_ID NUMBER; + v_CurrencyRate NUMBER; + v_DateAcct DATE; + v_BaseCurrency_ID NUMBER; + v_IsOverrideCurrencyRate CHAR(1); +BEGIN + SELECT AD_Client_ID, AD_Org_ID, DateAcct, C_Currency_ID, C_ConversionType_ID, CurrencyRate, GrandTotal, IsOverrideCurrencyRate + INTO v_Client_ID, v_Org_ID, v_DateAcct, v_Currency_ID, v_ConversionType_ID, v_CurrencyRate, v_GrandTotal, v_IsOverrideCurrencyRate + FROM C_Invoice + WHERE C_Invoice_ID=p_C_Invoice_ID; + + SELECT sc.C_Currency_ID + INTO v_BaseCurrency_ID + FROM AD_ClientInfo ci + JOIN C_AcctSchema sc ON ci.C_AcctSchema1_ID=sc.C_AcctSchema_ID + WHERE ci.AD_Client_ID=v_Client_ID; + + IF v_BaseCurrency_ID=p_Currency_To_id AND Coalesce(v_CurrencyRate,0) > 0 AND v_Currency_ID != p_Currency_To_id AND v_IsOverrideCurrencyRate='Y' THEN + RETURN currencyRound(Coalesce(p_Amt,v_GrandTotal)*v_CurrencyRate, p_Currency_To_id, null); + END IF; + + RETURN currencyConvert(Coalesce(p_Amt,v_GrandTotal), v_Currency_ID, p_Currency_To_id, Coalesce(p_conversionDate,v_DateAcct), v_ConversionType_ID, v_Client_ID, v_Org_ID); +END currencyConvertInvoice; +/ + +SELECT register_migration_script('202007212000_IDEMPIERE-4083.sql') FROM dual +; + diff --git a/migration/i7.1z/postgresql/202007211800_IDEMPIERE-4083.sql b/migration/i7.1z/postgresql/202007211800_IDEMPIERE-4083.sql new file mode 100644 index 0000000000..2ca725f857 --- /dev/null +++ b/migration/i7.1z/postgresql/202007211800_IDEMPIERE-4083.sql @@ -0,0 +1,42 @@ +-- Jul 25, 2018 6:27:49 PM MYT +-- AP2-473 Improve handling of Spot Rate +INSERT INTO AD_Column (AD_Column_ID,SeqNoSelection,IsSyncDatabase,Version,IsMandatory,IsTranslated,IsIdentifier,SeqNo,IsParent,FieldLength,IsSelectionColumn,IsKey,IsAutocomplete,IsAllowLogging,AD_Column_UU,Updated,IsUpdateable,ColumnName,Description,DefaultValue,Help,Name,IsAllowCopy,IsActive,CreatedBy,UpdatedBy,IsAlwaysUpdateable,AD_Client_ID,Created,IsSecure,EntityType,IsEncrypted,AD_Element_ID,AD_Table_ID,AD_Reference_ID,IsToolbarButton,AD_Org_ID,IsHtml) VALUES (213623,0,'N',0,'N','N','N',0,'N',22,'N','N','N','Y','2c7aa027-bb65-45f3-b584-7471b4db2589',TO_TIMESTAMP('2018-07-25 18:27:43','YYYY-MM-DD HH24:MI:SS'),'Y','CurrencyRate','Currency Conversion Rate',NULL,'The Currency Conversion Rate indicates the rate to use when converting the source currency to the accounting currency','Rate','Y','Y',100,100,'N',0,TO_TIMESTAMP('2018-07-25 18:27:43','YYYY-MM-DD HH24:MI:SS'),'N','D','N',253,335,22,'N',0,'N') +; + +-- Jul 25, 2018 6:27:58 PM MYT +ALTER TABLE C_Payment ADD COLUMN CurrencyRate NUMERIC DEFAULT NULL +; + +-- Jul 25, 2018 6:28:37 PM MYT +INSERT INTO AD_Column (AD_Column_ID,SeqNoSelection,IsSyncDatabase,Version,IsMandatory,IsTranslated,IsIdentifier,SeqNo,IsParent,FieldLength,IsSelectionColumn,IsKey,IsAutocomplete,IsAllowLogging,AD_Column_UU,Updated,IsUpdateable,ColumnName,Description,Help,Name,IsAllowCopy,IsActive,CreatedBy,UpdatedBy,IsAlwaysUpdateable,AD_Client_ID,Created,IsSecure,EntityType,IsEncrypted,AD_Element_ID,AD_Table_ID,AD_Reference_ID,IsToolbarButton,AD_Org_ID,IsHtml) VALUES (213624,0,'N',0,'N','N','N',0,'N',22,'N','N','N','Y','d1ef932b-5a7d-4d3a-b6c9-d92b02c440f9',TO_TIMESTAMP('2018-07-25 18:28:37','YYYY-MM-DD HH24:MI:SS'),'Y','ConvertedAmt','Converted Amount','The Converted Amount is the result of multiplying the Source Amount by the Conversion Rate for this target currency.','Converted Amount','Y','Y',100,100,'N',0,TO_TIMESTAMP('2018-07-25 18:28:37','YYYY-MM-DD HH24:MI:SS'),'N','D','N',1555,335,12,'N',0,'N') +; + +-- Jul 25, 2018 6:28:44 PM MYT +ALTER TABLE C_Payment ADD COLUMN ConvertedAmt NUMERIC DEFAULT NULL +; + +-- Jul 25, 2018 6:35:47 PM MYT +INSERT INTO AD_Field (SortNo,AD_Field_ID,IsEncrypted,DisplayLength,IsSameLine,IsHeading,SeqNo,IsCentrallyMaintained,IsReadOnly,Help,DisplayLogic,Updated,Description,Name,AD_Field_UU,IsDisplayed,IsFieldOnly,CreatedBy,UpdatedBy,IsActive,IsDisplayedGrid,SeqNoGrid,XPosition,IsQuickEntry,AD_Client_ID,Created,ColumnSpan,NumLines,IsAdvancedField,IsDefaultFocus,AD_Column_ID,EntityType,AD_Tab_ID,AD_Org_ID) VALUES (0,205669,'N',0,'N','N',231,'Y','N','The Currency Conversion Rate indicates the rate to use when converting the source currency to the accounting currency','@C_Currency_ID@!@$C_Currency_ID@ & @C_ConversionType_ID@=114',TO_TIMESTAMP('2018-07-25 18:35:41','YYYY-MM-DD HH24:MI:SS'),'Currency Conversion Rate','Rate','085538d5-fa30-454f-9efa-46d7f03ec2bf','Y','N',100,100,'Y','Y',221,4,'N',0,TO_TIMESTAMP('2018-07-25 18:35:41','YYYY-MM-DD HH24:MI:SS'),2,1,'N','N',213623,'D',330,0) +; + +-- Jul 25, 2018 6:36:28 PM MYT +INSERT INTO AD_Field (SortNo,AD_Field_ID,IsEncrypted,DisplayLength,IsSameLine,IsHeading,SeqNo,IsCentrallyMaintained,IsReadOnly,Help,DisplayLogic,Updated,Description,Name,AD_Field_UU,IsDisplayed,IsFieldOnly,CreatedBy,UpdatedBy,IsActive,IsDisplayedGrid,SeqNoGrid,XPosition,IsQuickEntry,AD_Client_ID,Created,ColumnSpan,NumLines,IsAdvancedField,IsDefaultFocus,AD_Column_ID,EntityType,AD_Tab_ID,AD_Org_ID) VALUES (0,205670,'N',0,'N','N',232,'Y','N','The Converted Amount is the result of multiplying the Source Amount by the Conversion Rate for this target currency.','@C_Currency_ID@!@$C_Currency_ID@ & @C_ConversionType_ID@=114',TO_TIMESTAMP('2018-07-25 18:36:22','YYYY-MM-DD HH24:MI:SS'),'Converted Amount','Converted Amount','a7312ba2-8cd8-4c8c-ac60-24559140372a','Y','N',100,100,'Y','Y',222,1,'N',0,TO_TIMESTAMP('2018-07-25 18:36:22','YYYY-MM-DD HH24:MI:SS'),2,1,'N','N',213624,'D',330,0) +; + +-- Jul 26, 2018 5:47:16 PM MYT +-- AP2-473 Improve handling of Spot Rate +UPDATE AD_Column SET Callout='org.compiere.model.CalloutPayment.amounts',Updated=TO_TIMESTAMP('2018-07-26 17:47:16','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=213623 +; + +-- Jul 26, 2018 5:47:50 PM MYT +UPDATE AD_Column SET Callout='org.compiere.model.CalloutPayment.amounts',Updated=TO_TIMESTAMP('2018-07-26 17:47:50','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=213624 +; + +-- Jul 26, 2018 8:42:12 PM MYT +-- AP2-473 Improve handling of Spot Rate +UPDATE AD_Column SET Callout='org.compiere.model.CalloutPayment.amounts',Updated=TO_TIMESTAMP('2018-07-26 20:42:12','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=12128 +; + +SELECT register_migration_script('202007211800_IDEMPIERE-4083.sql') FROM dual +; + diff --git a/migration/i7.1z/postgresql/202007211900_IDEMPIERE-4083.sql b/migration/i7.1z/postgresql/202007211900_IDEMPIERE-4083.sql new file mode 100644 index 0000000000..32ee41ea59 --- /dev/null +++ b/migration/i7.1z/postgresql/202007211900_IDEMPIERE-4083.sql @@ -0,0 +1,102 @@ +-- Aug 6, 2018 12:04:56 PM MYT +-- AP2-473 Improve handling of Spot Rate +INSERT INTO AD_Element (AD_Element_ID,ColumnName,Updated,Name,Description,PrintName,AD_Element_UU,IsActive,Created,CreatedBy,UpdatedBy,AD_Client_ID,EntityType,AD_Org_ID) VALUES (203258,'IsOverrideCurrencyRate',TO_TIMESTAMP('2018-08-06 12:04:54','YYYY-MM-DD HH24:MI:SS'),'Override Currency Conversion Rate','Override Currency Conversion Rate','Override Currency Conversion Rate','fa5158e6-cd76-4b51-a423-0e61f1174402','Y',TO_TIMESTAMP('2018-08-06 12:04:54','YYYY-MM-DD HH24:MI:SS'),100,100,0,'D',0) +; + +-- Aug 6, 2018 12:06:46 PM MYT +INSERT INTO AD_Column (AD_Column_ID,SeqNoSelection,IsSyncDatabase,Version,IsMandatory,IsTranslated,IsIdentifier,SeqNo,IsParent,FieldLength,IsSelectionColumn,IsKey,IsAutocomplete,IsAllowLogging,AD_Column_UU,Updated,IsUpdateable,ColumnName,Description,DefaultValue,Name,IsAllowCopy,IsActive,CreatedBy,UpdatedBy,IsAlwaysUpdateable,AD_Client_ID,Created,IsSecure,EntityType,IsEncrypted,FKConstraintType,AD_Element_ID,AD_Table_ID,AD_Reference_ID,IsToolbarButton,AD_Org_ID,IsHtml) VALUES (213664,0,'N',0,'Y','N','N',0,'N',1,'N','N','N','Y','694d7baf-3218-4940-a32e-439a8a8c0fdf',TO_TIMESTAMP('2018-08-06 12:06:45','YYYY-MM-DD HH24:MI:SS'),'Y','IsOverrideCurrencyRate','Override Currency Conversion Rate','N','Override Currency Conversion Rate','Y','Y',100,100,'N',0,TO_TIMESTAMP('2018-08-06 12:06:45','YYYY-MM-DD HH24:MI:SS'),'N','D','N','N',203258,335,20,'N',0,'N') +; + +-- Aug 6, 2018 12:07:00 PM MYT +UPDATE AD_Column SET IsAllowCopy='N',Updated=TO_TIMESTAMP('2018-08-06 12:07:00','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=213664 +; + +-- Aug 6, 2018 12:07:06 PM MYT +ALTER TABLE C_Payment ADD COLUMN IsOverrideCurrencyRate CHAR(1) DEFAULT 'N' CHECK (IsOverrideCurrencyRate IN ('Y','N')) NOT NULL +; + +-- Aug 6, 2018 12:11:52 PM MYT +UPDATE AD_Field SET SeqNo=233, DisplayLogic='@C_Currency_ID@!@$C_Currency_ID@ & @IsOverrideCurrencyRateO@=Y', AD_Val_Rule_ID=NULL, SeqNoGrid=223, XPosition=4, AD_Reference_Value_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2018-08-06 12:11:52','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=205670 +; + +-- Aug 6, 2018 12:12:40 PM MYT +UPDATE AD_Field SET SeqNo=232, DisplayLogic='@C_Currency_ID@!@$C_Currency_ID@ & @IsOverrideCurrencyRate@=Y', AD_Val_Rule_ID=NULL, SeqNoGrid=222, XPosition=1, AD_Reference_Value_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2018-08-06 12:12:40','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=205669 +; + +-- Aug 6, 2018 12:13:30 PM MYT +INSERT INTO AD_Field (SortNo,AD_Field_ID,IsEncrypted,DisplayLength,IsSameLine,IsHeading,SeqNo,IsCentrallyMaintained,IsReadOnly,DisplayLogic,Updated,Description,Name,AD_Field_UU,IsDisplayed,IsFieldOnly,CreatedBy,UpdatedBy,IsActive,IsDisplayedGrid,SeqNoGrid,XPosition,IsQuickEntry,AD_Client_ID,Created,ColumnSpan,NumLines,IsAdvancedField,IsDefaultFocus,AD_Column_ID,EntityType,AD_Tab_ID,AD_Org_ID) VALUES (0,205706,'N',0,'N','N',231,'Y','N','@C_Currency_ID@!@$C_Currency_ID@',TO_TIMESTAMP('2018-08-06 12:13:30','YYYY-MM-DD HH24:MI:SS'),'Override Currency Conversion Rate','Override Currency Conversion Rate','29fffeb3-e9dc-4a9d-813f-e54782b9dc19','Y','N',100,100,'Y','Y',221,1,'N',0,TO_TIMESTAMP('2018-08-06 12:13:30','YYYY-MM-DD HH24:MI:SS'),2,1,'N','N',213664,'D',330,0) +; + +-- Aug 6, 2018 12:14:06 PM MYT +UPDATE AD_Field SET DisplayLogic='@C_Currency_ID@!@$C_Currency_ID@ & @IsOverrideCurrencyRate@=N', AD_Val_Rule_ID=NULL, AD_Reference_Value_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2018-08-06 12:14:06','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=8651 +; + +-- Aug 6, 2018 12:14:39 PM MYT +UPDATE AD_Field SET AD_Val_Rule_ID=NULL, XPosition=2, AD_Reference_Value_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2018-08-06 12:14:39','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=205706 +; + +-- Aug 6, 2018 3:36:31 PM MYT +-- AP2-473 Improve handling of Spot Rate +UPDATE AD_Field SET DisplayLogic='@C_Currency_ID@!@$C_Currency_ID@', AD_Val_Rule_ID=NULL, AD_Reference_Value_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2018-08-06 15:36:31','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=8651 +; + +-- Aug 6, 2018 4:34:56 PM MYT +-- AP2-473 Improve handling of Spot Rate +UPDATE AD_Column SET Callout=NULL,Updated=TO_TIMESTAMP('2018-08-06 16:34:56','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=12128 +; + +-- Aug 6, 2018 4:35:17 PM MYT +UPDATE AD_Column SET Callout='org.compiere.model.CalloutPayment.amounts',Updated=TO_TIMESTAMP('2018-08-06 16:35:17','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=213664 +; + +-- Aug 6, 2018 6:16:52 PM MYT +-- AP2-473 Improve handling of Spot Rate +UPDATE AD_Field SET DisplayLogic='@C_Currency_ID@!@$C_Currency_ID@ & @IsOverrideCurrencyRate@=Y', AD_Val_Rule_ID=NULL, AD_Reference_Value_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2018-08-06 18:16:52','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=205670 +; + +CREATE OR REPLACE FUNCTION currencyConvertPayment( + p_C_Payment_ID numeric, + p_Currency_To_id numeric, + p_Amt numeric default null, + p_conversionDate timestamp with time zone default null) + RETURNS numeric + LANGUAGE 'plpgsql' +AS $BODY$ +DECLARE + v_PayAmt NUMERIC; + v_ConversionType_ID NUMERIC; + v_Client_ID NUMERIC; + v_Org_ID NUMERIC; + v_Currency_ID NUMERIC; + v_CurrencyRate NUMERIC; + v_ConvertedAmt NUMERIC; + v_DateAcct timestamp with time zone; + v_BaseCurrency_ID NUMERIC; + v_IsOverrideCurrencyRate character(1); +BEGIN + SELECT AD_Client_ID, AD_Org_ID, DateAcct, C_Currency_ID, C_ConversionType_ID, CurrencyRate, ConvertedAmt, PayAmt, IsOverrideCurrencyRate + INTO v_Client_ID, v_Org_ID, v_DateAcct, v_Currency_ID, v_ConversionType_ID, v_CurrencyRate, v_ConvertedAmt, v_PayAmt, v_IsOverrideCurrencyRate + FROM C_Payment + WHERE C_Payment_ID=p_C_Payment_ID; + + SELECT sc.C_Currency_ID + INTO v_BaseCurrency_ID + FROM AD_ClientInfo ci + JOIN C_AcctSchema sc ON ci.C_AcctSchema1_ID=sc.C_AcctSchema_ID + WHERE ci.AD_Client_ID=v_Client_ID; + + IF v_BaseCurrency_ID=p_Currency_To_id AND Coalesce(v_CurrencyRate,0) > 0 AND Coalesce(v_ConvertedAmt,0) != 0 AND v_Currency_ID != p_Currency_To_id AND v_IsOverrideCurrencyRate='Y' THEN + IF p_Amt IS NULL THEN + RETURN v_ConvertedAmt; + ELSE + RETURN currencyRound(p_Amt*v_CurrencyRate, p_Currency_To_id, null); + END IF; + END IF; + + RETURN currencyConvert(Coalesce(p_Amt,v_PayAmt), v_Currency_ID, p_Currency_To_id, Coalesce(p_conversionDate,v_DateAcct), v_ConversionType_ID, v_Client_ID, v_Org_ID); +END; +$BODY$; + +SELECT register_migration_script('202007211900_IDEMPIERE-4083.sql') FROM dual +; + diff --git a/migration/i7.1z/postgresql/202007212000_IDEMPIERE-4083.sql b/migration/i7.1z/postgresql/202007212000_IDEMPIERE-4083.sql new file mode 100644 index 0000000000..476bcd7900 --- /dev/null +++ b/migration/i7.1z/postgresql/202007212000_IDEMPIERE-4083.sql @@ -0,0 +1,99 @@ +-- Aug 7, 2018 12:11:37 PM MYT +-- AP2-473 Improve handling of Spot Rate +INSERT INTO AD_Column (AD_Column_ID,SeqNoSelection,IsSyncDatabase,Version,IsMandatory,IsTranslated,IsIdentifier,SeqNo,IsParent,FieldLength,IsSelectionColumn,IsKey,IsAutocomplete,IsAllowLogging,AD_Column_UU,Updated,IsUpdateable,ColumnName,Description,DefaultValue,Name,IsAllowCopy,IsActive,CreatedBy,UpdatedBy,IsAlwaysUpdateable,AD_Client_ID,Created,IsSecure,EntityType,IsEncrypted,FKConstraintType,AD_Element_ID,AD_Table_ID,AD_Reference_ID,IsToolbarButton,AD_Org_ID,IsHtml) VALUES (213667,0,'N',0,'Y','N','N',0,'N',1,'N','N','N','Y','49dfde99-b3e4-48df-b2dc-d178a7ba8391',TO_TIMESTAMP('2018-08-07 12:11:31','YYYY-MM-DD HH24:MI:SS'),'Y','IsOverrideCurrencyRate','Override Currency Conversion Rate','N','Override Currency Conversion Rate','Y','Y',100,100,'N',0,TO_TIMESTAMP('2018-08-07 12:11:31','YYYY-MM-DD HH24:MI:SS'),'N','D','N','N',203258,318,20,'N',0,'N') +; + +-- Aug 7, 2018 12:11:44 PM MYT +ALTER TABLE C_Invoice ADD COLUMN IsOverrideCurrencyRate CHAR(1) DEFAULT 'N' CHECK (IsOverrideCurrencyRate IN ('Y','N')) NOT NULL +; + +-- Aug 7, 2018 12:12:34 PM MYT +INSERT INTO AD_Column (AD_Column_ID,SeqNoSelection,IsSyncDatabase,Version,IsMandatory,IsTranslated,IsIdentifier,SeqNo,IsParent,FieldLength,IsSelectionColumn,IsKey,IsAutocomplete,IsAllowLogging,AD_Column_UU,Updated,IsUpdateable,ColumnName,Description,Help,Name,IsAllowCopy,IsActive,CreatedBy,UpdatedBy,IsAlwaysUpdateable,AD_Client_ID,Created,IsSecure,EntityType,IsEncrypted,AD_Element_ID,AD_Table_ID,AD_Reference_ID,IsToolbarButton,AD_Org_ID,IsHtml) VALUES (213668,0,'N',0,'N','N','N',0,'N',22,'N','N','N','Y','a73b45e7-f38f-4447-8657-1eb475e6e153',TO_TIMESTAMP('2018-08-07 12:12:28','YYYY-MM-DD HH24:MI:SS'),'Y','CurrencyRate','Currency Conversion Rate','The Currency Conversion Rate indicates the rate to use when converting the source currency to the accounting currency','Rate','Y','Y',100,100,'N',0,TO_TIMESTAMP('2018-08-07 12:12:28','YYYY-MM-DD HH24:MI:SS'),'N','D','N',253,318,22,'N',0,'N') +; + +-- Aug 7, 2018 12:12:40 PM MYT +ALTER TABLE C_Invoice ADD COLUMN CurrencyRate NUMERIC DEFAULT NULL +; + +-- Aug 7, 2018 12:50:01 PM MYT +-- AP2-473 Improve handling of Spot Rate +INSERT INTO AD_Field (SortNo,AD_Field_ID,IsEncrypted,DisplayLength,IsSameLine,IsHeading,SeqNo,IsCentrallyMaintained,IsReadOnly,DisplayLogic,Updated,Description,Name,AD_Field_UU,IsDisplayed,IsFieldOnly,CreatedBy,UpdatedBy,IsActive,IsDisplayedGrid,SeqNoGrid,XPosition,IsQuickEntry,AD_Client_ID,Created,ColumnSpan,NumLines,IsAdvancedField,IsDefaultFocus,AD_Column_ID,EntityType,AD_Tab_ID,AD_Org_ID) VALUES (0,205806,'N',0,'N','N',171,'Y','N','@C_Currency_ID@!@$C_Currency_ID@',TO_TIMESTAMP('2018-08-07 12:49:55','YYYY-MM-DD HH24:MI:SS'),'Override Currency Conversion Rate','Override Currency Conversion Rate','a28728cb-1b43-493f-bf29-481604eb1dcb','Y','N',100,100,'Y','Y',171,2,'N',0,TO_TIMESTAMP('2018-08-07 12:49:55','YYYY-MM-DD HH24:MI:SS'),2,1,'N','N',213667,'D',263,0) +; + +-- Aug 7, 2018 12:51:28 PM MYT +INSERT INTO AD_Field (SortNo,AD_Field_ID,IsEncrypted,DisplayLength,IsSameLine,IsHeading,SeqNo,IsCentrallyMaintained,IsReadOnly,Help,DisplayLogic,Updated,Description,Name,AD_Field_UU,IsDisplayed,IsFieldOnly,CreatedBy,UpdatedBy,IsActive,IsDisplayedGrid,SeqNoGrid,XPosition,IsQuickEntry,AD_Client_ID,Created,ColumnSpan,NumLines,IsAdvancedField,IsDefaultFocus,AD_Column_ID,EntityType,AD_Tab_ID,AD_Org_ID) VALUES (0,205807,'N',0,'N','N',172,'Y','N','The Currency Conversion Rate indicates the rate to use when converting the source currency to the accounting currency','@C_Currency_ID@!@$C_Currency_ID@ & @IsOverrideCurrencyRate@=Y',TO_TIMESTAMP('2018-08-07 12:51:22','YYYY-MM-DD HH24:MI:SS'),'Currency Conversion Rate','Rate','c8f3055c-77ff-4fa8-bf79-fa1e60f8693f','Y','N',100,100,'Y','Y',172,4,'N',0,TO_TIMESTAMP('2018-08-07 12:51:22','YYYY-MM-DD HH24:MI:SS'),2,1,'N','N',213668,'D',263,0) +; + +-- Aug 7, 2018 12:53:55 PM MYT +INSERT INTO AD_Field (SortNo,AD_Field_ID,IsEncrypted,DisplayLength,IsSameLine,IsHeading,SeqNo,IsCentrallyMaintained,IsReadOnly,DisplayLogic,Updated,Description,Name,AD_Field_UU,IsDisplayed,IsFieldOnly,CreatedBy,UpdatedBy,IsActive,IsDisplayedGrid,SeqNoGrid,XPosition,IsQuickEntry,AD_Client_ID,Created,ColumnSpan,NumLines,IsAdvancedField,IsDefaultFocus,AD_Column_ID,EntityType,AD_Tab_ID,AD_Org_ID) VALUES (0,205808,'N',0,'N','N',171,'Y','N','@C_Currency_ID@!@$C_Currency_ID@',TO_TIMESTAMP('2018-08-07 12:53:50','YYYY-MM-DD HH24:MI:SS'),'Override Currency Conversion Rate','Override Currency Conversion Rate','8adaa192-2b66-477c-a442-4902fcc8a377','Y','N',100,100,'Y','Y',171,2,'N',0,TO_TIMESTAMP('2018-08-07 12:53:50','YYYY-MM-DD HH24:MI:SS'),2,1,'N','N',213667,'D',290,0) +; + +-- Aug 7, 2018 12:55:15 PM MYT +INSERT INTO AD_Field (SortNo,AD_Field_ID,IsEncrypted,DisplayLength,IsSameLine,IsHeading,SeqNo,IsCentrallyMaintained,IsReadOnly,Help,DisplayLogic,Updated,Description,Name,AD_Field_UU,IsDisplayed,IsFieldOnly,CreatedBy,UpdatedBy,IsActive,IsDisplayedGrid,SeqNoGrid,XPosition,IsQuickEntry,AD_Client_ID,Created,ColumnSpan,NumLines,IsAdvancedField,IsDefaultFocus,AD_Column_ID,EntityType,AD_Tab_ID,AD_Org_ID) VALUES (0,205809,'N',0,'N','N',172,'Y','N','The Currency Conversion Rate indicates the rate to use when converting the source currency to the accounting currency','@C_Currency_ID@!@$C_Currency_ID@ & @IsOverrideCurrencyRate@=Y',TO_TIMESTAMP('2018-08-07 12:55:09','YYYY-MM-DD HH24:MI:SS'),'Currency Conversion Rate','Rate','654aef87-77d6-4640-9366-4e2d16de610c','Y','N',100,100,'Y','Y',1,4,'N',0,TO_TIMESTAMP('2018-08-07 12:55:09','YYYY-MM-DD HH24:MI:SS'),2,1,'N','N',213668,'D',290,0) +; + +-- Aug 7, 2018 5:24:49 PM MYT +-- AP2-473 Improve handling of Spot Rate +UPDATE AD_StatusLine SET SQLStatement='SELECT COUNT(DISTINCT C_InvoiceLine_ID) AS Lines,o.TotalLines,o.GrandTotal,c.ISO_Code, currencyConvertInvoice(o.C_Invoice_ID,@$C_Currency_ID@,o.GrandTotal,o.DateAcct) AS ConvAmt, o.GrandTotal-o.TotalLines AS TaxAmt +FROM C_Invoice o +INNER JOIN C_Currency c ON (o.C_Currency_ID=c.C_Currency_ID) +LEFT JOIN C_InvoiceLine l ON (o.C_Invoice_ID=l.C_Invoice_ID) +WHERE o.C_Invoice_ID=@C_Invoice_ID@ +GROUP BY o.C_Currency_ID, c.ISO_Code, o.TotalLines, o.GrandTotal, o.DateAcct, o.AD_Client_ID, o.AD_Org_ID',Updated=TO_TIMESTAMP('2018-08-07 17:24:49','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_StatusLine_ID=200002 +; + +-- Aug 7, 2018 5:26:55 PM MYT +UPDATE AD_StatusLine SET SQLStatement='SELECT COUNT(DISTINCT C_InvoiceLine_ID) AS Lines,o.TotalLines,o.GrandTotal,c.ISO_Code, currencyConvertInvoice(o.C_Invoice_ID,@$C_Currency_ID@,o.GrandTotal,o.DateAcct) AS ConvAmt, o.GrandTotal-o.TotalLines AS TaxAmt +FROM C_Invoice o +INNER JOIN C_Currency c ON (o.C_Currency_ID=c.C_Currency_ID) +LEFT JOIN C_InvoiceLine l ON (o.C_Invoice_ID=l.C_Invoice_ID) +WHERE o.C_Invoice_ID=@C_Invoice_ID@ +GROUP BY o.C_Invoice_ID, c.ISO_Code, o.TotalLines, o.GrandTotal, o.DateAcct, o.AD_Client_ID, o.AD_Org_ID',Updated=TO_TIMESTAMP('2018-08-07 17:26:55','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_StatusLine_ID=200002 +; + +CREATE OR REPLACE FUNCTION currencyConvertInvoice( + p_c_invoice_id numeric, + p_currency_to_id numeric, + p_amt numeric DEFAULT NULL::numeric, + p_conversiondate timestamp with time zone DEFAULT NULL::timestamp with time zone) + RETURNS numeric + LANGUAGE 'plpgsql' + + COST 100 + VOLATILE +AS $BODY$ + +DECLARE + v_GrandTotal NUMERIC; + v_ConversionType_ID NUMERIC; + v_Client_ID NUMERIC; + v_Org_ID NUMERIC; + v_Currency_ID NUMERIC; + v_CurrencyRate NUMERIC; + v_DateAcct timestamp with time zone; + v_BaseCurrency_ID NUMERIC; + v_IsOverrideCurrencyRate character(1); +BEGIN + SELECT AD_Client_ID, AD_Org_ID, DateAcct, C_Currency_ID, C_ConversionType_ID, CurrencyRate, GrandTotal, IsOverrideCurrencyRate + INTO v_Client_ID, v_Org_ID, v_DateAcct, v_Currency_ID, v_ConversionType_ID, v_CurrencyRate, v_GrandTotal, v_IsOverrideCurrencyRate + FROM C_Invoice + WHERE C_Invoice_ID=p_C_Invoice_ID; + + SELECT sc.C_Currency_ID + INTO v_BaseCurrency_ID + FROM AD_ClientInfo ci + JOIN C_AcctSchema sc ON ci.C_AcctSchema1_ID=sc.C_AcctSchema_ID + WHERE ci.AD_Client_ID=v_Client_ID; + + IF v_BaseCurrency_ID=p_Currency_To_id AND Coalesce(v_CurrencyRate,0) > 0 AND v_Currency_ID != p_Currency_To_id AND v_IsOverrideCurrencyRate='Y' THEN + RETURN currencyRound(Coalesce(p_Amt,v_GrandTotal)*v_CurrencyRate, p_Currency_To_id, null); + END IF; + + RETURN currencyConvert(Coalesce(p_Amt,v_GrandTotal), v_Currency_ID, p_Currency_To_id, Coalesce(p_conversionDate,v_DateAcct), v_ConversionType_ID, v_Client_ID, v_Org_ID); +END; + +$BODY$; + +SELECT register_migration_script('202007212000_IDEMPIERE-4083.sql') FROM dual +; + diff --git a/org.adempiere.base.callout/src/org/compiere/model/CalloutPaySelection.java b/org.adempiere.base.callout/src/org/compiere/model/CalloutPaySelection.java index c8fc2efef2..b0191f30da 100644 --- a/org.adempiere.base.callout/src/org/compiere/model/CalloutPaySelection.java +++ b/org.adempiere.base.callout/src/org/compiere/model/CalloutPaySelection.java @@ -105,9 +105,8 @@ public class CalloutPaySelection extends CalloutEngine BigDecimal DiscountAmt = Env.ZERO; Boolean IsSOTrx = Boolean.FALSE; String sql = "SELECT" - + " currencyConvert(" - + "invoiceOpen(i.C_Invoice_ID, 0)" - + ", i.C_Currency_ID,ba.C_Currency_ID, i.DateInvoiced, i.C_ConversionType_ID, i.AD_Client_ID, i.AD_Org_ID)," + + " currencyConvertInvoice(" + + "i.C_Invoice_ID, ba.C_Currency_ID, invoiceOpen(i.C_Invoice_ID, 0), i.DateInvoiced)," + " currencyConvert(" + "paymentTermDiscount(i.GrandTotal,i.C_Currency_ID,i.C_PaymentTerm_ID,i.DateInvoiced, ?)" + ", i.C_Currency_ID, ba.C_Currency_ID, i.DateInvoiced, i.C_ConversionType_ID, i.AD_Client_ID, i.AD_Org_ID)" diff --git a/org.adempiere.base.callout/src/org/compiere/model/CalloutPayment.java b/org.adempiere.base.callout/src/org/compiere/model/CalloutPayment.java index 63fa4d3f3e..0b4b67ffaa 100644 --- a/org.adempiere.base.callout/src/org/compiere/model/CalloutPayment.java +++ b/org.adempiere.base.callout/src/org/compiere/model/CalloutPayment.java @@ -27,6 +27,7 @@ import java.util.logging.Level; import org.compiere.util.DB; import org.compiere.util.Env; +import org.compiere.util.Msg; /** * Payment Callouts. org.compiere.model.CalloutPayment.* @@ -124,6 +125,7 @@ public class CalloutPayment extends CalloutEngine { DB.close (rs, pstmt); } + return docType (ctx, WindowNo, mTab, mField, value); } // invoice @@ -317,6 +319,81 @@ public class CalloutPayment extends CalloutEngine { C_InvoicePaySchedule_ID = Env.getContextAsInt (ctx, WindowNo, Env.TAB_INFO, "C_InvoicePaySchedule_ID"); } + + // Get Currency Info + Integer curr_int = (Integer) mTab.getValue ("C_Currency_ID"); + if (curr_int == null) + curr_int = Integer.valueOf(0); + int C_Currency_ID = curr_int.intValue (); + MCurrency currency = MCurrency.get (ctx, C_Currency_ID); + int C_ConversionType_ID = 0; + Integer ii = (Integer)mTab.getValue ("C_ConversionType_ID"); + if (ii != null) + C_ConversionType_ID = ii.intValue (); + int AD_Client_ID = Env.getContextAsInt (ctx, WindowNo, "AD_Client_ID"); + int AD_Org_ID = Env.getContextAsInt (ctx, WindowNo, "AD_Org_ID"); + + if (colName.equals(I_C_Payment.COLUMNNAME_CurrencyRate)) + { + if (value != null) + { + BigDecimal baseCurrencyRate = (BigDecimal) value; + if (baseCurrencyRate.signum() < 0) + { + mTab.setValue(colName, oldValue); + mTab.fireDataStatusEEvent("Invalid", Msg.getElement(ctx, colName), true); + return ""; + } + else if (baseCurrencyRate.signum() == 0) + { + int baseCurrencyId = Env.getContextAsInt(ctx, "$C_Currency_ID"); + Timestamp dateAcct = (Timestamp) mTab.getValue(I_C_Payment.COLUMNNAME_DateAcct); + baseCurrencyRate = MConversionRate.getRate(C_Currency_ID, baseCurrencyId, dateAcct, C_ConversionType_ID, AD_Client_ID, AD_Org_ID); + if (baseCurrencyRate == null) + return ""; + mTab.setValue(I_C_Payment.COLUMNNAME_CurrencyRate, baseCurrencyRate); + } + BigDecimal payAmt = (BigDecimal) mTab.getValue(I_C_Payment.COLUMNNAME_PayAmt); + if (payAmt != null) + { + BigDecimal convertedAmt = payAmt.multiply(baseCurrencyRate); + mTab.setValue(I_C_Payment.COLUMNNAME_ConvertedAmt, convertedAmt); + } + return ""; + } + else + { + mTab.setValue(colName, oldValue); + mTab.fireDataStatusEEvent("Invalid", Msg.getElement(ctx, colName), true); + return ""; + } + } + else if (colName.equals(I_C_Payment.COLUMNNAME_ConvertedAmt)) + { + if (value != null) + { + BigDecimal convertedAmt = (BigDecimal) value; + if (convertedAmt.signum() == 0) + { + mTab.setValue(colName, oldValue); + mTab.fireDataStatusEEvent("Invalid", Msg.getElement(ctx, colName), true); + return ""; + } + BigDecimal payAmt = (BigDecimal) mTab.getValue(I_C_Payment.COLUMNNAME_PayAmt); + if (payAmt != null) + { + BigDecimal baseCurrencyRate = convertedAmt.divide(payAmt, 6, RoundingMode.HALF_UP); + mTab.setValue(I_C_Payment.COLUMNNAME_CurrencyRate, baseCurrencyRate); + } + return ""; + } + else + { + mTab.setValue(colName, oldValue); + mTab.fireDataStatusEEvent("Invalid", Msg.getElement(ctx, colName), true); + return ""; + } + } // Get Open Amount & Invoice Currency BigDecimal InvoiceOpenAmt = Env.ZERO; int C_Currency_Invoice_ID = 0; @@ -377,19 +454,8 @@ public class CalloutPayment extends CalloutEngine OverUnderAmt = Env.ZERO; if (log.isLoggable(Level.FINE)) log.fine ("Pay=" + PayAmt + ", Discount=" + DiscountAmt + ", WriteOff=" + WriteOffAmt + ", OverUnderAmt=" + OverUnderAmt); - // Get Currency Info - Integer curr_int = (Integer) mTab.getValue ("C_Currency_ID"); - if (curr_int == null) - curr_int = Integer.valueOf(0); - int C_Currency_ID = curr_int.intValue (); - MCurrency currency = MCurrency.get (ctx, C_Currency_ID); - Timestamp ConvDate = (Timestamp)mTab.getValue ("DateTrx"); - int C_ConversionType_ID = 0; - Integer ii = (Integer)mTab.getValue ("C_ConversionType_ID"); - if (ii != null) - C_ConversionType_ID = ii.intValue (); - int AD_Client_ID = Env.getContextAsInt (ctx, WindowNo, "AD_Client_ID"); - int AD_Org_ID = Env.getContextAsInt (ctx, WindowNo, "AD_Org_ID"); + + Timestamp ConvDate = (Timestamp)mTab.getValue ("DateTrx"); // Get Currency Rate BigDecimal CurrencyRate = Env.ONE; if ((C_Currency_ID > 0 && C_Currency_Invoice_ID > 0 && C_Currency_ID != C_Currency_Invoice_ID) @@ -417,21 +483,46 @@ public class CalloutPayment extends CalloutEngine + InvoiceOpenAmt); } // Currency Changed - convert all - if (colName.equals ("C_Currency_ID") - || colName.equals ("C_ConversionType_ID")) + if (colName.equals ("C_Currency_ID")) { - PayAmt = PayAmt.multiply (CurrencyRate).setScale ( - currency.getStdPrecision (), RoundingMode.HALF_UP); - mTab.setValue ("PayAmt", PayAmt); - DiscountAmt = DiscountAmt.multiply (CurrencyRate).setScale ( - currency.getStdPrecision (), RoundingMode.HALF_UP); - mTab.setValue ("DiscountAmt", DiscountAmt); - WriteOffAmt = WriteOffAmt.multiply (CurrencyRate).setScale ( - currency.getStdPrecision (), RoundingMode.HALF_UP); - mTab.setValue ("WriteOffAmt", WriteOffAmt); - OverUnderAmt = OverUnderAmt.multiply (CurrencyRate).setScale ( - currency.getStdPrecision (), RoundingMode.HALF_UP); - mTab.setValue ("OverUnderAmt", OverUnderAmt); + if (oldValue != null && oldValue instanceof Integer) + { + BigDecimal conversionRate = null; + int oldId = (int) oldValue; + if (oldId > 0 && oldId == C_Currency_Invoice_ID) + { + conversionRate = CurrencyRate; + } + else if (oldId > 0) + { + conversionRate = MConversionRate.getRate (oldId, + C_Currency_ID, ConvDate, C_ConversionType_ID, AD_Client_ID, + AD_Org_ID); + if (conversionRate == null) + { + conversionRate = MConversionRate.getRate (C_Currency_ID, + oldId, ConvDate, C_ConversionType_ID, AD_Client_ID, + AD_Org_ID); + if (conversionRate != null) + conversionRate = new BigDecimal("1").divide(conversionRate, 12, RoundingMode.HALF_UP); + } + } + if (conversionRate != null) + { + PayAmt = PayAmt.multiply (conversionRate).setScale ( + currency.getStdPrecision (), RoundingMode.HALF_UP); + mTab.setValue ("PayAmt", PayAmt); + DiscountAmt = DiscountAmt.multiply (conversionRate).setScale ( + currency.getStdPrecision (), RoundingMode.HALF_UP); + mTab.setValue ("DiscountAmt", DiscountAmt); + WriteOffAmt = WriteOffAmt.multiply (conversionRate).setScale ( + currency.getStdPrecision (), RoundingMode.HALF_UP); + mTab.setValue ("WriteOffAmt", WriteOffAmt); + OverUnderAmt = OverUnderAmt.multiply (conversionRate).setScale ( + currency.getStdPrecision (), RoundingMode.HALF_UP); + mTab.setValue ("OverUnderAmt", OverUnderAmt); + } + } } // No Invoice - Set Discount, Writeoff, Under/Over to 0 else if (C_Invoice_ID == 0) @@ -495,6 +586,38 @@ public class CalloutPayment extends CalloutEngine mTab.setValue ("PayAmt", PayAmt); } } + + if (colName.equals(I_C_Payment.COLUMNNAME_C_Currency_ID) || colName.equals(I_C_Payment.COLUMNNAME_PayAmt) + || colName.equals(I_C_Payment.COLUMNNAME_IsOverrideCurrencyRate) ) { + Boolean override = (Boolean)(colName.equals(I_C_Payment.COLUMNNAME_IsOverrideCurrencyRate) ? value : mTab.getValue(I_C_Payment.COLUMNNAME_IsOverrideCurrencyRate)); + int baseCurrencyId = Env.getContextAsInt(ctx, "$C_Currency_ID"); + if (baseCurrencyId == C_Currency_ID) { + mTab.setValue(I_C_Payment.COLUMNNAME_IsOverrideCurrencyRate, false); + mTab.setValue(I_C_Payment.COLUMNNAME_CurrencyRate, null); + mTab.setValue(I_C_Payment.COLUMNNAME_ConvertedAmt, null); + } + else if (!override) { + mTab.setValue(I_C_Payment.COLUMNNAME_CurrencyRate, null); + mTab.setValue(I_C_Payment.COLUMNNAME_ConvertedAmt, null); + } else { + BigDecimal payAmt = colName.equals(I_C_Payment.COLUMNNAME_PayAmt) ? (BigDecimal) value : (BigDecimal)mTab.getValue ("PayAmt"); + if (payAmt == null) + return ""; + if (colName.equals(I_C_Payment.COLUMNNAME_PayAmt) && oldValue != null) { + BigDecimal oldPayAmt = (BigDecimal) oldValue; + BigDecimal baseConversionRate = (BigDecimal) mTab.getValue(I_C_Payment.COLUMNNAME_CurrencyRate); + BigDecimal converted = (BigDecimal) mTab.getValue(I_C_Payment.COLUMNNAME_ConvertedAmt); + if (baseConversionRate != null && converted != null && oldPayAmt.multiply(baseConversionRate).compareTo(converted)==0) { + converted = payAmt.multiply(baseConversionRate); + int stdPrecision = MCurrency.getStdPrecision(ctx, baseCurrencyId); + if (converted.scale() > stdPrecision) + converted = converted.setScale(stdPrecision, RoundingMode.HALF_UP); + mTab.setValue(I_C_Payment.COLUMNNAME_ConvertedAmt, converted); + return ""; + } + } + } + } return ""; } // amounts } // CalloutPayment diff --git a/org.adempiere.base.process/src/org/compiere/process/Aging.java b/org.adempiere.base.process/src/org/compiere/process/Aging.java index 0896c9a64a..4e7c98feca 100644 --- a/org.adempiere.base.process/src/org/compiere/process/Aging.java +++ b/org.adempiere.base.process/src/org/compiere/process/Aging.java @@ -124,17 +124,19 @@ public class Aging extends SvrProcess } else { - String s = ",oi.C_Currency_ID," + p_ConvertCurrencyTo_ID + ",oi.DateAcct,oi.C_ConversionType_ID,oi.AD_Client_ID,oi.AD_Org_ID)"; - sql.append("currencyConvert(oi.GrandTotal").append(s); // 11 + String s = "," + p_ConvertCurrencyTo_ID; + sql.append("currencyConvertInvoice(oi.C_Invoice_ID").append(s).append(")"); // 11 if (!p_DateAcct) { - sql.append(", currencyConvert(oi.PaidAmt").append(s) // 12 - .append(", currencyConvert(oi.OpenAmt").append(s); // 13 + sql.append(", currencyConvertInvoice(oi.C_Invoice_ID").append(s) // 12 + .append(",oi.PaidAmt), currencyConvertInvoice(oi.C_Invoice_ID").append(s).append(",oi.OpenAmt)"); // 13 } else { - sql.append(", currencyConvert(invoicePaidToDate(oi.C_Invoice_ID, oi.C_Currency_ID, 1,"+dateacct+")").append(s) // 12 - .append(", currencyConvert(invoiceOpenToDate(oi.C_Invoice_ID,oi.C_InvoicePaySchedule_ID,"+dateacct+")").append(s); // 13 + sql.append(", currencyConvertInvoice(oi.C_Invoice_ID").append(s) // 12 + .append(",invoicePaidToDate(oi.C_Invoice_ID, oi.C_Currency_ID, 1,"+dateacct+")), " + + "currencyConvertInvoice(oi.C_Invoice_ID").append(s) + .append(",invoiceOpenToDate(oi.C_Invoice_ID,oi.C_InvoicePaySchedule_ID,"+dateacct+"))"); // 13 } } sql.append(",oi.C_Activity_ID,oi.C_Campaign_ID,oi.C_Project_ID,oi.AD_Org_ID "); // 14..17 diff --git a/org.adempiere.base.process/src/org/compiere/process/PaySelectionCreateFrom.java b/org.adempiere.base.process/src/org/compiere/process/PaySelectionCreateFrom.java index 052cbc9443..c1ec863eec 100644 --- a/org.adempiere.base.process/src/org/compiere/process/PaySelectionCreateFrom.java +++ b/org.adempiere.base.process/src/org/compiere/process/PaySelectionCreateFrom.java @@ -125,11 +125,11 @@ public class PaySelectionCreateFrom extends SvrProcess StringBuilder sql = new StringBuilder("SELECT C_Invoice_ID,") // 1 // Open - .append(" currencyConvert(invoiceOpen(i.C_Invoice_ID, i.C_InvoicePaySchedule_ID)") - .append(",i.C_Currency_ID, ?,?, i.C_ConversionType_ID,i.AD_Client_ID,i.AD_Org_ID) AS PayAmt,") // 2 ##p1/p2 Currency_To,PayDate + .append(" currencyConvertInvoice(i.C_Invoice_ID") + .append(",?,invoiceOpen(i.C_Invoice_ID, i.C_InvoicePaySchedule_ID), ?) AS PayAmt,") // ##1/2 Currency_To,PayDate // Discount - .append(" currencyConvert(invoiceDiscount(i.C_Invoice_ID,?,i.C_InvoicePaySchedule_ID)") // ##p3 PayDate - .append(",i.C_Currency_ID, ?,?,i.C_ConversionType_ID,i.AD_Client_ID,i.AD_Org_ID) AS DiscountAmt,") // 3 ##p4/p5 Currency_To,PayDate + .append(" currencyConvertInvoice(i.C_Invoice_ID") + .append(",?,invoiceDiscount(i.C_Invoice_ID,?,i.C_InvoicePaySchedule_ID),?) AS DiscountAmt,") // ##3/4/5 Currency_To,PayDate,PayDate .append(" PaymentRule, IsSOTrx, ") // 4..5 .append(" currencyConvert(invoiceWriteOff(i.C_Invoice_ID) ") .append(",i.C_Currency_ID, ?,?,i.C_ConversionType_ID,i.AD_Client_ID,i.AD_Org_ID) AS WriteOffAmt ") // 6 ##p6/p7 Currency_To,PayDate @@ -233,9 +233,9 @@ public class PaySelectionCreateFrom extends SvrProcess pstmt.setInt (index++, C_CurrencyTo_ID); pstmt.setTimestamp(index++, psel.getPayDate()); // - pstmt.setTimestamp(index++, psel.getPayDate()); pstmt.setInt (index++, C_CurrencyTo_ID); pstmt.setTimestamp(index++, psel.getPayDate()); + pstmt.setTimestamp(index++, psel.getPayDate()); pstmt.setInt (index++, C_CurrencyTo_ID); pstmt.setTimestamp(index++, psel.getPayDate()); // diff --git a/org.adempiere.base/src/org/compiere/acct/Doc.java b/org.adempiere.base/src/org/compiere/acct/Doc.java index 864409367a..c6818ad9da 100644 --- a/org.adempiere.base/src/org/compiere/acct/Doc.java +++ b/org.adempiere.base/src/org/compiere/acct/Doc.java @@ -1102,7 +1102,7 @@ public abstract class Doc m_period = MPeriod.get(getCtx(), ii.intValue()); } if (m_period == null) - m_period = MPeriod.get(getCtx(), getDateAcct(), getAD_Org_ID(), m_trxName); + m_period = MPeriod.get(getCtx(), getDateAcct(), getAD_Org_ID(), (String)null); // Is Period Open? if (m_period != null && m_period.isOpen(getDocumentType(), getDateAcct())) @@ -1690,6 +1690,11 @@ public abstract class Doc return 0; } // getC_ConversionType_ID + public BigDecimal getCurrencyRate() + { + return null; + } + /** * Get GL_Category_ID * @return category @@ -1707,8 +1712,8 @@ public abstract class Doc } // getGL_Category_ID /** - * Get GL_Category_ID - * @return category + * Get getGL_Budget_ID + * @return budget */ public int getGL_Budget_ID() { @@ -2319,6 +2324,13 @@ public abstract class Doc return m_fact; } + /** + * @return MAcctSchema + */ + protected MAcctSchema getAcctSchema() { + return m_as; + } + /** * Return document whether need to defer posting or not */ diff --git a/org.adempiere.base/src/org/compiere/acct/DocLine.java b/org.adempiere.base/src/org/compiere/acct/DocLine.java index ae28eb8ca1..2d0edcefa9 100644 --- a/org.adempiere.base/src/org/compiere/acct/DocLine.java +++ b/org.adempiere.base/src/org/compiere/acct/DocLine.java @@ -115,6 +115,7 @@ public class DocLine private int m_C_ConversionType_ID = -1; /** Period */ private int m_C_Period_ID = -1; + private BigDecimal m_currencyRate = null; /** * Get Currency @@ -167,6 +168,16 @@ public class DocLine m_C_ConversionType_ID = C_ConversionType_ID; } // setC_ConversionType_ID + public BigDecimal getCurrencyRate() + { + return m_currencyRate; + } + + protected void setCurrencyRate(BigDecimal currencyRate) + { + m_currencyRate = currencyRate; + } + /** * Set Amount (DR) * @param sourceAmt source amt diff --git a/org.adempiere.base/src/org/compiere/acct/Doc_AllocationHdr.java b/org.adempiere.base/src/org/compiere/acct/Doc_AllocationHdr.java index 6101c654d3..fb8381a14a 100644 --- a/org.adempiere.base/src/org/compiere/acct/Doc_AllocationHdr.java +++ b/org.adempiere.base/src/org/compiere/acct/Doc_AllocationHdr.java @@ -105,6 +105,16 @@ public class Doc_AllocationHdr extends Doc { MAllocationLine line = lines[i]; DocLine_Allocation docLine = new DocLine_Allocation(line, this); + + // Get Payment Conversion Rate + if (line.getC_Payment_ID() != 0) + { + MPayment payment = new MPayment (getCtx(), line.getC_Payment_ID(), getTrxName()); + int C_ConversionType_ID = payment.getC_ConversionType_ID(); + docLine.setC_ConversionType_ID(C_ConversionType_ID); + if (payment.isOverrideCurrencyRate()) + docLine.setCurrencyRate(payment.getCurrencyRate()); + } // if (log.isLoggable(Level.FINE)) log.fine(docLine.toString()); list.add (docLine); diff --git a/org.adempiere.base/src/org/compiere/acct/Doc_Invoice.java b/org.adempiere.base/src/org/compiere/acct/Doc_Invoice.java index 5ea0cc4d88..212e839655 100644 --- a/org.adempiere.base/src/org/compiere/acct/Doc_Invoice.java +++ b/org.adempiere.base/src/org/compiere/acct/Doc_Invoice.java @@ -1140,7 +1140,7 @@ public class Doc_Invoice extends Doc "UPDATE M_Product_PO po ") .append("SET PriceLastInv = ") // select - .append("(SELECT currencyConvert(il.PriceActual,i.C_Currency_ID,po.C_Currency_ID,i.DateInvoiced,i.C_ConversionType_ID,i.AD_Client_ID,i.AD_Org_ID) ") + .append("(SELECT currencyConvertInvoice(i.C_Invoice_ID,po.C_Currency_ID,il.PriceActual,i.DateInvoiced) ") .append("FROM C_Invoice i, C_InvoiceLine il ") .append("WHERE i.C_Invoice_ID=il.C_Invoice_ID") .append(" AND po.M_Product_ID=il.M_Product_ID AND po.C_BPartner_ID=i.C_BPartner_ID"); @@ -1167,5 +1167,35 @@ public class Doc_Invoice extends Doc int no = DB.executeUpdate(sql.toString(), getTrxName()); if (log.isLoggable(Level.FINE)) log.fine("Updated=" + no); } // updateProductPO + + @Override + public BigDecimal getCurrencyRate() { + if (getC_Currency_ID() == getAcctSchema().getC_Currency_ID()) + return null; + + MInvoice inv = (MInvoice)getPO(); + int baseCurrencyId = MClientInfo.get(getCtx(), inv.getAD_Client_ID()).getC_Currency_ID(); + if (baseCurrencyId != getAcctSchema().getC_Currency_ID()) + return null; + + if (inv.isOverrideCurrencyRate()) { + return inv.getCurrencyRate(); + } else { + return null; + } + } + + @Override + public boolean isConvertible (MAcctSchema acctSchema) { + MInvoice inv = (MInvoice)getPO(); + if (inv.getC_Currency_ID() != acctSchema.getC_Currency_ID()) { + int baseCurrencyId = MClientInfo.get(getCtx(), inv.getAD_Client_ID()).getC_Currency_ID(); + if (baseCurrencyId == acctSchema.getC_Currency_ID() && inv.isOverrideCurrencyRate()) { + return true; + } + } + + return super.isConvertible(acctSchema); + } } // Doc_Invoice diff --git a/org.adempiere.base/src/org/compiere/acct/Doc_Payment.java b/org.adempiere.base/src/org/compiere/acct/Doc_Payment.java index c888349eac..979ff17090 100644 --- a/org.adempiere.base/src/org/compiere/acct/Doc_Payment.java +++ b/org.adempiere.base/src/org/compiere/acct/Doc_Payment.java @@ -25,6 +25,7 @@ import org.compiere.model.MAccount; import org.compiere.model.MAcctSchema; import org.compiere.model.MBankAccount; import org.compiere.model.MCharge; +import org.compiere.model.MClientInfo; import org.compiere.model.MPayment; import org.compiere.model.MSysConfig; import org.compiere.util.Env; @@ -185,4 +186,34 @@ public class Doc_Payment extends Doc return ba.getAD_Org_ID(); } // getBank_Org_ID + + @Override + public BigDecimal getCurrencyRate() { + if (getC_Currency_ID() == getAcctSchema().getC_Currency_ID()) + return null; + + MPayment pay = (MPayment)getPO(); + int baseCurrencyId = MClientInfo.get(getCtx(), pay.getAD_Client_ID()).getC_Currency_ID(); + if (baseCurrencyId != getAcctSchema().getC_Currency_ID()) + return null; + + if (pay.isOverrideCurrencyRate()) { + return pay.getCurrencyRate(); + } else { + return null; + } + } + + @Override + public boolean isConvertible (MAcctSchema acctSchema) { + MPayment pay = (MPayment)getPO(); + if (pay.getC_Currency_ID() != acctSchema.getC_Currency_ID()) { + int baseCurrencyId = MClientInfo.get(getCtx(), pay.getAD_Client_ID()).getC_Currency_ID(); + if (baseCurrencyId == acctSchema.getC_Currency_ID() && pay.isOverrideCurrencyRate()) { + return true; + } + } + + return super.isConvertible(acctSchema); + } } // Doc_Payment diff --git a/org.adempiere.base/src/org/compiere/acct/FactLine.java b/org.adempiere.base/src/org/compiere/acct/FactLine.java index f690e30704..fe5adaf2d0 100644 --- a/org.adempiere.base/src/org/compiere/acct/FactLine.java +++ b/org.adempiere.base/src/org/compiere/acct/FactLine.java @@ -62,7 +62,7 @@ public final class FactLine extends X_Fact_Acct /** * */ - private static final long serialVersionUID = 6141312459030795891L; + private static final long serialVersionUID = -533308106857819424L; /** * Constructor @@ -726,21 +726,45 @@ public final class FactLine extends X_Fact_Acct if (AD_Org_ID == 0) AD_Org_ID = m_doc.getAD_Org_ID(); } - + Timestamp convDate = getDateAcct(); - if (m_docLine != null && m_doc instanceof Doc_BankStatement) - convDate = m_docLine.getDateConv(); - - - setAmtAcctDr (MConversionRate.convert (getCtx(), - getAmtSourceDr(), getC_Currency_ID(), m_acctSchema.getC_Currency_ID(), - convDate, C_ConversionType_ID, m_doc.getAD_Client_ID(), AD_Org_ID)); - if (getAmtAcctDr() == null) - return false; - setAmtAcctCr (MConversionRate.convert (getCtx(), - getAmtSourceCr(), getC_Currency_ID(), m_acctSchema.getC_Currency_ID(), - convDate, C_ConversionType_ID, m_doc.getAD_Client_ID(), AD_Org_ID)); + if (( m_doc instanceof Doc_BankStatement || m_doc instanceof Doc_AllocationHdr ) && m_docLine != null) + convDate = m_docLine.getDateConv(); + + BigDecimal currencyRate = null; + if (m_docLine != null && m_docLine.getCurrencyRate() != null && m_docLine.getCurrencyRate().signum() > 0) + { + currencyRate = m_docLine.getCurrencyRate(); + } + if (currencyRate == null && m_doc != null && m_doc.getCurrencyRate() != null && m_doc.getCurrencyRate().signum() > 0) + { + currencyRate = m_doc.getCurrencyRate(); + } + + if (currencyRate != null && currencyRate.signum() > 0) + { + BigDecimal amtAcctDr = getAmtSourceDr().multiply(currencyRate); + int stdPrecision = MCurrency.getStdPrecision(getCtx(), m_acctSchema.getC_Currency_ID()); + if (amtAcctDr.scale() > stdPrecision) + amtAcctDr = amtAcctDr.setScale(stdPrecision, RoundingMode.HALF_UP); + setAmtAcctDr(amtAcctDr); + BigDecimal amtAcctCr = getAmtSourceCr().multiply(currencyRate); + if (amtAcctCr.scale() > stdPrecision) + amtAcctCr = amtAcctCr.setScale(stdPrecision, RoundingMode.HALF_UP); + setAmtAcctCr(amtAcctCr); + } + else + { + setAmtAcctDr (MConversionRate.convert (getCtx(), + getAmtSourceDr(), getC_Currency_ID(), m_acctSchema.getC_Currency_ID(), + convDate, C_ConversionType_ID, m_doc.getAD_Client_ID(), AD_Org_ID)); + if (getAmtAcctDr() == null) + return false; + setAmtAcctCr (MConversionRate.convert (getCtx(), + getAmtSourceCr(), getC_Currency_ID(), m_acctSchema.getC_Currency_ID(), + convDate, C_ConversionType_ID, m_doc.getAD_Client_ID(), AD_Org_ID)); + } return true; } // convert diff --git a/org.adempiere.base/src/org/compiere/model/I_C_Invoice.java b/org.adempiere.base/src/org/compiere/model/I_C_Invoice.java index e89c8708f9..df0863ef27 100644 --- a/org.adempiere.base/src/org/compiere/model/I_C_Invoice.java +++ b/org.adempiere.base/src/org/compiere/model/I_C_Invoice.java @@ -399,6 +399,19 @@ public interface I_C_Invoice */ public String getCreateFrom(); + /** Column name CurrencyRate */ + public static final String COLUMNNAME_CurrencyRate = "CurrencyRate"; + + /** Set Rate. + * Currency Conversion Rate + */ + public void setCurrencyRate (BigDecimal CurrencyRate); + + /** Get Rate. + * Currency Conversion Rate + */ + public BigDecimal getCurrencyRate(); + /** Column name DateAcct */ public static final String COLUMNNAME_DateAcct = "DateAcct"; @@ -612,6 +625,19 @@ public interface I_C_Invoice */ public boolean isInDispute(); + /** Column name IsOverrideCurrencyRate */ + public static final String COLUMNNAME_IsOverrideCurrencyRate = "IsOverrideCurrencyRate"; + + /** Set Override Currency Conversion Rate. + * Override Currency Conversion Rate + */ + public void setIsOverrideCurrencyRate (boolean IsOverrideCurrencyRate); + + /** Get Override Currency Conversion Rate. + * Override Currency Conversion Rate + */ + public boolean isOverrideCurrencyRate(); + /** Column name IsPaid */ public static final String COLUMNNAME_IsPaid = "IsPaid"; diff --git a/org.adempiere.base/src/org/compiere/model/I_C_Payment.java b/org.adempiere.base/src/org/compiere/model/I_C_Payment.java index c69386f8f5..ce6de4ab56 100644 --- a/org.adempiere.base/src/org/compiere/model/I_C_Payment.java +++ b/org.adempiere.base/src/org/compiere/model/I_C_Payment.java @@ -407,6 +407,19 @@ public interface I_C_Payment public org.compiere.model.I_C_Invoice getC_Invoice() throws RuntimeException; + /** Column name ConvertedAmt */ + public static final String COLUMNNAME_ConvertedAmt = "ConvertedAmt"; + + /** Set Converted Amount. + * Converted Amount + */ + public void setConvertedAmt (BigDecimal ConvertedAmt); + + /** Get Converted Amount. + * Converted Amount + */ + public BigDecimal getConvertedAmt(); + /** Column name C_Order_ID */ public static final String COLUMNNAME_C_Order_ID = "C_Order_ID"; @@ -581,6 +594,19 @@ public interface I_C_Payment */ public String getCreditCardVV(); + /** Column name CurrencyRate */ + public static final String COLUMNNAME_CurrencyRate = "CurrencyRate"; + + /** Set Rate. + * Currency Conversion Rate + */ + public void setCurrencyRate (BigDecimal CurrencyRate); + + /** Get Rate. + * Currency Conversion Rate + */ + public BigDecimal getCurrencyRate(); + /** Column name CustomerAddressID */ public static final String COLUMNNAME_CustomerAddressID = "CustomerAddressID"; @@ -777,6 +803,19 @@ public interface I_C_Payment */ public boolean isOnline(); + /** Column name IsOverrideCurrencyRate */ + public static final String COLUMNNAME_IsOverrideCurrencyRate = "IsOverrideCurrencyRate"; + + /** Set Override Currency Conversion Rate. + * Override Currency Conversion Rate + */ + public void setIsOverrideCurrencyRate (boolean IsOverrideCurrencyRate); + + /** Get Override Currency Conversion Rate. + * Override Currency Conversion Rate + */ + public boolean isOverrideCurrencyRate(); + /** Column name IsOverUnderPayment */ public static final String COLUMNNAME_IsOverUnderPayment = "IsOverUnderPayment"; diff --git a/org.adempiere.base/src/org/compiere/model/MCost.java b/org.adempiere.base/src/org/compiere/model/MCost.java index b2cdb08d5b..47e262bb52 100644 --- a/org.adempiere.base/src/org/compiere/model/MCost.java +++ b/org.adempiere.base/src/org/compiere/model/MCost.java @@ -464,7 +464,7 @@ public class MCost extends X_M_Cost int M_ASI_ID, int AD_Org_ID, int C_Currency_ID) { BigDecimal retValue = null; - StringBuilder sql = new StringBuilder("SELECT currencyConvert(il.PriceActual, i.C_Currency_ID, ?, i.DateAcct, i.C_ConversionType_ID, il.AD_Client_ID, il.AD_Org_ID) ") + StringBuilder sql = new StringBuilder("SELECT currencyConvertInvoice(i.C_Invoice_ID, ?, il.PriceActual, i.DateAcct) ") // ,il.PriceActual, il.QtyInvoiced, i.DateInvoiced, il.Line .append("FROM C_InvoiceLine il ") .append(" INNER JOIN C_Invoice i ON (il.C_Invoice_ID=i.C_Invoice_ID) ") diff --git a/org.adempiere.base/src/org/compiere/model/MInvoice.java b/org.adempiere.base/src/org/compiere/model/MInvoice.java index aedf9cf93b..cf2e92c209 100644 --- a/org.adempiere.base/src/org/compiere/model/MInvoice.java +++ b/org.adempiere.base/src/org/compiere/model/MInvoice.java @@ -18,6 +18,7 @@ package org.compiere.model; import java.io.File; import java.math.BigDecimal; +import java.math.RoundingMode; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; @@ -1055,6 +1056,31 @@ public class MInvoice extends X_C_Invoice implements DocAction } } + if (!isProcessed()) + { + MClientInfo info = MClientInfo.get(getCtx(), getAD_Client_ID(), get_TrxName()); + MAcctSchema as = MAcctSchema.get (getCtx(), info.getC_AcctSchema1_ID(), get_TrxName()); + if (as.getC_Currency_ID() != getC_Currency_ID()) + { + if (isOverrideCurrencyRate()) + { + if(getCurrencyRate() == null || getCurrencyRate().signum() == 0) + { + log.saveError("FillMandatory", Msg.getElement(getCtx(), COLUMNNAME_CurrencyRate)); + return false; + } + } + else + { + setCurrencyRate(null); + } + } + else + { + setCurrencyRate(null); + } + } + return true; } // beforeSave @@ -1949,8 +1975,20 @@ public class MInvoice extends X_C_Invoice implements DocAction MBPartner bp = new MBPartner (getCtx(), getC_BPartner_ID(), get_TrxName()); DB.getDatabase().forUpdate(bp, 0); // Update total revenue and balance / credit limit (reversed on AllocationLine.processIt) - BigDecimal invAmt = MConversionRate.convertBase(getCtx(), getGrandTotal(true), // CM adjusted - getC_Currency_ID(), getDateAcct(), getC_ConversionType_ID(), getAD_Client_ID(), getAD_Org_ID()); + BigDecimal invAmt = null; + int baseCurrencyId = Env.getContextAsInt(getCtx(), "$C_Currency_ID"); + if (getC_Currency_ID() != baseCurrencyId && isOverrideCurrencyRate()) + { + invAmt = getGrandTotal(true).multiply(getCurrencyRate()); + int stdPrecision = MCurrency.getStdPrecision(getCtx(), baseCurrencyId); + if (invAmt.scale() > stdPrecision) + invAmt = invAmt.setScale(stdPrecision, RoundingMode.HALF_UP); + } + else + { + invAmt = MConversionRate.convertBase(getCtx(), getGrandTotal(true), // CM adjusted + getC_Currency_ID(), getDateAcct(), getC_ConversionType_ID(), getAD_Client_ID(), getAD_Org_ID()); + } if (invAmt == null) { m_processMsg = MConversionRateUtil.getErrorMessage(getCtx(), "ErrorConvertingCurrencyToBaseCurrency", diff --git a/org.adempiere.base/src/org/compiere/model/MPayment.java b/org.adempiere.base/src/org/compiere/model/MPayment.java index 40478cf182..96e6958c1c 100644 --- a/org.adempiere.base/src/org/compiere/model/MPayment.java +++ b/org.adempiere.base/src/org/compiere/model/MPayment.java @@ -822,7 +822,39 @@ public class MPayment extends X_C_Payment } } } - + + if (!isProcessed()) + { + MClientInfo info = MClientInfo.get(getCtx(), getAD_Client_ID(), get_TrxName()); + MAcctSchema as = MAcctSchema.get (getCtx(), info.getC_AcctSchema1_ID(), get_TrxName()); + if (as.getC_Currency_ID() != getC_Currency_ID()) + { + if (isOverrideCurrencyRate()) + { + if(getCurrencyRate() == null || getCurrencyRate().signum() == 0) + { + log.saveError("FillMandatory", Msg.getElement(getCtx(), COLUMNNAME_CurrencyRate)); + return false; + } + if (getConvertedAmt() == null || getConvertedAmt().signum() == 0) + { + log.saveError("FillMandatory", Msg.getElement(getCtx(), COLUMNNAME_ConvertedAmt)); + return false; + } + } + else + { + setCurrencyRate(null); + setConvertedAmt(null); + } + } + else + { + setCurrencyRate(null); + setConvertedAmt(null); + } + } + return true; } // beforeSave @@ -2014,14 +2046,23 @@ public class MPayment extends X_C_Payment { MBPartner bp = new MBPartner (getCtx(), getC_BPartner_ID(), get_TrxName()); DB.getDatabase().forUpdate(bp, 0); - // Update total balance to include this payment - BigDecimal payAmt = MConversionRate.convertBase(getCtx(), getPayAmt(), - getC_Currency_ID(), getDateAcct(), getC_ConversionType_ID(), getAD_Client_ID(), getAD_Org_ID()); - if (payAmt == null) + // Update total balance to include this payment + BigDecimal payAmt = null; + int baseCurrencyId = Env.getContextAsInt(getCtx(), "$C_Currency_ID"); + if (getC_Currency_ID() != baseCurrencyId && isOverrideCurrencyRate()) { - m_processMsg = MConversionRateUtil.getErrorMessage(getCtx(), "ErrorConvertingCurrencyToBaseCurrency", - getC_Currency_ID(), MClient.get(getCtx()).getC_Currency_ID(), getC_ConversionType_ID(), getDateAcct(), get_TrxName()); - return DocAction.STATUS_Invalid; + payAmt = getConvertedAmt(); + } + else + { + payAmt = MConversionRate.convertBase(getCtx(), getPayAmt(), + getC_Currency_ID(), getDateAcct(), getC_ConversionType_ID(), getAD_Client_ID(), getAD_Org_ID()); + if (payAmt == null) + { + m_processMsg = MConversionRateUtil.getErrorMessage(getCtx(), "ErrorConvertingCurrencyToBaseCurrency", + getC_Currency_ID(), MClient.get(getCtx()).getC_Currency_ID(), getC_ConversionType_ID(), getDateAcct(), get_TrxName()); + return DocAction.STATUS_Invalid; + } } // Total Balance BigDecimal newBalance = bp.getTotalOpenBalance(); diff --git a/org.adempiere.base/src/org/compiere/model/X_C_Invoice.java b/org.adempiere.base/src/org/compiere/model/X_C_Invoice.java index 58a8d51cac..86109120ad 100644 --- a/org.adempiere.base/src/org/compiere/model/X_C_Invoice.java +++ b/org.adempiere.base/src/org/compiere/model/X_C_Invoice.java @@ -33,7 +33,7 @@ public class X_C_Invoice extends PO implements I_C_Invoice, I_Persistent /** * */ - private static final long serialVersionUID = 20200413L; + private static final long serialVersionUID = 20200721L; /** Standard Constructor */ public X_C_Invoice (Properties ctx, int C_Invoice_ID, String trxName) @@ -64,6 +64,8 @@ public class X_C_Invoice extends PO implements I_C_Invoice, I_Persistent // @IsApproved@ setIsDiscountPrinted (false); setIsInDispute (false); +// N + setIsOverrideCurrencyRate (false); // N setIsPaid (false); setIsPayScheduleValid (false); @@ -696,6 +698,26 @@ public class X_C_Invoice extends PO implements I_C_Invoice, I_Persistent return (String)get_Value(COLUMNNAME_CreateFrom); } + /** Set Rate. + @param CurrencyRate + Currency Conversion Rate + */ + public void setCurrencyRate (BigDecimal CurrencyRate) + { + set_Value (COLUMNNAME_CurrencyRate, CurrencyRate); + } + + /** Get Rate. + @return Currency Conversion Rate + */ + public BigDecimal getCurrencyRate () + { + BigDecimal bd = (BigDecimal)get_Value(COLUMNNAME_CurrencyRate); + if (bd == null) + return Env.ZERO; + return bd; + } + /** Set Account Date. @param DateAcct Accounting Date @@ -1070,6 +1092,30 @@ public class X_C_Invoice extends PO implements I_C_Invoice, I_Persistent return false; } + /** Set Override Currency Conversion Rate. + @param IsOverrideCurrencyRate + Override Currency Conversion Rate + */ + public void setIsOverrideCurrencyRate (boolean IsOverrideCurrencyRate) + { + set_Value (COLUMNNAME_IsOverrideCurrencyRate, Boolean.valueOf(IsOverrideCurrencyRate)); + } + + /** Get Override Currency Conversion Rate. + @return Override Currency Conversion Rate + */ + public boolean isOverrideCurrencyRate () + { + Object oo = get_Value(COLUMNNAME_IsOverrideCurrencyRate); + if (oo != null) + { + if (oo instanceof Boolean) + return ((Boolean)oo).booleanValue(); + return "Y".equals(oo); + } + return false; + } + /** Set Paid. @param IsPaid The document is paid diff --git a/org.adempiere.base/src/org/compiere/model/X_C_Payment.java b/org.adempiere.base/src/org/compiere/model/X_C_Payment.java index a3eee8ba95..daf10d2651 100644 --- a/org.adempiere.base/src/org/compiere/model/X_C_Payment.java +++ b/org.adempiere.base/src/org/compiere/model/X_C_Payment.java @@ -33,7 +33,7 @@ public class X_C_Payment extends PO implements I_C_Payment, I_Persistent /** * */ - private static final long serialVersionUID = 20200413L; + private static final long serialVersionUID = 20200721L; /** Standard Constructor */ public X_C_Payment (Properties ctx, int C_Payment_ID, String trxName) @@ -59,6 +59,8 @@ public class X_C_Payment extends PO implements I_C_Payment, I_Persistent // N setIsDelayedCapture (false); setIsOnline (false); + setIsOverrideCurrencyRate (false); +// N setIsOverUnderPayment (true); // Y setIsPrepayment (false); @@ -670,6 +672,26 @@ public class X_C_Payment extends PO implements I_C_Payment, I_Persistent return ii.intValue(); } + /** Set Converted Amount. + @param ConvertedAmt + Converted Amount + */ + public void setConvertedAmt (BigDecimal ConvertedAmt) + { + set_Value (COLUMNNAME_ConvertedAmt, ConvertedAmt); + } + + /** Get Converted Amount. + @return Converted Amount + */ + public BigDecimal getConvertedAmt () + { + BigDecimal bd = (BigDecimal)get_Value(COLUMNNAME_ConvertedAmt); + if (bd == null) + return Env.ZERO; + return bd; + } + public org.compiere.model.I_C_Order getC_Order() throws RuntimeException { return (org.compiere.model.I_C_Order)MTable.get(getCtx(), org.compiere.model.I_C_Order.Table_Name) @@ -952,6 +974,26 @@ public class X_C_Payment extends PO implements I_C_Payment, I_Persistent return (String)get_Value(COLUMNNAME_CreditCardVV); } + /** Set Rate. + @param CurrencyRate + Currency Conversion Rate + */ + public void setCurrencyRate (BigDecimal CurrencyRate) + { + set_Value (COLUMNNAME_CurrencyRate, CurrencyRate); + } + + /** Get Rate. + @return Currency Conversion Rate + */ + public BigDecimal getCurrencyRate () + { + BigDecimal bd = (BigDecimal)get_Value(COLUMNNAME_CurrencyRate); + if (bd == null) + return Env.ZERO; + return bd; + } + /** Set Customer Address ID. @param CustomerAddressID Customer Address ID */ public void setCustomerAddressID (String CustomerAddressID) @@ -1295,6 +1337,30 @@ public class X_C_Payment extends PO implements I_C_Payment, I_Persistent return false; } + /** Set Override Currency Conversion Rate. + @param IsOverrideCurrencyRate + Override Currency Conversion Rate + */ + public void setIsOverrideCurrencyRate (boolean IsOverrideCurrencyRate) + { + set_Value (COLUMNNAME_IsOverrideCurrencyRate, Boolean.valueOf(IsOverrideCurrencyRate)); + } + + /** Get Override Currency Conversion Rate. + @return Override Currency Conversion Rate + */ + public boolean isOverrideCurrencyRate () + { + Object oo = get_Value(COLUMNNAME_IsOverrideCurrencyRate); + if (oo != null) + { + if (oo instanceof Boolean) + return ((Boolean)oo).booleanValue(); + return "Y".equals(oo); + } + return false; + } + /** Set Over/Under Payment. @param IsOverUnderPayment Over-Payment (unallocated) or Under-Payment (partial payment) diff --git a/org.adempiere.ui/src/org/compiere/apps/form/Allocation.java b/org.adempiere.ui/src/org/compiere/apps/form/Allocation.java index f758a7aa3d..70db2235e3 100644 --- a/org.adempiere.ui/src/org/compiere/apps/form/Allocation.java +++ b/org.adempiere.ui/src/org/compiere/apps/form/Allocation.java @@ -126,8 +126,8 @@ public class Allocation Vector> data = new Vector>(); StringBuilder sql = new StringBuilder("SELECT p.DateTrx,p.DocumentNo,p.C_Payment_ID," // 1..3 + "c.ISO_Code,p.PayAmt," // 4..5 - + "currencyConvert(p.PayAmt,p.C_Currency_ID,?,?,p.C_ConversionType_ID,p.AD_Client_ID,p.AD_Org_ID),"// 6 #1, #2 - + "currencyConvert(paymentAvailable(C_Payment_ID),p.C_Currency_ID,?,?,p.C_ConversionType_ID,p.AD_Client_ID,p.AD_Org_ID)," // 7 #3, #4 + + "currencyConvertPayment(p.C_Payment_ID,?,null,?),"// 6 #1, #2 + + "currencyConvertPayment(p.C_Payment_ID,?,paymentAvailable(p.C_Payment_ID),?)," // 7 #3, #4 + "p.MultiplierAP " + "FROM C_Payment_v p" // Corrected for AP/AR + " INNER JOIN C_Currency c ON (p.C_Currency_ID=c.C_Currency_ID) " @@ -257,10 +257,10 @@ public class Allocation Vector> data = new Vector>(); StringBuilder sql = new StringBuilder("SELECT i.DateInvoiced,i.DocumentNo,i.C_Invoice_ID," // 1..3 + "c.ISO_Code,i.GrandTotal*i.MultiplierAP, " // 4..5 Orig Currency - + "currencyConvert(i.GrandTotal*i.MultiplierAP,i.C_Currency_ID,?,?,i.C_ConversionType_ID,i.AD_Client_ID,i.AD_Org_ID), " // 6 #1 Converted, #2 Date - + "currencyConvert(invoiceOpen(C_Invoice_ID,C_InvoicePaySchedule_ID),i.C_Currency_ID,?,?,i.C_ConversionType_ID,i.AD_Client_ID,i.AD_Org_ID)*i.MultiplierAP, " // 7 #3, #4 Converted Open - + "currencyConvert(invoiceDiscount" // 8 AllowedDiscount - + "(i.C_Invoice_ID,?,C_InvoicePaySchedule_ID),i.C_Currency_ID,?,i.DateInvoiced,i.C_ConversionType_ID,i.AD_Client_ID,i.AD_Org_ID)*i.Multiplier*i.MultiplierAP," // #5, #6 + + "currencyConvertInvoice(i.C_Invoice_ID,?,i.GrandTotal*i.MultiplierAP,?), " // 6 #1 Converted, #2 Date + + "currencyConvertInvoice(i.C_Invoice_ID,?,invoiceOpen(C_Invoice_ID,C_InvoicePaySchedule_ID),?)*i.MultiplierAP, " // 7 #3, #4 Converted Open + + "currencyConvertInvoice(i.C_Invoice_ID" // 8 AllowedDiscount + + ",?,invoiceDiscount(i.C_Invoice_ID,?,C_InvoicePaySchedule_ID),i.DateInvoiced)*i.Multiplier*i.MultiplierAP," // #5, #6 + "i.MultiplierAP " + "FROM C_Invoice_v i" // corrected for CM/Split + " INNER JOIN C_Currency c ON (i.C_Currency_ID=c.C_Currency_ID) " @@ -285,8 +285,8 @@ public class Allocation pstmt.setTimestamp(2, (Timestamp)date); pstmt.setInt(3, m_C_Currency_ID); pstmt.setTimestamp(4, (Timestamp)date); - pstmt.setTimestamp(5, (Timestamp)date); - pstmt.setInt(6, m_C_Currency_ID); + pstmt.setInt(5, m_C_Currency_ID); + pstmt.setTimestamp(6, (Timestamp)date); pstmt.setInt(7, m_C_BPartner_ID); if (!isMultiCurrency) pstmt.setInt(8, m_C_Currency_ID); diff --git a/org.adempiere.ui/src/org/compiere/apps/form/PaySelect.java b/org.adempiere.ui/src/org/compiere/apps/form/PaySelect.java index bad7405b79..11796184a4 100644 --- a/org.adempiere.ui/src/org/compiere/apps/form/PaySelect.java +++ b/org.adempiere.ui/src/org/compiere/apps/form/PaySelect.java @@ -233,8 +233,8 @@ public class PaySelect new ColumnInfo(Msg.translate(ctx, "DiscountAmt"), "currencyConvert(invoiceDiscount(i.C_Invoice_ID,?,i.C_InvoicePaySchedule_ID),i.C_Currency_ID, ?,?,i.C_ConversionType_ID, i.AD_Client_ID,i.AD_Org_ID)", BigDecimal.class), new ColumnInfo(Msg.translate(ctx, "WriteOffAmt"), "currencyConvert(invoiceWriteOff(i.C_Invoice_ID),i.C_Currency_ID, ?,?,i.C_ConversionType_ID, i.AD_Client_ID,i.AD_Org_ID)", BigDecimal.class), new ColumnInfo(Msg.getMsg(ctx, "DiscountDate"), "COALESCE((SELECT discountdate from C_InvoicePaySchedule ips WHERE ips.C_InvoicePaySchedule_ID=i.C_InvoicePaySchedule_ID),i.DateInvoiced+p.DiscountDays+p.GraceDays) AS DiscountDate", Timestamp.class), - new ColumnInfo(Msg.getMsg(ctx, "AmountDue"), "currencyConvert(invoiceOpen(i.C_Invoice_ID,i.C_InvoicePaySchedule_ID),i.C_Currency_ID, ?,?,i.C_ConversionType_ID, i.AD_Client_ID,i.AD_Org_ID) AS AmountDue", BigDecimal.class), - new ColumnInfo(Msg.getMsg(ctx, "AmountPay"), "currencyConvert(invoiceOpen(i.C_Invoice_ID,i.C_InvoicePaySchedule_ID)-invoiceDiscount(i.C_Invoice_ID,?,i.C_InvoicePaySchedule_ID)-invoiceWriteOff(i.C_Invoice_ID),i.C_Currency_ID, ?,?,i.C_ConversionType_ID, i.AD_Client_ID,i.AD_Org_ID) AS AmountPay", BigDecimal.class) + new ColumnInfo(Msg.getMsg(ctx, "AmountDue"), "currencyConvertInvoice(i.C_Invoice_ID,?,invoiceOpen(i.C_Invoice_ID,i.C_InvoicePaySchedule_ID),?) AS AmountDue", BigDecimal.class), + new ColumnInfo(Msg.getMsg(ctx, "AmountPay"), "currencyConvertInvoice(i.C_Invoice_ID,?,invoiceOpen(i.C_Invoice_ID,i.C_InvoicePaySchedule_ID)-invoiceDiscount(i.C_Invoice_ID,?,i.C_InvoicePaySchedule_ID),?) AS AmountPay", BigDecimal.class) }, // FROM "C_Invoice_v i" @@ -370,8 +370,8 @@ public class PaySelect pstmt.setTimestamp(index++, payDate); pstmt.setInt(index++, bi.C_Currency_ID); // DueAmt pstmt.setTimestamp(index++, payDate); - pstmt.setTimestamp(index++, payDate); // PayAmt pstmt.setInt(index++, bi.C_Currency_ID); + pstmt.setTimestamp(index++, payDate); // PayAmt pstmt.setTimestamp(index++, payDate); pstmt.setString(index++, isSOTrx); // IsSOTrx pstmt.setInt(index++, m_AD_Client_ID); // Client diff --git a/org.adempiere.ui/src/org/compiere/apps/form/StatementCreateFromBatch.java b/org.adempiere.ui/src/org/compiere/apps/form/StatementCreateFromBatch.java index 29700fb97e..fcdf90b6e2 100644 --- a/org.adempiere.ui/src/org/compiere/apps/form/StatementCreateFromBatch.java +++ b/org.adempiere.ui/src/org/compiere/apps/form/StatementCreateFromBatch.java @@ -176,7 +176,7 @@ public abstract class StatementCreateFromBatch extends CreateFromForm Vector> data = new Vector>(); StringBuilder sql = new StringBuilder(); sql.append("SELECT py.C_DepositBatch_ID, db.DocumentNo, db.DateDeposit, db.C_BankAccount_ID, ba.AccountNo,"); - sql.append("SUM(currencyConvert(p.PayAmt,p.C_Currency_ID,ba.C_Currency_ID,p.DateAcct,p.C_ConversionType_ID,p.AD_Client_ID,p.AD_Org_ID)) AS amount,"); + sql.append("SUM(currencyConvertPayment(p.C_Payment_ID,ba.C_Currency_ID)) AS amount,"); sql.append("SUM(p.PayAmt) AS amountoriginal"); sql.append(" FROM C_BankAccount ba"); sql.append(" INNER JOIN C_Payment_v p ON (p.C_BankAccount_ID=ba.C_BankAccount_ID)"); @@ -245,7 +245,7 @@ public abstract class StatementCreateFromBatch extends CreateFromForm StringBuilder sql = new StringBuilder(); sql.append("SELECT p.DateTrx,p.C_Payment_ID,p.DocumentNo, p.C_Currency_ID,c.ISO_Code, p.PayAmt,"); - sql.append("currencyConvert(p.PayAmt,p.C_Currency_ID,ba.C_Currency_ID,p.DateAcct,p.C_ConversionType_ID,p.AD_Client_ID,p.AD_Org_ID), bp.Name "); + sql.append("currencyConvertPayment(p.C_Payment_ID,ba.C_Currency_ID), bp.Name "); sql.append(" FROM C_BankAccount ba"); sql.append(" INNER JOIN C_Payment_v p ON (p.C_BankAccount_ID=ba.C_BankAccount_ID)"); sql.append(" INNER JOIN C_Currency c ON (p.C_Currency_ID=c.C_Currency_ID)"); diff --git a/org.adempiere.ui/src/org/compiere/grid/CreateFromDepositBatch.java b/org.adempiere.ui/src/org/compiere/grid/CreateFromDepositBatch.java index 2e9be672f7..ba3baafba8 100644 --- a/org.adempiere.ui/src/org/compiere/grid/CreateFromDepositBatch.java +++ b/org.adempiere.ui/src/org/compiere/grid/CreateFromDepositBatch.java @@ -59,7 +59,7 @@ public abstract class CreateFromDepositBatch extends CreateFromBatch StringBuilder sql = new StringBuilder(); sql.append("SELECT p.DateTrx,p.C_Payment_ID,p.DocumentNo, p.C_Currency_ID,c.ISO_Code, p.PayAmt,"); - sql.append("currencyConvert(p.PayAmt,p.C_Currency_ID,ba.C_Currency_ID,p.DateAcct,p.C_ConversionType_ID,p.AD_Client_ID,p.AD_Org_ID), bp.Name "); + sql.append("currencyConvertPayment(p.C_Payment_ID,ba.C_Currency_ID), bp.Name "); sql.append("FROM C_BankAccount ba"); sql.append(" INNER JOIN C_Payment_v p ON (p.C_BankAccount_ID=ba.C_BankAccount_ID)"); sql.append(" INNER JOIN C_Currency c ON (p.C_Currency_ID=c.C_Currency_ID)"); diff --git a/org.adempiere.ui/src/org/compiere/grid/CreateFromStatement.java b/org.adempiere.ui/src/org/compiere/grid/CreateFromStatement.java index 73fd39c0ad..9321fa557c 100644 --- a/org.adempiere.ui/src/org/compiere/grid/CreateFromStatement.java +++ b/org.adempiere.ui/src/org/compiere/grid/CreateFromStatement.java @@ -59,7 +59,7 @@ public abstract class CreateFromStatement extends CreateFromBatch StringBuilder sql = new StringBuilder(); sql.append("SELECT p.DateTrx,p.C_Payment_ID,p.DocumentNo, p.C_Currency_ID,c.ISO_Code, p.PayAmt,"); - sql.append("currencyConvert(p.PayAmt,p.C_Currency_ID,ba.C_Currency_ID,p.DateAcct,p.C_ConversionType_ID,p.AD_Client_ID,p.AD_Org_ID), bp.Name "); + sql.append("currencyConvertPayment(p.C_Payment_ID,ba.C_Currency_ID), bp.Name "); sql.append("FROM C_BankAccount ba"); sql.append(" INNER JOIN C_Payment_v p ON (p.C_BankAccount_ID=ba.C_BankAccount_ID)"); sql.append(" INNER JOIN C_Currency c ON (p.C_Currency_ID=c.C_Currency_ID)");