Codeunit 699 Exch. Rate Adjmt. Process

App
Base Application
Namespace
Microsoft.Finance.Currency
Versions
20-28

Procedures, 5Events, 70

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Finance/Currency/ExchRateAdjmtProcess.Codeunit.al3223 lines, Copyright (c) Microsoft Corporation. MIT

// ------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
// ------------------------------------------------------------------------------------------------
namespace Microsoft.Finance.Currency;

using Microsoft.Bank.BankAccount;
using Microsoft.Finance.Analysis;
using Microsoft.Finance.Dimension;
using Microsoft.Finance.GeneralLedger.Account;
using Microsoft.Finance.GeneralLedger.Journal;
using Microsoft.Finance.GeneralLedger.Ledger;
using Microsoft.Finance.GeneralLedger.Posting;
using Microsoft.Finance.GeneralLedger.Preview;
using Microsoft.Finance.GeneralLedger.Setup;
using Microsoft.Finance.ReceivablesPayables;
using Microsoft.Finance.SalesTax;
using Microsoft.Finance.VAT.Ledger;
using Microsoft.Finance.VAT.Setup;
using Microsoft.Foundation.AuditCodes;
using Microsoft.Foundation.Enums;
using Microsoft.Foundation.NoSeries;
using Microsoft.HumanResources.Employee;
using Microsoft.HumanResources.Payables;
using Microsoft.Purchases.Payables;
using Microsoft.Purchases.Vendor;
using Microsoft.Sales.Customer;
using Microsoft.Sales.Receivables;

