From 02e425d02b4d2a76c2aa244dc1b33cbba0c727b4 Mon Sep 17 00:00:00 2001 From: Tuan Nguyen Date: Wed, 11 Jun 2025 14:30:03 +1000 Subject: [PATCH 01/12] Set Additional Reporting Currency --- .../Finance/1.Setup data/CreateGeneralLedgerSetup.Codeunit.al | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/1.Setup data/CreateGeneralLedgerSetup.Codeunit.al b/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/1.Setup data/CreateGeneralLedgerSetup.Codeunit.al index 00513df617..99ce4cac68 100644 --- a/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/1.Setup data/CreateGeneralLedgerSetup.Codeunit.al +++ b/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/1.Setup data/CreateGeneralLedgerSetup.Codeunit.al @@ -25,6 +25,8 @@ codeunit 5230 "Create General Ledger Setup" procedure InsertData(JobQueueCategoryCode: Code[10]; InvoiceRoundingPrecisionLCY: Decimal; LocalContAddrFormat: Integer; BankAccountNo: Code[20]; LCYCode: Code[10]; DataCheck: Boolean; AccReceivablesCategory: Integer) var GeneralLedgerSetup: Record "General Ledger Setup"; + CreateCurrency: Codeunit "Create Currency"; + ACYCode: Code[10]; begin if not GeneralLedgerSetup.Get() then GeneralLedgerSetup.Insert(); @@ -36,6 +38,8 @@ codeunit 5230 "Create General Ledger Setup" GeneralLedgerSetup.Validate("LCY Code", LCYCode); GeneralLedgerSetup.Validate("Enable Data Check", DataCheck); GeneralLedgerSetup.Validate("Acc. Receivables Category", AccReceivablesCategory); + ACYCode := LCYCode = CreateCurrency.EUR() ? CreateCurrency.USD() : CreateCurrency.EUR(); + GeneralLedgerSetup."Additional Reporting Currency" := ACYCode; GeneralLedgerSetup.Modify(true); end; } From 346f42487fa97037ead42fecf68548f898337cdc Mon Sep 17 00:00:00 2001 From: Tuan Nguyen Date: Wed, 11 Jun 2025 14:30:20 +1000 Subject: [PATCH 02/12] Created residual FX accounts --- .../1.Setup data/CreateGLAccount.Codeunit.al | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/1.Setup data/CreateGLAccount.Codeunit.al b/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/1.Setup data/CreateGLAccount.Codeunit.al index 50b578fba1..7776c8cc59 100644 --- a/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/1.Setup data/CreateGLAccount.Codeunit.al +++ b/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/1.Setup data/CreateGLAccount.Codeunit.al @@ -396,6 +396,12 @@ codeunit 5208 "Create G/L Account" SubCategory := Format(GLAccountCategory."Account Category"::Expense, 80); ContosoGLAccount.InsertGLAccount(RealizedFXLosses(), RealizedFXLossesName(), Enum::"G/L Account Income/Balance"::"Income Statement", Enum::"G/L Account Category"::Expense, SubCategory, Enum::"G/L Account Type"::Posting, '', '', 0, '', Enum::"General Posting Type"::" ", '', '', false, false, false); + SubCategory := Format(GLAccountCategory."Account Category"::Income, 80); + ContosoGLAccount.InsertGLAccount(ResidualFXGains(), ResidualFXGainsName(), Enum::"G/L Account Income/Balance"::"Income Statement", Enum::"G/L Account Category"::Income, SubCategory, Enum::"G/L Account Type"::Posting, '', '', 0, '', Enum::"General Posting Type"::" ", '', '', false, false, false); + + SubCategory := Format(GLAccountCategory."Account Category"::Expense, 80); + ContosoGLAccount.InsertGLAccount(ResidualFXLosses(), ResidualFXLossesName(), Enum::"G/L Account Income/Balance"::"Income Statement", Enum::"G/L Account Category"::Expense, SubCategory, Enum::"G/L Account Type"::Posting, '', '', 0, '', Enum::"General Posting Type"::" ", '', '', false, false, false); + ContosoGLAccount.InsertGLAccount(NIBEFOREEXTRITEMSTAXES(), NIBEFOREEXTRITEMSTAXESName(), Enum::"G/L Account Income/Balance"::"Income Statement", Enum::"G/L Account Category"::" ", Enum::"G/L Account Type"::Total, '', '', 1, IncomeStatement() + '..' + NIBEFOREEXTRITEMSTAXES(), Enum::"General Posting Type"::" ", '', '', false, false, false); SubCategory := Format(GLAccountCategory."Account Category"::Income, 80); @@ -677,6 +683,8 @@ codeunit 5208 "Create G/L Account" ContosoGLAccount.AddAccountForLocalization(UnrealizedFXLossesName(), '9320'); ContosoGLAccount.AddAccountForLocalization(RealizedFXGainsName(), '9330'); ContosoGLAccount.AddAccountForLocalization(RealizedFXLossesName(), '9340'); + ContosoGLAccount.AddAccountForLocalization(ResidualFXGainsName(), '9350'); + ContosoGLAccount.AddAccountForLocalization(ResidualFXLossesName(), '9360'); ContosoGLAccount.AddAccountForLocalization(NIBEFOREEXTRITEMSTAXESName(), '9395'); ContosoGLAccount.AddAccountForLocalization(ExtraordinaryIncomeName(), '9410'); ContosoGLAccount.AddAccountForLocalization(ExtraordinaryExpensesName(), '9420'); @@ -3298,6 +3306,26 @@ codeunit 5208 "Create G/L Account" exit(RealizedFXLossesLbl); end; + procedure ResidualFXGains(): Code[20] + begin + exit(ContosoGLAccount.GetAccountNo(ResidualFXGainsName())); + end; + + procedure ResidualFXGainsName(): Text[100] + begin + exit(ResidualFXGainsLbl); + end; + + procedure ResidualFXLosses(): Code[20] + begin + exit(ContosoGLAccount.GetAccountNo(ResidualFXLossesName())); + end; + + procedure ResidualFXLossesName(): Text[100] + begin + exit(ResidualFXLossesLbl); + end; + procedure NIBEFOREEXTRITEMSTAXES(): Code[20] begin exit(ContosoGLAccount.GetAccountNo(NIBEFOREEXTRITEMSTAXESName())); @@ -3628,6 +3656,8 @@ codeunit 5208 "Create G/L Account" UnrealizedFXLossesLbl: Label 'Unrealized FX Losses', MaxLength = 100; RealizedFXGainsLbl: Label 'Realized FX Gains', MaxLength = 100; RealizedFXLossesLbl: Label 'Realized FX Losses', MaxLength = 100; + ResidualFXGainsLbl: Label 'Residual FX Gains', MaxLength = 100; + ResidualFXLossesLbl: Label 'Residual FX Losses', MaxLength = 100; NIBEFOREEXTRITEMSTAXESLbl: Label 'NI BEFORE EXTR. ITEMS & TAXES', MaxLength = 100; ExtraordinaryIncomeLbl: Label 'Extraordinary Income', MaxLength = 100; ExtraordinaryExpensesLbl: Label 'Extraordinary Expenses', MaxLength = 100; From edb7458af69c15057254c13bbf21ba43147c8700 Mon Sep 17 00:00:00 2001 From: Tuan Nguyen Date: Wed, 11 Jun 2025 14:30:42 +1000 Subject: [PATCH 03/12] Set residual FX accounts to EUR & GBP currencies --- .../Contoso Helpers/ContosoCurrency.Codeunit.al | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/Apps/W1/ContosoCoffeeDemoDataset/app/DemoTool/Contoso Helpers/ContosoCurrency.Codeunit.al b/Apps/W1/ContosoCoffeeDemoDataset/app/DemoTool/Contoso Helpers/ContosoCurrency.Codeunit.al index 6bf872c322..e54aa23a6c 100644 --- a/Apps/W1/ContosoCoffeeDemoDataset/app/DemoTool/Contoso Helpers/ContosoCurrency.Codeunit.al +++ b/Apps/W1/ContosoCoffeeDemoDataset/app/DemoTool/Contoso Helpers/ContosoCurrency.Codeunit.al @@ -5,13 +5,16 @@ namespace Microsoft.DemoTool.Helpers; using Microsoft.Finance.Currency; +using Microsoft.DemoData.Finance; +using Microsoft.Finance.GeneralLedger.Setup; codeunit 5587 "Contoso Currency" { InherentEntitlements = X; InherentPermissions = X; Permissions = tabledata Currency = rim, - tabledata "Currency Exchange Rate" = rim; + tabledata "Currency Exchange Rate" = rim, + tabledata "General Ledger Setup" = r; var OverwriteData: Boolean; @@ -24,6 +27,8 @@ codeunit 5587 "Contoso Currency" procedure InsertCurrency(Code: Code[10]; ISONumericCode: Code[3]; Description: Text[30]; UnrealizedGainsAcc: Code[20]; RealizedGainsAcc: Code[20]; UnrealizedLossesAcc: Code[20]; RealizedLossesAcc: Code[20]; InvoiceRoundingPrecision: Decimal; InvoiceRoundingType: Option Nearest,Up,Down; AmountRoundingPrecision: Decimal; UnitAmountRoundingPrecision: Decimal; EMUCurrency: Boolean; AmountDecimalPlaces: Text[5]; UnitAmountDecimalPlaces: Text[5]) var Currency: Record "Currency"; + GLSetup: Record "General Ledger Setup"; + CreateGLAccount: Codeunit "Create G/L Account"; Exists: Boolean; begin if Currency.Get(Code) then begin @@ -52,6 +57,15 @@ codeunit 5587 "Contoso Currency" Currency.Validate("Unit-Amount Decimal Places", UnitAmountDecimalPlaces); Currency.Validate("EMU Currency", EMUCurrency); + if Currency.Code in ['EUR', 'GBP'] then begin + if GLSetup.Get() then begin + if GLSetup."Additional Reporting Currency" <> '' then begin + Currency.Validate("Residual Gains Account", CreateGLAccount.ResidualFXGains()); + Currency.Validate("Residual Losses Account", CreateGLAccount.ResidualFXLosses()); + end; + end; + end; + if Exists then Currency.Modify(true) else From 523359fda5af1c437fab5a8c2b3781d95a0ea164 Mon Sep 17 00:00:00 2001 From: Tuan Nguyen Date: Thu, 26 Jun 2025 16:45:29 +1000 Subject: [PATCH 04/12] Changed hardcoded currency codes to use the currency functions --- .../app/DemoTool/Contoso Helpers/ContosoCurrency.Codeunit.al | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Apps/W1/ContosoCoffeeDemoDataset/app/DemoTool/Contoso Helpers/ContosoCurrency.Codeunit.al b/Apps/W1/ContosoCoffeeDemoDataset/app/DemoTool/Contoso Helpers/ContosoCurrency.Codeunit.al index e54aa23a6c..15af7a5480 100644 --- a/Apps/W1/ContosoCoffeeDemoDataset/app/DemoTool/Contoso Helpers/ContosoCurrency.Codeunit.al +++ b/Apps/W1/ContosoCoffeeDemoDataset/app/DemoTool/Contoso Helpers/ContosoCurrency.Codeunit.al @@ -29,6 +29,7 @@ codeunit 5587 "Contoso Currency" Currency: Record "Currency"; GLSetup: Record "General Ledger Setup"; CreateGLAccount: Codeunit "Create G/L Account"; + CreateCurrency: Codeunit "Create Currency"; Exists: Boolean; begin if Currency.Get(Code) then begin @@ -57,7 +58,7 @@ codeunit 5587 "Contoso Currency" Currency.Validate("Unit-Amount Decimal Places", UnitAmountDecimalPlaces); Currency.Validate("EMU Currency", EMUCurrency); - if Currency.Code in ['EUR', 'GBP'] then begin + if Currency.Code in [CreateCurrency.EUR(), CreateCurrency.GBP()] then begin if GLSetup.Get() then begin if GLSetup."Additional Reporting Currency" <> '' then begin Currency.Validate("Residual Gains Account", CreateGLAccount.ResidualFXGains()); From 908b84c601cb886f65b27799c9f3a94b11f46b10 Mon Sep 17 00:00:00 2001 From: Tuan Nguyen Date: Thu, 3 Jul 2025 10:24:45 +1000 Subject: [PATCH 05/12] Added "Create Add. Reporting Currency" codeunit and moved data creation logic --- .../1.Setup data/CreateGLAccount.Codeunit.al | 30 ------ .../CreateGeneralLedgerSetup.Codeunit.al | 4 - .../CreateAddReportingCurrency.Codeunit.al | 96 +++++++++++++++++++ .../Finance/FinanceModule.Codeunit.al | 1 + .../ContosoCurrency.Codeunit.al | 17 +--- 5 files changed, 98 insertions(+), 50 deletions(-) create mode 100644 Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/2.Master data/CreateAddReportingCurrency.Codeunit.al diff --git a/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/1.Setup data/CreateGLAccount.Codeunit.al b/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/1.Setup data/CreateGLAccount.Codeunit.al index 7776c8cc59..50b578fba1 100644 --- a/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/1.Setup data/CreateGLAccount.Codeunit.al +++ b/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/1.Setup data/CreateGLAccount.Codeunit.al @@ -396,12 +396,6 @@ codeunit 5208 "Create G/L Account" SubCategory := Format(GLAccountCategory."Account Category"::Expense, 80); ContosoGLAccount.InsertGLAccount(RealizedFXLosses(), RealizedFXLossesName(), Enum::"G/L Account Income/Balance"::"Income Statement", Enum::"G/L Account Category"::Expense, SubCategory, Enum::"G/L Account Type"::Posting, '', '', 0, '', Enum::"General Posting Type"::" ", '', '', false, false, false); - SubCategory := Format(GLAccountCategory."Account Category"::Income, 80); - ContosoGLAccount.InsertGLAccount(ResidualFXGains(), ResidualFXGainsName(), Enum::"G/L Account Income/Balance"::"Income Statement", Enum::"G/L Account Category"::Income, SubCategory, Enum::"G/L Account Type"::Posting, '', '', 0, '', Enum::"General Posting Type"::" ", '', '', false, false, false); - - SubCategory := Format(GLAccountCategory."Account Category"::Expense, 80); - ContosoGLAccount.InsertGLAccount(ResidualFXLosses(), ResidualFXLossesName(), Enum::"G/L Account Income/Balance"::"Income Statement", Enum::"G/L Account Category"::Expense, SubCategory, Enum::"G/L Account Type"::Posting, '', '', 0, '', Enum::"General Posting Type"::" ", '', '', false, false, false); - ContosoGLAccount.InsertGLAccount(NIBEFOREEXTRITEMSTAXES(), NIBEFOREEXTRITEMSTAXESName(), Enum::"G/L Account Income/Balance"::"Income Statement", Enum::"G/L Account Category"::" ", Enum::"G/L Account Type"::Total, '', '', 1, IncomeStatement() + '..' + NIBEFOREEXTRITEMSTAXES(), Enum::"General Posting Type"::" ", '', '', false, false, false); SubCategory := Format(GLAccountCategory."Account Category"::Income, 80); @@ -683,8 +677,6 @@ codeunit 5208 "Create G/L Account" ContosoGLAccount.AddAccountForLocalization(UnrealizedFXLossesName(), '9320'); ContosoGLAccount.AddAccountForLocalization(RealizedFXGainsName(), '9330'); ContosoGLAccount.AddAccountForLocalization(RealizedFXLossesName(), '9340'); - ContosoGLAccount.AddAccountForLocalization(ResidualFXGainsName(), '9350'); - ContosoGLAccount.AddAccountForLocalization(ResidualFXLossesName(), '9360'); ContosoGLAccount.AddAccountForLocalization(NIBEFOREEXTRITEMSTAXESName(), '9395'); ContosoGLAccount.AddAccountForLocalization(ExtraordinaryIncomeName(), '9410'); ContosoGLAccount.AddAccountForLocalization(ExtraordinaryExpensesName(), '9420'); @@ -3306,26 +3298,6 @@ codeunit 5208 "Create G/L Account" exit(RealizedFXLossesLbl); end; - procedure ResidualFXGains(): Code[20] - begin - exit(ContosoGLAccount.GetAccountNo(ResidualFXGainsName())); - end; - - procedure ResidualFXGainsName(): Text[100] - begin - exit(ResidualFXGainsLbl); - end; - - procedure ResidualFXLosses(): Code[20] - begin - exit(ContosoGLAccount.GetAccountNo(ResidualFXLossesName())); - end; - - procedure ResidualFXLossesName(): Text[100] - begin - exit(ResidualFXLossesLbl); - end; - procedure NIBEFOREEXTRITEMSTAXES(): Code[20] begin exit(ContosoGLAccount.GetAccountNo(NIBEFOREEXTRITEMSTAXESName())); @@ -3656,8 +3628,6 @@ codeunit 5208 "Create G/L Account" UnrealizedFXLossesLbl: Label 'Unrealized FX Losses', MaxLength = 100; RealizedFXGainsLbl: Label 'Realized FX Gains', MaxLength = 100; RealizedFXLossesLbl: Label 'Realized FX Losses', MaxLength = 100; - ResidualFXGainsLbl: Label 'Residual FX Gains', MaxLength = 100; - ResidualFXLossesLbl: Label 'Residual FX Losses', MaxLength = 100; NIBEFOREEXTRITEMSTAXESLbl: Label 'NI BEFORE EXTR. ITEMS & TAXES', MaxLength = 100; ExtraordinaryIncomeLbl: Label 'Extraordinary Income', MaxLength = 100; ExtraordinaryExpensesLbl: Label 'Extraordinary Expenses', MaxLength = 100; diff --git a/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/1.Setup data/CreateGeneralLedgerSetup.Codeunit.al b/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/1.Setup data/CreateGeneralLedgerSetup.Codeunit.al index 99ce4cac68..00513df617 100644 --- a/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/1.Setup data/CreateGeneralLedgerSetup.Codeunit.al +++ b/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/1.Setup data/CreateGeneralLedgerSetup.Codeunit.al @@ -25,8 +25,6 @@ codeunit 5230 "Create General Ledger Setup" procedure InsertData(JobQueueCategoryCode: Code[10]; InvoiceRoundingPrecisionLCY: Decimal; LocalContAddrFormat: Integer; BankAccountNo: Code[20]; LCYCode: Code[10]; DataCheck: Boolean; AccReceivablesCategory: Integer) var GeneralLedgerSetup: Record "General Ledger Setup"; - CreateCurrency: Codeunit "Create Currency"; - ACYCode: Code[10]; begin if not GeneralLedgerSetup.Get() then GeneralLedgerSetup.Insert(); @@ -38,8 +36,6 @@ codeunit 5230 "Create General Ledger Setup" GeneralLedgerSetup.Validate("LCY Code", LCYCode); GeneralLedgerSetup.Validate("Enable Data Check", DataCheck); GeneralLedgerSetup.Validate("Acc. Receivables Category", AccReceivablesCategory); - ACYCode := LCYCode = CreateCurrency.EUR() ? CreateCurrency.USD() : CreateCurrency.EUR(); - GeneralLedgerSetup."Additional Reporting Currency" := ACYCode; GeneralLedgerSetup.Modify(true); end; } diff --git a/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/2.Master data/CreateAddReportingCurrency.Codeunit.al b/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/2.Master data/CreateAddReportingCurrency.Codeunit.al new file mode 100644 index 0000000000..6ce098324d --- /dev/null +++ b/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/2.Master data/CreateAddReportingCurrency.Codeunit.al @@ -0,0 +1,96 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace Microsoft.DemoData.Finance; + +using Microsoft.Finance.GeneralLedger.Setup; +using Microsoft.DemoTool.Helpers; +using Microsoft.Finance.GeneralLedger.Account; +using Microsoft.Foundation.Enums; +using Microsoft.Finance.Currency; + +codeunit 5627 "Create Add. Reporting Currency" +{ + InherentEntitlements = X; + InherentPermissions = X; + Permissions = + tabledata "General Ledger Setup" = rm, + tabledata Currency = rm; + + trigger OnRun() + begin + ConfigureAdditionalReportingCurrency(); + GenerateGLAccountsForReportingCurrency(); + UpdateCurrencyResidualAccounts(); + end; + + procedure ConfigureAdditionalReportingCurrency() + var + GeneralLedgerSetup: Record "General Ledger Setup"; + CreateCurrency: Codeunit "Create Currency"; + ACYCode: Code[10]; + begin + GeneralLedgerSetup.Get(); + ACYCode := GeneralLedgerSetup."LCY Code" = CreateCurrency.EUR() ? CreateCurrency.USD() : CreateCurrency.EUR(); + GeneralLedgerSetup."Additional Reporting Currency" := ACYCode; + GeneralLedgerSetup.Modify(true); + end; + + procedure GenerateGLAccountsForReportingCurrency() + var + GLAccountCategory: Record "G/L Account Category"; + SubCategory: Text[80]; + begin + ContosoGLAccount.AddAccountForLocalization(ResidualFXGainsName(), '9350'); + ContosoGLAccount.AddAccountForLocalization(ResidualFXLossesName(), '9360'); + + SubCategory := Format(GLAccountCategory."Account Category"::Income, 80); + ContosoGLAccount.InsertGLAccount(ResidualFXGains(), ResidualFXGainsName(), Enum::"G/L Account Income/Balance"::"Income Statement", Enum::"G/L Account Category"::Income, SubCategory, Enum::"G/L Account Type"::Posting, '', '', 0, '', Enum::"General Posting Type"::" ", '', '', false, false, false); + + SubCategory := Format(GLAccountCategory."Account Category"::Expense, 80); + ContosoGLAccount.InsertGLAccount(ResidualFXLosses(), ResidualFXLossesName(), Enum::"G/L Account Income/Balance"::"Income Statement", Enum::"G/L Account Category"::Expense, SubCategory, Enum::"G/L Account Type"::Posting, '', '', 0, '', Enum::"General Posting Type"::" ", '', '', false, false, false); + end; + + procedure UpdateCurrencyResidualAccounts() + var + Currency: Record "Currency"; + CreateGLAccount: Codeunit "Create G/L Account"; + CreateCurrency: Codeunit "Create Currency"; + begin + Currency.SetFilter(Code, '%1|%2', CreateCurrency.EUR(), CreateCurrency.USD()); + if Currency.FindSet(true) then begin + repeat + Currency.Validate("Residual Gains Account", ResidualFXGains()); + Currency.Validate("Residual Losses Account", ResidualFXLosses()); + Currency.Modify(true); + until Currency.Next() = 0; + end; + end; + + procedure ResidualFXGains(): Code[20] + begin + exit(ContosoGLAccount.GetAccountNo(ResidualFXGainsName())); + end; + + procedure ResidualFXGainsName(): Text[100] + begin + exit(ResidualFXGainsLbl); + end; + + procedure ResidualFXLosses(): Code[20] + begin + exit(ContosoGLAccount.GetAccountNo(ResidualFXLossesName())); + end; + + procedure ResidualFXLossesName(): Text[100] + begin + exit(ResidualFXLossesLbl); + end; + + var + ContosoGLAccount: Codeunit "Contoso GL Account"; + ResidualFXGainsLbl: Label 'Residual FX Gains', MaxLength = 100; + ResidualFXLossesLbl: Label 'Residual FX Losses', MaxLength = 100; +} \ No newline at end of file diff --git a/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/FinanceModule.Codeunit.al b/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/FinanceModule.Codeunit.al index 3bccc4a6a7..57208acc0e 100644 --- a/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/FinanceModule.Codeunit.al +++ b/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/FinanceModule.Codeunit.al @@ -73,6 +73,7 @@ codeunit 5415 "Finance Module" implements "Contoso Demo Data Module" Codeunit.Run(Codeunit::"Categ. Generate Acc. Schedules"); Codeunit.Run(Codeunit::"Create Currency Exchange Rate"); Codeunit.Run(Codeunit::"Create Resource"); + Codeunit.Run(Codeunit::"Create Add. Reporting Currency") end; procedure CreateTransactionalData() diff --git a/Apps/W1/ContosoCoffeeDemoDataset/app/DemoTool/Contoso Helpers/ContosoCurrency.Codeunit.al b/Apps/W1/ContosoCoffeeDemoDataset/app/DemoTool/Contoso Helpers/ContosoCurrency.Codeunit.al index 15af7a5480..6bf872c322 100644 --- a/Apps/W1/ContosoCoffeeDemoDataset/app/DemoTool/Contoso Helpers/ContosoCurrency.Codeunit.al +++ b/Apps/W1/ContosoCoffeeDemoDataset/app/DemoTool/Contoso Helpers/ContosoCurrency.Codeunit.al @@ -5,16 +5,13 @@ namespace Microsoft.DemoTool.Helpers; using Microsoft.Finance.Currency; -using Microsoft.DemoData.Finance; -using Microsoft.Finance.GeneralLedger.Setup; codeunit 5587 "Contoso Currency" { InherentEntitlements = X; InherentPermissions = X; Permissions = tabledata Currency = rim, - tabledata "Currency Exchange Rate" = rim, - tabledata "General Ledger Setup" = r; + tabledata "Currency Exchange Rate" = rim; var OverwriteData: Boolean; @@ -27,9 +24,6 @@ codeunit 5587 "Contoso Currency" procedure InsertCurrency(Code: Code[10]; ISONumericCode: Code[3]; Description: Text[30]; UnrealizedGainsAcc: Code[20]; RealizedGainsAcc: Code[20]; UnrealizedLossesAcc: Code[20]; RealizedLossesAcc: Code[20]; InvoiceRoundingPrecision: Decimal; InvoiceRoundingType: Option Nearest,Up,Down; AmountRoundingPrecision: Decimal; UnitAmountRoundingPrecision: Decimal; EMUCurrency: Boolean; AmountDecimalPlaces: Text[5]; UnitAmountDecimalPlaces: Text[5]) var Currency: Record "Currency"; - GLSetup: Record "General Ledger Setup"; - CreateGLAccount: Codeunit "Create G/L Account"; - CreateCurrency: Codeunit "Create Currency"; Exists: Boolean; begin if Currency.Get(Code) then begin @@ -58,15 +52,6 @@ codeunit 5587 "Contoso Currency" Currency.Validate("Unit-Amount Decimal Places", UnitAmountDecimalPlaces); Currency.Validate("EMU Currency", EMUCurrency); - if Currency.Code in [CreateCurrency.EUR(), CreateCurrency.GBP()] then begin - if GLSetup.Get() then begin - if GLSetup."Additional Reporting Currency" <> '' then begin - Currency.Validate("Residual Gains Account", CreateGLAccount.ResidualFXGains()); - Currency.Validate("Residual Losses Account", CreateGLAccount.ResidualFXLosses()); - end; - end; - end; - if Exists then Currency.Modify(true) else From bb87255636ef07218603d3ef11821b6e5d14eef0 Mon Sep 17 00:00:00 2001 From: Tuan Nguyen Date: Fri, 22 Aug 2025 20:16:04 +1000 Subject: [PATCH 06/12] Updated account numbers for residual FX gains/losses --- .../2.Master data/CreateAddReportingCurrency.Codeunit.al | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/2.Master data/CreateAddReportingCurrency.Codeunit.al b/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/2.Master data/CreateAddReportingCurrency.Codeunit.al index 6ce098324d..7d2cdab4d1 100644 --- a/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/2.Master data/CreateAddReportingCurrency.Codeunit.al +++ b/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/2.Master data/CreateAddReportingCurrency.Codeunit.al @@ -43,8 +43,8 @@ codeunit 5627 "Create Add. Reporting Currency" GLAccountCategory: Record "G/L Account Category"; SubCategory: Text[80]; begin - ContosoGLAccount.AddAccountForLocalization(ResidualFXGainsName(), '9350'); - ContosoGLAccount.AddAccountForLocalization(ResidualFXLossesName(), '9360'); + ContosoGLAccount.AddAccountForLocalization(ResidualFXGainsName(), '9335'); + ContosoGLAccount.AddAccountForLocalization(ResidualFXLossesName(), '9345'); SubCategory := Format(GLAccountCategory."Account Category"::Income, 80); ContosoGLAccount.InsertGLAccount(ResidualFXGains(), ResidualFXGainsName(), Enum::"G/L Account Income/Balance"::"Income Statement", Enum::"G/L Account Category"::Income, SubCategory, Enum::"G/L Account Type"::Posting, '', '', 0, '', Enum::"General Posting Type"::" ", '', '', false, false, false); From 8b82005bf9e00cdbfca1b8d4f1edf2eacf57a581 Mon Sep 17 00:00:00 2001 From: Tuan Nguyen Date: Wed, 14 Jan 2026 09:09:07 +1100 Subject: [PATCH 07/12] Removed new residual FX accounts & used existing FX accounts instead --- .../CreateAddReportingCurrency.Codeunit.al | 52 ++----------------- 1 file changed, 4 insertions(+), 48 deletions(-) diff --git a/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/2.Master data/CreateAddReportingCurrency.Codeunit.al b/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/2.Master data/CreateAddReportingCurrency.Codeunit.al index 7d2cdab4d1..b775dff3e4 100644 --- a/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/2.Master data/CreateAddReportingCurrency.Codeunit.al +++ b/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/2.Master data/CreateAddReportingCurrency.Codeunit.al @@ -5,11 +5,8 @@ namespace Microsoft.DemoData.Finance; -using Microsoft.Finance.GeneralLedger.Setup; -using Microsoft.DemoTool.Helpers; -using Microsoft.Finance.GeneralLedger.Account; -using Microsoft.Foundation.Enums; using Microsoft.Finance.Currency; +using Microsoft.Finance.GeneralLedger.Setup; codeunit 5627 "Create Add. Reporting Currency" { @@ -22,7 +19,6 @@ codeunit 5627 "Create Add. Reporting Currency" trigger OnRun() begin ConfigureAdditionalReportingCurrency(); - GenerateGLAccountsForReportingCurrency(); UpdateCurrencyResidualAccounts(); end; @@ -38,59 +34,19 @@ codeunit 5627 "Create Add. Reporting Currency" GeneralLedgerSetup.Modify(true); end; - procedure GenerateGLAccountsForReportingCurrency() - var - GLAccountCategory: Record "G/L Account Category"; - SubCategory: Text[80]; - begin - ContosoGLAccount.AddAccountForLocalization(ResidualFXGainsName(), '9335'); - ContosoGLAccount.AddAccountForLocalization(ResidualFXLossesName(), '9345'); - - SubCategory := Format(GLAccountCategory."Account Category"::Income, 80); - ContosoGLAccount.InsertGLAccount(ResidualFXGains(), ResidualFXGainsName(), Enum::"G/L Account Income/Balance"::"Income Statement", Enum::"G/L Account Category"::Income, SubCategory, Enum::"G/L Account Type"::Posting, '', '', 0, '', Enum::"General Posting Type"::" ", '', '', false, false, false); - - SubCategory := Format(GLAccountCategory."Account Category"::Expense, 80); - ContosoGLAccount.InsertGLAccount(ResidualFXLosses(), ResidualFXLossesName(), Enum::"G/L Account Income/Balance"::"Income Statement", Enum::"G/L Account Category"::Expense, SubCategory, Enum::"G/L Account Type"::Posting, '', '', 0, '', Enum::"General Posting Type"::" ", '', '', false, false, false); - end; - procedure UpdateCurrencyResidualAccounts() var Currency: Record "Currency"; - CreateGLAccount: Codeunit "Create G/L Account"; CreateCurrency: Codeunit "Create Currency"; + CreateGLAccount: Codeunit "Create G/L Account"; begin Currency.SetFilter(Code, '%1|%2', CreateCurrency.EUR(), CreateCurrency.USD()); if Currency.FindSet(true) then begin repeat - Currency.Validate("Residual Gains Account", ResidualFXGains()); - Currency.Validate("Residual Losses Account", ResidualFXLosses()); + Currency.Validate("Residual Gains Account", CreateGLAccount.RealizedFXGains()); + Currency.Validate("Residual Losses Account", CreateGLAccount.RealizedFXLosses()); Currency.Modify(true); until Currency.Next() = 0; end; end; - - procedure ResidualFXGains(): Code[20] - begin - exit(ContosoGLAccount.GetAccountNo(ResidualFXGainsName())); - end; - - procedure ResidualFXGainsName(): Text[100] - begin - exit(ResidualFXGainsLbl); - end; - - procedure ResidualFXLosses(): Code[20] - begin - exit(ContosoGLAccount.GetAccountNo(ResidualFXLossesName())); - end; - - procedure ResidualFXLossesName(): Text[100] - begin - exit(ResidualFXLossesLbl); - end; - - var - ContosoGLAccount: Codeunit "Contoso GL Account"; - ResidualFXGainsLbl: Label 'Residual FX Gains', MaxLength = 100; - ResidualFXLossesLbl: Label 'Residual FX Losses', MaxLength = 100; } \ No newline at end of file From 11a923f585bb1b83dacc9f55f06135dfbd08c189 Mon Sep 17 00:00:00 2001 From: Tuan Nguyen Date: Wed, 28 Jan 2026 11:42:21 +1100 Subject: [PATCH 08/12] Implemented function to retrieve generic and localized currency accounts --- .../CreateAddReportingCurrency.Codeunit.al | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/2.Master data/CreateAddReportingCurrency.Codeunit.al b/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/2.Master data/CreateAddReportingCurrency.Codeunit.al index b775dff3e4..5ff5db5987 100644 --- a/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/2.Master data/CreateAddReportingCurrency.Codeunit.al +++ b/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/2.Master data/CreateAddReportingCurrency.Codeunit.al @@ -6,6 +6,8 @@ namespace Microsoft.DemoData.Finance; using Microsoft.Finance.Currency; +using Microsoft.Finance.GeneralLedger.Journal; +using Microsoft.Finance.GeneralLedger.Posting; using Microsoft.Finance.GeneralLedger.Setup; codeunit 5627 "Create Add. Reporting Currency" @@ -38,15 +40,35 @@ codeunit 5627 "Create Add. Reporting Currency" var Currency: Record "Currency"; CreateCurrency: Codeunit "Create Currency"; - CreateGLAccount: Codeunit "Create G/L Account"; + FXGainsAccount: Code[20]; + FXLossesAccount: Code[20]; begin + GetResidualCurrencyAccounts(FXGainsAccount, FXLossesAccount); Currency.SetFilter(Code, '%1|%2', CreateCurrency.EUR(), CreateCurrency.USD()); if Currency.FindSet(true) then begin repeat - Currency.Validate("Residual Gains Account", CreateGLAccount.RealizedFXGains()); - Currency.Validate("Residual Losses Account", CreateGLAccount.RealizedFXLosses()); + Currency.Validate("Residual Gains Account", FXGainsAccount); + Currency.Validate("Residual Losses Account", FXLossesAccount); Currency.Modify(true); until Currency.Next() = 0; end; end; + + local procedure GetResidualCurrencyAccounts(var FXGainsAccount: Code[20]; var FXLossesAccount: Code[20]) + var + CreateGLAccount: Codeunit "Create G/L Account"; + IsHandled: Boolean; + begin + OnBeforeGetResidualCurrencyAccounts(FXGainsAccount, FXLossesAccount, IsHandled); + if IsHandled then + exit; + + FXGainsAccount := CreateGLAccount.RealizedFXGains(); + FXLossesAccount := CreateGLAccount.RealizedFXLosses(); + end; + + [IntegrationEvent(false, false)] + local procedure OnBeforeGetResidualCurrencyAccounts(var FXGainsAccount: Code[20]; var FXLossesAccount: Code[20]; var IsHandled: Boolean) + begin + end; } \ No newline at end of file From ab2e8817c0cc501f788fce0980cae33b2b03be0f Mon Sep 17 00:00:00 2001 From: Tuan Nguyen Date: Wed, 28 Jan 2026 11:45:10 +1100 Subject: [PATCH 09/12] Implemented localized currency gains/losses accounts for countries with specific FX account setup --- .../2. Master Data/CreateCurrencyExRateAT.Codeunit.al | 10 ++++++++++ .../2. Master Data/CreateCurrencyExRateBE.Codeunit.al | 10 ++++++++++ .../2.Master Data/CreateCHCurrencyExRate.Codeunit.al | 10 ++++++++++ .../2. Master Data/CreateCurrencyExRateCZ.Codeunit.al | 10 ++++++++++ .../2. Master data/CreateDECurrencyExRate.Codeunit.al | 10 ++++++++++ .../2.Master Data/CreateESCurrencyExch.Codeunit.al | 10 ++++++++++ .../2.Master Data/CreateCurrencyExRateFI.Codeunit.al | 10 ++++++++++ .../2.Master Data/CreateGBCurrency.Codeunit.al | 10 ++++++++++ .../2.Master Data/CreateCurrencyNL.Codeunit.al | 11 +++++++++++ .../Finance/1.Setup Data/CreateCurrencyUS.Codeunit.al | 10 ++++++++++ 10 files changed, 101 insertions(+) diff --git a/Apps/AT/ContosoCoffeeDemoDatasetAT/app/DemoData/Finance/2. Master Data/CreateCurrencyExRateAT.Codeunit.al b/Apps/AT/ContosoCoffeeDemoDatasetAT/app/DemoData/Finance/2. Master Data/CreateCurrencyExRateAT.Codeunit.al index 7790b87081..a595ea2741 100644 --- a/Apps/AT/ContosoCoffeeDemoDatasetAT/app/DemoData/Finance/2. Master Data/CreateCurrencyExRateAT.Codeunit.al +++ b/Apps/AT/ContosoCoffeeDemoDatasetAT/app/DemoData/Finance/2. Master Data/CreateCurrencyExRateAT.Codeunit.al @@ -189,4 +189,14 @@ codeunit 11154 "Create Currency Ex. Rate AT" CurrencyExchangeRate.Validate("Relational Exch. Rate Amount", RelationalExchRateAmount); CurrencyExchangeRate.Validate("Relational Adjmt Exch Rate Amt", RelationalAdjmtExchRateAmt); end; + + [EventSubscriber(ObjectType::Codeunit, Codeunit::"Create Add. Reporting Currency", OnBeforeGetResidualCurrencyAccounts, '', false, false)] + local procedure GetResidualCurrencyAccountsAT(var FXGainsAccount: Code[20]; var FXLossesAccount: Code[20]; var IsHandled: Boolean) + var + CreateATGLAccount: Codeunit "Create AT GL Account"; + begin + FXGainsAccount := CreateATGLAccount.FCYRealizedExchangeGains(); + FXLossesAccount := CreateATGLAccount.FCYRealizedExchangeLosses(); + IsHandled := true; + end; } diff --git a/Apps/BE/ContosoCoffeeDemoDatasetBE/app/DemoData/Finance/2. Master Data/CreateCurrencyExRateBE.Codeunit.al b/Apps/BE/ContosoCoffeeDemoDatasetBE/app/DemoData/Finance/2. Master Data/CreateCurrencyExRateBE.Codeunit.al index 38572b64f3..2034ef83c0 100644 --- a/Apps/BE/ContosoCoffeeDemoDatasetBE/app/DemoData/Finance/2. Master Data/CreateCurrencyExRateBE.Codeunit.al +++ b/Apps/BE/ContosoCoffeeDemoDatasetBE/app/DemoData/Finance/2. Master Data/CreateCurrencyExRateBE.Codeunit.al @@ -199,4 +199,14 @@ codeunit 11367 "Create Currency Ex. Rate BE" CurrencyExchangeRate.Validate("Relational Exch. Rate Amount", RelationalExchRateAmount); CurrencyExchangeRate.Validate("Relational Adjmt Exch Rate Amt", RelationalAdjmtExchRateAmt); end; + + [EventSubscriber(ObjectType::Codeunit, Codeunit::"Create Add. Reporting Currency", OnBeforeGetResidualCurrencyAccounts, '', false, false)] + local procedure GetResidualCurrencyAccountsBE(var FXGainsAccount: Code[20]; var FXLossesAccount: Code[20]; var IsHandled: Boolean) + var + CreateBEGLAccount: Codeunit "Create GL Account BE"; + begin + FXGainsAccount := CreateBEGLAccount.RealizedExchRateDiffIncome(); + FXLossesAccount := CreateBEGLAccount.RealizedExchRateDiffExpense(); + IsHandled := true; + end; } diff --git a/Apps/CH/ContosoCoffeeDemoDatasetCH/app/DemoData/Finance/2.Master Data/CreateCHCurrencyExRate.Codeunit.al b/Apps/CH/ContosoCoffeeDemoDatasetCH/app/DemoData/Finance/2.Master Data/CreateCHCurrencyExRate.Codeunit.al index df2253f499..aef2bd458e 100644 --- a/Apps/CH/ContosoCoffeeDemoDatasetCH/app/DemoData/Finance/2.Master Data/CreateCHCurrencyExRate.Codeunit.al +++ b/Apps/CH/ContosoCoffeeDemoDatasetCH/app/DemoData/Finance/2.Master Data/CreateCHCurrencyExRate.Codeunit.al @@ -203,4 +203,14 @@ codeunit 11630 "Create CH Currency Ex. Rate" CurrencyExchangeRate.Validate("Relational Exch. Rate Amount", RelationalExchRateAmount); CurrencyExchangeRate.Validate("Relational Adjmt Exch Rate Amt", RelationalAdjmtExchRateAmt); end; + + [EventSubscriber(ObjectType::Codeunit, Codeunit::"Create Add. Reporting Currency", OnBeforeGetResidualCurrencyAccounts, '', false, false)] + local procedure GetResidualCurrencyAccountsCH(var FXGainsAccount: Code[20]; var FXLossesAccount: Code[20]; var IsHandled: Boolean) + var + CreateCHGLAccounts: Codeunit "Create CH GL Accounts"; + begin + FXGainsAccount := CreateCHGLAccounts.UnrealizedExchRateAdjmts(); + FXLossesAccount := CreateCHGLAccounts.UnrealizedExchRateAdjmts(); + IsHandled := true; + end; } diff --git a/Apps/CZ/ContosoCoffeeDemoDatasetCZ/app/DemoData/Finance/2. Master Data/CreateCurrencyExRateCZ.Codeunit.al b/Apps/CZ/ContosoCoffeeDemoDatasetCZ/app/DemoData/Finance/2. Master Data/CreateCurrencyExRateCZ.Codeunit.al index cced4322a3..1955b8c2a1 100644 --- a/Apps/CZ/ContosoCoffeeDemoDatasetCZ/app/DemoData/Finance/2. Master Data/CreateCurrencyExRateCZ.Codeunit.al +++ b/Apps/CZ/ContosoCoffeeDemoDatasetCZ/app/DemoData/Finance/2. Master Data/CreateCurrencyExRateCZ.Codeunit.al @@ -60,4 +60,14 @@ codeunit 31337 "Create Currency Ex. Rate CZ" begin exit(0.026618); end; + + [EventSubscriber(ObjectType::Codeunit, Codeunit::"Create Add. Reporting Currency", OnBeforeGetResidualCurrencyAccounts, '', false, false)] + local procedure GetResidualCurrencyAccountsCZ(var FXGainsAccount: Code[20]; var FXLossesAccount: Code[20]; var IsHandled: Boolean) + var + CreateGLAccountCZ: Codeunit "Create G/L Account CZ"; + begin + FXGainsAccount := CreateGLAccountCZ.ExchangeGainsRealized(); + FXLossesAccount := CreateGLAccountCZ.ExchangeLossesRealized(); + IsHandled := true; + end; } \ No newline at end of file diff --git a/Apps/DE/ContosoCoffeeDemoDatasetDE/app/DemoData/Finance/2. Master data/CreateDECurrencyExRate.Codeunit.al b/Apps/DE/ContosoCoffeeDemoDatasetDE/app/DemoData/Finance/2. Master data/CreateDECurrencyExRate.Codeunit.al index 2949a35cb3..969cccaff8 100644 --- a/Apps/DE/ContosoCoffeeDemoDatasetDE/app/DemoData/Finance/2. Master data/CreateDECurrencyExRate.Codeunit.al +++ b/Apps/DE/ContosoCoffeeDemoDatasetDE/app/DemoData/Finance/2. Master data/CreateDECurrencyExRate.Codeunit.al @@ -195,4 +195,14 @@ codeunit 11376 "Create DE Currency Ex. Rate" CurrencyExchangeRate.Validate("Relational Exch. Rate Amount", RelationalExchRateAmount); CurrencyExchangeRate.Validate("Relational Adjmt Exch Rate Amt", RelationalAdjmtExchRateAmt); end; + + [EventSubscriber(ObjectType::Codeunit, Codeunit::"Create Add. Reporting Currency", OnBeforeGetResidualCurrencyAccounts, '', false, false)] + local procedure GetResidualCurrencyAccountsDe(var FXGainsAccount: Code[20]; var FXLossesAccount: Code[20]; var IsHandled: Boolean) + var + CreateDEGLAcc: Codeunit "Create DE GL Acc."; + begin + FXGainsAccount := CreateDEGLAcc.CurrencyGains(); + FXLossesAccount := CreateDEGLAcc.CurrencyLosses(); + IsHandled := true; + end; } diff --git a/Apps/ES/ContosoCoffeeDemoDatasetES/app/DemoData/Finance/2.Master Data/CreateESCurrencyExch.Codeunit.al b/Apps/ES/ContosoCoffeeDemoDatasetES/app/DemoData/Finance/2.Master Data/CreateESCurrencyExch.Codeunit.al index c9a5e423cf..36d2cb7332 100644 --- a/Apps/ES/ContosoCoffeeDemoDatasetES/app/DemoData/Finance/2.Master Data/CreateESCurrencyExch.Codeunit.al +++ b/Apps/ES/ContosoCoffeeDemoDatasetES/app/DemoData/Finance/2.Master Data/CreateESCurrencyExch.Codeunit.al @@ -189,4 +189,14 @@ codeunit 10834 "Create ES Currency Exch" CurrencyExchangeRate.Validate("Relational Exch. Rate Amount", RelationalExchRateAmount); CurrencyExchangeRate.Validate("Relational Adjmt Exch Rate Amt", RelationalAdjmtExchRateAmt); end; + + [EventSubscriber(ObjectType::Codeunit, Codeunit::"Create Add. Reporting Currency", OnBeforeGetResidualCurrencyAccounts, '', false, false)] + local procedure GetResidualCurrencyAccountsCH(var FXGainsAccount: Code[20]; var FXLossesAccount: Code[20]; var IsHandled: Boolean) + var + CreateESGLAccount: Codeunit "Create ES GL Accounts"; + begin + FXGainsAccount := CreateESGLAccount.ExchangeGainPosting(); + FXLossesAccount := CreateESGLAccount.RealizedLossesOnExchange(); + IsHandled := true; + end; } diff --git a/Apps/FI/ContosoCoffeeDemoDatasetFI/app/DemoData/Finance/2.Master Data/CreateCurrencyExRateFI.Codeunit.al b/Apps/FI/ContosoCoffeeDemoDatasetFI/app/DemoData/Finance/2.Master Data/CreateCurrencyExRateFI.Codeunit.al index e63c30199a..54e6e0bc44 100644 --- a/Apps/FI/ContosoCoffeeDemoDatasetFI/app/DemoData/Finance/2.Master Data/CreateCurrencyExRateFI.Codeunit.al +++ b/Apps/FI/ContosoCoffeeDemoDatasetFI/app/DemoData/Finance/2.Master Data/CreateCurrencyExRateFI.Codeunit.al @@ -200,4 +200,14 @@ codeunit 13433 "Create Currency Ex. Rate FI" CurrencyExchangeRate.Validate("Relational Exch. Rate Amount", RelationalExchRateAmount); CurrencyExchangeRate.Validate("Relational Adjmt Exch Rate Amt", RelationalAdjmtExchRateAmt); end; + + [EventSubscriber(ObjectType::Codeunit, Codeunit::"Create Add. Reporting Currency", OnBeforeGetResidualCurrencyAccounts, '', false, false)] + local procedure GetResidualCurrencyAccountsFI(var FXGainsAccount: Code[20]; var FXLossesAccount: Code[20]; var IsHandled: Boolean) + var + CreateFIGLAccount: Codeunit "Create FI GL Accounts"; + begin + FXGainsAccount := CreateFIGLAccount.Otherfinancialincome2(); + FXLossesAccount := CreateFIGLAccount.Financialexpenses9(); + IsHandled := true; + end; } diff --git a/Apps/GB/ContosoCoffeeDemoDatasetGB/app/DemoData/Finance/2.Master Data/CreateGBCurrency.Codeunit.al b/Apps/GB/ContosoCoffeeDemoDatasetGB/app/DemoData/Finance/2.Master Data/CreateGBCurrency.Codeunit.al index 2ba940674a..e320e1b3b8 100644 --- a/Apps/GB/ContosoCoffeeDemoDatasetGB/app/DemoData/Finance/2.Master Data/CreateGBCurrency.Codeunit.al +++ b/Apps/GB/ContosoCoffeeDemoDatasetGB/app/DemoData/Finance/2.Master Data/CreateGBCurrency.Codeunit.al @@ -78,4 +78,14 @@ codeunit 11500 "Create GB Currency" Currency.Validate("Realized Gains Acc.", RealizedGainsAcc); Currency.Validate("Realized Losses Acc.", RealizedLossesAcc); end; + + [EventSubscriber(ObjectType::Codeunit, Codeunit::"Create Add. Reporting Currency", OnBeforeGetResidualCurrencyAccounts, '', false, false)] + local procedure GetResidualCurrencyAccountsGB(var FXGainsAccount: Code[20]; var FXLossesAccount: Code[20]; var IsHandled: Boolean) + var + CreateGLAccount: Codeunit "Create G/L Account"; + begin + FXGainsAccount := CreateGLAccount.InterestIncome(); + FXLossesAccount := CreateGLAccount.InterestIncome(); + IsHandled := true; + end; } diff --git a/Apps/NL/ContosoCoffeeDemoDatasetNL/app/DemoData/Finance/2.Master Data/CreateCurrencyNL.Codeunit.al b/Apps/NL/ContosoCoffeeDemoDatasetNL/app/DemoData/Finance/2.Master Data/CreateCurrencyNL.Codeunit.al index cc9f9e7d32..cc47f73177 100644 --- a/Apps/NL/ContosoCoffeeDemoDatasetNL/app/DemoData/Finance/2.Master Data/CreateCurrencyNL.Codeunit.al +++ b/Apps/NL/ContosoCoffeeDemoDatasetNL/app/DemoData/Finance/2.Master Data/CreateCurrencyNL.Codeunit.al @@ -6,6 +6,7 @@ namespace Microsoft.DemoData.Finance; using Microsoft.Finance.Currency; +using Microsoft.DemoData.Localization; codeunit 11536 "Create Currency NL" { @@ -80,4 +81,14 @@ codeunit 11536 "Create Currency NL" Currency.Validate("Realized Gains Acc.", ''); Currency.Validate("Realized Losses Acc.", ''); end; + + [EventSubscriber(ObjectType::Codeunit, Codeunit::"Create Add. Reporting Currency", OnBeforeGetResidualCurrencyAccounts, '', false, false)] + local procedure GetResidualCurrencyAccountsNL(var FXGainsAccount: Code[20]; var FXLossesAccount: Code[20]; var IsHandled: Boolean) + var + CreateNLGLAccount: Codeunit "Create NL GL Accounts"; + begin + FXGainsAccount := CreateNLGLAccount.CurrencyGains(); + FXLossesAccount := CreateNLGLAccount.CurrencyLosses(); + IsHandled := true; + end; } diff --git a/Apps/US/ContosoCoffeeDemoDatasetUS/app/DemoData/Finance/1.Setup Data/CreateCurrencyUS.Codeunit.al b/Apps/US/ContosoCoffeeDemoDatasetUS/app/DemoData/Finance/1.Setup Data/CreateCurrencyUS.Codeunit.al index 19531c10ac..c9c7171d97 100644 --- a/Apps/US/ContosoCoffeeDemoDatasetUS/app/DemoData/Finance/1.Setup Data/CreateCurrencyUS.Codeunit.al +++ b/Apps/US/ContosoCoffeeDemoDatasetUS/app/DemoData/Finance/1.Setup Data/CreateCurrencyUS.Codeunit.al @@ -35,4 +35,14 @@ codeunit 11486 "Create Currency US" Currency.Validate("Realized Gains Acc.", RealizedGainsAcc); Currency.Validate("Realized Losses Acc.", RealizedLossesAcc); end; + + [EventSubscriber(ObjectType::Codeunit, Codeunit::"Create Add. Reporting Currency", OnBeforeGetResidualCurrencyAccounts, '', false, false)] + local procedure GetResidualCurrencyAccountsUS(var FXGainsAccount: Code[20]; var FXLossesAccount: Code[20]; var IsHandled: Boolean) + var + CreateUSGLAccount: Codeunit "Create US GL Accounts"; + begin + FXGainsAccount := CreateUSGLAccount.CurrencyGains(); + FXLossesAccount := CreateUSGLAccount.CurrencyLosses(); + IsHandled := true; + end; } From 2976c8b1f406359da69fea0869e4ecb4230aee8d Mon Sep 17 00:00:00 2001 From: Tuan Nguyen Date: Tue, 3 Feb 2026 17:45:08 +1100 Subject: [PATCH 10/12] Removed unused using directives --- .../2.Master data/CreateAddReportingCurrency.Codeunit.al | 2 -- 1 file changed, 2 deletions(-) diff --git a/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/2.Master data/CreateAddReportingCurrency.Codeunit.al b/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/2.Master data/CreateAddReportingCurrency.Codeunit.al index 5ff5db5987..7a4c3a2eca 100644 --- a/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/2.Master data/CreateAddReportingCurrency.Codeunit.al +++ b/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/2.Master data/CreateAddReportingCurrency.Codeunit.al @@ -6,8 +6,6 @@ namespace Microsoft.DemoData.Finance; using Microsoft.Finance.Currency; -using Microsoft.Finance.GeneralLedger.Journal; -using Microsoft.Finance.GeneralLedger.Posting; using Microsoft.Finance.GeneralLedger.Setup; codeunit 5627 "Create Add. Reporting Currency" From 74eb3df627adda6b1fbefca7e2e25404a7d22a2d Mon Sep 17 00:00:00 2001 From: Tuan Nguyen Date: Thu, 5 Feb 2026 09:43:20 +1100 Subject: [PATCH 11/12] Renamed GetResidualCurrencyAccountsES function --- .../Finance/2.Master Data/CreateESCurrencyExch.Codeunit.al | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Apps/ES/ContosoCoffeeDemoDatasetES/app/DemoData/Finance/2.Master Data/CreateESCurrencyExch.Codeunit.al b/Apps/ES/ContosoCoffeeDemoDatasetES/app/DemoData/Finance/2.Master Data/CreateESCurrencyExch.Codeunit.al index 36d2cb7332..8acebb9f31 100644 --- a/Apps/ES/ContosoCoffeeDemoDatasetES/app/DemoData/Finance/2.Master Data/CreateESCurrencyExch.Codeunit.al +++ b/Apps/ES/ContosoCoffeeDemoDatasetES/app/DemoData/Finance/2.Master Data/CreateESCurrencyExch.Codeunit.al @@ -191,7 +191,7 @@ codeunit 10834 "Create ES Currency Exch" end; [EventSubscriber(ObjectType::Codeunit, Codeunit::"Create Add. Reporting Currency", OnBeforeGetResidualCurrencyAccounts, '', false, false)] - local procedure GetResidualCurrencyAccountsCH(var FXGainsAccount: Code[20]; var FXLossesAccount: Code[20]; var IsHandled: Boolean) + local procedure GetResidualCurrencyAccountsES(var FXGainsAccount: Code[20]; var FXLossesAccount: Code[20]; var IsHandled: Boolean) var CreateESGLAccount: Codeunit "Create ES GL Accounts"; begin From de2c60f25fba4ba1a531795dc0934be5cf7f7888 Mon Sep 17 00:00:00 2001 From: Tuan Nguyen Date: Thu, 5 Feb 2026 20:18:12 +1100 Subject: [PATCH 12/12] Removed begin .. end --- .../2.Master data/CreateAddReportingCurrency.Codeunit.al | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/2.Master data/CreateAddReportingCurrency.Codeunit.al b/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/2.Master data/CreateAddReportingCurrency.Codeunit.al index 7a4c3a2eca..1ffcf7b17e 100644 --- a/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/2.Master data/CreateAddReportingCurrency.Codeunit.al +++ b/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/2.Master data/CreateAddReportingCurrency.Codeunit.al @@ -43,13 +43,12 @@ codeunit 5627 "Create Add. Reporting Currency" begin GetResidualCurrencyAccounts(FXGainsAccount, FXLossesAccount); Currency.SetFilter(Code, '%1|%2', CreateCurrency.EUR(), CreateCurrency.USD()); - if Currency.FindSet(true) then begin + if Currency.FindSet(true) then repeat Currency.Validate("Residual Gains Account", FXGainsAccount); Currency.Validate("Residual Losses Account", FXLossesAccount); Currency.Modify(true); until Currency.Next() = 0; - end; end; local procedure GetResidualCurrencyAccounts(var FXGainsAccount: Code[20]; var FXLossesAccount: Code[20])