/// <summary>
/// Manages exchange rate adjustment processing for foreign currency transactions.
/// Provides functionality to revalue customer, vendor, bank account, and G/L account balances
/// when exchange rates change, ensuring accurate financial reporting in the local currency.
/// </summary>
/// <remarks>
/// Integrates with Customer Ledger Entries, Vendor Ledger Entries, Bank Account Ledger Entries,
/// and G/L Entries for comprehensive currency revaluation. Supports dimension handling and
/// generates adjustment entries through General Journal posting.
/// </remarks>
codeunit 699 "Exch. Rate Adjmt. Process"
{
    EventSubscriberInstance = Manual;
    Permissions = TableData "Cust. Ledger Entry" = rimd,
                  TableData "Vendor Ledger Entry" = rimd,
                  TableData "Employee Ledger Entry" = rimd,
                  TableData "Exch. Rate Adjmt. Reg." = rimd,
                  TableData "Exch. Rate Adjmt. Ledg. Entry" = rimd,
                  TableData Currency = rim,
                  TableData "VAT Entry" = rimd,
                  TableData "Detailed Cust. Ledg. Entry" = rimd,
                  TableData "Detailed Vendor Ledg. Entry" = rimd,
                  TableData "Detailed Employee Ledger Entry" = rimd;

    TableNo = "Exch. Rate Adjmt. Parameters";

    trigger OnRun()
    var
        SequenceNoMgt: Codeunit "Sequence No. Mgt.";

    begin
        SequenceNoMgt.SetPreviewMode(Rec."Preview Posting");
        ExchRateAdjmtParameters.Copy(Rec);

        SourceCodeSetup.Get();
        GetGLSetup();

        if ExchRateAdjmtReg.FindLast() then
            LastRegNo := ExchRateAdjmtReg."No.";

        CheckPostingDate();

        if not ExchRateAdjmtParameters."Hide UI" then
            Window.Open(
                AdjustingExchangeRatesTxt +
                BankAccountProgressBarTxt +
                CustomerProgressBarTxt +
                VendorProgressBarTxt +
                EmployeeProgressBarTxt +
                AdjustmentProgressBarTxt);

        if Rec."Adjust G/L Accounts" then
            SetAdditionalReportingCurrency();

        RunAdjustment();

        if Rec."Preview Posting" then
            GenJnlPostPreview.ThrowError();

        if GenJnlPostLine.IsGLEntryInconsistent() then
            GenJnlPostLine.ShowInconsistentEntries()
        else begin
            UpdateAnalysisView.UpdateAll(0, true);
            if not ExchRateAdjmtParameters."Hide UI" then
                if ExchRateAdjmtReg."No." > LastRegNo then
                    Message(RatesAdjustedMsg)
                else
                    Message(NothingToAdjustMsg)
        end;
    end;

    var
        Currency: Record Currency;
        ExchRateAdjmtParameters: Record "Exch. Rate Adjmt. Parameters";
        DtldCustLedgEntry: Record "Detailed Cust. Ledg. Entry";
        TempDtldCustLedgEntry: Record "Detailed Cust. Ledg. Entry" temporary;
        TempDtldCustLedgEntrySums: Record "Detailed Cust. Ledg. Entry" temporary;
        DtldVendLedgEntry: Record "Detailed Vendor Ledg. Entry";
        TempDtldVendLedgEntry: Record "Detailed Vendor Ledg. Entry" temporary;
        TempDtldVendLedgEntrySums: Record "Detailed Vendor Ledg. Entry" temporary;
        DtldEmplLedgEntry: Record "Detailed Employee Ledger Entry";
        TempDtldEmplLedgEntry: Record "Detailed Employee Ledger Entry" temporary;
        TempDtldEmplLedgEntrySums: Record "Detailed Employee Ledger Entry" temporary;
        ExchRateAdjmtReg: Record "Exch. Rate Adjmt. Reg.";
        TempExchRateAdjmtLedgEntry: Record "Exch. Rate Adjmt. Ledg. Entry" temporary;
        SourceCodeSetup: Record "Source Code Setup";
        TempExchRateAdjmtBuffer: Record "Exch. Rate Adjmt. Buffer" temporary;
        TempExchRateAdjmtBuffer2: Record "Exch. Rate Adjmt. Buffer" temporary;
        TempCurrencyToAdjust: Record Currency temporary;
        AddRepCurrency: Record Currency;
        CurrExchRate: Record "Currency Exchange Rate";
        CurrExchRate2: Record "Currency Exchange Rate";
        GLSetup: Record "General Ledger Setup";
        VATEntryTotalBase: Record "VAT Entry";
        TempDimBuf: Record "Dimension Buffer" temporary;
        TempDimSetEntry: Record "Dimension Set Entry" temporary;
        GenJnlPostLine: Codeunit "Gen. Jnl.-Post Line";
        GenJnlPostPreview: Codeunit "Gen. Jnl.-Post Preview";
        UpdateAnalysisView: Codeunit "Update Analysis View";
        DimMgt: Codeunit DimensionManagement;
        DimBufMgt: Codeunit "Dimension Buffer Management";
        Window: Dialog;
        TotalAdjBase: Decimal;
        TotalAdjBaseLCY: Decimal;
        TotalAdjAmount: Decimal;
        GainsAmount: Decimal;
        LossesAmount: Decimal;
        CurrAdjBase: Decimal;
        CurrAdjBaseLCY: Decimal;
        CurrAdjAmount: Decimal;
        CustNo: Decimal;
        CustNoTotal: Decimal;
        VendNo: Decimal;
        VendNoTotal: Decimal;
        EmplNo: Decimal;
        EmplNoTotal: Decimal;
        BankAccNo: Decimal;
        BankAccNoTotal: Decimal;
        GLAccNo: Decimal;
        GLAccNoTotal: Decimal;
        GLAmtTotal: Decimal;
        GLAddCurrAmtTotal: Decimal;
        GLNetChangeTotal: Decimal;
        GLAddCurrNetChangeTotal: Decimal;
        GLNetChangeBase: Decimal;
        GLAddCurrNetChangeBase: Decimal;
        AddCurrCurrencyFactor: Decimal;
        VATEntryNoTotal: Decimal;
        VATEntryNo: Decimal;
        NewEntryNo: Integer;
        NewRegLedgEntryNo: Integer;
        LastRegNo: Integer;
        GLSetupRead: Boolean;
        MaxAdjExchRateBufIndex: Integer;
        AdjustingExchangeRatesTxt: Label 'Adjusting exchange rates...\\';
        BankAccountProgressBarTxt: Label 'Bank Account    @1@@@@@@@@@@@@@\\';
        CustomerProgressBarTxt: Label 'Customer        @2@@@@@@@@@@@@@\';
        VendorProgressBarTxt: Label 'Vendor          @3@@@@@@@@@@@@@\';
        EmployeeProgressBarTxt: Label 'Employee          @5@@@@@@@@@@@@@\';
        AdjustmentProgressBarTxt: Label 'Adjustment      #4#############', Comment = '#4 - progress bar';
        AdjustingVATEntriesTxt: Label 'Adjusting VAT Entries...\\';
        VATEntryProgressBarTxt: Label 'VAT Entry    @1@@@@@@@@@@@@@';
        AdjustingGeneralLedgerTxt: Label 'Adjusting general ledger...\\';
        GLAccountProgressBarTxt: Label 'G/L Account    @1@@@@@@@@@@@@@';
        PostingDescriptionTxt: Label 'Adjmt. of %1 %2, Ex.Rate Adjust.', Comment = '%1 = Currency Code, %2= Adjust Amount';
        ExchangeRateAdjmtMustBeErr: Label '%1 on %2 %3 must be %4. When this %2 is used in %5, the exchange rate adjustment is defined in the %6 field in the %7. %2 %3 is used in the %8 field in the %5. ', Comment = '%1, %2, &%3, %4, %5, %6, %7, %8 - field names';
        PostingDateNotInPeriodErr: Label 'This posting date cannot be entered because it does not occur within the adjustment period. Reenter the posting date.';
        RatesAdjustedMsg: Label 'One or more currency exchange rates have been adjusted.';
        NothingToAdjustMsg: Label 'There is nothing to adjust.';
        SourceCurrRevalConflictErr: Label 'G/L Account %1 is configured for Source Currency Revaluation and is also used as a Receivables/Payables Account. Please correct the setup before running the adjustment.', Comment = '%1 = G/L Account No.';

    local procedure RunAdjustment()
    begin
        AdjustCurrency();

        if ExchRateAdjmtParameters."Adjust Customers" then
            AdjustCustomers();

        if ExchRateAdjmtParameters."Adjust Vendors" then
            AdjustVendors();

        if ExchRateAdjmtParameters."Adjust Employees" then
            AdjustEmployees(ExchRateAdjmtParameters);

        AdjustGLAccountsAndVATEntries(ExchRateAdjmtParameters);

        OnAfterRunAdjustment(ExchRateAdjmtParameters);
    end;

    local procedure AdjustCurrency()
    var
        BankAccount: Record "Bank Account";
    begin
        if ExchRateAdjmtParameters."Adjust Bank Accounts" then begin
            BankAccount.SetFilter("No.", ExchRateAdjmtParameters.GetFilter("Bank Account Filter"));
            BankAccount.FilterGroup(2);
            BankAccount.SetFilter("Currency Code", '<>%1', '');
            OnAdjustCurrencyOnAfterSetBankAccountFilters(BankAccount);
            BankAccount.FilterGroup(0);
            BankAccNoTotal := BankAccount.Count();
            BankAccount.Reset();
        end;

        Currency.SetView(ExchRateAdjmtParameters."Currency Filter");
        if Currency.FindSet() then
            repeat
                Currency."Last Date Adjusted" := ExchRateAdjmtParameters."Posting Date";
                Currency.Modify();

                Currency."Currency Factor" := CurrExchRate.ExchangeRateAdjmt(ExchRateAdjmtParameters."Posting Date", Currency.Code);

                TempCurrencyToAdjust := Currency;
                TempCurrencyToAdjust.Insert();

                if ExchRateAdjmtParameters."Adjust Bank Accounts" then begin
                    BankAccount.SetCurrentKey("Bank Acc. Posting Group");
                    BankAccount.SetView(ExchRateAdjmtParameters."Bank Account Filter");
                    BankAccount.SetRange("Currency Code", Currency.Code);
                    BankAccount.SetRange("Date Filter", ExchRateAdjmtParameters."Start Date", ExchRateAdjmtParameters."End Date");
                    OnAdjustCurrencyOnAfterSetBankAccountFiltersInLoop(BankAccount);
                    if BankAccount.FindSet() then
                        repeat
                            BankAccNo := BankAccNo + 1;
                            if not ExchRateAdjmtParameters."Hide UI" then
                                Window.Update(1, Round(BankAccNo / BankAccNoTotal * 10000, 1));
                            ProcessBankAccount(BankAccount, Currency);
                        until BankAccount.Next() = 0;
                end;
            until Currency.Next() = 0;
    end;

    local procedure AdjustCustomers()
    var
        Customer: Record Customer;
        CustPostingGroupFilter: Text;
    begin
        CustNo := 0;
        GetNewCustLedgEntryNo();

        CustNoTotal := Customer.Count();
        Customer.SetView(ExchRateAdjmtParameters."Customer Filter");
        Customer.SetRange("Date Filter", ExchRateAdjmtParameters."Start Date", ExchRateAdjmtParameters."End Date");
        CustPostingGroupFilter := Customer.GetFilter("Customer Posting Group");
        Customer.SetRange("Customer Posting Group");
        if Customer.FindSet() then
            repeat
                CustNo := CustNo + 1;
                if not ExchRateAdjmtParameters."Hide UI" then
                    Window.Update(2, Round(CustNo / CustNoTotal * 10000, 1));

                ProcessCustomerAdjustment(Customer, CustPostingGroupFilter);
            until Customer.Next() = 0;

        if CustNo <> 0 then
            HandlePostAdjmt("Exch. Rate Adjmt. Account Type"::Customer);
    end;

    local procedure AdjustVendors();
    var
        Vendor: Record Vendor;
        VendPostingGroupFilter: Text;
    begin
        VendNo := 0;
        GetNewVendLedgEntryNo();

        VendNoTotal := Vendor.Count();
        Vendor.SetView(ExchRateAdjmtParameters."Vendor Filter");
        Vendor.SetRange("Date Filter", ExchRateAdjmtParameters."Start Date", ExchRateAdjmtParameters."End Date");
        VendPostingGroupFilter := Vendor.GetFilter("Vendor Posting Group");
        Vendor.SetRange("Vendor Posting Group");
        if Vendor.FindSet() then
            repeat
                VendNo := VendNo + 1;
                if not ExchRateAdjmtParameters."Hide UI" then
                    Window.Update(3, Round(VendNo / VendNoTotal * 10000, 1));

                ProcessVendorAdjustment(Vendor, VendPostingGroupFilter);
            until Vendor.Next() = 0;

        if VendNo <> 0 then
            HandlePostAdjmt("Exch. Rate Adjmt. Account Type"::Vendor);
    end;

    local procedure AdjustEmployees(var ExchRateAdjmtParameters: Record "Exch. Rate Adjmt. Parameters" temporary);
    var
        Employee: Record Employee;
    begin
        EmplNo := 0;
        GetNewEmplLedgEntryNo();

        EmplNoTotal := Employee.Count();
        Employee.SetView(ExchRateAdjmtParameters."Employee Filter");
        Employee.SetRange("Date Filter", ExchRateAdjmtParameters."Start Date", ExchRateAdjmtParameters."End Date");
        if Employee.FindSet() then
            repeat
                EmplNo := EmplNo + 1;
                if not ExchRateAdjmtParameters."Hide UI" then
                    Window.Update(5, Round(EmplNo / EmplNoTotal * 10000, 1));

                ProcessEmployeeAdjustment(Employee);

            until Employee.Next() = 0;

        if EmplNo <> 0 then
            HandlePostAdjmt("Exch. Rate Adjmt. Account Type"::Employee);
    end;

    local procedure AdjustGLAccountsAndVATEntries(ExchRateAdjmtParameters: Record "Exch. Rate Adjmt. Parameters")
    begin
        OnBeforeAdjustGLAccountsAndVATEntries(ExchRateAdjmtParameters, Currency, GenJnlPostLine);

        if ExchRateAdjmtParameters."Adjust G/L Accounts" and
            (GLSetup."VAT Exchange Rate Adjustment" <> GLSetup."VAT Exchange Rate Adjustment"::"No Adjustment")
        then
            AdjustVAT();

        if ExchRateAdjmtParameters."Adjust G/L Accounts" then
            AdjustGLAccounts();
    end;

    local procedure AdjustVAT()
    var
        VATEntry: Record "VAT Entry";
        VATPostingSetup: Record "VAT Posting Setup";
    begin
        if not ExchRateAdjmtParameters."Hide UI" then
            Window.Open(AdjustingVATEntriesTxt + VATEntryProgressBarTxt);

        VATEntryNoTotal := VATEntry.Count();
        if VATEntryNoTotal = 0 then
            exit;
        if VATPostingSetup.FindSet() then
            repeat
                VATEntryNo := VATEntryNo + 1;
                if not ExchRateAdjmtParameters."Hide UI" then
                    Window.Update(1, Round(VATEntryNo / VATEntryNoTotal * 10000, 1));

                ProcessVATAdjustment(VATPostingSetup);
            until VATPostingSetup.Next() = 0;
    end;

    local procedure AdjustGLAccounts()
    var
        GLAccount: Record "G/L Account";
    begin
        if not ExchRateAdjmtParameters."Hide UI" then
            Window.Open(AdjustingGeneralLedgerTxt + GLAccountProgressBarTxt);

        GLAccNo := 0;
        GLAccNoTotal := GLAccount.Count();
        GLAccount.SetRange("Date Filter", ExchRateAdjmtParameters."Start Date", ExchRateAdjmtParameters."End Date");
        if GLAccount.FindSet() then
            repeat
                GLAccNo := GLAccNo + 1;
                if not ExchRateAdjmtParameters."Hide UI" then
                    Window.Update(1, Round(GLAccNo / GLAccNoTotal * 10000, 1));
                if GLAccount."Exchange Rate Adjustment" <> GLAccount."Exchange Rate Adjustment"::"No Adjustment" then
                    ProcessGLAccountAdjustment(GLAccount);
            until GLAccount.Next() = 0;

        PostGLAccAdjmtTotal();
    end;

    local procedure SetAdditionalReportingCurrency()
    var
        GLAccount: Record "G/L Account";
        VATPostingSetup2: Record "VAT Posting Setup";
        TaxJurisdiction2: Record "Tax Jurisdiction";
        IsHandled: Boolean;
    begin
        GetGLSetup();
        GLSetup.TestField("Additional Reporting Currency");

        AddRepCurrency.Get(GetAdditionalReportingCurrency());
        GLAccount.Get(AddRepCurrency.GetRealizedGLGainsAccount());
        GLAccount.TestField("Exchange Rate Adjustment", GLAccount."Exchange Rate Adjustment"::"No Adjustment");

        GLAccount.Get(AddRepCurrency.GetRealizedGLLossesAccount());
        GLAccount.TestField("Exchange Rate Adjustment", GLAccount."Exchange Rate Adjustment"::"No Adjustment");

        if VATPostingSetup2.Find('-') then
            repeat
                if VATPostingSetup2."VAT Calculation Type" <> "Tax Calculation Type"::"Sales Tax" then begin
                    CheckExchRateAdjustment(
                        VATPostingSetup2."Purchase VAT Account", VATPostingSetup2.TableCaption(), VATPostingSetup2.FieldCaption("Purchase VAT Account"));
                    CheckExchRateAdjustment(
                        VATPostingSetup2."Reverse Chrg. VAT Acc.", VATPostingSetup2.TableCaption(), VATPostingSetup2.FieldCaption("Reverse Chrg. VAT Acc."));
                    CheckExchRateAdjustment(
                        VATPostingSetup2."Purch. VAT Unreal. Account", VATPostingSetup2.TableCaption(), VATPostingSetup2.FieldCaption("Purch. VAT Unreal. Account"));
                    CheckExchRateAdjustment(
                        VATPostingSetup2."Reverse Chrg. VAT Unreal. Acc.", VATPostingSetup2.TableCaption(), VATPostingSetup2.FieldCaption("Reverse Chrg. VAT Unreal. Acc."));
                    CheckExchRateAdjustment(
                        VATPostingSetup2."Sales VAT Account", VATPostingSetup2.TableCaption(), VATPostingSetup2.FieldCaption("Sales VAT Account"));
                    CheckExchRateAdjustment(
                        VATPostingSetup2."Sales VAT Unreal. Account", VATPostingSetup2.TableCaption(), VATPostingSetup2.FieldCaption("Sales VAT Unreal. Account"));
                end;
            until VATPostingSetup2.Next() = 0;

        IsHandled := false;
        OnSetAdditionalReportingCurrencyOnBeforeCheckTaxJurisdiction(TaxJurisdiction2, IsHandled);
        if not IsHandled then
            if TaxJurisdiction2.Find('-') then
                repeat
                    CheckExchRateAdjustment(
                        TaxJurisdiction2."Tax Account (Purchases)", TaxJurisdiction2.TableCaption(), TaxJurisdiction2.FieldCaption("Tax Account (Purchases)"));
                    CheckExchRateAdjustment(
                        TaxJurisdiction2."Reverse Charge (Purchases)", TaxJurisdiction2.TableCaption(), TaxJurisdiction2.FieldCaption("Reverse Charge (Purchases)"));
                    CheckExchRateAdjustment(
                        TaxJurisdiction2."Unreal. Tax Acc. (Purchases)", TaxJurisdiction2.TableCaption(), TaxJurisdiction2.FieldCaption("Unreal. Tax Acc. (Purchases)"));
                    CheckExchRateAdjustment(
                        TaxJurisdiction2."Unreal. Rev. Charge (Purch.)", TaxJurisdiction2.TableCaption(), TaxJurisdiction2.FieldCaption("Unreal. Rev. Charge (Purch.)"));
                    CheckExchRateAdjustment(
                        TaxJurisdiction2."Tax Account (Sales)", TaxJurisdiction2.TableCaption(), TaxJurisdiction2.FieldCaption("Tax Account (Sales)"));
                    CheckExchRateAdjustment(
                        TaxJurisdiction2."Unreal. Tax Acc. (Sales)", TaxJurisdiction2.TableCaption(), TaxJurisdiction2.FieldCaption("Unreal. Tax Acc. (Sales)"));
                until TaxJurisdiction2.Next() = 0;

        AddCurrCurrencyFactor :=
            CurrExchRate2.ExchangeRateAdjmt(ExchRateAdjmtParameters."Posting Date", GetAdditionalReportingCurrency());
    end;

    local procedure ProcessBankAccount(var BankAccount: Record "Bank Account"; Currency: Record Currency)
    var
        NextBankAccount: Record "Bank Account";
        GroupTotal: Boolean;
    begin
        TempDimSetEntry.Reset();
        TempDimSetEntry.DeleteAll();
        TempDimBuf.Reset();
        TempDimBuf.DeleteAll();

        BankAccount.CalcFields("Balance at Date", "Balance at Date (LCY)");
        OnProcessBankAccountOnAfterCalcFields(BankAccount, Currency);
        CurrAdjBase := BankAccount."Balance at Date";
        CurrAdjBaseLCY := BankAccount."Balance at Date (LCY)";
        CurrAdjAmount :=
            Round(
            CurrExchRate.ExchangeAmtFCYToLCYAdjmt(
                ExchRateAdjmtParameters."Posting Date", Currency.Code, BankAccount."Balance at Date", Currency."Currency Factor")) -
            BankAccount."Balance at Date (LCY)";

        if CurrAdjAmount <> 0 then begin
            PostBankAccAdjmt(BankAccount);

            TotalAdjBase := TotalAdjBase + CurrAdjBase;
            TotalAdjBaseLCY := TotalAdjBaseLCY + CurrAdjBaseLCY;
            TotalAdjAmount := TotalAdjAmount + CurrAdjAmount;
            if not ExchRateAdjmtParameters."Hide UI" then
                Window.Update(4, TotalAdjAmount);
        end;

        NextBankAccount.Copy(BankAccount);
        if NextBankAccount.Next() = 1 then begin
            if NextBankAccount."Bank Acc. Posting Group" <> BankAccount."Bank Acc. Posting Group" then
                GroupTotal := true;
        end else
            GroupTotal := true;

        if GroupTotal then
            if TotalAdjAmount <> 0 then begin
                PostBankAccAdjmtGroupTotal(BankAccount, TotalAdjBase, TotalAdjBaseLCY, TotalAdjAmount);
                TotalAdjBase := 0;
                TotalAdjBaseLCY := 0;
                TotalAdjAmount := 0;
            end;
    end;

    local procedure PostBankAccAdjmtGroupTotal(BankAccount: Record "Bank Account"; TotalAdjBase: Decimal; TotalAdjBaseLCY: Decimal; TotalAdjamount: Decimal)
    begin
        ExchRateAdjmtBufferUpdate(
            BankAccount."Currency Code", BankAccount."Bank Acc. Posting Group", GetBankAccountNo(BankAccount),
            TotalAdjBase, TotalAdjBaseLCY, TotalAdjAmount, 0, 0, 0, ExchRateAdjmtParameters."Posting Date", '', 0);
        InsertExchRateAdjmtReg(
            "Exch. Rate Adjmt. Account Type"::"Bank Account", BankAccount."Bank Acc. Posting Group", BankAccount."Currency Code", 0);
        ResetTempAdjmtBuffer();
    end;

    local procedure ProcessGLAccountAdjustment(var GLAccount: Record "G/L Account")
    begin
        if GLAccount."Exchange Rate Adjustment" = GLAccount."Exchange Rate Adjustment"::"No Adjustment" then
            exit;

        TempDimSetEntry.Reset();
        TempDimSetEntry.DeleteAll();
        GLAccount.CalcFields("Net Change", "Additional-Currency Net Change");
        OnProcessGLAccountAdjustmentOnBeforePostGLAccAdjmt(GLAccount);
        case GLAccount."Exchange Rate Adjustment" of
            GLAccount."Exchange Rate Adjustment"::"Adjust Amount":
                PostGLAccAdjmt(
                    GLAccount."No.", GLAccount."Exchange Rate Adjustment"::"Adjust Amount",
                    Round(
                    CurrExchRate2.ExchangeAmtFCYToLCYAdjmt(
                        ExchRateAdjmtParameters."Posting Date", GetAdditionalReportingCurrency(),
                        GLAccount."Additional-Currency Net Change", AddCurrCurrencyFactor) -
                    GLAccount."Net Change"),
                    GLAccount."Net Change",
                    GLAccount."Additional-Currency Net Change");
            GLAccount."Exchange Rate Adjustment"::"Adjust Additional-Currency Amount":
                PostGLAccAdjmt(
                    GLAccount."No.", GLAccount."Exchange Rate Adjustment"::"Adjust Additional-Currency Amount",
                    Round(
                    CurrExchRate2.ExchangeAmtLCYToFCY(
                        ExchRateAdjmtParameters."Posting Date", GetAdditionalReportingCurrency(),
                        GLAccount."Net Change", AddCurrCurrencyFactor) -
                    GLAccount."Additional-Currency Net Change",
                    AddRepCurrency."Amount Rounding Precision"),
                    GLAccount."Net Change",
                    GLAccount."Additional-Currency Net Change");
        end;
    end;

    local procedure ProcessVATAdjustment(var VATPostingSetup: Record "VAT Posting Setup")
    var
        TotalVATEntry: Record "VAT Entry";
        TaxJurisdiction: Record "Tax Jurisdiction";
        VATEntry: Record "VAT Entry";
    begin
        SetVATEntryFilters(VATEntry, ExchRateAdjmtParameters."Start Date", ExchRateAdjmtParameters."End Date");
        VATEntry.SetRange("VAT Bus. Posting Group", VATPostingSetup."VAT Bus. Posting Group");
        VATEntry.SetRange("VAT Prod. Posting Group", VATPostingSetup."VAT Prod. Posting Group");

        if VATPostingSetup."VAT Calculation Type" <> "Tax Calculation Type"::"Sales Tax" then begin
            AdjustVATEntries(VATEntry, TotalVATEntry, VATEntry.Type::Purchase, false);
            if (TotalVATEntry.Amount <> 0) or (TotalVATEntry."Additional-Currency Amount" <> 0) then begin
                AdjustVATAccount(
                    VATPostingSetup.GetPurchAccount(false),
                    TotalVATEntry.Amount, TotalVATEntry."Additional-Currency Amount",
                    VATEntryTotalBase.Amount, VATEntryTotalBase."Additional-Currency Amount");
                if VATPostingSetup."VAT Calculation Type" = "Tax Calculation Type"::"Reverse Charge VAT" then
                    AdjustVATAccount(
                        VATPostingSetup.GetRevChargeAccount(false),
                        -TotalVATEntry.Amount, -TotalVATEntry."Additional-Currency Amount",
                        -VATEntryTotalBase.Amount, -VATEntryTotalBase."Additional-Currency Amount");
            end;
            if (TotalVATEntry."Remaining Unrealized Amount" <> 0) or
                (TotalVATEntry."Add.-Curr. Rem. Unreal. Amount" <> 0)
            then begin
                VATPostingSetup.TestField("Unrealized VAT Type");
                AdjustVATAccount(
                    VATPostingSetup.GetPurchAccount(true),
                    TotalVATEntry."Remaining Unrealized Amount",
                    TotalVATEntry."Add.-Curr. Rem. Unreal. Amount",
                    VATEntryTotalBase."Remaining Unrealized Amount",
                    VATEntryTotalBase."Add.-Curr. Rem. Unreal. Amount");
                if VATPostingSetup."VAT Calculation Type" = "Tax Calculation Type"::"Reverse Charge VAT" then
                    AdjustVATAccount(
                        VATPostingSetup.GetRevChargeAccount(true),
                        -TotalVATEntry."Remaining Unrealized Amount",
                        -TotalVATEntry."Add.-Curr. Rem. Unreal. Amount",
                        -VATEntryTotalBase."Remaining Unrealized Amount",
                        -VATEntryTotalBase."Add.-Curr. Rem. Unreal. Amount");
            end;

            AdjustVATEntries(VATEntry, TotalVATEntry, VATEntry.Type::Sale, false);
            if (TotalVATEntry.Amount <> 0) or (TotalVATEntry."Additional-Currency Amount" <> 0) then
                AdjustVATAccount(
                    VATPostingSetup.GetSalesAccount(false),
                    TotalVATEntry.Amount, TotalVATEntry."Additional-Currency Amount",
                    VATEntryTotalBase.Amount, VATEntryTotalBase."Additional-Currency Amount");
            if (TotalVATEntry."Remaining Unrealized Amount" <> 0) or
                (TotalVATEntry."Add.-Curr. Rem. Unreal. Amount" <> 0)
            then begin
                VATPostingSetup.TestField("Unrealized VAT Type");
                AdjustVATAccount(
                    VATPostingSetup.GetSalesAccount(true),
                    TotalVATEntry."Remaining Unrealized Amount",
                    TotalVATEntry."Add.-Curr. Rem. Unreal. Amount",
                    VATEntryTotalBase."Remaining Unrealized Amount",
                    VATEntryTotalBase."Add.-Curr. Rem. Unreal. Amount");
            end;
        end else begin
            if TaxJurisdiction.Find('-') then
                repeat
                    VATEntry.SetRange("Tax Jurisdiction Code", TaxJurisdiction.Code);
                    AdjustVATEntries(VATEntry, TotalVATEntry, VATEntry.Type::Purchase, false);
                    AdjustPurchTax(TaxJurisdiction, TotalVATEntry, false);
                    AdjustVATEntries(VATEntry, TotalVATEntry, VATEntry.Type::Purchase, true);
                    AdjustPurchTax(TaxJurisdiction, TotalVATEntry, true);
                    AdjustVATEntries(VATEntry, TotalVATEntry, VATEntry.Type::Sale, false);
                    AdjustSalesTax(TaxJurisdiction, TotalVATEntry);
                until TaxJurisdiction.Next() = 0;
            VATEntry.SetRange("Tax Jurisdiction Code");
        end;
        Clear(VATEntryTotalBase);
    end;

    local procedure SetVATEntryFilters(var VATEntry: Record "VAT Entry"; StartDate: Date; EndDate: Date)
    begin
        if not
            VATEntry.SetCurrentKey(
                Type, Closed, "VAT Bus. Posting Group", "VAT Prod. Posting Group", "Posting Date")
        then
            VATEntry.SetCurrentKey(
                Type, Closed, "Tax Jurisdiction Code", "Use Tax", "Posting Date");
        VATEntry.SetRange(Closed, false);
        VATEntry.SetRange("Posting Date", StartDate, EndDate);
        OnAfterSetVATEntryFilters(VATEntry);
    end;

    local procedure ProcessCustomerAdjustment(var Customer: Record Customer; CustPostingGroupFilter: Text)
    var
        CustLedgerEntry: Record "Cust. Ledger Entry";
        DtldCustLedgEntryToAdjust: Record "Detailed Cust. Ledg. Entry";
        TempCustLedgerEntry: Record "Cust. Ledger Entry" temporary;
    begin
        TotalAdjAmount := 0;
        PrepareTempCustLedgEntry(Customer, TempCustLedgerEntry, CustPostingGroupFilter);

        if TempCustLedgerEntry.Find('-') then
            repeat
                TempDtldCustLedgEntrySums.DeleteAll();

                CustLedgerEntry.Get(TempCustLedgerEntry."Entry No.");
                if ShouldAdjustCustLedgEntry(CustLedgerEntry) then begin
                    AdjustCustomerLedgerEntry(Customer, CustLedgerEntry, ExchRateAdjmtParameters."Posting Date", false);

                    SetDtldCustLedgEntryFilters(DtldCustLedgEntryToAdjust, CustLedgerEntry);
                    if DtldCustLedgEntryToAdjust.FindSet() then
                        repeat
                            AdjustCustomerLedgerEntry(Customer, CustLedgerEntry, DtldCustLedgEntryToAdjust."Posting Date", true);
                        until DtldCustledgEntryToAdjust.Next() = 0;
                end;
            until TempCustLedgerEntry.Next() = 0;

        OnAfterProcessCustomerAdjustment(TempCustLedgerEntry);
    end;

    local procedure ShouldAdjustCustLedgEntry(CustLedgEntry: Record "Cust. Ledger Entry") ShouldAdjust: Boolean
    begin
        ShouldAdjust := true;

        OnAfterShouldAdjustCustLedgEntry(CustLedgEntry, ShouldAdjust);
    end;

    local procedure GetNewCustLedgEntryNo()
    var
        CustLedgerEntry: Record "Cust. Ledger Entry";
    begin
        DtldCustLedgEntry.LockTable();
        CustLedgerEntry.LockTable();

        CustNo := 0;

        if DtldCustLedgEntry.Find('+') then
            NewEntryNo := DtldCustLedgEntry."Entry No." + 1
        else
            NewEntryNo := 1;
    end;

    local procedure SetDtldCustLedgEntryFilters(var DtldCustLedgEntry2: Record "Detailed Cust. Ledg. Entry"; CustLedgEntry2: Record "Cust. Ledger Entry")
    begin
        DtldCustLedgEntry2.SetCurrentKey("Cust. Ledger Entry No.");
        DtldCustLedgEntry2.SetRange("Cust. Ledger Entry No.", CustLedgEntry2."Entry No.");
        DtldCustLedgEntry2.SetFilter("Posting Date", '%1..', CalcDate('<+1D>', ExchRateAdjmtParameters."Posting Date"));

        OnAfterSetDtldCustLedgEntryFilters(DtldCustLedgEntry2, CustLedgEntry2);
    end;

    local procedure ProcessVendorAdjustment(var Vendor: Record Vendor; VendPostingGroupFilter: Text)
    var
        VendorLedgerEntry: Record "Vendor Ledger Entry";
        DtldVendLedgEntryToAdjust: Record "Detailed Vendor Ledg. Entry";
        TempVendorLedgerEntry: Record "Vendor Ledger Entry" temporary;
    begin
        TotalAdjAmount := 0;
        PrepareTempVendLedgEntry(Vendor, TempVendorLedgerEntry, VendPostingGroupFilter);

        if TempVendorLedgerEntry.Find('-') then
            repeat
                TempDtldVendLedgEntrySums.DeleteAll();

                VendorLedgerEntry.Get(TempVendorLedgerEntry."Entry No.");
                if ShouldAdjustVendLedgEntry(VendorLedgerEntry) then begin
                    AdjustVendorLedgerEntry(Vendor, VendorLedgerEntry, ExchRateAdjmtParameters."Posting Date", false);

                    SetDtldVendLedgEntryFilters(DtldVendLedgEntryToAdjust, VendorLedgerEntry);
                    if DtldVendLedgEntryToAdjust.FindSet() then
                        repeat
                            AdjustVendorLedgerEntry(Vendor, VendorLedgerEntry, DtldVendLedgEntryToAdjust."Posting Date", true);
                        until DtldVendLedgEntryToAdjust.Next() = 0;
                end;
            until TempVendorLedgerEntry.Next() = 0;

        OnAfterProcessVendorAdjustment(TempVendorLedgerEntry);
    end;

    local procedure ShouldAdjustVendLedgEntry(VendLedgEntry: Record "Vendor Ledger Entry") ShouldAdjust: Boolean
    begin
        ShouldAdjust := true;

        OnAfterShouldAdjustVendLedgEntry(VendLedgEntry, ShouldAdjust);
    end;

    local procedure GetNewVendLedgEntryNo()
    var
        VendorLedgerEntry: Record "Vendor Ledger Entry";
    begin
        DtldVendLedgEntry.LockTable();
        VendorLedgerEntry.LockTable();

        VendNo := 0;

        if DtldVendLedgEntry.Find('+') then
            NewEntryNo := DtldVendLedgEntry."Entry No." + 1
        else
            NewEntryNo := 1;
    end;

    local procedure SetDtldVendLedgEntryFilters(var DtldVendLedgEntry2: Record "Detailed Vendor Ledg. Entry"; VendLedgEntry2: Record "Vendor Ledger Entry")
    begin
        DtldVendLedgEntry2.SetCurrentKey("Vendor Ledger Entry No.");
        DtldVendLedgEntry2.SetRange("Vendor Ledger Entry No.", VendLedgEntry2."Entry No.");
        DtldVendLedgEntry2.SetFilter("Posting Date", '%1..', CalcDate('<+1D>', ExchRateAdjmtParameters."Posting Date"));

        OnAfterSetDtldVendLedgEntryFilters(DtldVendLedgEntry2, VendLedgEntry2);
    end;

    local procedure ProcessEmployeeAdjustment(var Employee: Record Employee)
    var
        EmployeeLedgerEntry: Record "Employee Ledger Entry";
        DtldEmplLedgEntryToAdjust: Record "Detailed Employee Ledger Entry";
        TempEmployeeLedgerEntry: Record "Employee Ledger Entry" temporary;
    begin
        TotalAdjAmount := 0;
        PrepareTempEmplLedgEntry(Employee, TempEmployeeLedgerEntry);

        if TempEmployeeLedgerEntry.Find('-') then
            repeat
                TempDtldEmplLedgEntrySums.DeleteAll();

                EmployeeLedgerEntry.Get(TempEmployeeLedgerEntry."Entry No.");
                if ShouldAdjustEmployeeLedgEntry(EmployeeLedgerEntry) then begin
                    AdjustEmployeeLedgerEntry(Employee, EmployeeLedgerEntry, ExchRateAdjmtParameters."Posting Date", false);

                    SetDtldEmplLedgEntryFilters(DtldEmplLedgEntryToAdjust, EmployeeLedgerEntry);
                    if DtldEmplLedgEntryToAdjust.FindSet() then
                        repeat
                            AdjustEmployeeLedgerEntry(Employee, EmployeeLedgerEntry, ExchRateAdjmtParameters."Posting Date", true);
                        until DtldEmplLedgEntryToAdjust.Next() = 0;
                end;
            until TempEmployeeLedgerEntry.Next() = 0;

        OnAfterProcessEmployeeAdjustment(TempEmployeeLedgerEntry);
    end;

    local procedure ShouldAdjustEmployeeLedgEntry(EmplLedgEntry: Record "Employee Ledger Entry") ShouldAdjust: Boolean
    begin
        ShouldAdjust := true;

        OnAfterShouldAdjustEmplLedgEntry(EmplLedgEntry, ShouldAdjust);
    end;

    local procedure GetNewEmplLedgEntryNo()
    var
        EmployeeLedgerEntry: Record "Employee Ledger Entry";
    begin
        DtldEmplLedgEntry.LockTable();
        EmployeeLedgerEntry.LockTable();

        EmplNo := 0;

        if DtldEmplLedgEntry.Find('+') then
            NewEntryNo := DtldEmplLedgEntry."Entry No." + 1
        else
            NewEntryNo := 1;
    end;

    local procedure SetDtldEmplLedgEntryFilters(var DtldEmplLedgEntry2: Record "Detailed Employee Ledger Entry"; EmplLedgEntry2: Record "Employee Ledger Entry")
    begin
        DtldEmplLedgEntry2.SetCurrentKey("Employee Ledger Entry No.");
        DtldEmplLedgEntry2.SetRange("Employee Ledger Entry No.", EmplLedgEntry2."Entry No.");
        DtldEmplLedgEntry2.SetFilter("Posting Date", '%1..', CalcDate('<+1D>', ExchRateAdjmtParameters."Posting Date"));

        OnAfterSetDtldEmplLedgEntryFilters(DtldEmplLedgEntry2, EmplLedgEntry2);
    end;

    local procedure PostAdjmt(ExchRateAdjmtBuffer: Record "Exch. Rate Adjmt. Buffer"; var TempDimSetEntry: Record "Dimension Set Entry" temporary): Integer
    begin
        OnBeforePostAdjmt(ExchRateAdjmtBuffer, TempDimSetEntry);
        exit(
            PostAdjmt(
                ExchRateAdjmtBuffer."Account No.", ExchRateAdjmtBuffer."Adjmt. Amount",
                ExchRateAdjmtBuffer."Adjmt. Base", ExchRateAdjmtBuffer."Currency Code", TempDimSetEntry,
                ExchRateAdjmtBuffer."Posting Date", ExchRateAdjmtBuffer."IC Partner Code")
        );
    end;

    local procedure PostAdjmt(GLAccNo: Code[20]; PostingAmount: Decimal; AdjBase2: Decimal; CurrencyCode2: Code[10]; var DimSetEntry: Record "Dimension Set Entry"; PostingDate2: Date; ICCode: Code[20]) TransactionNo: Integer
    var
        GenJnlLine: Record "Gen. Journal Line";
    begin
        if PostingAmount = 0 then
            exit;

        CheckGLAccNotUsedForRevaluation(GLAccNo);

        GenJnlLine.Init();
        GenJnlLine.Validate("Posting Date", PostingDate2);
        GenJnlLine."Document No." := ExchRateAdjmtParameters."Document No.";
        GenJnlLine."Account Type" := GenJnlLine."Account Type"::"G/L Account";
        GenJnlLine.Validate("Account No.", GLAccNo);
        GenJnlLine."Gen. Posting Type" := GenJnlLine."Gen. Posting Type"::" ";
        GenJnlLine."Gen. Bus. Posting Group" := '';
        GenJnlLine."Gen. Prod. Posting Group" := '';
        GenJnlLine."VAT Bus. Posting Group" := '';
        GenJnlLine."VAT Prod. Posting Group" := '';
        GenJnlLine.Description :=
            PadStr(StrSubstNo(ExchRateAdjmtParameters."Posting Description", CurrencyCode2, AdjBase2), MaxStrLen(GenJnlLine.Description));
        GenJnlLine.Validate(Amount, PostingAmount);
        GenJnlLine."Source Currency Code" := CurrencyCode2;
        GenJnlLine."IC Partner Code" := ICCode;
        if CurrencyCode2 = GetAdditionalReportingCurrency() then
            GenJnlLine."Source Currency Amount" := 0;
        GenJnlLine."Source Code" := SourceCodeSetup."Exchange Rate Adjmt.";
        GenJnlLine."Journal Template Name" := ExchRateAdjmtParameters."Journal Template Name";
        GenJnlLine."Journal Batch Name" := ExchRateAdjmtParameters."Journal Batch Name";
        GenJnlLine."System-Created Entry" := true;

        OnPostAdjmtOnBeforePostGenJnlLine(GenJnlLine, TempDimSetEntry);
        TransactionNo := PostGenJnlLine(GenJnlLine, DimSetEntry);
    end;

    local procedure CheckGLAccNotUsedForRevaluation(GLAccNo: Code[20])
    var
        GLAccount: Record "G/L Account";
    begin
        if GLAccount.Get(GLAccNo) then
            if (GLAccount."Source Currency Revaluation") or (GLAccount."Source Currency Code" <> '') then
                Error(SourceCurrRevalConflictErr, GLAccNo);
    end;

    local procedure PostBankAccAdjmt(BankAccount: Record "Bank Account")
    var
        GenJnlLine: Record "Gen. Journal Line";
        AccNo: Code[20];
    begin
        GenJnlLine.Init();
        GenJnlLine.Validate("Posting Date", ExchRateAdjmtParameters."Posting Date");
        GenJnlLine."Document No." := ExchRateAdjmtParameters."Document No.";
        GenJnlLine."Account Type" := GenJnlLine."Account Type"::"Bank Account";
        GenJnlLine.Validate("Account No.", BankAccount."No.");
        GenJnlLine.Description :=
          PadStr(StrSubstNo(ExchRateAdjmtParameters."Posting Description", Currency.Code, CurrAdjBase), MaxStrLen(GenJnlLine.Description));
        GenJnlLine.Validate(Amount, 0);
        GenJnlLine."Amount (LCY)" := CurrAdjAmount;
        GenJnlLine."Source Currency Code" := BankAccount."Currency Code";
        if BankAccount."Currency Code" = GetAdditionalReportingCurrency() then
            GenJnlLine."Source Currency Amount" := 0;
        GenJnlLine."Source Code" := SourceCodeSetup."Exchange Rate Adjmt.";
        GenJnlLine."Source Type" := GenJnlLine."Source Type"::"Bank Account";
        GenJnlLine."Source No." := BankAccount."No.";
        GenJnlLine."System-Created Entry" := true;
        GenJnlLine."Journal Template Name" := ExchRateAdjmtParameters."Journal Template Name";
        GenJnlLine."Journal Batch Name" := ExchRateAdjmtParameters."Journal Batch Name";
        GetJnlLineDefDim(GenJnlLine, TempDimSetEntry);
        CopyDimSetEntryToDimBuf(TempDimSetEntry, TempDimBuf);
        PostGenJnlLine(GenJnlLine, TempDimSetEntry);

        if CurrAdjAmount <> 0 then begin
            GetDimSetEntry(GetDimCombID(TempDimBuf), TempDimSetEntry);
            if CurrAdjAmount > 0 then
                AccNo := GetRealizedGainsAccount(Currency)
            else
                AccNo := GetRealizedLossesAccount(Currency);
            PostAdjmt(
                AccNo, -CurrAdjAmount, CurrAdjBase, BankAccount."Currency Code", TempDimSetEntry,
                ExchRateAdjmtParameters."Posting Date", '');
            InsertExchRateAdjmtBankAccLedgerEntry(BankAccount);
        end;
    end;

    local procedure GetRealizedGainsAccount(Currency: Record Currency) AccountNo: Code[20]
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeGetRealizedGainsAccount(Currency, AccountNo, IsHandled);
        if IsHandled then
            exit(AccountNo);

        exit(Currency.GetRealizedGainsAccount());
    end;

    local procedure GetRealizedLossesAccount(Currency: Record Currency) AccountNo: Code[20]
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeGetRealizedLossesAccount(Currency, AccountNo, IsHandled);
        if IsHandled then
            exit(AccountNo);

        exit(Currency.GetRealizedLossesAccount());
    end;

    local procedure PostCustAdjmt(ExchRateAdjmtBuffer: Record "Exch. Rate Adjmt. Buffer"; var TempDtldCVLedgEntryBuf: Record "Detailed CV Ledg. Entry Buffer" temporary; var TempDimSetEntry: Record "Dimension Set Entry" temporary)
    begin
        TempDtldCVLedgEntryBuf."Transaction No." := PostAdjmt(ExchRateAdjmtBuffer, TempDimSetEntry);
        if TempDtldCVLedgEntryBuf.Insert() then;
        InsertExchRateAdjmtReg(
            "Exch. Rate Adjmt. Account Type"::Customer, ExchRateAdjmtBuffer."Posting Group", ExchRateAdjmtBuffer."Currency Code", ExchRateAdjmtBuffer.Index);
        TempDtldCVLedgEntryBuf.Get(TempDtldCVLedgEntryBuf."Entry No.");
        TempDtldCVLedgEntryBuf."Exch. Rate Adjmt. Reg. No." := ExchRateAdjmtReg."No.";
        TempDtldCVLedgEntryBuf.Modify();
    end;

    local procedure PostVendAdjmt(ExchRateAdjmtBuffer: Record "Exch. Rate Adjmt. Buffer"; var TempDtldCVLedgEntryBuf: Record "Detailed CV Ledg. Entry Buffer" temporary; var TempDimSetEntry: Record "Dimension Set Entry" temporary)
    begin
        TempDtldCVLedgEntryBuf."Transaction No." := PostAdjmt(ExchRateAdjmtBuffer, TempDimSetEntry);
        if TempDtldCVLedgEntryBuf.Insert() then;
        InsertExchRateAdjmtReg(
            "Exch. Rate Adjmt. Account Type"::Vendor, ExchRateAdjmtBuffer."Posting Group", ExchRateAdjmtBuffer."Currency Code", ExchRateAdjmtBuffer.Index);
        TempDtldCVLedgEntryBuf.Get(TempDtldCVLedgEntryBuf."Entry No.");
        TempDtldCVLedgEntryBuf."Exch. Rate Adjmt. Reg. No." := ExchRateAdjmtReg."No.";
        TempDtldCVLedgEntryBuf.Modify();
    end;

    local procedure PostEmplAdjmt(ExchRateAdjmtBuffer: Record "Exch. Rate Adjmt. Buffer"; var TempDtldCVLedgEntryBuf: Record "Detailed CV Ledg. Entry Buffer" temporary; var TempDimSetEntry: Record "Dimension Set Entry" temporary)
    begin
        TempDtldCVLedgEntryBuf."Transaction No." := PostAdjmt(ExchRateAdjmtBuffer, TempDimSetEntry);
        if TempDtldCVLedgEntryBuf.Insert() then;
        InsertExchRateAdjmtReg(
            "Exch. Rate Adjmt. Account Type"::Employee, ExchRateAdjmtBuffer."Posting Group", ExchRateAdjmtBuffer."Currency Code", ExchRateAdjmtBuffer.Index);
        TempDtldCVLedgEntryBuf.Get(TempDtldCVLedgEntryBuf."Entry No.");
        TempDtldCVLedgEntryBuf."Exch. Rate Adjmt. Reg. No." := ExchRateAdjmtReg."No.";
        TempDtldCVLedgEntryBuf.Modify();
    end;

    local procedure GetDimSetEntry(EntryNo: Integer; var TempDimSetEntry: Record "Dimension Set Entry" temporary)
    begin
        TempDimSetEntry.Reset();
        TempDimSetEntry.DeleteAll();
        TempDimBuf.Reset();
        TempDimBuf.DeleteAll();
        DimBufMgt.GetDimensions(EntryNo, TempDimBuf);
        DimMgt.CopyDimBufToDimSetEntry(TempDimBuf, TempDimSetEntry);
    end;

    local procedure InsertExchRateAdjmtReg(AdjustAccType: Enum "Exch. Rate Adjmt. Account Type"; PostingGrCode: Code[20]; CurrencyCode: Code[10]; BufferIndex: Integer)
    var
        ExchRateAdjmtLedgEntry: Record "Exch. Rate Adjmt. Ledg. Entry";
    begin
        if TempCurrencyToAdjust.Code <> CurrencyCode then
            TempCurrencyToAdjust.Get(CurrencyCode);

        ExchRateAdjmtReg."No." := ExchRateAdjmtReg."No." + 1;
        ExchRateAdjmtReg."Creation Date" := ExchRateAdjmtParameters."Posting Date";
        ExchRateAdjmtReg."Account Type" := AdjustAccType;
        ExchRateAdjmtReg."Posting Group" := PostingGrCode;
        ExchRateAdjmtReg."Currency Code" := TempCurrencyToAdjust.Code;
        ExchRateAdjmtReg."Currency Factor" := TempCurrencyToAdjust."Currency Factor";
        ExchRateAdjmtReg."Adjusted Base" := TempExchRateAdjmtBuffer."Adjmt. Base";
        ExchRateAdjmtReg."Adjusted Base (LCY)" := TempExchRateAdjmtBuffer."Adjmt. Base (LCY)";
        ExchRateAdjmtReg."Adjusted Amt. (LCY)" := TempExchRateAdjmtBuffer."Adjmt. Amount";
        ExchRateAdjmtReg.Insert();

        TempExchRateAdjmtLedgEntry.Reset();
        TempExchRateAdjmtLedgEntry.SetRange("Register No.", BufferIndex);
        if TempExchRateAdjmtLedgEntry.Find('-') then
            repeat
                ExchRateAdjmtLedgEntry := TempExchRateAdjmtLedgEntry;
                ExchRateAdjmtLedgEntry."Register No." := ExchRateAdjmtReg."No.";
                ExchRateAdjmtLedgEntry.Insert();
            until TempExchRateAdjmtLedgEntry.Next() = 0;
        TempExchRateAdjmtLedgEntry.DeleteAll();
    end;

    /// <summary>
    /// Temporarily stores BufferIndex in "Register No." so that InsertExchRateAdjmtReg
    /// can filter temp entries per posting group. The actual register number is assigned
    /// when the entry is copied to the real table.
    /// </summary>
    local procedure TagExchRateAdjmtLedgEntry(BufferIndex: Integer)
    begin
        if TempExchRateAdjmtLedgEntry.Get(0, NewRegLedgEntryNo) then begin
            TempExchRateAdjmtLedgEntry.Delete();
            TempExchRateAdjmtLedgEntry."Register No." := BufferIndex;
            TempExchRateAdjmtLedgEntry.Insert();
        end;
    end;

    local procedure GetBankAccountNo(BankAccount: Record "Bank Account") AccountNo: Code[20]
    var
        BankAccountPostingGroup: Record "Bank Account Posting Group";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeGetBankAccountNo(BankAccount, AccountNo, IsHandled);
        if IsHandled then
            exit(AccountNo);

        if AccountNo = '' then begin
            BankAccountPostingGroup.Get(BankAccount."Bank Acc. Posting Group");
            BankAccountPostingGroup.TestField("G/L Account No.");
            AccountNo := BankAccountPostingGroup."G/L Account No.";
        end;
    end;

    local procedure GetCustAccountNo(CustLedgerEntry: Record "Cust. Ledger Entry") AccountNo: Code[20]
    var
        CustPostingGr: Record "Customer Posting Group";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeGetCustAccountNo(CustLedgerEntry, AccountNo, IsHandled);
        if IsHandled then
            exit(AccountNo);

        if AccountNo = '' then
            GetLocalCustAccountNo(CustLedgerEntry, AccountNo);

        if AccountNo = '' then begin
            CustPostingGr.Get(CustLedgerEntry."Customer Posting Group");
            AccountNo := CustPostingGr.GetReceivablesAccount();
        end;
    end;

    local procedure GetLocalCustAccountNo(CustLedgerEntry: Record "Cust. Ledger Entry"; AccountNo: Code[20]): Boolean
    var
        IsHandled: Boolean;
    begin
        // reserved for local implementation
        IsHandled := false;
        OnBeforeGetLocalCustAccountNo(CustLedgerEntry, AccountNo, IsHandled);
        exit(IsHandled);
    end;

    local procedure GetVendAccountNo(VendLedgerEntry: Record "Vendor Ledger Entry") AccountNo: Code[20]
    var
        VendPostingGr: Record "Vendor Posting Group";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeGetVendAccountNo(VendLedgerEntry, AccountNo, IsHandled);
        if IsHandled then
            exit(AccountNo);

        if AccountNo = '' then
            GetLocalVendAccountNo(VendLedgerEntry, AccountNo);

        if AccountNo = '' then begin
            VendPostingGr.Get(VendLedgerEntry."Vendor Posting Group");
            AccountNo := VendPostingGr.GetPayablesAccount();
        end;
    end;

    local procedure GetLocalVendAccountNo(VendLedgerEntry: Record "Vendor Ledger Entry"; AccountNo: Code[20]): Boolean
    var
        IsHandled: Boolean;
    begin
        // reserved for local implementation
        IsHandled := false;
        OnBeforeGetLocalVendAccountNo(VendLedgerEntry, AccountNo, IsHandled);
        exit(IsHandled);
    end;

    local procedure GetEmplAccountNo(EmplLedgerEntry: Record "Employee Ledger Entry") AccountNo: Code[20]
    var
        EmplPostingGr: Record "Employee Posting Group";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeGetEmplAccountNo(EmplLedgerEntry, AccountNo, IsHandled);
        if IsHandled then
            exit(AccountNo);

        if AccountNo = '' then begin
            EmplPostingGr.Get(EmplLedgerEntry."Employee Posting Group");
            AccountNo := EmplPostingGr.GetPayablesAccount();
        end;
    end;

    local procedure ExchRateAdjmtBufferUpdate(CurrencyCode2: Code[10]; PostingGroup2: Code[20]; AccountNo2: Code[20]; AdjBase2: Decimal; AdjBaseLCY2: Decimal; AdjAmount2: Decimal; GainsAmount2: Decimal; LossesAmount2: Decimal; DimEntryNo2: Integer; PostingDate2: Date; ICCode2: Code[20]; EntryNo2: Integer): Integer
    var
        Found: Boolean;
    begin
        TempExchRateAdjmtBuffer.Reset();
        TempExchRateAdjmtBuffer.SetRange("Currency Code", CurrencyCode2);
        TempExchRateAdjmtBuffer.SetRange("Posting Group", PostingGroup2);
        TempExchRateAdjmtBuffer.SetRange("Account No.", AccountNo2);
        TempExchRateAdjmtBuffer.SetRange("Dimension Entry No.", DimEntryNo2);
        TempExchRateAdjmtBuffer.SetRange("IC Partner Code", ICCode2);
        TempExchRateAdjmtBuffer.SetRange("Posting Date", PostingDate2);
        if ExchRateAdjmtParameters."Adjust Per Entry" then
            TempExchRateAdjmtBuffer.SetRange("Entry No.", EntryNo2);

        Found := TempExchRateAdjmtBuffer.FindFirst();

        if not Found then begin
            TempExchRateAdjmtBuffer.BuildPrimaryKey();
            TempExchRateAdjmtBuffer."Currency Code" := CurrencyCode2;
            TempExchRateAdjmtBuffer."Posting Group" := PostingGroup2;
            TempExchRateAdjmtBuffer."Account No." := AccountNo2;
            TempExchRateAdjmtBuffer."Dimension Entry No." := DimEntryNo2;
            TempExchRateAdjmtBuffer."IC Partner Code" := ICCode2;
            TempExchRateAdjmtBuffer."Posting Date" := PostingDate2;
            TempExchRateAdjmtBuffer."Adjmt. Base" := AdjBase2;
            TempExchRateAdjmtBuffer."Adjmt. Base (LCY)" := AdjBaseLCY2;
            TempExchRateAdjmtBuffer."Adjmt. Amount" := AdjAmount2;
            TempExchRateAdjmtBuffer."Gains Amount" := GainsAmount2;
            TempExchRateAdjmtBuffer."Losses Amount" := LossesAmount2;
            if ExchRateAdjmtParameters."Adjust Per Entry" then
                TempExchRateAdjmtBuffer."Entry No." := EntryNo2;
            MaxAdjExchRateBufIndex += 1;
            TempExchRateAdjmtBuffer.Index := MaxAdjExchRateBufIndex;
            TempExchRateAdjmtBuffer.Insert();
        end else begin
            TempExchRateAdjmtBuffer."Adjmt. Base" += AdjBase2;
            TempExchRateAdjmtBuffer."Adjmt. Base (LCY)" += AdjBaseLCY2;
            TempExchRateAdjmtBuffer."Adjmt. Amount" += AdjAmount2;
            TempExchRateAdjmtBuffer."Gains Amount" += GainsAmount2;
            TempExchRateAdjmtBuffer."Losses Amount" += LossesAmount2;
            TempExchRateAdjmtBuffer.Modify();
        end;

        OnAfterExchRateAdjmtBufferUpdate(ExchRateAdjmtParameters, TempExchRateAdjmtBuffer);
        exit(TempExchRateAdjmtBuffer.Index);
    end;

    local procedure HandlePostAdjmt(AdjustAccType: Enum "Exch. Rate Adjmt. Account Type")
    var
        TempDtldCVLedgEntryBuf: Record "Detailed CV Ledg. Entry Buffer" temporary;
    begin
        SummarizeExchRateAdjmtBuffer(TempExchRateAdjmtBuffer, TempExchRateAdjmtBuffer2);

        // Post per posting group and per currency
        TempExchRateAdjmtBuffer2.Reset();
        if TempExchRateAdjmtBuffer2.Find('-') then
            repeat
                TempExchRateAdjmtBuffer.SetRange("Currency Code", TempExchRateAdjmtBuffer2."Currency Code");
                TempExchRateAdjmtBuffer.SetRange("Dimension Entry No.", TempExchRateAdjmtBuffer2."Dimension Entry No.");
                TempExchRateAdjmtBuffer.SetRange("Posting Date", TempExchRateAdjmtBuffer2."Posting Date");
                TempExchRateAdjmtBuffer.SetRange("IC Partner Code", TempExchRateAdjmtBuffer2."IC Partner Code");
                if ExchRateAdjmtParameters."Adjust Per Entry" then
                    TempExchRateAdjmtBuffer.SetRange("Entry No.", TempExchRateAdjmtBuffer2."Entry No.");
                TempExchRateAdjmtBuffer.Find('-');

                GetDimSetEntry(TempExchRateAdjmtBuffer."Dimension Entry No.", TempDimSetEntry);
                repeat
                    TempDtldCVLedgEntryBuf.Init();
                    TempDtldCVLedgEntryBuf."Entry No." := TempExchRateAdjmtBuffer.Index;
                    if TempExchRateAdjmtBuffer."Adjmt. Amount" <> 0 then
                        case AdjustAccType of
                            "Exch. Rate Adjmt. Account Type"::Customer:
                                PostCustAdjmt(TempExchRateAdjmtBuffer, TempDtldCVLedgEntryBuf, TempDimSetEntry);
                            "Exch. Rate Adjmt. Account Type"::Vendor:
                                PostVendAdjmt(TempExchRateAdjmtBuffer, TempDtldCVLedgEntryBuf, TempDimSetEntry);
                            "Exch. Rate Adjmt. Account Type"::Employee:
                                PostEmplAdjmt(TempExchRateAdjmtBuffer, TempDtldCVLedgEntryBuf, TempDimSetEntry);
                        end;
                until TempExchRateAdjmtBuffer.Next() = 0;

                OnHandlePostAdjmtOnBeforePostAdjmt(TempExchRateAdjmtBuffer2, TempCurrencyToAdjust, TempDimSetEntry, AdjustAccType);
                TempCurrencyToAdjust.Get(TempExchRateAdjmtBuffer2."Currency Code");
                if TempExchRateAdjmtBuffer2."Gains Amount" <> 0 then
                    PostAdjmt(
                        GetUnrealizedGainsAccount(TempCurrencyToAdjust),
                        -TempExchRateAdjmtBuffer2."Gains Amount", -TempExchRateAdjmtBuffer2."Adjmt. Base",
                        TempExchRateAdjmtBuffer2."Currency Code", TempDimSetEntry,
                        TempExchRateAdjmtBuffer2."Posting Date", TempExchRateAdjmtBuffer2."IC Partner Code");
                if TempExchRateAdjmtBuffer2."Losses Amount" <> 0 then
                    PostAdjmt(
                        GetUnrealizedLossesAccount(TempCurrencyToAdjust),
                        -TempExchRateAdjmtBuffer2."Losses Amount", -TempExchRateAdjmtBuffer2."Adjmt. Base",
                        TempExchRateAdjmtBuffer2."Currency Code", TempDimSetEntry,
                        TempExchRateAdjmtBuffer2."Posting Date", TempExchRateAdjmtBuffer2."IC Partner Code");
            until TempExchRateAdjmtBuffer2.Next() = 0;

        case AdjustAccType of
            "Exch. Rate Adjmt. Account Type"::Customer:
                InsertCustLedgEntries(TempDtldCustLedgEntry, TempDtldCVLedgEntryBuf);
            "Exch. Rate Adjmt. Account Type"::Vendor:
                InsertVendLedgEntries(TempDtldVendLedgEntry, TempDtldCVLedgEntryBuf);
            "Exch. Rate Adjmt. Account Type"::Employee:
                InsertEmplLedgEntries(TempDtldEmplLedgEntry, TempDtldCVLedgEntryBuf);
        end;

        ResetTempAdjmtBuffer();
        ResetTempAdjmtBuffer2();

        TempDtldCustLedgEntry.Reset();
        TempDtldCustLedgEntry.DeleteAll();
        TempDtldVendLedgEntry.Reset();
        TempDtldVendLedgEntry.DeleteAll();
        TempDtldEmplLedgEntry.Reset();
        TempDtldEmplLedgEntry.DeleteAll();
    end;

    local procedure SummarizeExchRateAdjmtBuffer(var TempExchRateAdjmtBuffer: Record "Exch. Rate Adjmt. Buffer" temporary; var TempExchRateAdjmtBuffer2: Record "Exch. Rate Adjmt. Buffer" temporary)
    var
        Found: Boolean;
    begin
        TempExchRateAdjmtBuffer.Reset();
        if TempExchRateAdjmtBuffer.Find('-') then
            // Summarize per currency and dimension combination
            repeat
                TempExchRateAdjmtBuffer2.Reset();
                TempExchRateAdjmtBuffer2.SetRange("Currency Code", TempExchRateAdjmtBuffer."Currency Code");
                TempExchRateAdjmtBuffer2.SetRange("Dimension Entry No.", TempExchRateAdjmtBuffer."Dimension Entry No.");
                TempExchRateAdjmtBuffer2.SetRange("Posting Date", TempExchRateAdjmtBuffer."Posting Date");
                TempExchRateAdjmtBuffer2.SetRange("IC Partner Code", TempExchRateAdjmtBuffer."IC Partner Code");
                if ExchRateAdjmtParameters."Adjust Per Entry" then
                    TempExchRateAdjmtBuffer2.SetRange("Entry No.", TempExchRateAdjmtBuffer."Entry No.");

                OnSummarizeExchRateAdjmtBufferOnAfterExchRateAdjmtBuffer2SetFilters(TempExchRateAdjmtBuffer2, TempExchRateAdjmtBuffer, ExchRateAdjmtParameters);

                Found := TempExchRateAdjmtBuffer2.FindFirst();

                if not Found then begin
                    TempExchRateAdjmtBuffer2.BuildPrimaryKey();
                    TempExchRateAdjmtBuffer2."Currency Code" := TempExchRateAdjmtBuffer."Currency Code";
                    TempExchRateAdjmtBuffer2."Dimension Entry No." := TempExchRateAdjmtBuffer."Dimension Entry No.";
                    TempExchRateAdjmtBuffer2."Posting Date" := TempExchRateAdjmtBuffer."Posting Date";
                    TempExchRateAdjmtBuffer2."IC Partner Code" := TempExchRateAdjmtBuffer."IC Partner Code";
                    if ExchRateAdjmtParameters."Adjust Per Entry" then
                        TempExchRateAdjmtBuffer2."Entry No." := TempExchRateAdjmtBuffer."Entry No.";
                    TempExchRateAdjmtBuffer2."Adjmt. Base" := TempExchRateAdjmtBuffer."Adjmt. Base";
                    TempExchRateAdjmtBuffer2."Gains Amount" := TempExchRateAdjmtBuffer."Gains Amount";
                    TempExchRateAdjmtBuffer2."Losses Amount" := TempExchRateAdjmtBuffer."Losses Amount";
                    TempExchRateAdjmtBuffer2.Insert();
                end else begin
                    TempExchRateAdjmtBuffer2."Adjmt. Base" += TempExchRateAdjmtBuffer."Adjmt. Base";
                    TempExchRateAdjmtBuffer2."Gains Amount" += TempExchRateAdjmtBuffer."Gains Amount";
                    TempExchRateAdjmtBuffer2."Losses Amount" += TempExchRateAdjmtBuffer."Losses Amount";
                    TempExchRateAdjmtBuffer2.Modify();
                end;
            until TempExchRateAdjmtBuffer.Next() = 0;
    end;

    local procedure InsertCustLedgEntries(var TempDtldCustLedgEntry: Record "Detailed Cust. Ledg. Entry" temporary; var TempDtldCVLedgEntryBuf: Record "Detailed CV Ledg. Entry Buffer" temporary)
    var
        DtldCustLedgEntry2: Record "Detailed Cust. Ledg. Entry";
        GLEntry: Record "G/L Entry";
        LastEntryNo: Integer;
        LastTransactionNo: Integer;
    begin
        GLEntry.GetLastEntry(LastEntryNo, LastTransactionNo);

        if TempDtldCustLedgEntry.Find('-') then
            repeat
                if TempDtldCVLedgEntryBuf.Get(TempDtldCustLedgEntry."Transaction No.") then
                    TempDtldCustLedgEntry."Transaction No." := TempDtldCVLedgEntryBuf."Transaction No."
                else
                    TempDtldCustLedgEntry."Transaction No." := LastTransactionNo;
                DtldCustLedgEntry2 := TempDtldCustLedgEntry;
                DtldCustLedgEntry2."Exch. Rate Adjmt. Reg. No." := TempDtldCVLedgEntryBuf."Exch. Rate Adjmt. Reg. No.";
                DtldCustLedgEntry2.Insert(true);
            until TempDtldCustLedgEntry.Next() = 0;
    end;

    local procedure InsertVendLedgEntries(var TempDtldVendLedgEntry: Record "Detailed Vendor Ledg. Entry" temporary; var TempDtldCVLedgEntryBuf: Record "Detailed CV Ledg. Entry Buffer" temporary)
    var
        DtldVendLedgEntry2: Record "Detailed Vendor Ledg. Entry";
        GLEntry: Record "G/L Entry";
        LastEntryNo: Integer;
        LastTransactionNo: Integer;
    begin
        GLEntry.GetLastEntry(LastEntryNo, LastTransactionNo);

        if TempDtldVendLedgEntry.Find('-') then
            repeat
                if TempDtldCVLedgEntryBuf.Get(TempDtldVendLedgEntry."Transaction No.") then
                    TempDtldVendLedgEntry."Transaction No." := TempDtldCVLedgEntryBuf."Transaction No."
                else
                    TempDtldVendLedgEntry."Transaction No." := LastTransactionNo;
                DtldVendLedgEntry2 := TempDtldVendLedgEntry;
                DtldVendLedgEntry2."Exch. Rate Adjmt. Reg. No." := TempDtldCVLedgEntryBuf."Exch. Rate Adjmt. Reg. No.";
                DtldVendLedgEntry2.Insert(true);
            until TempDtldVendLedgEntry.Next() = 0;
    end;

    local procedure InsertEmplLedgEntries(var TempDtldEmplLedgEntry: Record "Detailed Employee Ledger Entry" temporary; var TempDtldCVLedgEntryBuf: Record "Detailed CV Ledg. Entry Buffer" temporary)
    var
        DtldEmplLedgEntry2: Record "Detailed Employee Ledger Entry";
        GLEntry: Record "G/L Entry";
        LastEntryNo: Integer;
        LastTransactionNo: Integer;
    begin
        GLEntry.GetLastEntry(LastEntryNo, LastTransactionNo);

        if TempDtldEmplLedgEntry.Find('-') then
            repeat
                if TempDtldCVLedgEntryBuf.Get(TempDtldEmplLedgEntry."Transaction No.") then
                    TempDtldEmplLedgEntry."Transaction No." := TempDtldCVLedgEntryBuf."Transaction No."
                else
                    TempDtldEmplLedgEntry."Transaction No." := LastTransactionNo;
                DtldEmplLedgEntry2 := TempDtldEmplLedgEntry;
                DtldEmplLedgEntry2."Exch. Rate Adjmt. Reg. No." := TempDtldCVLedgEntryBuf."Exch. Rate Adjmt. Reg. No.";
                DtldEmplLedgEntry2.Insert(true);
            until TempDtldEmplLedgEntry.Next() = 0;
    end;

    local procedure PrepareTempCustLedgEntry(var Customer: Record Customer; var TempCustLedgerEntry: Record "Cust. Ledger Entry" temporary; CustPostingGroupFilter: Text)
    var
        CustLedgerEntry2: Record "Cust. Ledger Entry";
        DtldCustLedgEntry2: Record "Detailed Cust. Ledg. Entry";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforePrepareTempCustLedgEntry(CustLedgerEntry2, TempCustLedgerEntry, Customer, IsHandled);
        if IsHandled then
            exit;

        TempCustLedgerEntry.DeleteAll();

        Currency.CopyFilter(Code, CustLedgerEntry2."Currency Code");
        CustLedgerEntry2.FilterGroup(2);
        CustLedgerEntry2.SetFilter("Currency Code", '<>%1', '');
        OnPrepareTempCustLedgEntryOnAfterSetCustLedgerEntryFilters(CustLedgerEntry2);
        CustLedgerEntry2.FilterGroup(0);

        DtldCustLedgEntry2.Reset();
        DtldCustLedgEntry2.SetCurrentKey("Customer No.", "Posting Date", "Entry Type");
        DtldCustLedgEntry2.SetRange("Customer No.", Customer."No.");
        DtldCustLedgEntry2.SetRange("Posting Date", CalcDate('<+1D>', ExchRateAdjmtParameters."End Date"), DMY2Date(31, 12, 9999));
        OnPrepareTempCustLedgEntryOnAfterSetDtldCustLedgerEntryFilters(DtldCustLedgEntry2);
        if DtldCustLedgEntry2.Find('-') then
            repeat
                CustLedgerEntry2."Entry No." := DtldCustLedgEntry2."Cust. Ledger Entry No.";
                if CustLedgerEntry2.Find('=') then
                    if (CustLedgerEntry2."Posting Date" >= ExchRateAdjmtParameters."Start Date") and
                        (CustLedgerEntry2."Posting Date" <= ExchRateAdjmtParameters."End Date") and
                        CustLedgEntryMatchesPostingGroupFilter(CustLedgerEntry2, CustPostingGroupFilter)
                    then begin
                        TempCustLedgerEntry."Entry No." := CustLedgerEntry2."Entry No.";
                        if TempCustLedgerEntry.Insert() then;
                    end;
            until DtldCustLedgEntry2.Next() = 0;

        CustLedgerEntry2.SetCurrentKey("Customer No.", Open);
        CustLedgerEntry2.SetRange("Customer No.", Customer."No.");
        CustLedgerEntry2.SetRange(Open, true);
        CustLedgerEntry2.SetRange("Posting Date", 0D, ExchRateAdjmtParameters."End Date");
        if CustPostingGroupFilter <> '' then
            CustLedgerEntry2.SetFilter("Customer Posting Group", CustPostingGroupFilter);
        OnPrepareTempCustLedgEntryOnAfterSetCustLedgerEntryFilters(CustLedgerEntry2);
        if CustLedgerEntry2.Find('-') then
            repeat
                TempCustLedgerEntry."Entry No." := CustLedgerEntry2."Entry No.";
                if TempCustLedgerEntry.Insert() then;
            until CustLedgerEntry2.Next() = 0;
        CustLedgerEntry2.Reset();
    end;

    local procedure CustLedgEntryMatchesPostingGroupFilter(var CustLedgerEntry: Record "Cust. Ledger Entry"; CustPostingGroupFilter: Text): Boolean
    var
        CustLedgerEntryFilter: Record "Cust. Ledger Entry";
    begin
        if CustPostingGroupFilter = '' then
            exit(true);

        CustLedgerEntryFilter := CustLedgerEntry;
        CustLedgerEntryFilter.SetRange("Entry No.", CustLedgerEntry."Entry No.");
        CustLedgerEntryFilter.SetFilter("Customer Posting Group", CustPostingGroupFilter);
        exit(not CustLedgerEntryFilter.IsEmpty());
    end;

    local procedure PrepareTempVendLedgEntry(var Vendor: Record Vendor; var TempVendorLedgerEntry: Record "Vendor Ledger Entry" temporary; VendPostingGroupFilter: Text);
    var
        VendorLedgerEntry2: Record "Vendor Ledger Entry";
        DtldVendLedgEntry2: Record "Detailed Vendor Ledg. Entry";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforePrepareTempVendLedgEntry(VendorLedgerEntry2, TempVendorLedgerEntry, Vendor, IsHandled);
        if IsHandled then
            exit;
        TempVendorLedgerEntry.DeleteAll();

        Currency.CopyFilter(Code, VendorLedgerEntry2."Currency Code");
        VendorLedgerEntry2.FilterGroup(2);
        VendorLedgerEntry2.SetFilter("Currency Code", '<>%1', '');
        OnPrepareTempVendLedgEntryOnAfterSetVendLedgerEntryFilters(VendorLedgerEntry2);
        VendorLedgerEntry2.FilterGroup(0);

        DtldVendLedgEntry2.Reset();
        DtldVendLedgEntry2.SetCurrentKey("Vendor No.", "Posting Date", "Entry Type");
        DtldVendLedgEntry2.SetRange("Vendor No.", Vendor."No.");
        DtldVendLedgEntry2.SetRange("Posting Date", CalcDate('<+1D>', ExchRateAdjmtParameters."End Date"), DMY2Date(31, 12, 9999));
        OnPrepareTempVendLedgEntryOnAfterSetDtldVendLedgerEntryFilters(DtldVendLedgEntry2);
        if DtldVendLedgEntry2.Find('-') then
            repeat
                VendorLedgerEntry2."Entry No." := DtldVendLedgEntry2."Vendor Ledger Entry No.";
                if VendorLedgerEntry2.Find('=') then
                    if (VendorLedgerEntry2."Posting Date" >= ExchRateAdjmtParameters."Start Date") and
                        (VendorLedgerEntry2."Posting Date" <= ExchRateAdjmtParameters."End Date") and
                        VendLedgEntryMatchesPostingGroupFilter(VendorLedgerEntry2, VendPostingGroupFilter)
                    then begin
                        TempVendorLedgerEntry."Entry No." := VendorLedgerEntry2."Entry No.";
                        if TempVendorLedgerEntry.Insert() then;
                    end;
            until DtldVendLedgEntry2.Next() = 0;

        VendorLedgerEntry2.SetCurrentKey("Vendor No.", Open);
        VendorLedgerEntry2.SetRange("Vendor No.", Vendor."No.");
        VendorLedgerEntry2.SetRange(Open, true);
        VendorLedgerEntry2.SetRange("Posting Date", 0D, ExchRateAdjmtParameters."End Date");
        if VendPostingGroupFilter <> '' then
            VendorLedgerEntry2.SetFilter("Vendor Posting Group", VendPostingGroupFilter);
        OnPrepareTempVendLedgEntryOnAfterSetVendLedgerEntryFilters(VendorLedgerEntry2);
        if VendorLedgerEntry2.Find('-') then
            repeat
                TempVendorLedgerEntry."Entry No." := VendorLedgerEntry2."Entry No.";
                if TempVendorLedgerEntry.Insert() then;
            until VendorLedgerEntry2.Next() = 0;
        VendorLedgerEntry2.Reset();
    end;

    local procedure VendLedgEntryMatchesPostingGroupFilter(var VendorLedgerEntry: Record "Vendor Ledger Entry"; VendPostingGroupFilter: Text): Boolean
    var
        VendorLedgerEntryFilter: Record "Vendor Ledger Entry";
    begin
        if VendPostingGroupFilter = '' then
            exit(true);

        VendorLedgerEntryFilter := VendorLedgerEntry;
        VendorLedgerEntryFilter.SetRange("Entry No.", VendorLedgerEntry."Entry No.");
        VendorLedgerEntryFilter.SetFilter("Vendor Posting Group", VendPostingGroupFilter);
        exit(not VendorLedgerEntryFilter.IsEmpty());
    end;

    local procedure PrepareTempEmplLedgEntry(var Employee: Record Employee; var TempEmployeeLedgerEntry: Record "Employee Ledger Entry" temporary);
    var
        EmployeeLedgerEntry2: Record "Employee Ledger Entry";
        DtldEmplLedgEntry2: Record "Detailed Employee Ledger Entry";
    begin
        TempEmployeeLedgerEntry.DeleteAll();

        Currency.CopyFilter(Code, EmployeeLedgerEntry2."Currency Code");
        EmployeeLedgerEntry2.FilterGroup(2);
        EmployeeLedgerEntry2.SetFilter("Currency Code", '<>%1', '');
        OnPrepareTempEmplLedgEntryOnAfterSetEmplLedgerEntryFilters(EmployeeLedgerEntry2);
        EmployeeLedgerEntry2.FilterGroup(0);

        DtldEmplLedgEntry2.Reset();
        DtldEmplLedgEntry2.SetCurrentKey("Employee No.", "Posting Date", "Entry Type");
        DtldEmplLedgEntry2.SetRange("Employee No.", Employee."No.");
        DtldEmplLedgEntry2.SetRange("Posting Date", CalcDate('<+1D>', ExchRateAdjmtParameters."End Date"), DMY2Date(31, 12, 9999));
        OnPrepareTempEmplLedgEntryOnAfterSetDtldEmplLedgerEntryFilters(DtldEmplLedgEntry2);
        if DtldEmplLedgEntry2.Find('-') then
            repeat
                EmployeeLedgerEntry2."Entry No." := DtldEmplLedgEntry2."Employee Ledger Entry No.";
                if EmployeeLedgerEntry2.Find('=') then
                    if (EmployeeLedgerEntry2."Posting Date" >= ExchRateAdjmtParameters."Start Date") and
                        (EmployeeLedgerEntry2."Posting Date" <= ExchRateAdjmtParameters."End Date")
                    then begin
                        TempEmployeeLedgerEntry."Entry No." := EmployeeLedgerEntry2."Entry No.";
                        if TempEmployeeLedgerEntry.Insert() then;
                    end;
            until DtldEmplLedgEntry2.Next() = 0;

        EmployeeLedgerEntry2.SetCurrentKey("Employee No.", Open);
        EmployeeLedgerEntry2.SetRange("Employee No.", Employee."No.");
        EmployeeLedgerEntry2.SetRange(Open, true);
        EmployeeLedgerEntry2.SetRange("Posting Date", 0D, ExchRateAdjmtParameters."End Date");
        OnPrepareTempEmplLedgEntryOnAfterSetEmplLedgerEntryFilters(EmployeeLedgerEntry2);
        if EmployeeLedgerEntry2.Find('-') then
            repeat
                TempEmployeeLedgerEntry."Entry No." := EmployeeLedgerEntry2."Entry No.";
                if TempEmployeeLedgerEntry.Insert() then;
            until EmployeeLedgerEntry2.Next() = 0;
        EmployeeLedgerEntry2.Reset();
    end;

    local procedure AdjustVATEntries(var VATEntry: Record "VAT Entry"; var TotalVATEntry: Record "VAT Entry"; VATType: Enum "General Posting Type"; UseTax: Boolean)
    begin
        Clear(TotalVATEntry);
        VATEntry.SetRange(Type, VATType);
        VATEntry.SetRange("Use Tax", UseTax);
        if VATEntry.Find('-') then
            repeat
                Accumulate(TotalVATEntry.Base, VATEntry.Base);
                Accumulate(TotalVATEntry.Amount, VATEntry.Amount);
                Accumulate(TotalVATEntry."Unrealized Amount", VATEntry."Unrealized Amount");
                Accumulate(TotalVATEntry."Unrealized Base", VATEntry."Unrealized Base");
                Accumulate(TotalVATEntry."Remaining Unrealized Amount", VATEntry."Remaining Unrealized Amount");
                Accumulate(TotalVATEntry."Remaining Unrealized Base", VATEntry."Remaining Unrealized Base");
                Accumulate(TotalVATEntry."Additional-Currency Amount", VATEntry."Additional-Currency Amount");
                Accumulate(TotalVATEntry."Additional-Currency Base", VATEntry."Additional-Currency Base");
                Accumulate(TotalVATEntry."Add.-Currency Unrealized Amt.", VATEntry."Add.-Currency Unrealized Amt.");
                Accumulate(TotalVATEntry."Add.-Currency Unrealized Base", VATEntry."Add.-Currency Unrealized Base");
                Accumulate(TotalVATEntry."Add.-Curr. Rem. Unreal. Amount", VATEntry."Add.-Curr. Rem. Unreal. Amount");
                Accumulate(TotalVATEntry."Add.-Curr. Rem. Unreal. Base", VATEntry."Add.-Curr. Rem. Unreal. Base");

                Accumulate(VATEntryTotalBase.Base, VATEntry.Base);
                Accumulate(VATEntryTotalBase.Amount, VATEntry.Amount);
                Accumulate(VATEntryTotalBase."Unrealized Amount", VATEntry."Unrealized Amount");
                Accumulate(VATEntryTotalBase."Unrealized Base", VATEntry."Unrealized Base");
                Accumulate(VATEntryTotalBase."Remaining Unrealized Amount", VATEntry."Remaining Unrealized Amount");
                Accumulate(VATEntryTotalBase."Remaining Unrealized Base", VATEntry."Remaining Unrealized Base");
                Accumulate(VATEntryTotalBase."Additional-Currency Amount", VATEntry."Additional-Currency Amount");
                Accumulate(VATEntryTotalBase."Additional-Currency Base", VATEntry."Additional-Currency Base");
                Accumulate(VATEntryTotalBase."Add.-Currency Unrealized Amt.", VATEntry."Add.-Currency Unrealized Amt.");
                Accumulate(VATEntryTotalBase."Add.-Currency Unrealized Base", VATEntry."Add.-Currency Unrealized Base");
                Accumulate(VATEntryTotalBase."Add.-Curr. Rem. Unreal. Amount", VATEntry."Add.-Curr. Rem. Unreal. Amount");
                Accumulate(VATEntryTotalBase."Add.-Curr. Rem. Unreal. Base", VATEntry."Add.-Curr. Rem. Unreal. Base");

                AdjustVATAmount(VATEntry.Base, VATEntry."Additional-Currency Base");
                AdjustVATAmount(VATEntry.Amount, VATEntry."Additional-Currency Amount");
                AdjustVATAmount(VATEntry."Unrealized Amount", VATEntry."Add.-Currency Unrealized Amt.");
                AdjustVATAmount(VATEntry."Unrealized Base", VATEntry."Add.-Currency Unrealized Base");
                AdjustVATAmount(VATEntry."Remaining Unrealized Amount", VATEntry."Add.-Curr. Rem. Unreal. Amount");
                AdjustVATAmount(VATEntry."Remaining Unrealized Base", VATEntry."Add.-Curr. Rem. Unreal. Base");
                VATEntry.Modify();

                Accumulate(TotalVATEntry.Base, -VATEntry.Base);
                Accumulate(TotalVATEntry.Amount, -VATEntry.Amount);
                Accumulate(TotalVATEntry."Unrealized Amount", -VATEntry."Unrealized Amount");
                Accumulate(TotalVATEntry."Unrealized Base", -VATEntry."Unrealized Base");
                Accumulate(TotalVATEntry."Remaining Unrealized Amount", -VATEntry."Remaining Unrealized Amount");
                Accumulate(TotalVATEntry."Remaining Unrealized Base", -VATEntry."Remaining Unrealized Base");
                Accumulate(TotalVATEntry."Additional-Currency Amount", -VATEntry."Additional-Currency Amount");
                Accumulate(TotalVATEntry."Additional-Currency Base", -VATEntry."Additional-Currency Base");
                Accumulate(TotalVATEntry."Add.-Currency Unrealized Amt.", -VATEntry."Add.-Currency Unrealized Amt.");
                Accumulate(TotalVATEntry."Add.-Currency Unrealized Base", -VATEntry."Add.-Currency Unrealized Base");
                Accumulate(TotalVATEntry."Add.-Curr. Rem. Unreal. Amount", -VATEntry."Add.-Curr. Rem. Unreal. Amount");
                Accumulate(TotalVATEntry."Add.-Curr. Rem. Unreal. Base", -VATEntry."Add.-Curr. Rem. Unreal. Base");
            until VATEntry.Next() = 0;
    end;

    local procedure AdjustVATAmount(var AmountLCY: Decimal; var AmountAddCurr: Decimal)
    begin
        case GLSetup."VAT Exchange Rate Adjustment" of
            GLSetup."VAT Exchange Rate Adjustment"::"Adjust Amount":
                AmountLCY :=
                  Round(
                    CurrExchRate2.ExchangeAmtFCYToLCYAdjmt(
                      ExchRateAdjmtParameters."Posting Date", GetAdditionalReportingCurrency(),
                      AmountAddCurr, AddCurrCurrencyFactor));
            GLSetup."VAT Exchange Rate Adjustment"::"Adjust Additional-Currency Amount":
                AmountAddCurr :=
                  Round(
                    CurrExchRate2.ExchangeAmtLCYToFCY(
                      ExchRateAdjmtParameters."Posting Date", GetAdditionalReportingCurrency(),
                      AmountLCY, AddCurrCurrencyFactor));
        end;
    end;

    local procedure AdjustVATAccount(AccNo: Code[20]; AmountLCY: Decimal; AmountAddCurr: Decimal; BaseLCY: Decimal; BaseAddCurr: Decimal)
    var
        GLAccount: Record "G/L Account";
    begin
        GLAccount.Get(AccNo);
        GLAccount.SetRange("Date Filter", ExchRateAdjmtParameters."Start Date", ExchRateAdjmtParameters."End Date");
        case GLSetup."VAT Exchange Rate Adjustment" of
            GLSetup."VAT Exchange Rate Adjustment"::"Adjust Amount":
                PostGLAccAdjmt(
                  AccNo, GLSetup."VAT Exchange Rate Adjustment"::"Adjust Amount",
                  -AmountLCY, BaseLCY, BaseAddCurr);
            GLSetup."VAT Exchange Rate Adjustment"::"Adjust Additional-Currency Amount":
                PostGLAccAdjmt(
                  AccNo, GLSetup."VAT Exchange Rate Adjustment"::"Adjust Additional-Currency Amount",
                  -AmountAddCurr, BaseLCY, BaseAddCurr);
        end;
    end;

    local procedure AdjustPurchTax(TaxJurisdiction: Record "Tax Jurisdiction"; var TotalVATEntry: Record "VAT Entry"; UseTax: Boolean)
    begin
        if (TotalVATEntry.Amount <> 0) or (TotalVATEntry."Additional-Currency Amount" <> 0) then begin
            TaxJurisdiction.TestField("Tax Account (Purchases)");
            AdjustVATAccount(
              TaxJurisdiction."Tax Account (Purchases)",
              TotalVATEntry.Amount, TotalVATEntry."Additional-Currency Amount",
              VATEntryTotalBase.Amount, VATEntryTotalBase."Additional-Currency Amount");
            if UseTax then begin
                TaxJurisdiction.TestField("Reverse Charge (Purchases)");
                AdjustVATAccount(
                  TaxJurisdiction."Reverse Charge (Purchases)",
                  -TotalVATEntry.Amount, -TotalVATEntry."Additional-Currency Amount",
                  -VATEntryTotalBase.Amount, -VATEntryTotalBase."Additional-Currency Amount");
            end;
        end;
        if (TotalVATEntry."Remaining Unrealized Amount" <> 0) or
           (TotalVATEntry."Add.-Curr. Rem. Unreal. Amount" <> 0)
        then begin
            TaxJurisdiction.TestField("Unrealized VAT Type");
            TaxJurisdiction.TestField("Unreal. Tax Acc. (Purchases)");
            AdjustVATAccount(
              TaxJurisdiction."Unreal. Tax Acc. (Purchases)",
              TotalVATEntry."Remaining Unrealized Amount", TotalVATEntry."Add.-Curr. Rem. Unreal. Amount",
              VATEntryTotalBase."Remaining Unrealized Amount", TotalVATEntry."Add.-Curr. Rem. Unreal. Amount");

            if UseTax then begin
                TaxJurisdiction.TestField("Unreal. Rev. Charge (Purch.)");
                AdjustVATAccount(
                  TaxJurisdiction."Unreal. Rev. Charge (Purch.)",
                  -TotalVATEntry."Remaining Unrealized Amount",
                  -TotalVATEntry."Add.-Curr. Rem. Unreal. Amount",
                  -VATEntryTotalBase."Remaining Unrealized Amount",
                  -VATEntryTotalBase."Add.-Curr. Rem. Unreal. Amount");
            end;
        end;
    end;

    local procedure AdjustSalesTax(TaxJurisdiction: Record "Tax Jurisdiction"; var TotalVATEntry: Record "VAT Entry")
    begin
        TaxJurisdiction.TestField("Tax Account (Sales)");
        AdjustVATAccount(
          TaxJurisdiction."Tax Account (Sales)",
          TotalVATEntry.Amount, TotalVATEntry."Additional-Currency Amount",
          VATEntryTotalBase.Amount, VATEntryTotalBase."Additional-Currency Amount");
        if (TotalVATEntry."Remaining Unrealized Amount" <> 0) or
           (TotalVATEntry."Add.-Curr. Rem. Unreal. Amount" <> 0)
        then begin
            TaxJurisdiction.TestField("Unrealized VAT Type");
            TaxJurisdiction.TestField("Unreal. Tax Acc. (Sales)");
            AdjustVATAccount(
              TaxJurisdiction."Unreal. Tax Acc. (Sales)",
              TotalVATEntry."Remaining Unrealized Amount",
              TotalVATEntry."Add.-Curr. Rem. Unreal. Amount",
              VATEntryTotalBase."Remaining Unrealized Amount",
              VATEntryTotalBase."Add.-Curr. Rem. Unreal. Amount");
        end;
    end;

    local procedure Accumulate(var TotalAmount: Decimal; AmountToAdd: Decimal)
    begin
        TotalAmount := TotalAmount + AmountToAdd;
    end;

    local procedure PostGLAccAdjmt(GLAccNo: Code[20]; ExchRateAdjmt: Enum "Exch. Rate Adjustment Type"; Amount: Decimal; NetChange: Decimal; AddCurrNetChange: Decimal)
    var
        GenJnlLine: Record "Gen. Journal Line";
    begin
        GenJnlLine.Init();
        case ExchRateAdjmt of
            "Exch. Rate Adjustment Type"::"Adjust Amount":
                begin
                    GenJnlLine."Additional-Currency Posting" := GenJnlLine."Additional-Currency Posting"::"Amount Only";
                    GenJnlLine."Currency Code" := '';
                    GenJnlLine.Amount := Amount;
                    GenJnlLine."Amount (LCY)" := GenJnlLine.Amount;
                    GLAmtTotal := GLAmtTotal + GenJnlLine.Amount;
                    GLAddCurrNetChangeTotal := GLAddCurrNetChangeTotal + AddCurrNetChange;
                    GLNetChangeBase := GLNetChangeBase + NetChange;
                end;
            "Exch. Rate Adjustment Type"::"Adjust Additional-Currency Amount":
                begin
                    GenJnlLine."Additional-Currency Posting" := GenJnlLine."Additional-Currency Posting"::"Additional-Currency Amount Only";
                    GenJnlLine."Currency Code" := GetAdditionalReportingCurrency();
                    GenJnlLine.Amount := Amount;
                    GenJnlLine."Amount (LCY)" := 0;
                    GLAddCurrAmtTotal := GLAddCurrAmtTotal + GenJnlLine.Amount;
                    GLNetChangeTotal := GLNetChangeTotal + NetChange;
                    GLAddCurrNetChangeBase := GLAddCurrNetChangeBase + AddCurrNetChange;
                end;
        end;
        if GenJnlLine.Amount <> 0 then begin
            GenJnlLine."Document No." := ExchRateAdjmtParameters."Document No.";
            GenJnlLine."Account Type" := GenJnlLine."Account Type"::"G/L Account";
            GenJnlLine."Account No." := GLAccNo;
            GenJnlLine."Posting Date" := ExchRateAdjmtParameters."Posting Date";
            case GenJnlLine."Additional-Currency Posting" of
                GenJnlLine."Additional-Currency Posting"::"Amount Only":
                    GenJnlLine.Description :=
                        StrSubstNo(
                            ExchRateAdjmtParameters."Posting Description", GetAdditionalReportingCurrency(), AddCurrNetChange);
                GenJnlLine."Additional-Currency Posting"::"Additional-Currency Amount Only":
                    GenJnlLine.Description := StrSubstNo(ExchRateAdjmtParameters."Posting Description", '', NetChange);
            end;
            GenJnlLine."System-Created Entry" := true;
            GenJnlLine."Source Code" := SourceCodeSetup."Exchange Rate Adjmt.";
            GenJnlLine."Journal Template Name" := ExchRateAdjmtParameters."Journal Template Name";
            GenJnlLine."Journal Batch Name" := ExchRateAdjmtParameters."Journal Batch Name";
            GetJnlLineDefDim(GenJnlLine, TempDimSetEntry);
            PostGenJnlLine(GenJnlLine, TempDimSetEntry);
        end;
    end;

    local procedure PostGLAccAdjmtTotal()
    var
        GenJnlLine: Record "Gen. Journal Line";
    begin
        GenJnlLine.Init();
        GenJnlLine."Document No." := ExchRateAdjmtParameters."Document No.";
        GenJnlLine."Account Type" := GenJnlLine."Account Type"::"G/L Account";
        GenJnlLine."Posting Date" := ExchRateAdjmtParameters."Posting Date";
        GenJnlLine."Source Code" := SourceCodeSetup."Exchange Rate Adjmt.";
        GenJnlLine."System-Created Entry" := true;

        if GLAmtTotal <> 0 then begin
            if GLAmtTotal < 0 then
                GenJnlLine."Account No." := AddRepCurrency.GetRealizedGLLossesAccount()
            else
                GenJnlLine."Account No." := AddRepCurrency.GetRealizedGLGainsAccount();
            GenJnlLine.Description :=
                StrSubstNo(ExchRateAdjmtParameters."Posting Description", GetAdditionalReportingCurrency(), GLAddCurrNetChangeTotal);
            GenJnlLine."Additional-Currency Posting" := GenJnlLine."Additional-Currency Posting"::"Amount Only";
            GenJnlLine."Currency Code" := '';
            GenJnlLine.Amount := -GLAmtTotal;
            GenJnlLine."Amount (LCY)" := -GLAmtTotal;
            GenJnlLine."Journal Template Name" := ExchRateAdjmtParameters."Journal Template Name";
            GenJnlLine."Journal Batch Name" := ExchRateAdjmtParameters."Journal Batch Name";
            GetJnlLineDefDim(GenJnlLine, TempDimSetEntry);
            PostGenJnlLine(GenJnlLine, TempDimSetEntry);
        end;
        if GLAddCurrAmtTotal <> 0 then begin
            if GLAddCurrAmtTotal < 0 then
                GenJnlLine."Account No." := AddRepCurrency.GetRealizedGLLossesAccount()
            else
                GenJnlLine."Account No." := AddRepCurrency.GetRealizedGLGainsAccount();
            GenJnlLine.Description := StrSubstNo(ExchRateAdjmtParameters."Posting Description", '', GLNetChangeTotal);
            GenJnlLine."Additional-Currency Posting" := GenJnlLine."Additional-Currency Posting"::"Additional-Currency Amount Only";
            GenJnlLine."Currency Code" := GetAdditionalReportingCurrency();
            GenJnlLine.Amount := -GLAddCurrAmtTotal;
            GenJnlLine."Amount (LCY)" := 0;
            GenJnlLine."Journal Template Name" := ExchRateAdjmtParameters."Journal Template Name";
            GenJnlLine."Journal Batch Name" := ExchRateAdjmtParameters."Journal Batch Name";
            GetJnlLineDefDim(GenJnlLine, TempDimSetEntry);
            PostGenJnlLine(GenJnlLine, TempDimSetEntry);
        end;

        ExchRateAdjmtReg."No." := ExchRateAdjmtReg."No." + 1;
        ExchRateAdjmtReg."Creation Date" := ExchRateAdjmtParameters."Posting Date";
        ExchRateAdjmtReg."Account Type" := ExchRateAdjmtReg."Account Type"::"G/L Account";
        ExchRateAdjmtReg."Posting Group" := '';
        ExchRateAdjmtReg."Currency Code" := GetAdditionalReportingCurrency();
        ExchRateAdjmtReg."Currency Factor" := CurrExchRate2."Adjustment Exch. Rate Amount";
        ExchRateAdjmtReg."Adjusted Base" := 0;
        ExchRateAdjmtReg."Adjusted Base (LCY)" := GLNetChangeBase;
        ExchRateAdjmtReg."Adjusted Amt. (LCY)" := GLAmtTotal;
        ExchRateAdjmtReg."Adjusted Base (Add.-Curr.)" := GLAddCurrNetChangeBase;
        ExchRateAdjmtReg."Adjusted Amt. (Add.-Curr.)" := GLAddCurrAmtTotal;
        ExchRateAdjmtReg.Insert();
    end;

    local procedure CheckExchRateAdjustment(AccNo: Code[20]; SetupTableName: Text; SetupFieldName: Text)
    var
        GLAcc: Record "G/L Account";
    begin
        if AccNo = '' then
            exit;

        GLAcc.Get(AccNo);
        if GLAcc."Exchange Rate Adjustment" <> GLAcc."Exchange Rate Adjustment"::"No Adjustment" then begin
            GLAcc."Exchange Rate Adjustment" := GLAcc."Exchange Rate Adjustment"::"No Adjustment";
            Error(
              ExchangeRateAdjmtMustBeErr,
              GLAcc.FieldCaption("Exchange Rate Adjustment"), GLAcc.TableCaption(),
              GLAcc."No.", GLAcc."Exchange Rate Adjustment",
              SetupTableName, GLSetup.FieldCaption("VAT Exchange Rate Adjustment"),
              GLSetup.TableCaption(), SetupFieldName);
        end;
    end;

    local procedure HandleCustDebitCredit(Correction: Boolean; AdjAmount: Decimal)
    begin
        if (AdjAmount > 0) and not Correction or
           (AdjAmount < 0) and Correction
        then begin
            TempDtldCustLedgEntry."Debit Amount (LCY)" := AdjAmount;
            TempDtldCustLedgEntry."Credit Amount (LCY)" := 0;
        end else begin
            TempDtldCustLedgEntry."Debit Amount (LCY)" := 0;
            TempDtldCustLedgEntry."Credit Amount (LCY)" := -AdjAmount;
        end;
    end;

    local procedure HandleVendDebitCredit(Correction: Boolean; AdjAmount: Decimal)
    begin
        if (AdjAmount > 0) and not Correction or
           (AdjAmount < 0) and Correction
        then begin
            TempDtldVendLedgEntry."Debit Amount (LCY)" := AdjAmount;
            TempDtldVendLedgEntry."Credit Amount (LCY)" := 0;
        end else begin
            TempDtldVendLedgEntry."Debit Amount (LCY)" := 0;
            TempDtldVendLedgEntry."Credit Amount (LCY)" := -AdjAmount;
        end;
    end;

    local procedure HandleEmplDebitCredit(Correction: Boolean; AdjAmount: Decimal)
    begin
        if (AdjAmount > 0) and not Correction or
           (AdjAmount < 0) and Correction
        then begin
            TempDtldEmplLedgEntry."Debit Amount (LCY)" := AdjAmount;
            TempDtldEmplLedgEntry."Credit Amount (LCY)" := 0;
        end else begin
            TempDtldEmplLedgEntry."Debit Amount (LCY)" := 0;
            TempDtldEmplLedgEntry."Credit Amount (LCY)" := -AdjAmount;
        end;
    end;

    local procedure GetJnlLineDefDim(var GenJnlLine: Record "Gen. Journal Line"; var DimSetEntry: Record "Dimension Set Entry")
    var
        DimSetID: Integer;
        DefaultDimSource: List of [Dictionary of [Integer, Code[20]]];
    begin
        case GenJnlLine."Account Type" of
            GenJnlLine."Account Type"::"G/L Account":
                DimMgt.AddDimSource(DefaultDimSource, Database::"G/L Account", GenJnlLine."Account No.");
            GenJnlLine."Account Type"::"Bank Account":
                DimMgt.AddDimSource(DefaultDimSource, Database::"Bank Account", GenJnlLine."Account No.");
        end;
        DimSetID :=
            DimMgt.GetDefaultDimID(
                DefaultDimSource, GenJnlLine."Source Code",
                GenJnlLine."Shortcut Dimension 1 Code", GenJnlLine."Shortcut Dimension 2 Code",
                GenJnlLine."Dimension Set ID", 0);
        DimMgt.GetDimensionSet(DimSetEntry, DimSetID);
    end;

    local procedure CopyDimSetEntryToDimBuf(var DimSetEntry: Record "Dimension Set Entry"; var DimBuf: Record "Dimension Buffer")
    begin
        if DimSetEntry.Find('-') then
            repeat
                DimBuf."Table ID" := DATABASE::"Dimension Buffer";
                DimBuf."Entry No." := 0;
                DimBuf."Dimension Code" := DimSetEntry."Dimension Code";
                DimBuf."Dimension Value Code" := DimSetEntry."Dimension Value Code";
                DimBuf.Insert();
            until DimSetEntry.Next() = 0;
    end;

    local procedure GetDimCombID(var DimBuf: Record "Dimension Buffer"): Integer
    var
        DimEntryNo: Integer;
    begin
        DimEntryNo := DimBufMgt.FindDimensions(DimBuf);
        if DimEntryNo = 0 then
            DimEntryNo := DimBufMgt.InsertDimensions(DimBuf);
        exit(DimEntryNo);
    end;

    local procedure PostGenJnlLine(var GenJournalLine: Record "Gen. Journal Line"; var DimensionSetEntry: Record "Dimension Set Entry"): Integer
    begin
        GenJournalLine."Journal Template Name" := ExchRateAdjmtParameters."Journal Template Name";
        GenJournalLine."Journal Batch Name" := ExchRateAdjmtParameters."Journal Batch Name";
        GenJournalLine."Zero Src. Curr. Amount" := true;
        SetPostingDimensions(GenJournalLine, DimensionSetEntry);
        OnPostGenJnlLineOnBeforeGenJnlPostLineRun(GenJournalLine, ExchRateAdjmtParameters);
        GenJnlPostLine.Run(GenJournalLine);
        OnPostGenJnlLineOnAfterGenJnlPostLineRun(GenJournalLine, GenJnlPostLine);
        exit(GenJnlPostLine.GetNextTransactionNo());
    end;

    local procedure SetPostingDimensions(var GenJournalLine: Record "Gen. Journal Line"; var DimensionSetEntry: Record "Dimension Set Entry")
    var
        DefaultDimSource: List of [Dictionary of [Integer, Code[20]]];
    begin
        case ExchRateAdjmtParameters."Dimension Posting" of
            "Exch. Rate Adjmt. Dimensions"::"No Dimensions":
                begin
                    GenJournalLine."Shortcut Dimension 1 Code" := '';
                    GenJournalLine."Shortcut Dimension 2 Code" := '';
                    GenJournalLine."Dimension Set ID" := 0;
                end;
            "Exch. Rate Adjmt. Dimensions"::"Source Entry Dimensions":
                begin
                    GenJournalLine."Shortcut Dimension 1 Code" := GetGlobalDimVal(GLSetup."Global Dimension 1 Code", DimensionSetEntry);
                    GenJournalLine."Shortcut Dimension 2 Code" := GetGlobalDimVal(GLSetup."Global Dimension 2 Code", DimensionSetEntry);
                    GenJournalLine."Dimension Set ID" := DimMgt.GetDimensionSetID(DimensionSetEntry);
                    OnSetPostingDimensionsOnCaseSourceEntryDimensions(GenJournalLine, DimensionSetEntry);
                end;
            "Exch. Rate Adjmt. Dimensions"::"G/L Account Dimensions":
                if GenJournalLine."Account Type" = "Gen. Journal Account Type"::"G/L Account" then begin
                    DimMgt.AddDimSource(
                        DefaultDimSource, DimMgt.TypeToTableID1(GenJournalLine."Account Type".AsInteger()), GenJournalLine."Account No.", true);
                    GenJournalLine."Dimension Set ID" :=
                        DimMgt.GetRecDefaultDimID(
                            GenJournalLine, 0, DefaultDimSource, GenJournalLine."Source Code",
                            GenJournalLine."Shortcut Dimension 1 Code", GenJournalLine."Shortcut Dimension 2 Code", 0, 0);
                end;
            else
                OnSetPostingDimensionsElseCase(GenJournalLine, DimensionSetEntry, ExchRateAdjmtParameters);
        end;
    end;

    procedure GetGlobalDimVal(GlobalDimCode: Code[20]; var DimSetEntry: Record "Dimension Set Entry"): Code[20]
    var
        DimVal: Code[20];
    begin
        if GlobalDimCode = '' then
            DimVal := ''
        else begin
            DimSetEntry.SetRange("Dimension Code", GlobalDimCode);
            if DimSetEntry.Find('-') then
                DimVal := DimSetEntry."Dimension Value Code"
            else
                DimVal := '';
            DimSetEntry.SetRange("Dimension Code");
        end;
        exit(DimVal);
    end;

    local procedure CheckPostingDate()
    begin
        if ExchRateAdjmtParameters."Posting Date" < ExchRateAdjmtParameters."Start Date" then
            Error(PostingDateNotInPeriodErr);
        if ExchRateAdjmtParameters."Posting Date" > ExchRateAdjmtParameters."End Date" then
            Error(PostingDateNotInPeriodErr);
    end;

    procedure Preview(var ExchRateAdjmtParameters: Record "Exch. Rate Adjmt. Parameters" temporary)
    var
        ExchRateAdjmtProcess: Codeunit "Exch. Rate Adjmt. Process";
    begin
        BindSubscription(ExchRateAdjmtProcess);
        GenJnlPostPreview.Preview(ExchRateAdjmtProcess, ExchRateAdjmtParameters);
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Gen. Jnl.-Post Preview", 'OnRunPreview', '', false, false)]
    local procedure OnRunPreview(var Result: Boolean; Subscriber: Variant; RecVar: Variant)
    var
        ExchRateAdjmtProcess: Codeunit "Exch. Rate Adjmt. Process";
    begin
        ExchRateAdjmtParameters.Copy(RecVar);
        Result := ExchRateAdjmtProcess.Run(ExchRateAdjmtParameters);
    end;

    local procedure AdjustCustomerLedgerEntry(Customer: Record Customer; CustLedgerEntry: Record "Cust. Ledger Entry"; PostingDate2: Date; Application: Boolean)
    var
        DimSetEntry: Record "Dimension Set Entry";
        DimEntryNo: Integer;
        OldAdjAmount: Decimal;
        Adjust: Boolean;
        AdjExchRateBufIndex: Integer;
        Correction: Boolean;
        ShouldExit: Boolean;
    begin
        CustLedgerEntry.SetRange("Date Filter", 0D, PostingDate2);
        TempCurrencyToAdjust.Get(CustLedgerEntry."Currency Code");
        if not ShouldAdjustCurrency(TempCurrencyToAdjust) then
            exit;

        GainsAmount := 0;
        LossesAmount := 0;
        OldAdjAmount := 0;
        Adjust := false;

        TempDimSetEntry.Reset();
        TempDimSetEntry.DeleteAll();
        TempDimBuf.Reset();
        TempDimBuf.DeleteAll();
        DimSetEntry.SetRange("Dimension Set ID", CustLedgerEntry."Dimension Set ID");
        CopyDimSetEntryToDimBuf(DimSetEntry, TempDimBuf);
        DimEntryNo := GetDimCombID(TempDimBuf);

        CustLedgerEntry.CalcFields(
            Amount, "Amount (LCY)", "Remaining Amount", "Remaining Amt. (LCY)", "Original Amt. (LCY)",
            "Debit Amount", "Credit Amount", "Debit Amount (LCY)", "Credit Amount (LCY)");
        OnAdjustCustomerLedgerEntryOnAfterCalcFields(CustLedgerEntry);

        // Calculate Old Unrealized Gains and Losses
        SetUnrealizedGainLossFilterCust(DtldCustLedgEntry, CustLedgerEntry."Entry No.");
        DtldCustLedgEntry.CalcSums("Amount (LCY)");

        SetUnrealizedGainLossFilterCust(TempDtldCustLedgEntrySums, CustLedgerEntry."Entry No.");
        TempDtldCustLedgEntrySums.CalcSums("Amount (LCY)");
        OldAdjAmount := DtldCustLedgEntry."Amount (LCY)" + TempDtldCustLedgEntrySums."Amount (LCY)";
        CustLedgerEntry."Remaining Amt. (LCY)" += TempDtldCustLedgEntrySums."Amount (LCY)";
        CustLedgerEntry."Debit Amount (LCY)" += TempDtldCustLedgEntrySums."Amount (LCY)";
        CustLedgerEntry."Credit Amount (LCY)" += TempDtldCustLedgEntrySums."Amount (LCY)";
        TempDtldCustLedgEntrySums.Reset();

        // Calculate New Unrealized Gains and Losses
        CurrAdjAmount :=
            Round(
                CurrExchRate.ExchangeAmtFCYToLCYAdjmt(
                    PostingDate2, TempCurrencyToAdjust.Code, CustLedgerEntry."Remaining Amount", TempCurrencyToAdjust."Currency Factor")) -
                CustLedgerEntry."Remaining Amt. (LCY)";

        OnAfterAdjustCustomerLedgerEntryOnAfterCalcAdjmtAmount(CustLedgerEntry, ExchRateAdjmtParameters, CurrAdjAmount, Application, ShouldExit);
        if ShouldExit then
            exit;

        // Modify Currency Factor on Customer Ledger Entry
        if CustLedgerEntry."Adjusted Currency Factor" <> TempCurrencyToAdjust."Currency Factor" then begin
            CustLedgerEntry."Adjusted Currency Factor" := TempCurrencyToAdjust."Currency Factor";
            CustLedgerEntry.Modify();
        end;

        if CurrAdjAmount <> 0 then begin
            OnAdjustCustomerLedgerEntryOnBeforeInitDtldCustLedgEntry(Customer, CustLedgerEntry);
            InitDtldCustLedgEntry(CustLedgerEntry, TempDtldCustLedgEntry);
            TempDtldCustLedgEntry."Entry No." := NewEntryNo;
            TempDtldCustLedgEntry."Posting Date" := PostingDate2;
            TempDtldCustLedgEntry."Document No." := ExchRateAdjmtParameters."Document No.";

            Correction :=
                (CustLedgerEntry."Debit Amount" < 0) or
                (CustLedgerEntry."Credit Amount" < 0) or
                (CustLedgerEntry."Debit Amount (LCY)" < 0) or
                (CustLedgerEntry."Credit Amount (LCY)" < 0);

            if OldAdjAmount > 0 then
                case true of
                    (CurrAdjAmount > 0):
                        begin
                            TempDtldCustLedgEntry."Amount (LCY)" := CurrAdjAmount;
                            TempDtldCustLedgEntry."Entry Type" := TempDtldCustLedgEntry."Entry Type"::"Unrealized Gain";
                            HandleCustDebitCredit(Correction, TempDtldCustLedgEntry."Amount (LCY)");
                            InsertTempDtldCustomerLedgerEntry(CustLedgerEntry);
                            NewEntryNo := NewEntryNo + 1;
                            GainsAmount := CurrAdjAmount;
                            Adjust := true;
                        end;
                    (CurrAdjAmount < 0):
                        if -CurrAdjAmount <= OldAdjAmount then begin
                            TempDtldCustLedgEntry."Amount (LCY)" := CurrAdjAmount;
                            TempDtldCustLedgEntry."Entry Type" := TempDtldCustLedgEntry."Entry Type"::"Unrealized Loss";
                            HandleCustDebitCredit(Correction, TempDtldCustLedgEntry."Amount (LCY)");
                            InsertTempDtldCustomerLedgerEntry(CustLedgerEntry);
                            NewEntryNo := NewEntryNo + 1;
                            LossesAmount := CurrAdjAmount;
                            Adjust := true;
                        end else begin
                            CurrAdjAmount := CurrAdjAmount + OldAdjAmount;
                            TempDtldCustLedgEntry."Amount (LCY)" := -OldAdjAmount;
                            TempDtldCustLedgEntry."Entry Type" := TempDtldCustLedgEntry."Entry Type"::"Unrealized Loss";
                            HandleCustDebitCredit(Correction, TempDtldCustLedgEntry."Amount (LCY)");
                            InsertTempDtldCustomerLedgerEntry(CustLedgerEntry);
                            NewEntryNo := NewEntryNo + 1;
                            AdjExchRateBufIndex :=
                                ExchRateAdjmtBufferUpdate(
                                    CustLedgerEntry."Currency Code", CustLedgerEntry."Customer Posting Group", GetCustAccountNo(CustLedgerEntry),
                                    0, 0, -OldAdjAmount, 0, -OldAdjAmount, DimEntryNo, PostingDate2, Customer."IC Partner Code",
                                    CustLedgerEntry."Entry No.");
                            TagExchRateAdjmtLedgEntry(AdjExchRateBufIndex);
                            TempDtldCustLedgEntry."Transaction No." := AdjExchRateBufIndex;
                            ModifyTempDtldCustomerLedgerEntry();
                            Adjust := false;
                        end;
                end;
            if OldAdjAmount < 0 then
                case true of
                    (CurrAdjAmount < 0):
                        begin
                            TempDtldCustLedgEntry."Amount (LCY)" := CurrAdjAmount;
                            TempDtldCustLedgEntry."Entry Type" := TempDtldCustLedgEntry."Entry Type"::"Unrealized Loss";
                            HandleCustDebitCredit(Correction, TempDtldCustLedgEntry."Amount (LCY)");
                            InsertTempDtldCustomerLedgerEntry(CustLedgerEntry);
                            NewEntryNo := NewEntryNo + 1;
                            LossesAmount := CurrAdjAmount;
                            Adjust := true;
                        end;
                    (CurrAdjAmount > 0):
                        if CurrAdjAmount <= -OldAdjAmount then begin
                            TempDtldCustLedgEntry."Amount (LCY)" := CurrAdjAmount;
                            TempDtldCustLedgEntry."Entry Type" := TempDtldCustLedgEntry."Entry Type"::"Unrealized Gain";
                            HandleCustDebitCredit(Correction, TempDtldCustLedgEntry."Amount (LCY)");
                            InsertTempDtldCustomerLedgerEntry(CustLedgerEntry);
                            NewEntryNo := NewEntryNo + 1;
                            GainsAmount := CurrAdjAmount;
                            Adjust := true;
                        end else begin
                            CurrAdjAmount := OldAdjAmount + CurrAdjAmount;
                            TempDtldCustLedgEntry."Amount (LCY)" := -OldAdjAmount;
                            TempDtldCustLedgEntry."Entry Type" := TempDtldCustLedgEntry."Entry Type"::"Unrealized Gain";
                            HandleCustDebitCredit(Correction, TempDtldCustLedgEntry."Amount (LCY)");
                            InsertTempDtldCustomerLedgerEntry(CustLedgerEntry);
                            NewEntryNo := NewEntryNo + 1;
                            AdjExchRateBufIndex :=
                                ExchRateAdjmtBufferUpdate(
                                    CustLedgerEntry."Currency Code", CustLedgerEntry."Customer Posting Group", GetCustAccountNo(CustLedgerEntry),
                                    0, 0, -OldAdjAmount, -OldAdjAmount, 0, DimEntryNo, PostingDate2, Customer."IC Partner Code",
                                    CustLedgerEntry."Entry No.");
                            TagExchRateAdjmtLedgEntry(AdjExchRateBufIndex);
                            TempDtldCustLedgEntry."Transaction No." := AdjExchRateBufIndex;
                            ModifyTempDtldCustomerLedgerEntry();
                            Adjust := false;
                        end;
                end;

            OnAdjustCustomerLedgerEntryOnAfterPrepareAdjust(CustLedgerEntry, CurrAdjAmount, OldAdjAmount);

            if not Adjust then begin
                TempDtldCustLedgEntry."Amount (LCY)" := CurrAdjAmount;
                HandleCustDebitCredit(Correction, TempDtldCustLedgEntry."Amount (LCY)");
                TempDtldCustLedgEntry."Entry No." := NewEntryNo;
                if CurrAdjAmount < 0 then begin
                    TempDtldCustLedgEntry."Entry Type" := TempDtldCustLedgEntry."Entry Type"::"Unrealized Loss";
                    GainsAmount := 0;
                    LossesAmount := CurrAdjAmount;
                end else
                    if CurrAdjAmount > 0 then begin
                        TempDtldCustLedgEntry."Entry Type" := TempDtldCustLedgEntry."Entry Type"::"Unrealized Gain";
                        GainsAmount := CurrAdjAmount;
                        LossesAmount := 0;
                    end;
                InsertTempDtldCustomerLedgerEntry(CustLedgerEntry);
                NewEntryNo := NewEntryNo + 1;
            end;

            TotalAdjAmount := TotalAdjAmount + CurrAdjAmount;
            if not ExchRateAdjmtParameters."Hide UI" then
                Window.Update(4, TotalAdjAmount);
            AdjExchRateBufIndex :=
                ExchRateAdjmtBufferUpdate(
                    CustLedgerEntry."Currency Code", CustLedgerEntry."Customer Posting Group", GetCustAccountNo(CustLedgerEntry),
                    CustLedgerEntry."Remaining Amount", CustLedgerEntry."Remaining Amt. (LCY)", TempDtldCustLedgEntry."Amount (LCY)",
                    GainsAmount, LossesAmount, DimEntryNo, PostingDate2, Customer."IC Partner Code",
                    CustLedgerEntry."Entry No.");
            TagExchRateAdjmtLedgEntry(AdjExchRateBufIndex);
            TempDtldCustLedgEntry."Transaction No." := AdjExchRateBufIndex;
            ModifyTempDtldCustomerLedgerEntry();
        end;
    end;

    local procedure AdjustVendorLedgerEntry(Vendor: Record Vendor; VendLedgerEntry: Record "Vendor Ledger Entry"; PostingDate2: Date; Application: Boolean)
    var
        DimSetEntry: Record "Dimension Set Entry";
        DimEntryNo: Integer;
        OldAdjAmount: Decimal;
        Adjust: Boolean;
        AdjExchRateBufIndex: Integer;
        Correction: Boolean;
        ShouldExit: Boolean;
    begin
        VendLedgerEntry.SetRange("Date Filter", 0D, PostingDate2);
        TempCurrencyToAdjust.Get(VendLedgerEntry."Currency Code");
        if not ShouldAdjustCurrency(TempCurrencyToAdjust) then
            exit;

        GainsAmount := 0;
        LossesAmount := 0;
        OldAdjAmount := 0;
        Adjust := false;

        TempDimBuf.Reset();
        TempDimBuf.DeleteAll();
        DimSetEntry.SetRange("Dimension Set ID", VendLedgerEntry."Dimension Set ID");
        CopyDimSetEntryToDimBuf(DimSetEntry, TempDimBuf);
        DimEntryNo := GetDimCombID(TempDimBuf);

        VendLedgerEntry.CalcFields(
            Amount, "Amount (LCY)", "Remaining Amount", "Remaining Amt. (LCY)", "Original Amt. (LCY)",
            "Debit Amount", "Credit Amount", "Debit Amount (LCY)", "Credit Amount (LCY)");
        OnAdjustVendorLedgerEntryOnAfterCalcFields(VendLedgerEntry);

        // Calculate Old Unrealized GainLoss
        SetUnrealizedGainLossFilterVend(DtldVendLedgEntry, VendLedgerEntry."Entry No.");
        DtldVendLedgEntry.CalcSums("Amount (LCY)");

        SetUnrealizedGainLossFilterVend(TempDtldVendLedgEntrySums, VendLedgerEntry."Entry No.");
        TempDtldVendLedgEntrySums.CalcSums("Amount (LCY)");
        OldAdjAmount := DtldVendLedgEntry."Amount (LCY)" + TempDtldVendLedgEntrySums."Amount (LCY)";
        VendLedgerEntry."Remaining Amt. (LCY)" += TempDtldVendLedgEntrySums."Amount (LCY)";
        VendLedgerEntry."Debit Amount (LCY)" += TempDtldVendLedgEntrySums."Amount (LCY)";
        VendLedgerEntry."Credit Amount (LCY)" += TempDtldVendLedgEntrySums."Amount (LCY)";
        TempDtldVendLedgEntrySums.Reset();

        // Calculate New Unrealized Gains and Losses
        CurrAdjAmount :=
            Round(
                CurrExchRate.ExchangeAmtFCYToLCYAdjmt(
                    PostingDate2, TempCurrencyToAdjust.Code, VendLedgerEntry."Remaining Amount", TempCurrencyToAdjust."Currency Factor")) -
                VendLedgerEntry."Remaining Amt. (LCY)";

        OnAfterAdjustVendorLedgerEntryOnAfterCalcAdjmtAmount(VendLedgerEntry, ExchRateAdjmtParameters, CurrAdjAmount, Application, ShouldExit);
        if ShouldExit then
            exit;

        // Modify Currency Factor on Vendor Ledger Entry
        if VendLedgerEntry."Adjusted Currency Factor" <> TempCurrencyToAdjust."Currency Factor" then begin
            VendLedgerEntry."Adjusted Currency Factor" := TempCurrencyToAdjust."Currency Factor";
            VendLedgerEntry.Modify();
        end;

        if CurrAdjAmount <> 0 then begin
            OnAdjustVendorLedgerEntryOnBeforeInitDtldVendLedgEntry(Vendor, VendLedgerEntry);
            InitDtldVendLedgEntry(VendLedgerEntry, TempDtldVendLedgEntry);
            TempDtldVendLedgEntry."Entry No." := NewEntryNo;
            TempDtldVendLedgEntry."Posting Date" := PostingDate2;
            TempDtldVendLedgEntry."Document No." := ExchRateAdjmtParameters."Document No.";

            Correction :=
                (VendLedgerEntry."Debit Amount" < 0) or
                (VendLedgerEntry."Credit Amount" < 0) or
                (VendLedgerEntry."Debit Amount (LCY)" < 0) or
                (VendLedgerEntry."Credit Amount (LCY)" < 0);

            if OldAdjAmount > 0 then
                case true of
                    (CurrAdjAmount > 0):
                        begin
                            TempDtldVendLedgEntry."Amount (LCY)" := CurrAdjAmount;
                            TempDtldVendLedgEntry."Entry Type" := TempDtldVendLedgEntry."Entry Type"::"Unrealized Gain";
                            HandleVendDebitCredit(Correction, TempDtldVendLedgEntry."Amount (LCY)");
                            InsertTempDtldVendorLedgerEntry(VendLedgerEntry);
                            NewEntryNo := NewEntryNo + 1;
                            GainsAmount := CurrAdjAmount;
                            Adjust := true;
                        end;
                    (CurrAdjAmount < 0):
                        if -CurrAdjAmount <= OldAdjAmount then begin
                            TempDtldVendLedgEntry."Amount (LCY)" := CurrAdjAmount;
                            TempDtldVendLedgEntry."Entry Type" := TempDtldVendLedgEntry."Entry Type"::"Unrealized Loss";
                            HandleVendDebitCredit(Correction, TempDtldVendLedgEntry."Amount (LCY)");
                            InsertTempDtldVendorLedgerEntry(VendLedgerEntry);
                            NewEntryNo := NewEntryNo + 1;
                            LossesAmount := CurrAdjAmount;
                            Adjust := true;
                        end else begin
                            CurrAdjAmount := CurrAdjAmount + OldAdjAmount;
                            TempDtldVendLedgEntry."Amount (LCY)" := -OldAdjAmount;
                            TempDtldVendLedgEntry."Entry Type" := TempDtldVendLedgEntry."Entry Type"::"Unrealized Loss";
                            HandleVendDebitCredit(Correction, TempDtldVendLedgEntry."Amount (LCY)");
                            InsertTempDtldVendorLedgerEntry(VendLedgerEntry);
                            NewEntryNo := NewEntryNo + 1;
                            AdjExchRateBufIndex :=
                                ExchRateAdjmtBufferUpdate(
                                    VendLedgerEntry."Currency Code", VendLedgerEntry."Vendor Posting Group", GetVendAccountNo(VendLedgerEntry),
                                    0, 0, -OldAdjAmount, 0, -OldAdjAmount, DimEntryNo, PostingDate2, Vendor."IC Partner Code",
                                    VendLedgerEntry."Entry No.");
                            TagExchRateAdjmtLedgEntry(AdjExchRateBufIndex);
                            TempDtldVendLedgEntry."Transaction No." := AdjExchRateBufIndex;
                            ModifyTempDtldVendorLedgerEntry();
                            Adjust := false;
                        end;
                end;
            if OldAdjAmount < 0 then
                case true of
                    (CurrAdjAmount < 0):
                        begin
                            TempDtldVendLedgEntry."Amount (LCY)" := CurrAdjAmount;
                            TempDtldVendLedgEntry."Entry Type" := TempDtldVendLedgEntry."Entry Type"::"Unrealized Loss";
                            HandleVendDebitCredit(Correction, TempDtldVendLedgEntry."Amount (LCY)");
                            InsertTempDtldVendorLedgerEntry(VendLedgerEntry);
                            NewEntryNo := NewEntryNo + 1;
                            LossesAmount := CurrAdjAmount;
                            Adjust := true;
                        end;
                    (CurrAdjAmount > 0):
                        if CurrAdjAmount <= -OldAdjAmount then begin
                            TempDtldVendLedgEntry."Amount (LCY)" := CurrAdjAmount;
                            TempDtldVendLedgEntry."Entry Type" := TempDtldVendLedgEntry."Entry Type"::"Unrealized Gain";
                            HandleVendDebitCredit(Correction, TempDtldVendLedgEntry."Amount (LCY)");
                            InsertTempDtldVendorLedgerEntry(VendLedgerEntry);
                            NewEntryNo := NewEntryNo + 1;
                            GainsAmount := CurrAdjAmount;
                            Adjust := true;
                        end else begin
                            CurrAdjAmount := OldAdjAmount + CurrAdjAmount;
                            TempDtldVendLedgEntry."Amount (LCY)" := -OldAdjAmount;
                            TempDtldVendLedgEntry."Entry Type" := TempDtldVendLedgEntry."Entry Type"::"Unrealized Gain";
                            HandleVendDebitCredit(Correction, TempDtldVendLedgEntry."Amount (LCY)");
                            InsertTempDtldVendorLedgerEntry(VendLedgerEntry);
                            NewEntryNo := NewEntryNo + 1;
                            AdjExchRateBufIndex :=
                                ExchRateAdjmtBufferUpdate(
                                    VendLedgerEntry."Currency Code", VendLedgerEntry."Vendor Posting Group", GetVendAccountNo(VendLedgerEntry),
                                    0, 0, -OldAdjAmount, -OldAdjAmount, 0, DimEntryNo, PostingDate2, Vendor."IC Partner Code",
                                    VendLedgerEntry."Entry No.");
                            TagExchRateAdjmtLedgEntry(AdjExchRateBufIndex);
                            TempDtldVendLedgEntry."Transaction No." := AdjExchRateBufIndex;
                            ModifyTempDtldVendorLedgerEntry();
                            Adjust := false;
                        end;
                end;

            OnAdjustVendorLedgerEntryOnAfterPrepareAdjust(VendLedgerEntry, CurrAdjAmount, OldAdjAmount);

            if not Adjust then begin
                TempDtldVendLedgEntry."Amount (LCY)" := CurrAdjAmount;
                HandleVendDebitCredit(Correction, TempDtldVendLedgEntry."Amount (LCY)");
                TempDtldVendLedgEntry."Entry No." := NewEntryNo;
                if CurrAdjAmount < 0 then begin
                    TempDtldVendLedgEntry."Entry Type" := TempDtldVendLedgEntry."Entry Type"::"Unrealized Loss";
                    GainsAmount := 0;
                    LossesAmount := CurrAdjAmount;
                end else
                    if CurrAdjAmount > 0 then begin
                        TempDtldVendLedgEntry."Entry Type" := TempDtldVendLedgEntry."Entry Type"::"Unrealized Gain";
                        GainsAmount := CurrAdjAmount;
                        LossesAmount := 0;
                    end;
                InsertTempDtldVendorLedgerEntry(VendLedgerEntry);
                NewEntryNo := NewEntryNo + 1;
            end;

            TotalAdjAmount := TotalAdjAmount + CurrAdjAmount;
            if not ExchRateAdjmtParameters."Hide UI" then
                Window.Update(4, TotalAdjAmount);
            AdjExchRateBufIndex :=
                ExchRateAdjmtBufferUpdate(
                    VendLedgerEntry."Currency Code", VendLedgerEntry."Vendor Posting Group", GetVendAccountNo(VendLedgerEntry),
                    VendLedgerEntry."Remaining Amount", VendLedgerEntry."Remaining Amt. (LCY)",
                    TempDtldVendLedgEntry."Amount (LCY)", GainsAmount, LossesAmount, DimEntryNo, PostingDate2, Vendor."IC Partner Code",
                    VendLedgerEntry."Entry No.");
            TagExchRateAdjmtLedgEntry(AdjExchRateBufIndex);
            TempDtldVendLedgEntry."Transaction No." := AdjExchRateBufIndex;
            ModifyTempDtldVendorLedgerEntry();
        end;
    end;

    local procedure AdjustEmployeeLedgerEntry(Employee: Record Employee; EmplLedgerEntry: Record "Employee Ledger Entry"; PostingDate2: Date; Application: Boolean)
    var
        DimSetEntry: Record "Dimension Set Entry";
        DimEntryNo: Integer;
        OldAdjAmount: Decimal;
        Adjust: Boolean;
        AdjExchRateBufIndex: Integer;
        Correction: Boolean;
        ShouldExit: Boolean;
    begin
        EmplLedgerEntry.SetRange("Date Filter", 0D, PostingDate2);
        TempCurrencyToAdjust.Get(EmplLedgerEntry."Currency Code");
        if not ShouldAdjustCurrency(TempCurrencyToAdjust) then
            exit;

        GainsAmount := 0;
        LossesAmount := 0;
        OldAdjAmount := 0;
        Adjust := false;

        TempDimBuf.Reset();
        TempDimBuf.DeleteAll();
        DimSetEntry.SetRange("Dimension Set ID", EmplLedgerEntry."Dimension Set ID");
        CopyDimSetEntryToDimBuf(DimSetEntry, TempDimBuf);
        DimEntryNo := GetDimCombID(TempDimBuf);

        EmplLedgerEntry.CalcFields(
            Amount, "Amount (LCY)", "Remaining Amount", "Remaining Amt. (LCY)", "Original Amt. (LCY)",
            "Debit Amount", "Credit Amount", "Debit Amount (LCY)", "Credit Amount (LCY)");

        // Calculate Old Unrealized GainLoss
        SetUnrealizedGainLossFilterEmpl(DtldEmplLedgEntry, EmplLedgerEntry."Entry No.");
        DtldEmplLedgEntry.CalcSums("Amount (LCY)");

        SetUnrealizedGainLossFilterEmpl(TempDtldEmplLedgEntrySums, EmplLedgerEntry."Entry No.");
        TempDtldEmplLedgEntrySums.CalcSums("Amount (LCY)");
        OldAdjAmount := DtldEmplLedgEntry."Amount (LCY)" + TempDtldEmplLedgEntrySums."Amount (LCY)";
        EmplLedgerEntry."Remaining Amt. (LCY)" += TempDtldEmplLedgEntrySums."Amount (LCY)";
        EmplLedgerEntry."Debit Amount (LCY)" += TempDtldEmplLedgEntrySums."Amount (LCY)";
        EmplLedgerEntry."Credit Amount (LCY)" += TempDtldEmplLedgEntrySums."Amount (LCY)";
        TempDtldEmplLedgEntrySums.Reset();

        // Calculate New Unrealized Gains and Losses
        CurrAdjAmount :=
            Round(
                CurrExchRate.ExchangeAmtFCYToLCYAdjmt(
                    PostingDate2, TempCurrencyToAdjust.Code, EmplLedgerEntry."Remaining Amount", TempCurrencyToAdjust."Currency Factor")) -
                EmplLedgerEntry."Remaining Amt. (LCY)";

        OnAfterAdjustEmployeeLedgerEntryOnAfterCalcAdjmtAmount(EmplLedgerEntry, ExchRateAdjmtParameters, CurrAdjAmount, Application, ShouldExit);
        if ShouldExit then
            exit;

        // Modify Currency Factor on Employee Ledger Entry
        if EmplLedgerEntry."Adjusted Currency Factor" <> TempCurrencyToAdjust."Currency Factor" then begin
            EmplLedgerEntry."Adjusted Currency Factor" := TempCurrencyToAdjust."Currency Factor";
            EmplLedgerEntry.Modify();
        end;

        if CurrAdjAmount <> 0 then begin
            OnAdjustEmployeeLedgerEntryOnBeforeInitDtldEmplLedgEntry(Employee, EmplLedgerEntry);
            InitDtldEmplLedgEntry(EmplLedgerEntry, TempDtldEmplLedgEntry);
            TempDtldEmplLedgEntry."Entry No." := NewEntryNo;
            TempDtldEmplLedgEntry."Posting Date" := PostingDate2;
            TempDtldEmplLedgEntry."Document No." := ExchRateAdjmtParameters."Document No.";

            Correction :=
                (EmplLedgerEntry."Debit Amount" < 0) or
                (EmplLedgerEntry."Credit Amount" < 0) or
                (EmplLedgerEntry."Debit Amount (LCY)" < 0) or
                (EmplLedgerEntry."Credit Amount (LCY)" < 0);

            if OldAdjAmount > 0 then
                case true of
                    (CurrAdjAmount > 0):
                        begin
                            TempDtldEmplLedgEntry."Amount (LCY)" := CurrAdjAmount;
                            TempDtldEmplLedgEntry."Entry Type" := TempDtldEmplLedgEntry."Entry Type"::"Unrealized Gain";
                            HandleEmplDebitCredit(Correction, TempDtldEmplLedgEntry."Amount (LCY)");
                            InsertTempDtldEmployeeLedgerEntry(EmplLedgerEntry);
                            NewEntryNo := NewEntryNo + 1;
                            GainsAmount := CurrAdjAmount;
                            Adjust := true;
                        end;
                    (CurrAdjAmount < 0):
                        if -CurrAdjAmount <= OldAdjAmount then begin
                            TempDtldEmplLedgEntry."Amount (LCY)" := CurrAdjAmount;
                            TempDtldEmplLedgEntry."Entry Type" := TempDtldEmplLedgEntry."Entry Type"::"Unrealized Loss";
                            HandleEmplDebitCredit(Correction, TempDtldEmplLedgEntry."Amount (LCY)");
                            InsertTempDtldEmployeeLedgerEntry(EmplLedgerEntry);
                            NewEntryNo := NewEntryNo + 1;
                            LossesAmount := CurrAdjAmount;
                            Adjust := true;
                        end else begin
                            CurrAdjAmount := CurrAdjAmount + OldAdjAmount;
                            TempDtldEmplLedgEntry."Amount (LCY)" := -OldAdjAmount;
                            TempDtldEmplLedgEntry."Entry Type" := TempDtldEmplLedgEntry."Entry Type"::"Unrealized Loss";
                            HandleEmplDebitCredit(Correction, TempDtldEmplLedgEntry."Amount (LCY)");
                            InsertTempDtldEmployeeLedgerEntry(EmplLedgerEntry);
                            NewEntryNo := NewEntryNo + 1;
                            AdjExchRateBufIndex :=
                                ExchRateAdjmtBufferUpdate(
                                    EmplLedgerEntry."Currency Code", EmplLedgerEntry."Employee Posting Group", GetEmplAccountNo(EmplLedgerEntry),
                                    0, 0, -OldAdjAmount, 0, -OldAdjAmount, DimEntryNo, PostingDate2, '',
                                    EmplLedgerEntry."Entry No.");
                            TagExchRateAdjmtLedgEntry(AdjExchRateBufIndex);
                            TempDtldEmplLedgEntry."Transaction No." := AdjExchRateBufIndex;
                            ModifyTempDtldEmployeeLedgerEntry();
                            Adjust := false;
                        end;
                end;
            if OldAdjAmount < 0 then
                case true of
                    (CurrAdjAmount < 0):
                        begin
                            TempDtldEmplLedgEntry."Amount (LCY)" := CurrAdjAmount;
                            TempDtldEmplLedgEntry."Entry Type" := TempDtldEmplLedgEntry."Entry Type"::"Unrealized Loss";
                            HandleEmplDebitCredit(Correction, TempDtldEmplLedgEntry."Amount (LCY)");
                            InsertTempDtldEmployeeLedgerEntry(EmplLedgerEntry);
                            NewEntryNo := NewEntryNo + 1;
                            LossesAmount := CurrAdjAmount;
                            Adjust := true;
                        end;
                    (CurrAdjAmount > 0):
                        if CurrAdjAmount <= -OldAdjAmount then begin
                            TempDtldEmplLedgEntry."Amount (LCY)" := CurrAdjAmount;
                            TempDtldEmplLedgEntry."Entry Type" := TempDtldEmplLedgEntry."Entry Type"::"Unrealized Gain";
                            HandleEmplDebitCredit(Correction, TempDtldEmplLedgEntry."Amount (LCY)");
                            InsertTempDtldEmployeeLedgerEntry(EmplLedgerEntry);
                            NewEntryNo := NewEntryNo + 1;
                            GainsAmount := CurrAdjAmount;
                            Adjust := true;
                        end else begin
                            CurrAdjAmount := OldAdjAmount + CurrAdjAmount;
                            TempDtldEmplLedgEntry."Amount (LCY)" := -OldAdjAmount;
                            TempDtldEmplLedgEntry."Entry Type" := TempDtldEmplLedgEntry."Entry Type"::"Unrealized Gain";
                            HandleEmplDebitCredit(Correction, TempDtldEmplLedgEntry."Amount (LCY)");
                            InsertTempDtldEmployeeLedgerEntry(EmplLedgerEntry);
                            NewEntryNo := NewEntryNo + 1;
                            AdjExchRateBufIndex :=
                                ExchRateAdjmtBufferUpdate(
                                    EmplLedgerEntry."Currency Code", EmplLedgerEntry."Employee Posting Group", GetEmplAccountNo(EmplLedgerEntry),
                                    0, 0, -OldAdjAmount, -OldAdjAmount, 0, DimEntryNo, PostingDate2, '',
                                    EmplLedgerEntry."Entry No.");
                            TagExchRateAdjmtLedgEntry(AdjExchRateBufIndex);
                            TempDtldEmplLedgEntry."Transaction No." := AdjExchRateBufIndex;
                            ModifyTempDtldEmployeeLedgerEntry();
                            Adjust := false;
                        end;
                end;

            OnAdjustEmployeeLedgerEntryOnAfterPrepareAdjust(EmplLedgerEntry, CurrAdjAmount, OldAdjAmount);

            if not Adjust then begin
                TempDtldEmplLedgEntry."Amount (LCY)" := CurrAdjAmount;
                HandleEmplDebitCredit(Correction, TempDtldEmplLedgEntry."Amount (LCY)");
                TempDtldEmplLedgEntry."Entry No." := NewEntryNo;
                if CurrAdjAmount < 0 then begin
                    TempDtldEmplLedgEntry."Entry Type" := TempDtldEmplLedgEntry."Entry Type"::"Unrealized Loss";
                    GainsAmount := 0;
                    LossesAmount := CurrAdjAmount;
                end else
                    if CurrAdjAmount > 0 then begin
                        TempDtldEmplLedgEntry."Entry Type" := TempDtldEmplLedgEntry."Entry Type"::"Unrealized Gain";
                        GainsAmount := CurrAdjAmount;
                        LossesAmount := 0;
                    end;
                InsertTempDtldEmployeeLedgerEntry(EmplLedgerEntry);
                NewEntryNo := NewEntryNo + 1;
            end;

            TotalAdjAmount := TotalAdjAmount + CurrAdjAmount;
            if not ExchRateAdjmtParameters."Hide UI" then
                Window.Update(4, TotalAdjAmount);
            AdjExchRateBufIndex :=
                ExchRateAdjmtBufferUpdate(
                    EmplLedgerEntry."Currency Code", EmplLedgerEntry."Employee Posting Group", GetEmplAccountNo(EmplLedgerEntry),
                    EmplLedgerEntry."Remaining Amount", EmplLedgerEntry."Remaining Amt. (LCY)",
                    TempDtldEmplLedgEntry."Amount (LCY)", GainsAmount, LossesAmount, DimEntryNo, PostingDate2, '',
                    EmplLedgerEntry."Entry No.");
            TagExchRateAdjmtLedgEntry(AdjExchRateBufIndex);
            TempDtldEmplLedgEntry."Transaction No." := AdjExchRateBufIndex;
            ModifyTempDtldEmployeeLedgerEntry();
        end;
    end;

    procedure AdjustExchRateCust(GenJournalLine: Record "Gen. Journal Line"; var TempCustLedgerEntry: Record "Cust. Ledger Entry" temporary)
    var
        Customer: Record Customer;
        CustLedgerEntry2: Record "Cust. Ledger Entry";
        DetailedCustLedgEntry: Record "Detailed Cust. Ledg. Entry";
        PostingDate2: Date;
    begin
        PostingDate2 := GenJournalLine."Posting Date";
        if TempCustLedgerEntry.FindSet() then
            repeat
                CustLedgerEntry2.Get(TempCustLedgerEntry."Entry No.");
                CustLedgerEntry2.SetRange("Date Filter", 0D, PostingDate2);
                CustLedgerEntry2.CalcFields("Remaining Amount", "Remaining Amt. (LCY)");
                OnAdjustExchRateCustOnAfterCalcFields(CustLedgerEntry2);
                if ShouldAdjustEntry(
                        PostingDate2, CustLedgerEntry2."Currency Code", CustLedgerEntry2."Remaining Amount",
                        CustLedgerEntry2."Remaining Amt. (LCY)", CustLedgerEntry2."Adjusted Currency Factor")
                then begin
                    InitVariablesForSetLedgEntry(GenJournalLine);
                    SetCustLedgEntry(Customer, CustLedgerEntry2);
                    AdjustCustomerLedgerEntry(Customer, CustLedgerEntry2, PostingDate2, false);

                    DetailedCustLedgEntry.SetCurrentKey("Cust. Ledger Entry No.");
                    DetailedCustLedgEntry.SetRange("Cust. Ledger Entry No.", CustLedgerEntry2."Entry No.");
                    DetailedCustLedgEntry.SetFilter("Posting Date", '%1..', CalcDate('<+1D>', PostingDate2));
                    if DetailedCustLedgEntry.FindSet() then
                        repeat
                            AdjustCustomerLedgerEntry(Customer, CustLedgerEntry2, DetailedCustLedgEntry."Posting Date", true);
                        until DetailedCustLedgEntry.Next() = 0;
                    HandlePostAdjmt("Exch. Rate Adjmt. Account Type"::Customer);
                end;
            until TempCustLedgerEntry.Next() = 0;
    end;

    procedure AdjustExchRateVend(GenJournalLine: Record "Gen. Journal Line"; var TempVendLedgerEntry: Record "Vendor Ledger Entry" temporary)
    var
        Vendor: Record Vendor;
        VendLedgerEntry2: Record "Vendor Ledger Entry";
        DetailedVendLedgEntry: Record "Detailed Vendor Ledg. Entry";
        PostingDate2: Date;
    begin
        PostingDate2 := GenJournalLine."Posting Date";
        if TempVendLedgerEntry.FindSet() then
            repeat
                VendLedgerEntry2.Get(TempVendLedgerEntry."Entry No.");
                VendLedgerEntry2.SetRange("Date Filter", 0D, PostingDate2);
                VendLedgerEntry2.CalcFields("Remaining Amount", "Remaining Amt. (LCY)");
                OnAdjustExchRateVendOnAfterCalcFields(VendLedgerEntry2);
                if ShouldAdjustEntry(
                    PostingDate2, VendLedgerEntry2."Currency Code",
                    VendLedgerEntry2."Remaining Amount", VendLedgerEntry2."Remaining Amt. (LCY)", VendLedgerEntry2."Adjusted Currency Factor")
                then begin
                    InitVariablesForSetLedgEntry(GenJournalLine);
                    SetVendLedgEntry(Vendor, VendLedgerEntry2);
                    AdjustVendorLedgerEntry(Vendor, VendLedgerEntry2, PostingDate2, false);

                    DetailedVendLedgEntry.SetCurrentKey("Vendor Ledger Entry No.");
                    DetailedVendLedgEntry.SetRange("Vendor Ledger Entry No.", VendLedgerEntry2."Entry No.");
                    DetailedVendLedgEntry.SetFilter("Posting Date", '%1..', CalcDate('<+1D>', PostingDate2));
                    if DetailedVendLedgEntry.FindSet() then
                        repeat
                            AdjustVendorLedgerEntry(Vendor, VendLedgerEntry2, DetailedVendLedgEntry."Posting Date", true);
                        until DetailedVendLedgEntry.Next() = 0;
                    HandlePostAdjmt("Exch. Rate Adjmt. Account Type"::Vendor);
                end;
            until TempVendLedgerEntry.Next() = 0;
    end;

    procedure AdjustExchRateEmpl(GenJournalLine: Record "Gen. Journal Line"; var TempEmplLedgerEntry: Record "Employee Ledger Entry" temporary)
    var
        Employee: Record Employee;
        EmplLedgerEntry2: Record "Employee Ledger Entry";
        DetailedEmplLedgEntry: Record "Detailed Employee Ledger Entry";
        PostingDate2: Date;
    begin
        PostingDate2 := GenJournalLine."Posting Date";
        if TempEmplLedgerEntry.FindSet() then
            repeat
                EmplLedgerEntry2.Get(TempEmplLedgerEntry."Entry No.");
                EmplLedgerEntry2.SetRange("Date Filter", 0D, PostingDate2);
                EmplLedgerEntry2.CalcFields("Remaining Amount", "Remaining Amt. (LCY)");
                if ShouldAdjustEntry(
                    PostingDate2, EmplLedgerEntry2."Currency Code",
                    EmplLedgerEntry2."Remaining Amount", EmplLedgerEntry2."Remaining Amt. (LCY)", EmplLedgerEntry2."Adjusted Currency Factor")
                then begin
                    InitVariablesForSetLedgEntry(GenJournalLine);
                    SetEmplLedgEntry(Employee, EmplLedgerEntry2);
                    AdjustEmployeeLedgerEntry(Employee, EmplLedgerEntry2, PostingDate2, false);

                    DetailedEmplLedgEntry.SetCurrentKey("Employee Ledger Entry No.");
                    DetailedEmplLedgEntry.SetRange("Employee Ledger Entry No.", EmplLedgerEntry2."Entry No.");
                    DetailedEmplLedgEntry.SetFilter("Posting Date", '%1..', CalcDate('<+1D>', PostingDate2));
                    if DetailedEmplLedgEntry.FindSet() then
                        repeat
                            AdjustEmployeeLedgerEntry(Employee, EmplLedgerEntry2, DetailedEmplLedgEntry."Posting Date", true);
                        until DetailedEmplLedgEntry.Next() = 0;
                    HandlePostAdjmt("Exch. Rate Adjmt. Account Type"::Employee);
                end;
            until TempEmplLedgerEntry.Next() = 0;
    end;

    local procedure ResetTempAdjmtBuffer()
    begin
        TempExchRateAdjmtBuffer.Reset();
        TempExchRateAdjmtBuffer.DeleteAll();
    end;

    local procedure ResetTempAdjmtBuffer2()
    begin
        TempExchRateAdjmtBuffer2.Reset();
        TempExchRateAdjmtBuffer2.DeleteAll();
    end;

    local procedure SetCustLedgEntry(var Customer: Record Customer; CustLedgerEntryToAdjust: Record "Cust. Ledger Entry")
    begin
        Customer.Get(CustLedgerEntryToAdjust."Customer No.");
        AddCurrency(CustLedgerEntryToAdjust."Currency Code", CustLedgerEntryToAdjust."Adjusted Currency Factor");
        DtldCustLedgEntry.LockTable();
        CustLedgerEntryToAdjust.LockTable();
        NewEntryNo := DtldCustLedgEntry.GetLastEntryNo() + 1;
    end;

    local procedure SetVendLedgEntry(var Vendor: Record Vendor; VendLedgerEntryToAdjust: Record "Vendor Ledger Entry")
    begin
        Vendor.Get(VendLedgerEntryToAdjust."Vendor No.");
        AddCurrency(VendLedgerEntryToAdjust."Currency Code", VendLedgerEntryToAdjust."Adjusted Currency Factor");
        DtldVendLedgEntry.LockTable();
        VendLedgerEntryToAdjust.LockTable();
        NewEntryNo := DtldVendLedgEntry.GetLastEntryNo() + 1;
    end;

    local procedure SetEmplLedgEntry(var Employee: Record Employee; EmplLedgerEntryToAdjust: Record "Employee Ledger Entry")
    begin
        Employee.Get(EmplLedgerEntryToAdjust."Employee No.");
        AddCurrency(EmplLedgerEntryToAdjust."Currency Code", EmplLedgerEntryToAdjust."Adjusted Currency Factor");
        DtldEmplLedgEntry.LockTable();
        EmplLedgerEntryToAdjust.LockTable();
        NewEntryNo := DtldEmplLedgEntry.GetLastEntryNo() + 1;
    end;

    local procedure ShouldAdjustEntry(PostingDate: Date; CurCode: Code[10]; RemainingAmount: Decimal; RemainingAmtLCY: Decimal; AdjCurFactor: Decimal): Boolean
    begin
        exit(Round(CurrExchRate.ExchangeAmtFCYToLCYAdjmt(PostingDate, CurCode, RemainingAmount, AdjCurFactor)) - RemainingAmtLCY <> 0);
    end;

    local procedure InitVariablesForSetLedgEntry(GenJournalLine: Record "Gen. Journal Line")
    begin
        ExchRateAdjmtParameters."Start Date" := GenJournalLine."Posting Date";
        ExchRateAdjmtParameters."End Date" := GenJournalLine."Posting Date";
        ExchRateAdjmtParameters."Posting Date" := GenJournalLine."Posting Date";
        ExchRateAdjmtParameters."Posting Description" := PostingDescriptionTxt;
        ExchRateAdjmtParameters."Document No." := GenJournalLine."Document No.";
        ExchRateAdjmtParameters."Journal Template Name" := GenJournalLine."Journal Template Name";
        ExchRateAdjmtParameters."Journal Batch Name" := GenJournalLine."Journal Batch Name";
        ExchRateAdjmtParameters."Hide UI" := true;
        GetGLSetup();
        SourceCodeSetup.Get();
        if ExchRateAdjmtReg.FindLast() then
            ExchRateAdjmtReg.Init();
        OnAfterInitVariablesForSetLedgEntry(ExchRateAdjmtParameters, GenJournalLine);
    end;

    local procedure AddCurrency(CurrencyCode: Code[10]; CurrencyFactor: Decimal)
    var
        CurrencyToAdd: Record Currency;
    begin
        if TempCurrencyToAdjust.Get(CurrencyCode) then begin
            TempCurrencyToAdjust."Currency Factor" := CurrencyFactor;
            TempCurrencyToAdjust.Modify();
        end else begin
            CurrencyToAdd.Get(CurrencyCode);
            TempCurrencyToAdjust := CurrencyToAdd;
            TempCurrencyToAdjust."Currency Factor" := CurrencyFactor;
            TempCurrencyToAdjust.Insert();
        end;
    end;

    local procedure ShouldAdjustCurrency(Currency: Record Currency) ShouldAdjust: Boolean
    begin
        ShouldAdjust := true;

        OnAfterShouldAdjustCurrency(Currency, ShouldAdjust);
    end;

    local procedure InitDtldCustLedgEntry(CustLedgEntry: Record "Cust. Ledger Entry"; var DtldCustLedgEntry: Record "Detailed Cust. Ledg. Entry")
    begin
        DtldCustLedgEntry.Init();
        DtldCustLedgEntry."Cust. Ledger Entry No." := CustLedgEntry."Entry No.";
        DtldCustLedgEntry.Amount := 0;
        DtldCustLedgEntry."Customer No." := CustLedgEntry."Customer No.";
        DtldCustLedgEntry."Currency Code" := CustLedgEntry."Currency Code";
        DtldCustLedgEntry."Posting Group" := CustLedgEntry."Customer Posting Group";
        DtldCustLedgEntry."User ID" := CopyStr(UserId, 1, MaxStrLen(DtldCustLedgEntry."User ID"));
        DtldCustLedgEntry."Source Code" := SourceCodeSetup."Exchange Rate Adjmt.";
        DtldCustLedgEntry."Journal Batch Name" := CustLedgEntry."Journal Batch Name";
        DtldCustLedgEntry."Reason Code" := CustLedgEntry."Reason Code";
        DtldCustLedgEntry."Initial Entry Due Date" := CustLedgEntry."Due Date";
        DtldCustLedgEntry."Initial Entry Global Dim. 1" := CustLedgEntry."Global Dimension 1 Code";
        DtldCustLedgEntry."Initial Entry Global Dim. 2" := CustLedgEntry."Global Dimension 2 Code";
        DtldCustLedgEntry."Initial Document Type" := CustLedgEntry."Document Type";

        OnAfterInitDtldCustLedgerEntry(DtldCustLedgEntry);
    end;

    local procedure InitDtldVendLedgEntry(VendLedgEntry: Record "Vendor Ledger Entry"; var DtldVendLedgEntry: Record "Detailed Vendor Ledg. Entry")
    begin
        DtldVendLedgEntry.Init();
        DtldVendLedgEntry."Vendor Ledger Entry No." := VendLedgEntry."Entry No.";
        DtldVendLedgEntry.Amount := 0;
        DtldVendLedgEntry."Vendor No." := VendLedgEntry."Vendor No.";
        DtldVendLedgEntry."Currency Code" := VendLedgEntry."Currency Code";
        DtldVendLedgEntry."Posting Group" := VendLedgEntry."Vendor Posting Group";
        DtldVendLedgEntry."User ID" := CopyStr(UserId, 1, MaxStrLen(DtldVendLedgEntry."User ID"));
        DtldVendLedgEntry."Source Code" := SourceCodeSetup."Exchange Rate Adjmt.";
        DtldVendLedgEntry."Journal Batch Name" := VendLedgEntry."Journal Batch Name";
        DtldVendLedgEntry."Reason Code" := VendLedgEntry."Reason Code";
        DtldVendLedgEntry."Initial Entry Due Date" := VendLedgEntry."Due Date";
        DtldVendLedgEntry."Initial Entry Global Dim. 1" := VendLedgEntry."Global Dimension 1 Code";
        DtldVendLedgEntry."Initial Entry Global Dim. 2" := VendLedgEntry."Global Dimension 2 Code";
        DtldVendLedgEntry."Initial Document Type" := VendLedgEntry."Document Type";

        OnAfterInitDtldVendLedgerEntry(DtldVendLedgEntry);
    end;

    local procedure InitDtldEmplLedgEntry(EmplLedgEntry: Record "Employee Ledger Entry"; var DtldEmplLedgEntry: Record "Detailed Employee Ledger Entry")
    begin
        DtldEmplLedgEntry.Init();
        DtldEmplLedgEntry."Employee Ledger Entry No." := EmplLedgEntry."Entry No.";
        DtldEmplLedgEntry.Amount := 0;
        DtldEmplLedgEntry."Employee No." := EmplLedgEntry."Employee No.";
        DtldEmplLedgEntry."Currency Code" := EmplLedgEntry."Currency Code";
        DtldEmplLedgEntry."User ID" := CopyStr(UserId, 1, MaxStrLen(DtldEmplLedgEntry."User ID"));
        DtldEmplLedgEntry."Source Code" := SourceCodeSetup."Exchange Rate Adjmt.";
        DtldEmplLedgEntry."Journal Batch Name" := EmplLedgEntry."Journal Batch Name";
        DtldEmplLedgEntry."Reason Code" := EmplLedgEntry."Reason Code";
        DtldEmplLedgEntry."Initial Entry Global Dim. 1" := EmplLedgEntry."Global Dimension 1 Code";
        DtldEmplLedgEntry."Initial Entry Global Dim. 2" := EmplLedgEntry."Global Dimension 2 Code";
        DtldEmplLedgEntry."Initial Document Type" := EmplLedgEntry."Document Type";

        OnAfterInitDtldEmplLedgerEntry(DtldEmplLedgEntry);
    end;

    local procedure GetUnrealizedGainsAccount(Currency: Record Currency) AccountNo: Code[20]
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeGetUnrealizedGainsAccount(Currency, AccountNo, IsHandled);
        if IsHandled then
            exit(AccountNo);

        exit(Currency.GetUnrealizedGainsAccount());
    end;

    local procedure GetUnrealizedLossesAccount(Currency: Record Currency) AccountNo: Code[20]
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeGetUnrealizedLossesAccount(Currency, AccountNo, IsHandled);
        if IsHandled then
            exit(AccountNo);

        exit(Currency.GetUnrealizedLossesAccount());
    end;

    local procedure SetUnrealizedGainLossFilterCust(var DtldCustLedgEntry: Record "Detailed Cust. Ledg. Entry"; EntryNo: Integer)
    begin
        DtldCustLedgEntry.Reset();
        DtldCustLedgEntry.SetCurrentKey("Cust. Ledger Entry No.", "Entry Type");
        DtldCustLedgEntry.SetRange("Cust. Ledger Entry No.", EntryNo);
        DtldCustLedgEntry.SetRange("Entry Type", DtldCustLedgEntry."Entry Type"::"Unrealized Loss", DtldCustLedgEntry."Entry Type"::"Unrealized Gain");
    end;

    local procedure SetUnrealizedGainLossFilterVend(var DtldVendLedgEntry: Record "Detailed Vendor Ledg. Entry"; EntryNo: Integer)
    begin
        DtldVendLedgEntry.Reset();
        DtldVendLedgEntry.SetCurrentKey("Vendor Ledger Entry No.", "Entry Type");
        DtldVendLedgEntry.SetRange("Vendor Ledger Entry No.", EntryNo);
        DtldVendLedgEntry.SetRange("Entry Type", DtldVendLedgEntry."Entry Type"::"Unrealized Loss", DtldVendLedgEntry."Entry Type"::"Unrealized Gain");
    end;

    local procedure SetUnrealizedGainLossFilterEmpl(var DtldEmplLedgEntry: Record "Detailed Employee Ledger Entry"; EntryNo: Integer)
    begin
        DtldEmplLedgEntry.Reset();
        DtldEmplLedgEntry.SetCurrentKey("Employee Ledger Entry No.", "Entry Type");
        DtldEmplLedgEntry.SetRange("Employee Ledger Entry No.", EntryNo);
        DtldEmplLedgEntry.SetRange("Entry Type", DtldEmplLedgEntry."Entry Type"::"Unrealized Loss", DtldEmplLedgEntry."Entry Type"::"Unrealized Gain");
    end;

    local procedure InsertTempDtldCustomerLedgerEntry(CustLedgerEntry: Record "Cust. Ledger Entry")
    begin
        TempDtldCustLedgEntry.Insert();
        InsertExchRateAdjmtCustLedgerEntry(CustLedgerEntry, TempDtldCustLedgEntry);
        TempDtldCustLedgEntrySums := TempDtldCustLedgEntry;
        TempDtldCustLedgEntrySums.Insert();
    end;

    local procedure InsertTempDtldVendorLedgerEntry(VendLedgerEntry: Record "Vendor Ledger Entry")
    begin
        TempDtldVendLedgEntry.Insert();
        InsertExchRateAdjmtVendLedgerEntry(VendLedgerEntry, TempDtldVendLedgEntry);
        TempDtldVendLedgEntrySums := TempDtldVendLedgEntry;
        TempDtldVendLedgEntrySums.Insert();
    end;

    local procedure InsertTempDtldEmployeeLedgerEntry(EmplLedgerEntry: Record "Employee Ledger Entry")
    begin
        TempDtldEmplLedgEntry.Insert();
        InsertExchRateAdjmtEmplLedgerEntry(EmplLedgerEntry, TempDtldEmplLedgEntry);
        TempDtldEmplLedgEntrySums := TempDtldEmplLedgEntry;
        TempDtldEmplLedgEntrySums.Insert();
    end;

    local procedure ModifyTempDtldCustomerLedgerEntry()
    begin
        TempDtldCustLedgEntry.Modify();
        TempDtldCustLedgEntrySums := TempDtldCustLedgEntry;
        TempDtldCustLedgEntrySums.Modify();
    end;

    local procedure ModifyTempDtldVendorLedgerEntry()
    begin
        TempDtldVendLedgEntry.Modify();
        TempDtldVendLedgEntrySums := TempDtldVendLedgEntry;
        TempDtldVendLedgEntrySums.Modify();
    end;

    local procedure ModifyTempDtldEmployeeLedgerEntry()
    begin
        TempDtldEmplLedgEntry.Modify();
        TempDtldEmplLedgEntrySums := TempDtldEmplLedgEntry;
        TempDtldEmplLedgEntrySums.Modify();
    end;

    local procedure GetGLSetup()
    begin
        if not GLSetupRead then
            GLSetup.Get();

        GLSetupRead := true;
    end;

    local procedure GetAdditionalReportingCurrency(): Code[10]
    begin
        GetGLSetup();
        exit(GLSetup."Additional Reporting Currency");
    end;

    local procedure InsertExchRateAdjmtBankAccLedgerEntry(BankAccount: Record "Bank Account");
    begin
        TempExchRateAdjmtLedgEntry.Init();
        TempExchRateAdjmtLedgEntry."Register No." := 0;
        NewRegLedgEntryNo += 1;
        TempExchRateAdjmtLedgEntry."Entry No." := NewRegLedgEntryNo;
        TempExchRateAdjmtLedgEntry."Account Type" := "Exch. Rate Adjmt. Account Type"::"Bank Account";
        TempExchRateAdjmtLedgEntry."Account No." := BankAccount."No.";
        TempExchRateAdjmtLedgEntry."Posting Date" := ExchRateAdjmtParameters."Posting Date";
        TempExchRateAdjmtLedgEntry."Currency Code" := BankAccount."Currency Code";
        TempExchRateAdjmtLedgEntry."Currency Factor" := Currency."Currency Factor";
        TempExchRateAdjmtLedgEntry."Base Amount" := BankAccount."Balance at Date";
        TempExchRateAdjmtLedgEntry."Base Amount (LCY)" := BankAccount."Balance at Date (LCY)";
        TempExchRateAdjmtLedgEntry."Adjustment Amount" := CurrAdjAmount;
        TempExchRateAdjmtLedgEntry.Insert();
    end;

    local procedure InsertExchRateAdjmtCustLedgerEntry(CustLedgerEntry: Record "Cust. Ledger Entry"; DetailedCustLedgEntry2: Record "Detailed Cust. Ledg. Entry");
    begin
        TempExchRateAdjmtLedgEntry.Init();
        TempExchRateAdjmtLedgEntry."Register No." := 0;
        NewRegLedgEntryNo += 1;
        TempExchRateAdjmtLedgEntry."Entry No." := NewRegLedgEntryNo;
        TempExchRateAdjmtLedgEntry."Detailed Ledger Entry Type" := DetailedCustLedgEntry2."Entry Type";
        TempExchRateAdjmtLedgEntry."Detailed Ledger Entry No." := DetailedCustLedgEntry2."Entry No.";
        TempExchRateAdjmtLedgEntry."Account Type" := "Exch. Rate Adjmt. Account Type"::Customer;
        TempExchRateAdjmtLedgEntry."Account No." := CustLedgerEntry."Customer No.";
        TempExchRateAdjmtLedgEntry."Document Type" := CustLedgerEntry."Document Type";
        TempExchRateAdjmtLedgEntry."Document No." := CustLedgerEntry."Document No.";
        TempExchRateAdjmtLedgEntry."Posting Date" := ExchRateAdjmtParameters."Posting Date";
        TempExchRateAdjmtLedgEntry."Currency Code" := CustLedgerEntry."Currency Code";
        TempExchRateAdjmtLedgEntry."Currency Factor" := CustLedgerEntry."Adjusted Currency Factor";
        TempExchRateAdjmtLedgEntry."Base Amount" := CustLedgerEntry."Remaining Amount";
        TempExchRateAdjmtLedgEntry."Base Amount (LCY)" := CustLedgerEntry."Remaining Amt. (LCY)";
        TempExchRateAdjmtLedgEntry."Adjustment Amount" := DetailedCustLedgEntry2."Amount (LCY)";
        TempExchRateAdjmtLedgEntry.Insert();
    end;

    local procedure InsertExchRateAdjmtVendLedgerEntry(VendorLedgerEntry: Record "Vendor Ledger Entry"; DetailedVendorLedgEntry2: Record "Detailed Vendor Ledg. Entry");
    begin
        TempExchRateAdjmtLedgEntry.Init();
        TempExchRateAdjmtLedgEntry."Register No." := 0;
        NewRegLedgEntryNo += 1;
        TempExchRateAdjmtLedgEntry."Entry No." := NewRegLedgEntryNo;
        TempExchRateAdjmtLedgEntry."Detailed Ledger Entry Type" := DetailedVendorLedgEntry2."Entry Type";
        TempExchRateAdjmtLedgEntry."Detailed Ledger Entry No." := DetailedVendorLedgEntry2."Entry No.";
        TempExchRateAdjmtLedgEntry."Account Type" := "Exch. Rate Adjmt. Account Type"::Vendor;
        TempExchRateAdjmtLedgEntry."Account No." := VendorLedgerEntry."Vendor No.";
        TempExchRateAdjmtLedgEntry."Document Type" := VendorLedgerEntry."Document Type";
        TempExchRateAdjmtLedgEntry."Document No." := VendorLedgerEntry."Document No.";
        TempExchRateAdjmtLedgEntry."Posting Date" := ExchRateAdjmtParameters."Posting Date";
        TempExchRateAdjmtLedgEntry."Currency Code" := VendorLedgerEntry."Currency Code";
        TempExchRateAdjmtLedgEntry."Currency Factor" := VendorLedgerEntry."Adjusted Currency Factor";
        TempExchRateAdjmtLedgEntry."Base Amount" := VendorLedgerEntry."Remaining Amount";
        TempExchRateAdjmtLedgEntry."Base Amount (LCY)" := VendorLedgerEntry."Remaining Amt. (LCY)";
        TempExchRateAdjmtLedgEntry."Adjustment Amount" := DetailedVendorLedgEntry2."Amount (LCY)";
        TempExchRateAdjmtLedgEntry.Insert();
    end;

    local procedure InsertExchRateAdjmtEmplLedgerEntry(EmplLedgEntry: Record "Employee Ledger Entry"; DtldEmplLedgEntry: Record "Detailed Employee Ledger Entry");
    begin
        TempExchRateAdjmtLedgEntry.Init();
        TempExchRateAdjmtLedgEntry."Register No." := 0;
        NewRegLedgEntryNo += 1;
        TempExchRateAdjmtLedgEntry."Entry No." := NewRegLedgEntryNo;
        TempExchRateAdjmtLedgEntry."Detailed Ledger Entry Type" := DtldEmplLedgEntry."Entry Type";
        TempExchRateAdjmtLedgEntry."Detailed Ledger Entry No." := DtldEmplLedgEntry."Entry No.";
        TempExchRateAdjmtLedgEntry."Account Type" := "Exch. Rate Adjmt. Account Type"::Employee;
        TempExchRateAdjmtLedgEntry."Account No." := EmplLedgEntry."Employee No.";
        TempExchRateAdjmtLedgEntry."Document Type" := EmplLedgEntry."Document Type";
        TempExchRateAdjmtLedgEntry."Document No." := EmplLedgEntry."Document No.";
        TempExchRateAdjmtLedgEntry."Posting Date" := ExchRateAdjmtParameters."Posting Date";
        TempExchRateAdjmtLedgEntry."Currency Code" := EmplLedgEntry."Currency Code";
        TempExchRateAdjmtLedgEntry."Currency Factor" := Currency."Currency Factor";
        TempExchRateAdjmtLedgEntry."Base Amount" := EmplLedgEntry."Remaining Amount";
        TempExchRateAdjmtLedgEntry."Base Amount (LCY)" := EmplLedgEntry."Remaining Amt. (LCY)";
        TempExchRateAdjmtLedgEntry."Adjustment Amount" := DtldEmplLedgEntry."Amount (LCY)";
        TempExchRateAdjmtLedgEntry.Insert();
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterInitDtldCustLedgerEntry(var DetailedCustLedgEntry: Record "Detailed Cust. Ledg. Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterInitDtldVendLedgerEntry(var DetailedVendorLedgEntry: Record "Detailed Vendor Ledg. Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterInitDtldEmplLedgerEntry(var DetailedEmployeeLedgEntry: Record "Detailed Employee Ledger Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterInitVariablesForSetLedgEntry(var ExchRateAdjmtParameters: Record "Exch. Rate Adjmt. Parameters"; GenJournalLine: Record "Gen. Journal Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetDtldCustLedgEntryFilters(var DtldCustLedgEntry: Record "Detailed Cust. Ledg. Entry"; CustLedgEntry: Record "Cust. Ledger Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetDtldVendLedgEntryFilters(var DtldVendLedgEntry: Record "Detailed Vendor Ledg. Entry"; VendLedgEntry: Record "Vendor Ledger Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetDtldEmplLedgEntryFilters(var DtldEmplLedgEntry: Record "Detailed Employee Ledger Entry"; EmplLedgEntry: Record "Employee Ledger Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterShouldAdjustCurrency(Currency: Record Currency; var ShouldAdjust: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterShouldAdjustCustLedgEntry(CustLedgEntry: Record "Cust. Ledger Entry"; var ShouldAdjust: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterShouldAdjustVendLedgEntry(VendLedgEntry: Record "Vendor Ledger Entry"; var ShouldAdjust: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterShouldAdjustEmplLedgEntry(EmplLedgEntry: Record "Employee Ledger Entry"; var ShouldAdjust: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetVATEntryFilters(var VATEntry: Record "VAT Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAdjustCustomerLedgerEntryOnBeforeInitDtldCustLedgEntry(var Customer: Record Customer; CusLedgerEntry: Record "Cust. Ledger Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAdjustCustomerLedgerEntryOnAfterPrepareAdjust(var CustLedgerEntry: Record "Cust. Ledger Entry"; CurrAdjAmount: Decimal; OldAdjAmount: Decimal);
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterAdjustCustomerLedgerEntryOnAfterCalcAdjmtAmount(CustLedgerEntry: Record "Cust. Ledger Entry"; var ExchRateAdjmtParameters: Record "Exch. Rate Adjmt. Parameters"; AdjmtAmount: Decimal; Application: Boolean; var ShouldExit: Boolean);
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAdjustVendorLedgerEntryOnBeforeInitDtldVendLedgEntry(var Vendor: Record Vendor; VendLedgerEntry: Record "Vendor Ledger Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAdjustVendorLedgerEntryOnAfterPrepareAdjust(var VendorLedgerEntry: Record "Vendor Ledger Entry"; CurrAdjAmount: Decimal; OldAdjAmount: Decimal);
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterAdjustVendorLedgerEntryOnAfterCalcAdjmtAmount(VendLedgerEntry: Record "Vendor Ledger Entry"; var ExchRateAdjmtParameters: Record "Exch. Rate Adjmt. Parameters"; AdjmtAmount: Decimal; Application: Boolean; var ShouldExit: Boolean);
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAdjustEmployeeLedgerEntryOnBeforeInitDtldEmplLedgEntry(var Employe: Record Employee; EmplLedgerEntry: Record "Employee Ledger Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAdjustEmployeeLedgerEntryOnAfterPrepareAdjust(var EmployeeLedgerEntry: Record "Employee Ledger Entry"; CurrAdjAmount: Decimal; OldAdjAmount: Decimal);
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterAdjustEmployeeLedgerEntryOnAfterCalcAdjmtAmount(EmplLedgerEntry: Record "Employee Ledger Entry"; var ExchRateAdjmtParameters: Record "Exch. Rate Adjmt. Parameters"; AdjmtAmount: Decimal; Application: Boolean; var ShouldExit: Boolean);
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterProcessCustomerAdjustment(var TempCustLedgerEntry: Record "Cust. Ledger Entry" temporary)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterProcessVendorAdjustment(var TempVendorLedgerEntry: Record "Vendor Ledger Entry" temporary)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterProcessEmployeeAdjustment(var TempEmployeeLedgerEntry: Record "Employee Ledger Entry" temporary)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterRunAdjustment(var ExchRateAdjmtParameters: Record "Exch. Rate Adjmt. Parameters" temporary)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeGetBankAccountNo(BankAccount: Record "Bank Account"; var AccountNo: Code[20]; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeGetCustAccountNo(CustLedgerEntry: Record "Cust. Ledger Entry"; var AccountNo: Code[20]; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    internal procedure OnBeforeGetLocalCustAccountNo(CustLedgerEntry: Record "Cust. Ledger Entry"; var AccountNo: Code[20]; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeGetVendAccountNo(VendLedgerEntry: Record "Vendor Ledger Entry"; var AccountNo: Code[20]; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    internal procedure OnBeforeGetLocalVendAccountNo(VendLedgerEntry: Record "Vendor Ledger Entry"; var AccountNo: Code[20]; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeGetEmplAccountNo(EmplLedgerEntry: Record "Employee Ledger Entry"; var AccountNo: Code[20]; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeGetRealizedGainsAccount(Currency: Record Currency; var AccountNo: Code[20]; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeGetRealizedLossesAccount(Currency: Record Currency; var AccountNo: Code[20]; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeGetUnrealizedGainsAccount(Currency: Record Currency; var AccountNo: Code[20]; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeGetUnrealizedLossesAccount(Currency: Record Currency; var AccountNo: Code[20]; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPostGenJnlLineOnAfterGenJnlPostLineRun(var GenJnlLine: Record "Gen. Journal Line"; var GenJnlPostLine: Codeunit "Gen. Jnl.-Post Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnProcessBankAccountOnAfterCalcFields(var BankAccount: Record "Bank Account"; Currency: Record Currency)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPostGenJnlLineOnBeforeGenJnlPostLineRun(var GenJnlLine: Record "Gen. Journal Line"; var ExchRateAdjmtParameters: Record "Exch. Rate Adjmt. Parameters")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeAdjustGLAccountsAndVATEntries(var ExchRateAdjmtParameters: Record "Exch. Rate Adjmt. Parameters"; var Currency: Record Currency; var GenJnlPostLine: Codeunit "Gen. Jnl.-Post Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnSetPostingDimensionsElseCase(var GenJournalLine: Record "Gen. Journal Line"; var DimensionSetEntry: Record "Dimension Set Entry"; var ExchRateAdjmtParameters: Record "Exch. Rate Adjmt. Parameters" temporary)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAdjustCurrencyOnAfterSetBankAccountFilters(var BankAccount: Record "Bank Account")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAdjustCurrencyOnAfterSetBankAccountFiltersInLoop(var BankAccount: Record "Bank Account")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPrepareTempCustLedgEntryOnAfterSetCustLedgerEntryFilters(var CustLedgerEntry: Record "Cust. Ledger Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPrepareTempCustLedgEntryOnAfterSetDtldCustLedgerEntryFilters(var DetailedCustLedgEntry: Record "Detailed Cust. Ledg. Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPrepareTempVendLedgEntryOnAfterSetVendLedgerEntryFilters(var VendorLedgerEntry: Record "Vendor Ledger Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPrepareTempVendLedgEntryOnAfterSetDtldVendLedgerEntryFilters(var DetailedVendorLedgEntry: Record "Detailed Vendor Ledg. Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPrepareTempEmplLedgEntryOnAfterSetEmplLedgerEntryFilters(var EmployeeLedgerEntry: Record "Employee Ledger Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPrepareTempEmplLedgEntryOnAfterSetDtldEmplLedgerEntryFilters(var DetailedEmployeeLedgerEntry: Record "Detailed Employee Ledger Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnSetPostingDimensionsOnCaseSourceEntryDimensions(var GenJournalLine: Record "Gen. Journal Line"; var DimensionSetEntry: Record "Dimension Set Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforePrepareTempCustLedgEntry(var CustLedgerEntry: Record "Cust. Ledger Entry"; var TempCustLedgerEntry: Record "Cust. Ledger Entry" temporary; Customer: Record Customer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforePrepareTempVendLedgEntry(var VendorLedgerEntry: Record "Vendor Ledger Entry"; var TempVendorLedgerEntry: Record "Vendor Ledger Entry" temporary; Vendor: Record Vendor; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAdjustExchRateCustOnAfterCalcFields(var CustomerLedgerEntry: Record "Cust. Ledger Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAdjustCustomerLedgerEntryOnAfterCalcFields(var CustomerLedgerEntry: Record "Cust. Ledger Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAdjustExchRateVendOnAfterCalcFields(var VendorLedgerEntry: Record "Vendor Ledger Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnProcessGLAccountAdjustmentOnBeforePostGLAccAdjmt(var GLAccount: Record "G/L Account");
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAdjustVendorLedgerEntryOnAfterCalcFields(var VendorLedgerEntry: Record "Vendor Ledger Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnHandlePostAdjmtOnBeforePostAdjmt(var TempExchRateAdjmtBuffer2: Record "Exch. Rate Adjmt. Buffer" temporary; var Currency: Record Currency; var DimensionSetEntry: Record "Dimension Set Entry"; var AdjustAccType: Enum "Exch. Rate Adjmt. Account Type")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterExchRateAdjmtBufferUpdate(var ExchRateAdjmtParameters: Record "Exch. Rate Adjmt. Parameters"; var TempExchRateAdjmtBuffer: Record "Exch. Rate Adjmt. Buffer" temporary)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforePostAdjmt(var ExchRateAdjmtBuffer: Record "Exch. Rate Adjmt. Buffer"; var TempDimSetEntry: Record "Dimension Set Entry" temporary)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPostAdjmtOnBeforePostGenJnlLine(var GenJnlLine: Record "Gen. Journal Line"; var TempDimSetEntry: Record "Dimension Set Entry" temporary)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnSetAdditionalReportingCurrencyOnBeforeCheckTaxJurisdiction(var TaxJurisdiction: Record "Tax Jurisdiction"; var IsHandled: Boolean);
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnSummarizeExchRateAdjmtBufferOnAfterExchRateAdjmtBuffer2SetFilters(var TempExchRateAdjmtBuffer2: Record "Exch. Rate Adjmt. Buffer" temporary; var TempExchRateAdjmtBuffer: Record "Exch. Rate Adjmt. Buffer" temporary; var ExchRateAdjmtParameters: Record "Exch. Rate Adjmt. Parameters")
    begin
    end;

}