Report 317 Vendor Pre-Payment Journal

App
Base Application
Namespace
Microsoft.Purchases.Reports
Versions
17-28

Procedures, 3

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Purchases/Reports/VendorPrePaymentJournal.Report.al2428 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.Purchases.Reports;

using Microsoft.Bank.BankAccount;
using Microsoft.CRM.Campaign;
using Microsoft.CRM.Team;
using Microsoft.Finance.Currency;
using Microsoft.Finance.Dimension;
using Microsoft.Finance.GeneralLedger.Account;
using Microsoft.Finance.GeneralLedger.Journal;
using Microsoft.Finance.GeneralLedger.Setup;
using Microsoft.Finance.VAT.Setup;
using Microsoft.FixedAssets.Depreciation;
using Microsoft.FixedAssets.FixedAsset;
using Microsoft.FixedAssets.Setup;
using Microsoft.Foundation.Company;
using Microsoft.Foundation.NoSeries;
using Microsoft.Foundation.PaymentTerms;
using Microsoft.Foundation.Period;
using Microsoft.Intercompany.BankAccount;
using Microsoft.Intercompany.GLAccount;
using Microsoft.Intercompany.Partner;
using Microsoft.Projects.Project.Job;
using Microsoft.Purchases.Payables;
using Microsoft.Purchases.Setup;
using Microsoft.Purchases.Vendor;
using Microsoft.Sales.Customer;
using Microsoft.Sales.Receivables;
using Microsoft.Sales.Setup;
using System.Security.User;
using System.Utilities;

report 317 "Vendor Pre-Payment Journal"
{
    Caption = 'Vendor Pre-Payment Journal';
    DefaultRenderingLayout = RDLCLayout;

    dataset
    {
        dataitem("Gen. Journal Batch"; "Gen. Journal Batch")
        {
            DataItemTableView = sorting("Journal Template Name", Name);
            column(Gen__Journal_Batch_Journal_Template_Name; "Journal Template Name")
            {
            }
            column(Gen__Journal_Batch_Name; Name)
            {
            }
            dataitem("Integer"; "Integer")
            {
                DataItemTableView = sorting(Number) where(Number = const(1));
                PrintOnlyIfDetail = true;
                column(FORMAT_TODAY_0_4_; Format(Today, 0, 4))
                {
                }
                column(CompanyInformation_Name; CompanyInformation.Name)
                {
                }
                column(USERID; UserId)
                {
                }
                column(Gen__Journal_Batch___Journal_Template_Name_; "Gen. Journal Batch"."Journal Template Name")
                {
                }
                column(Gen__Journal_Batch__Name; "Gen. Journal Batch".Name)
                {
                }
                column(TIME; Time)
                {
                }
                column(Gen__Journal_Line__TABLECAPTION__________GenJnlLineFilter; "Gen. Journal Line".TableCaption + ': ' + GenJnlLineFilter)
                {
                }
                column(GenJnlLineFilter; GenJnlLineFilter)
                {
                }
                column(USE001Err; USE001Lbl)
                {
                }
                column(GenJnlTemplate__Force_Doc__Balance_; GenJnlTemplate."Force Doc. Balance")
                {
                }
                column(Integer_Number; Number)
                {
                }
                column(Payment_Journal___Pre_Check_TestCaption; Payment_Journal___Pre_Check_TestCaptionLbl)
                {
                }
                column(CurrReport_PAGENOCaption; CurrReport_PAGENOCaptionLbl)
                {
                }
                column(Gen__Journal_Batch___Journal_Template_Name_Caption; "Gen. Journal Batch".FieldCaption("Journal Template Name"))
                {
                }
                column(Gen__Journal_Batch__NameCaption; Gen__Journal_Batch__NameCaptionLbl)
                {
                }
                column(Gen__Journal_Line__Posting_Date_Caption; "Gen. Journal Line".FieldCaption("Posting Date"))
                {
                }
                column(Gen__Journal_Line__Document_Type_Caption; Gen__Journal_Line__Document_Type_CaptionLbl)
                {
                }
                column(Gen__Journal_Line__Document_No__Caption; Gen__Journal_Line__Document_No__CaptionLbl)
                {
                }
                column(Gen__Journal_Line__Account_Type_Caption; Gen__Journal_Line__Account_Type_CaptionLbl)
                {
                }
                column(Gen__Journal_Line__Account_No__Caption; Gen__Journal_Line__Account_No__CaptionLbl)
                {
                }
                column(Gen__Journal_Line_DescriptionCaption; "Gen. Journal Line".FieldCaption(Description))
                {
                }
                column(Gen__Journal_Line_AmountCaption; "Gen. Journal Line".FieldCaption(Amount))
                {
                }
                column(Gen__Journal_Line__Bal__Account_No__Caption; Gen__Journal_Line__Bal__Account_No__CaptionLbl)
                {
                }
                column(Gen__Journal_Line__Bal__Account_Type_Caption; Gen__Journal_Line__Bal__Account_Type_CaptionLbl)
                {
                }
                column(Gen__Journal_Line__Bank_Payment_Type_Caption; "Gen. Journal Line".FieldCaption("Bank Payment Type"))
                {
                }
                column(DocumentCaption; DocumentCaptionLbl)
                {
                }
                column(AccountCaption; AccountCaptionLbl)
                {
                }
                column(Bal__AccountCaption; Bal__AccountCaptionLbl)
                {
                }
                dataitem("Gen. Journal Line"; "Gen. Journal Line")
                {
                    DataItemLink = "Journal Template Name" = field("Journal Template Name"), "Journal Batch Name" = field(Name);
                    DataItemLinkReference = "Gen. Journal Batch";
                    DataItemTableView = sorting("Journal Template Name", "Journal Batch Name", "Posting Date", "Document No.", "Account Type", "Account No.");
                    RequestFilterFields = "Posting Date";
                    column(Gen__Journal_Line__Posting_Date_; "Posting Date")
                    {
                    }
                    column(Gen__Journal_Line__Document_Type_; "Document Type")
                    {
                    }
                    column(Gen__Journal_Line__Document_No__; "Document No.")
                    {
                    }
                    column(Gen__Journal_Line__Bank_Payment_Type_; "Bank Payment Type")
                    {
                    }
                    column(Gen__Journal_Line__Account_Type_; "Account Type")
                    {
                    }
                    column(Gen__Journal_Line__Account_No__; "Account No.")
                    {
                    }
                    column(Gen__Journal_Line_Description; Description)
                    {
                    }
                    column(Gen__Journal_Line__Bal__Account_Type_; "Bal. Account Type")
                    {
                    }
                    column(Gen__Journal_Line__Bal__Account_No__; "Bal. Account No.")
                    {
                    }
                    column(Gen__Journal_Line__Applies_to_Doc__Type_; "Applies-to Doc. Type")
                    {
                    }
                    column(Gen__Journal_Line__Applies_to_Doc__No__; "Applies-to Doc. No.")
                    {
                    }
                    column(Gen__Journal_Line__Due_Date_; "Due Date")
                    {
                    }
                    column(Gen__Journal_Line_Description_Control3015; Description)
                    {
                    }
                    column(AmountDue; AmountDue)
                    {
                        AutoFormatExpression = "Currency Code";
                        AutoFormatType = 1;
                    }
                    column(AmountDiscounted; AmountDiscounted)
                    {
                        AutoFormatExpression = "Currency Code";
                        AutoFormatType = 1;
                    }
                    column(AmountPaid___AmountDiscounted___AmountPmtDiscTolerance___AmountPmtTolerance; AmountPaid - AmountDiscounted - AmountPmtDiscTolerance - AmountPmtTolerance)
                    {
                        AutoFormatExpression = "Currency Code";
                        AutoFormatType = 1;
                    }
                    column(Gen__Journal_Line__Currency_Code_; "Currency Code")
                    {
                    }
                    column(AmountPmtDiscTolerance; AmountPmtDiscTolerance)
                    {
                        AutoFormatExpression = "Currency Code";
                        AutoFormatType = 1;
                    }
                    column(AmountPmtTolerance; AmountPmtTolerance)
                    {
                        AutoFormatExpression = "Currency Code";
                        AutoFormatType = 1;
                    }
                    column(ShowApplyToOutput; ShowApplyToOutput)
                    {
                    }
                    column(TotalAmount; TotalAmount)
                    {
                    }
                    column(Amount___TotalAmountDiscounted___TotalAmountPmtDiscTolerance___TotalAmountPmtTolerance___AmountApplied; TotalAmount + TotalAmountDiscounted + TotalAmountPmtDiscTolerance + TotalAmountPmtTolerance + AmountApplied)
                    {
                        AutoFormatExpression = "Currency Code";
                        AutoFormatType = 1;
                    }
                    column(AmountApplied; AmountApplied)
                    {
                    }
                    column(Gen__Journal_Line_Amount; Amount)
                    {
                        AutoFormatExpression = "Currency Code";
                        AutoFormatType = 1;
                    }
                    column(Gen__Journal_Line__Currency_Code__Control35; "Currency Code")
                    {
                    }
                    column(STRSUBSTNO_USE003Err__Document_Type___Document_No___; StrSubstNo(USE003Lbl, "Document Type", "Document No."))
                    {
                    }
                    column(TotalAmountDiscounted; TotalAmountDiscounted)
                    {
                        AutoFormatExpression = "Currency Code";
                        AutoFormatType = 1;
                    }
                    column(TotalAmountPmtDiscTolerance; TotalAmountPmtDiscTolerance)
                    {
                        AutoFormatExpression = "Currency Code";
                        AutoFormatType = 1;
                    }
                    column(TotalAmountPmtTolerance; TotalAmountPmtTolerance)
                    {
                        AutoFormatExpression = "Currency Code";
                        AutoFormatType = 1;
                    }
                    column(Gen__Journal_Line__Amount__LCY__; "Amount (LCY)")
                    {
                    }
                    column(Gen__Journal_Line__Balance__LCY__; "Balance (LCY)")
                    {
                    }
                    column(STRSUBSTNO_USE002Err__Journal_Template_Name___Journal_Batch_Name__; StrSubstNo(USE002Lbl, "Journal Template Name", "Journal Batch Name"))
                    {
                    }
                    column(AmountLcy; AmountLcy)
                    {
                    }
                    column(AmountBalLcy; AmountBalLcy)
                    {
                    }
                    column(Gen__Journal_Line_Journal_Template_Name; "Journal Template Name")
                    {
                    }
                    column(Gen__Journal_Line_Journal_Batch_Name; "Journal Batch Name")
                    {
                    }
                    column(Gen__Journal_Line_Line_No_; "Line No.")
                    {
                    }
                    column(Gen__Journal_Line_Applies_to_ID; "Applies-to ID")
                    {
                    }
                    column(Gen__Journal_Line__Applies_to_Doc__Type_Caption; FieldCaption("Applies-to Doc. Type"))
                    {
                    }
                    column(Gen__Journal_Line__Applies_to_Doc__No__Caption; FieldCaption("Applies-to Doc. No."))
                    {
                    }
                    column(Gen__Journal_Line__Due_Date_Caption; FieldCaption("Due Date"))
                    {
                    }
                    column(Description___Caption; Description___CaptionLbl)
                    {
                    }
                    column(AmountDueCaption; AmountDueCaptionLbl)
                    {
                    }
                    column(AmountDiscountedCaption; AmountDiscountedCaptionLbl)
                    {
                    }
                    column(AmountPmtDiscToleranceCaption; AmountPmtDiscToleranceCaptionLbl)
                    {
                    }
                    column(AmountPmtToleranceCaption; AmountPmtToleranceCaptionLbl)
                    {
                    }
                    column(Unapplied_AmountsCaption; Unapplied_AmountsCaptionLbl)
                    {
                    }
                    column(Gen__Journal_Line__Amount__LCY__Caption; CaptionClassTranslate('101,0,Total (%1)'))
                    {
                    }
                    column(Gen__Journal_Line__Balance__LCY__Caption; CaptionClassTranslate('101,0,Balance (%1)'))
                    {
                    }
                    column(Cust_Vend_Name; CustVendName)
                    {
                    }
                    dataitem("Cust. Ledger Entry"; "Cust. Ledger Entry")
                    {
                        DataItemLink = "Customer No." = field("Account No."), "Applies-to ID" = field("Applies-to ID");
                        DataItemTableView = sorting("Customer No.", Open, Positive, "Due Date", "Currency Code");
                        column(Cust__Ledger_Entry__Document_Type_; "Document Type")
                        {
                        }
                        column(Cust__Ledger_Entry__Document_No__; "Document No.")
                        {
                        }
                        column(Cust__Ledger_Entry_Description; Description)
                        {
                        }
                        column(Cust__Ledger_Entry__Due_Date_; "Due Date")
                        {
                        }
                        column(Remaining_Amount_; -"Remaining Amount")
                        {
                            AutoFormatExpression = "Currency Code";
                            AutoFormatType = 1;
                        }
                        column(AmountDiscounted_Control3033; AmountDiscounted)
                        {
                            AutoFormatExpression = "Currency Code";
                            AutoFormatType = 1;
                        }
                        column(Amount_to_Apply____AmountDiscounted___AmountPmtDiscTolerance___AmountPmtTolerance_; -("Amount to Apply" + AmountDiscounted + AmountPmtDiscTolerance + AmountPmtTolerance))
                        {
                            AutoFormatExpression = "Currency Code";
                            AutoFormatType = 1;
                        }
                        column(Cust__Ledger_Entry__Currency_Code_; "Currency Code")
                        {
                        }
                        column(AmountPmtTolerance_Control3049; AmountPmtTolerance)
                        {
                            AutoFormatExpression = "Currency Code";
                            AutoFormatType = 1;
                        }
                        column(AmountPmtDiscTolerance_Control3050; AmountPmtDiscTolerance)
                        {
                            AutoFormatExpression = "Currency Code";
                            AutoFormatType = 1;
                        }
                        column(Cust__Ledger_Entry_Entry_No_; "Entry No.")
                        {
                        }
                        column(Cust__Ledger_Entry_Customer_No_; "Customer No.")
                        {
                        }
                        column(Cust__Ledger_Entry_Applies_to_ID; "Applies-to ID")
                        {
                        }

                        trigger OnAfterGetRecord()
                        begin
                            CalcFields("Remaining Amount");

                            InitPmtDisc(-"Accepted Payment Tolerance", -"Remaining Amount");
                            CalcPmtDisc(
                              Positive, "Remaining Pmt. Disc. Possible",
                              "Pmt. Discount Date" >= "Gen. Journal Line"."Posting Date", "Accepted Pmt. Disc. Tolerance",
                              TotalCustAmount);

                            AmountPaid := AmountPaid + AmountPmtTolerance + AmountDiscounted + AmountPmtDiscTolerance;
                            if "Currency Code" = "Gen. Journal Line"."Currency Code" then begin
                                TotalAmountDiscounted := TotalAmountDiscounted + AmountDiscounted;
                                AmountApplied := AmountApplied + "Amount to Apply";
                                TotalAmountPmtTolerance := TotalAmountPmtTolerance + AmountPmtTolerance;
                                TotalAmountPmtDiscTolerance := TotalAmountPmtDiscTolerance + AmountPmtDiscTolerance;
                            end else begin
                                TotalAmountDiscounted :=
                                  TotalAmountDiscounted +
                                  CurrExchRate.ExchangeAmtFCYToFCY(
                                    "Gen. Journal Line"."Posting Date",
                                    "Currency Code",
                                    "Gen. Journal Line"."Currency Code",
                                    AmountDiscounted);
                                AmountApplied :=
                                  AmountApplied +
                                  CurrExchRate.ExchangeAmtFCYToFCY(
                                    "Gen. Journal Line"."Posting Date",
                                    "Currency Code",
                                    "Gen. Journal Line"."Currency Code",
                                    "Amount to Apply");
                                TotalAmountPmtTolerance :=
                                  TotalAmountPmtTolerance +
                                  CurrExchRate.ExchangeAmtFCYToFCY(
                                    "Gen. Journal Line"."Posting Date",
                                    "Currency Code",
                                    "Gen. Journal Line"."Currency Code",
                                    AmountPmtTolerance);
                                TotalAmountPmtDiscTolerance :=
                                  TotalAmountPmtDiscTolerance +
                                  CurrExchRate.ExchangeAmtFCYToFCY(
                                    "Gen. Journal Line"."Posting Date",
                                    "Currency Code",
                                    "Gen. Journal Line"."Currency Code",
                                    AmountPmtDiscTolerance);
                            end;
                        end;

                        trigger OnPreDataItem()
                        begin
                            if ("Gen. Journal Line"."Account Type" <> "Gen. Journal Line"."Account Type"::Customer) or
                               ("Gen. Journal Line"."Applies-to ID" = '')
                            then
                                CurrReport.Break();

                            if CheckIfExistProcessedCustVendLedgerEntryApplicationGroup("Gen. Journal Line") then
                                CurrReport.Break()
                            else
                                AddProcessedCustVendLedgerEntryApplicationGroup("Gen. Journal Line");
                        end;
                    }
                    dataitem("Vendor Ledger Entry"; "Vendor Ledger Entry")
                    {
                        DataItemLink = "Vendor No." = field("Account No."), "Applies-to ID" = field("Applies-to ID");
                        DataItemTableView = sorting("Vendor No.", Open, Positive, "Due Date", "Currency Code");
                        column(Remaining_Amount__Control3035; -"Remaining Amount")
                        {
                            AutoFormatExpression = "Currency Code";
                            AutoFormatType = 1;
                        }
                        column(Amount_to_Apply____AmountDiscounted___AmountPmtDiscTolerance___AmountPmtTolerance__Control3036; -("Amount to Apply" + AmountDiscounted + AmountPmtDiscTolerance + AmountPmtTolerance))
                        {
                            AutoFormatExpression = "Currency Code";
                            AutoFormatType = 1;
                        }
                        column(AmountDiscounted_Control3037; AmountDiscounted)
                        {
                            AutoFormatExpression = "Currency Code";
                            AutoFormatType = 1;
                        }
                        column(Vendor_Ledger_Entry_Description; Description)
                        {
                        }
                        column(Vendor_Ledger_Entry__Due_Date_; "Due Date")
                        {
                        }
                        column(Vendor_Ledger_Entry__Document_No__; "Document No.")
                        {
                        }
                        column(Vendor_Ledger_Entry__Document_Type_; "Document Type")
                        {
                        }
                        column(Vendor_Ledger_Entry__Currency_Code_; "Currency Code")
                        {
                        }
                        column(AmountPmtTolerance_Control3051; AmountPmtTolerance)
                        {
                            AutoFormatExpression = "Currency Code";
                            AutoFormatType = 1;
                        }
                        column(AmountPmtDiscTolerance_Control3052; AmountPmtDiscTolerance)
                        {
                            AutoFormatExpression = "Currency Code";
                            AutoFormatType = 1;
                        }
                        column(Vendor_Ledger_Entry_Entry_No_; "Entry No.")
                        {
                        }
                        column(Vendor_Ledger_Entry_Vendor_No_; "Vendor No.")
                        {
                        }
                        column(Vendor_Ledger_Entry_Applies_to_ID; "Applies-to ID")
                        {
                        }

                        trigger OnAfterGetRecord()
                        begin
                            CalcFields("Remaining Amount");

                            InitPmtDisc(-"Accepted Payment Tolerance", -"Remaining Amount");
                            CalcPmtDisc(
                              Positive, "Remaining Pmt. Disc. Possible",
                              "Pmt. Discount Date" >= "Gen. Journal Line"."Posting Date", "Accepted Pmt. Disc. Tolerance",
                              TotalVendAmount);

                            AmountPaid := AmountPaid + AmountPmtTolerance + AmountDiscounted + AmountPmtDiscTolerance;
                            if "Currency Code" = "Gen. Journal Line"."Currency Code" then begin
                                TotalAmountDiscounted := TotalAmountDiscounted + AmountDiscounted;
                                AmountApplied := AmountApplied + "Amount to Apply";
                                TotalAmountPmtTolerance := TotalAmountPmtTolerance + AmountPmtTolerance;
                                TotalAmountPmtDiscTolerance := TotalAmountPmtDiscTolerance + AmountPmtDiscTolerance;
                            end else begin
                                TotalAmountDiscounted :=
                                  TotalAmountDiscounted +
                                  CurrExchRate.ExchangeAmtFCYToFCY(
                                    "Gen. Journal Line"."Posting Date",
                                    "Currency Code",
                                    "Gen. Journal Line"."Currency Code",
                                    AmountDiscounted);
                                AmountApplied :=
                                  AmountApplied +
                                  CurrExchRate.ExchangeAmtFCYToFCY(
                                    "Gen. Journal Line"."Posting Date",
                                    "Currency Code",
                                    "Gen. Journal Line"."Currency Code",
                                    "Amount to Apply");
                                TotalAmountPmtTolerance :=
                                  TotalAmountPmtTolerance +
                                  CurrExchRate.ExchangeAmtFCYToFCY(
                                    "Gen. Journal Line"."Posting Date",
                                    "Currency Code",
                                    "Gen. Journal Line"."Currency Code",
                                    AmountPmtTolerance);
                                TotalAmountPmtDiscTolerance :=
                                  TotalAmountPmtDiscTolerance +
                                  CurrExchRate.ExchangeAmtFCYToFCY(
                                    "Gen. Journal Line"."Posting Date",
                                    "Currency Code",
                                    "Gen. Journal Line"."Currency Code",
                                    AmountPmtDiscTolerance);
                            end;
                        end;

                        trigger OnPreDataItem()
                        begin
                            if ("Gen. Journal Line"."Account Type" <> "Gen. Journal Line"."Account Type"::Vendor) or
                               ("Gen. Journal Line"."Applies-to ID" = '')
                            then
                                CurrReport.Break();

                            if CheckIfExistProcessedCustVendLedgerEntryApplicationGroup("Gen. Journal Line") then
                                CurrReport.Break()
                            else
                                AddProcessedCustVendLedgerEntryApplicationGroup("Gen. Journal Line");
                        end;
                    }
                    dataitem(ErrorLoop; "Integer")
                    {
                        DataItemTableView = sorting(Number);
                        column(ErrorText_Number_; ErrorText[Number])
                        {
                        }
                        column(ErrorLoop_Number; Number)
                        {
                        }
                        column(ErrorText_Number_Caption; ErrorText_Number_CaptionLbl)
                        {
                        }

                        trigger OnPostDataItem()
                        begin
                            ErrorCounter := 0;
                        end;

                        trigger OnPreDataItem()
                        begin
                            if ErrorCounter <= 0 then
                                CurrReport.Break();

                            SetRange(Number, 1, ErrorCounter);
                        end;
                    }

                    trigger OnAfterGetRecord()
                    begin
                        if ("Document No." = LastDocumentNo) and ("Account Type" = LastAccountType) and ("Account No." = LastAccountNo) then
                            TotalAmount := TotalAmount + Amount
                        else begin
                            TotalAmount := Amount;
                            AmountApplied := 0;
                            TotalAmountDiscounted := 0;
                            TotalAmountPmtTolerance := 0;
                            TotalAmountPmtDiscTolerance := 0;
                        end;
                        AmountBalLcy := AmountBalLcy + "Balance (LCY)";
                        AmountLcy := AmountLcy + "Amount (LCY)";

                        if "Currency Code" = '' then
                            "Amount (LCY)" := Amount;

                        AccName := '';
                        BalAccName := '';

                        if not EmptyLine() then begin
                            MakeRecurringTexts("Gen. Journal Line");
                            AmountError := false;
                            CheckGenJnlLineErrors("Gen. Journal Line");
                        end;

                        CheckBalance();

                        AmountDiscounted := 0;
                        AmountPmtTolerance := 0;
                        AmountPmtDiscTolerance := 0;
                        for Sign := Sign::Negative to Sign::Positive do begin
                            TotalCustAmount[Sign] := 0;
                            TotalVendAmount[Sign] := 0;
                        end;
                        AmountPaid := Amount;
                        ShowApplyToOutput := false;
                        if "Applies-to Doc. No." <> '' then begin
                            ShowApplyToOutput := true;
                            case "Account Type" of
                                "Account Type"::Customer:
                                    CheckOldCustomer();
                                "Account Type"::Vendor:
                                    CheckOldVendor();
                                else
                                    ShowApplyToOutput := false;
                            end;
                        end else
                            CalcAppliesToIDTotals();
                        case "Account Type" of
                            "Account Type"::Customer:
                                if Cust.Get("Account No.") then
                                    CustVendName := Cust.Name;
                            "Account Type"::Vendor:
                                if Vend.Get("Account No.") then
                                    CustVendName := Vend.Name;
                            "Account Type"::"Bank Account":
                                if BankAcc.Get("Account No.") then
                                    CustVendName := BankAcc.Name;
                        end;

                        LastDocumentNo := "Document No.";
                        LastAccountNo := "Account No.";
                        LastAccountType := "Account Type";
                    end;

                    trigger OnPreDataItem()
                    begin
                        LastDocumentNo := '';
                        LastAccountNo := '';
                        LastAccountType := LastAccountType::"G/L Account";
                        AmountBalLcy := 0;
                        AmountLcy := 0;
                        TotalAmount := 0;

                        GenJnlTemplate.Get("Gen. Journal Batch"."Journal Template Name");
                        if GenJnlTemplate.Recurring then begin
                            if GetFilter("Posting Date") <> '' then
                                AddError(
                                  StrSubstNo(
                                    E000Err,
                                    FieldCaption("Posting Date")));
                            SetRange("Posting Date", 0D, WorkDate());
                            if GetFilter("Expiration Date") <> '' then
                                AddError(
                                  StrSubstNo(
                                    E000Err,
                                    FieldCaption("Expiration Date")));
                            SetFilter("Expiration Date", '%1 | %2..', 0D, WorkDate());
                        end;

                        if "Gen. Journal Batch"."No. Series" <> '' then begin
                            NoSeries.Get("Gen. Journal Batch"."No. Series");
                            LastEntrdDocNo := '';
                            LastEntrdDate := 0D;
                        end;

                        CurrentCustomerVendors := 0;
                        VATEntryCreated := false;

                        GenJnlLine2.Reset();
                        GenJnlLine2.CopyFilters("Gen. Journal Line");

                        TempGLAccNetChange.DeleteAll();
                        Clear(TotalAmountDiscounted);
                        Clear(TotalAmountPmtTolerance);
                        Clear(TotalAmountPmtDiscTolerance);
                        Clear(AmountApplied);
                    end;
                }
                dataitem(ReconcileLoop; "Integer")
                {
                    DataItemTableView = sorting(Number);
                    column(GLAccNetChange__No__; TempGLAccNetChange."No.")
                    {
                    }
                    column(GLAccNetChange_Name; TempGLAccNetChange.Name)
                    {
                    }
                    column(GLAccNetChange__Net_Change_in_Jnl__; TempGLAccNetChange."Net Change in Jnl.")
                    {
                    }
                    column(GLAccNetChange__Balance_after_Posting_; TempGLAccNetChange."Balance after Posting")
                    {
                    }
                    column(ReconcileLoop_Number; Number)
                    {
                    }
                    column(ReconciliationCaption; ReconciliationCaptionLbl)
                    {
                    }
                    column(GLAccNetChange__No__Caption; GLAccNetChange__No__CaptionLbl)
                    {
                    }
                    column(GLAccNetChange_NameCaption; GLAccNetChange_NameCaptionLbl)
                    {
                    }
                    column(GLAccNetChange__Net_Change_in_Jnl__Caption; GLAccNetChange__Net_Change_in_Jnl__CaptionLbl)
                    {
                    }
                    column(GLAccNetChange__Balance_after_Posting_Caption; GLAccNetChange__Balance_after_Posting_CaptionLbl)
                    {
                    }

                    trigger OnAfterGetRecord()
                    begin
                        if Number = 1 then
                            TempGLAccNetChange.Find('-')
                        else
                            TempGLAccNetChange.Next();
                    end;

                    trigger OnPostDataItem()
                    begin
                        TempGLAccNetChange.DeleteAll();
                    end;

                    trigger OnPreDataItem()
                    begin
                        SetRange(Number, 1, TempGLAccNetChange.Count);
                    end;
                }

                trigger OnPreDataItem()
                begin
                    LastDocumentNo := '';
                end;
            }

            trigger OnAfterGetRecord()
            begin
                GenJnlTemplate.Get("Journal Template Name");

                ClearProcessedCustVendLedgerEntryApplicationGroups();
            end;

            trigger OnPreDataItem()
            begin
                GLSetup.Get();
                SalesSetup.Get();
                PurchSetup.Get();
            end;
        }
    }

    requestpage
    {
        AboutTitle = 'About Vendor Pre-Payment Journal';
        AboutText = 'Check payments before you create payment files and post the journal.';
        SaveValues = true;

        layout
        {
        }

        actions
        {
        }
    }

    rendering
    {
        layout(RDLCLayout)
        {
            Type = RDLC;
            LayoutFile = './Purchases/Reports/VendorPrePaymentJournal.rdlc';
            Summary = 'Report layout made in the legacy RDLC format. Use an RDLC editor to modify the layout.';
        }
    }

    labels
    {
    }

    trigger OnPreReport()
    begin
        GenJnlLineFilter := "Gen. Journal Line".GetFilters();
        CompanyInformation.Get();
    end;

    var
        GLSetup: Record "General Ledger Setup";
        SalesSetup: Record "Sales & Receivables Setup";
        PurchSetup: Record "Purchases & Payables Setup";
        UserSetup: Record "User Setup";
        AccountingPeriod: Record "Accounting Period";
        GLAcc: Record "G/L Account";
        Currency: Record Currency;
        Cust: Record Customer;
        Vend: Record Vendor;
        BankAccPostingGr: Record "Bank Account Posting Group";
        BankAcc: Record "Bank Account";
        GenJnlTemplate: Record "Gen. Journal Template";
        GenJnlLine2: Record "Gen. Journal Line";
        TempGenJnlLine: Record "Gen. Journal Line" temporary;
        GenJnlAlloc: Record "Gen. Jnl. Allocation";
        OldCustLedgEntry: Record "Cust. Ledger Entry";
        OldVendLedgEntry: Record "Vendor Ledger Entry";
        VATPostingSetup: Record "VAT Posting Setup";
        NoSeries: Record "No. Series";
        FA: Record "Fixed Asset";
        ICPartner: Record "IC Partner";
        DeprBook: Record "Depreciation Book";
        FADeprBook: Record "FA Depreciation Book";
        FASetup: Record "FA Setup";
        TempGLAccNetChange: Record "G/L Account Net Change" temporary;
        CompanyInformation: Record "Company Information";
        CurrExchRate: Record "Currency Exchange Rate";
        TempGenJnlLineForProcessedCustVendLedgerEntryApplicationGroups: Record "Gen. Journal Line" temporary;
        GenJnlLineFilter: Text;
        AllowFAPostingFrom: Date;
        AllowFAPostingTo: Date;
        LastDate: Date;
        LastDocType: Enum "Gen. Journal Document Type";
        LastDocNo: Code[20];
        LastEntrdDocNo: Code[20];
        LastEntrdDate: Date;
        DocBalance: Decimal;
        DocBalanceReverse: Decimal;
        DateBalance: Decimal;
        DateBalanceReverse: Decimal;
        TotalBalance: Decimal;
        TotalBalanceReverse: Decimal;
        AccName: Text[100];
        LastLineNo: Integer;
        AmountError: Boolean;
        ErrorCounter: Integer;
        ErrorText: array[50] of Text[250];
        TempErrorText: Text[250];
        BalAccName: Text[100];
        CustVendName: Text[100];
        CurrentCustomerVendors: Integer;
        VATEntryCreated: Boolean;
        CustPosting: Boolean;
        VendPosting: Boolean;
        SalesPostingType: Boolean;
        PurchPostingType: Boolean;
        CurrentICPartner: Code[20];
        AmountDiscounted: Decimal;
        AmountPmtTolerance: Decimal;
        AmountPmtDiscTolerance: Decimal;
        AmountDue: Decimal;
        AmountPaid: Decimal;
        TotalAmountDiscounted: Decimal;
        TotalAmountPmtTolerance: Decimal;
        TotalAmountPmtDiscTolerance: Decimal;
        AmountApplied: Decimal;
        TotalAmount: Decimal;
        ShowApplyToOutput: Boolean;
        AmountLcy: Decimal;
        LastDocumentNo: Code[20];
        AmountBalLcy: Decimal;
        TotalCustAmount: array[2] of Decimal;
        TotalVendAmount: array[2] of Decimal;
        Sign: Option " ",Negative,Positive;
        LastAccountNo: Code[20];
        LastAccountType: Enum "Gen. Journal Account Type";

        E000Err: Label '%1 cannot be filtered when you post recurring journals.', Comment = '%1=Posting date field caption';
        E001Err: Label '%1 or %2 must be specified.', Comment = '%1=Account No. field caption; %2=Bal. Account No. field caption';
        E002Err: Label '%1 must be specified.', Comment = '%1=Gen. Posting Type field caption';
        E003Err: Label '%1 + %2 must be %3.', Comment = '%1=VAT Amount field caption;%2=VAT Base Amount field caption;%3=Amount field caption';
        E004Err: Label '%1 must be " " when %2 is %3.', Comment = '%1=Gen. Posting Type field caption;%2=Account Type field caption;%3=Account Type';
        E005Err: Label '%1, %2, %3 or %4 must not be completed when %5 is %6.', Comment = '%1=Gen. Bus. Posting Group field caption;%2=Gen. Prod. Posting Group field caption;%3=VAT Bus. Posting Group field caption;%4=VAT Prod. Posting Group field caption;%5=Account Type field caption;%6=Account Type';
        E006Err: Label '%1 must be negative.', Comment = '%1=Amount field caption';
        E007Err: Label '%1 must be positive.', Comment = '%1=Amount field caption';
        E008Err: Label '%1 must have the same sign as %2.', Comment = '%1=Sales/Purch. (LCY) field caption;%2=Amount field caption';
        E009Err: Label '%1 cannot be specified.', Comment = '%1=Project No. field caption';
        E011Err: Label '%1 + %2 must be -%3.', Comment = '%1=Bal. VAT Amount field caption;%2=Bal. VAT Base Amount field caption;%3=Amount field caption';
        E012Err: Label '%1 must have a different sign than %2.', Comment = '%1=Sales/Purch. (LCY) field caption;%2=Amount field caption';
        E013Err: Label '%1 must only be a closing date for G/L entries.', Comment = '%1=Posting Date field caption';
        E015Err: Label 'The lines are not listed according to Posting Date because they were not entered in that order.';
        E016Err: Label 'There is a gap in the number series.';
        E017Err: Label '%1 or %2 must be G/L Account or Bank Account.', Comment = '%1=Account Type field caption;%2=Bal. Account Type field caption';
        E018Err: Label '%1 must be 0.', Comment = '%1=Payment Discount % field caption';
        E019Err: Label '%1 cannot be specified when using recurring journals.', Comment = '%1=Bal. Account No. field caption';
        E020Err: Label '%1 must not be %2 when %3 = %4.', Comment = '%1=Recurring Method field caption;%2=Recurring Method;%3=Account Type field caption;%4=Account Type';
        E021Err: Label 'Allocations can only be used with recurring journals.';
        E022Err: Label 'Please specify %1 in the %2 allocation lines.', Comment = '%1=Account No. field caption;%2=GenJnlAlloc record count';
        E024Err: Label '%1 %2 posted on %3, must be separated by an empty line', Comment = '%1=Document Type;%2=Document No.;%3=Posting Date';
        E025Err: Label '%1 %2 is out of balance by %3.', Comment = '%1=LastDocType;%2=LastDocNo; %3=DocBalance';
        E026Err: Label 'The reversing entries for %1 %2 are out of balance by %3.', Comment = '%1=LastDocType;%2=LastDocNo;%3=DocBalanceReverse';
        E027Err: Label 'As of %1, the lines are out of balance by %2.', Comment = '%1=LastDate;%2=DateBalance';
        E028Err: Label 'As of %1, the reversing entries are out of balance by %2.', Comment = '%1=LastDate;%2=DateBalanceReverse';
        E029Err: Label 'The total of the lines is out of balance by %1.', Comment = '%1=Total balance';
        E030Err: Label 'The total of the reversing entries is out of balance by %1.', Comment = '%1=TotalBalanceReverse';
        E031Err: Label '%1 %2 does not exist.', Comment = '%1=G/L Account table caption;%2=Account No.';
        E032Err: Label '%1 must be %2 for %3 %4.', Comment = '%1=Blocked field caption;%2=FALSE;%3=G/L Account table caption;%4=Account No.';
        E036Err: Label '%1 %2 %3 does not exist.', Comment = '%1=VAT Posting Setup table caption;%2=VAT Bus. Posting Group;%3=VAT Prod. Posting Group';
        E037Err: Label '%1 must be %2.', Comment = '%1=VAT Calculation Type field caption;%2=VAT Calculation Type';
        E038Err: Label 'The currency %1 cannot be found. Please check the currency table.', Comment = '%1=Currency Code';
        E039Err: Label 'Sales %1 %2 already exists.', Comment = '%1=Document Type;%2=Document No.';
        E040Err: Label 'Purchase %1 %2 already exists.', Comment = '%1=Document Type;%2=Document No.';
        E041Err: Label '%1 must be entered.', Comment = '%1=External Document No. field caption';
        E042Err: Label '%1 must not be filled when %2 is different in %3 and %4.', Comment = '%1=Bank Payment Type field caption;%2=Currency Code field caption;%3=Table caption;%4=Bank Account table caption';
        E043Err: Label '%1 %2 must not have %3 = %4.', Comment = '%1=Fixed Asset table caption;%2=Account No.;%3=Budgeted Asset field caption;%4=TRUE';
        E044Err: Label '%1 must not be specified in fixed asset journal lines.', Comment = '%1=Project No.';
        E045Err: Label '%1 must be specified in fixed asset journal lines.', Comment = '%1=Depreciation Book Code field caption';
        E046Err: Label '%1 must be different than %2.', Comment = '%1=Depreciation Book Code field caption;%2=Duplicate in Depreciation Book field caption';
        E047Err: Label '%1 and %2 must not both be %3.', Comment = '%1=Account Type field caption;%2=Bal. Account Type field caption;%3=Account Type';
        E048Err: Label '%1  must not be specified when %2 = %3.', Comment = '%1=Gen. Posting Type field caption;%2=FA Posting Type field caption;%3=FA Posting Type';
        E049Err: Label '%1 must not be specified when %2 = %3.', Comment = '%1=Gen. Bus. Posting Group field caption;%2=FA Posting Type field caption;%3=FA Posting Type';
        E050Err: Label 'must not be specified together with %1 = %2.', Comment = '%1=FA Posting Type field caption;%2=FA Posting Type';
        E051Err: Label '%1 must be identical to %2.', Comment = '%1=Posting Date field caption;%2=FA Posting Date field caption';
        E052Err: Label '%1 cannot be a closing date.', Comment = '%1=FA Posting Date field caption';
        E053Err: Label '%1 is not within your range of allowed posting dates.', Comment = '%1=FA Posting Date field caption';
#pragma warning disable AA0470
        E054Err: Label 'Insurance integration is not activated for %1 %2.', Comment = 'Depreciation Book Code field caption;%2=Depreciation Book Code';
        E055Err: Label 'must not be specified when %1 is specified.', Comment = 'FA Error Entry No. field caption';
#pragma warning restore AA0470
        E056Err: Label 'When G/L integration is not activated, %1 must not be posted in the general journal.', Comment = '%1=FA Posting Type';
        E057Err: Label 'When G/L integration is not activated, %1 must not be specified in the general journal.', Comment = '%1=Some field caption';
        E058Err: Label '%1 must not be specified.', Comment = '%1=Some field caption';
        E059Err: Label 'The combination of Customer and Gen. Posting Type Purchase is not allowed.';
        E060Err: Label 'The combination of Vendor and Gen. Posting Type Sales is not allowed.';
        E061Err: Label 'The Balance and Reversing Balance recurring methods can be used only with Allocations.';
        E062Err: Label '%1 must not be 0.', Comment = '%1=Amount field caption';
        E064Err: Label '%1 %2 is already used in line %3 (%4 %5).', Comment = '%1=External Document No. field caption;%2=External Document No.;%3=Line No.;%4=Document No. field caption;%5=Document No.';
        E065Err: Label '%1 must not be blocked with type %2 when %3 is %4', Comment = '%1=Account Type;%2=Whether customer is blocked;%3=Document Type field caption;%4=Document Type';
        E066Err: Label 'You cannot enter G/L Account or Bank Account in both %1 and %2.', Comment = '%1=Account No. field caption;%2=Bal. Account No. field caption';
        E067Err: Label '%1 %2 is linked to %3 %4.', Comment = '%1=Customer table caption;%2=Account No.%3=IC Partner table caption;%4=IC Partner Code';
        E069Err: Label '%1 must not be specified when %2 is %3.', Comment = '%1=IC Partner G/L Acc. No. field caption;%2=IC Direction field caption;%3=IC Direction format';
        E070Err: Label '%1 must not be specified when the document is not an intercompany transaction.', Comment = '%1=IC Partner G/L Acc. No. field caption';
        USE001Lbl: Label 'Warning:  Checks cannot be financially voided when Force Doc. Balance is set to No in the Journal Template.';
        USE002Lbl: Label 'Totals for Journal %1, Batch %2', Comment = '%1=Journal Template Name;%2=Journal Batch Name';
        USE003Lbl: Label 'Total Amount, %1 %2', Comment = '%1=Document Type;%2=Document No.';
        Payment_Journal___Pre_Check_TestCaptionLbl: Label 'Payment Journal - Pre-Check Test';
        CurrReport_PAGENOCaptionLbl: Label 'Page';
        Gen__Journal_Batch__NameCaptionLbl: Label 'Journal Batch';
        Gen__Journal_Line__Document_Type_CaptionLbl: Label 'Type';
        Gen__Journal_Line__Document_No__CaptionLbl: Label 'Number';
        Gen__Journal_Line__Account_Type_CaptionLbl: Label 'Type';
        Gen__Journal_Line__Account_No__CaptionLbl: Label 'Number';
        Gen__Journal_Line__Bal__Account_No__CaptionLbl: Label 'Number';
        Gen__Journal_Line__Bal__Account_Type_CaptionLbl: Label 'Type';
        DocumentCaptionLbl: Label 'Document';
        AccountCaptionLbl: Label 'Account';
        Bal__AccountCaptionLbl: Label 'Bal. Account';
        Description___CaptionLbl: Label 'Description';
        AmountDueCaptionLbl: Label 'AmountDue';
        AmountDiscountedCaptionLbl: Label 'Payment Discount';
        AmountPmtDiscToleranceCaptionLbl: Label 'Pmt. Discount Tolerance';
        AmountPmtToleranceCaptionLbl: Label 'Payment Tolerance';
        Unapplied_AmountsCaptionLbl: Label 'Unapplied Amounts';
        ErrorText_Number_CaptionLbl: Label 'Warning!';
        ReconciliationCaptionLbl: Label 'Reconciliation';
        GLAccNetChange__No__CaptionLbl: Label 'No.';
        GLAccNetChange_NameCaptionLbl: Label 'Name';
        GLAccNetChange__Net_Change_in_Jnl__CaptionLbl: Label 'Net Change in Jnl.';
        GLAccNetChange__Balance_after_Posting_CaptionLbl: Label 'Balance after Posting';

    local procedure CheckRecurringLine(GenJnlLine2: Record "Gen. Journal Line")
    begin
        if GenJnlTemplate.Recurring then begin
            if GenJnlLine2."Recurring Method" = "Gen. Journal Recurring Method"::" " then
                AddError(StrSubstNo(E002Err, GenJnlLine2.FieldCaption("Recurring Method")));
            if Format(GenJnlLine2."Recurring Frequency") = '' then
                AddError(StrSubstNo(E002Err, GenJnlLine2.FieldCaption("Recurring Frequency")));
            if GenJnlLine2."Bal. Account No." <> '' then
                AddError(
                  StrSubstNo(
                    E019Err,
                    GenJnlLine2.FieldCaption("Bal. Account No.")));
            case GenJnlLine2."Recurring Method" of
                GenJnlLine2."Recurring Method"::"V  Variable", GenJnlLine2."Recurring Method"::"RV Reversing Variable",
              GenJnlLine2."Recurring Method"::"F  Fixed", GenJnlLine2."Recurring Method"::"RF Reversing Fixed":
                    WarningIfZeroAmt("Gen. Journal Line");
                GenJnlLine2."Recurring Method"::"B  Balance", GenJnlLine2."Recurring Method"::"RB Reversing Balance":
                    WarningIfNonZeroAmt("Gen. Journal Line");
            end;
            if GenJnlLine2."Recurring Method".AsInteger() > GenJnlLine2."Recurring Method"::"V  Variable".AsInteger() then begin
                if GenJnlLine2."Account Type" = GenJnlLine2."Account Type"::"Fixed Asset" then
                    AddError(
                      StrSubstNo(
                        E020Err,
                        GenJnlLine2.FieldCaption("Recurring Method"), GenJnlLine2."Recurring Method",
                        GenJnlLine2.FieldCaption("Account Type"), GenJnlLine2."Account Type"));
                if GenJnlLine2."Bal. Account Type" = GenJnlLine2."Bal. Account Type"::"Fixed Asset" then
                    AddError(
                      StrSubstNo(
                        E020Err,
                        GenJnlLine2.FieldCaption("Recurring Method"), GenJnlLine2."Recurring Method",
                        GenJnlLine2.FieldCaption("Bal. Account Type"), GenJnlLine2."Bal. Account Type"));
            end;
        end else begin
            if GenJnlLine2."Recurring Method" <> "Gen. Journal Recurring Method"::" " then
                AddError(StrSubstNo(E009Err, GenJnlLine2.FieldCaption("Recurring Method")));
            if Format(GenJnlLine2."Recurring Frequency") <> '' then
                AddError(StrSubstNo(E009Err, GenJnlLine2.FieldCaption("Recurring Frequency")));
        end;
    end;

    local procedure CheckAllocations(GenJnlLine2: Record "Gen. Journal Line")
    begin
        if GenJnlLine2."Recurring Method" in
           [GenJnlLine2."Recurring Method"::"B  Balance",
            GenJnlLine2."Recurring Method"::"RB Reversing Balance"]
        then begin
            GenJnlAlloc.Reset();
            GenJnlAlloc.SetRange("Journal Template Name", GenJnlLine2."Journal Template Name");
            GenJnlAlloc.SetRange("Journal Batch Name", GenJnlLine2."Journal Batch Name");
            GenJnlAlloc.SetRange("Journal Line No.", GenJnlLine2."Line No.");
            if not GenJnlAlloc.FindFirst() then
                AddError(E061Err);
        end;

        GenJnlAlloc.Reset();
        GenJnlAlloc.SetRange("Journal Template Name", GenJnlLine2."Journal Template Name");
        GenJnlAlloc.SetRange("Journal Batch Name", GenJnlLine2."Journal Batch Name");
        GenJnlAlloc.SetRange("Journal Line No.", GenJnlLine2."Line No.");
        GenJnlAlloc.SetFilter(Amount, '<>0');
        if GenJnlAlloc.FindFirst() then
            if not GenJnlTemplate.Recurring then
                AddError(E021Err)
            else begin
                GenJnlAlloc.SetRange("Account No.", '');
                if GenJnlAlloc.FindFirst() then
                    AddError(
                      StrSubstNo(
                        E022Err,
                        GenJnlAlloc.FieldCaption("Account No."), GenJnlAlloc.Count));
            end;
    end;

    local procedure MakeRecurringTexts(var GenJnlLine2: Record "Gen. Journal Line")
    begin
        if (GenJnlLine2."Posting Date" <> 0D) and (GenJnlLine2."Account No." <> '') and (GenJnlLine2."Recurring Method" <> "Gen. Journal Recurring Method"::" ") then
            AccountingPeriod.MakeRecurringTexts(GenJnlLine2."Posting Date", GenJnlLine2."Document No.", GenJnlLine2.Description);
    end;

    local procedure CheckBalance()
    var
        GenJnlLine: Record "Gen. Journal Line";
        NextGenJnlLine: Record "Gen. Journal Line";
    begin
        GenJnlLine := "Gen. Journal Line";
        LastLineNo := "Gen. Journal Line"."Line No.";
        if "Gen. Journal Line".Next() = 0 then;
        NextGenJnlLine := "Gen. Journal Line";
        MakeRecurringTexts(NextGenJnlLine);
        "Gen. Journal Line" := GenJnlLine;
        if not GenJnlLine.EmptyLine() then begin
            DocBalance := DocBalance + GenJnlLine."Balance (LCY)";
            DateBalance := DateBalance + GenJnlLine."Balance (LCY)";
            TotalBalance := TotalBalance + GenJnlLine."Balance (LCY)";
            if GenJnlLine."Recurring Method".AsInteger() >= GenJnlLine."Recurring Method"::"RF Reversing Fixed".AsInteger() then begin
                DocBalanceReverse := DocBalanceReverse + GenJnlLine."Balance (LCY)";
                DateBalanceReverse := DateBalanceReverse + GenJnlLine."Balance (LCY)";
                TotalBalanceReverse := TotalBalanceReverse + GenJnlLine."Balance (LCY)";
            end;
            LastDocType := GenJnlLine."Document Type";
            LastDocNo := GenJnlLine."Document No.";
            LastDate := GenJnlLine."Posting Date";
            if TotalBalance = 0 then begin
                CurrentCustomerVendors := 0;
                VATEntryCreated := false;
            end;
            if GenJnlTemplate."Force Doc. Balance" then begin
                VATEntryCreated :=
                  VATEntryCreated or
                  ((GenJnlLine."Account Type" = GenJnlLine."Account Type"::"G/L Account") and (GenJnlLine."Account No." <> '') and
                   (GenJnlLine."Gen. Posting Type" in [GenJnlLine."Gen. Posting Type"::Purchase, GenJnlLine."Gen. Posting Type"::Sale])) or
                  ((GenJnlLine."Bal. Account Type" = GenJnlLine."Bal. Account Type"::"G/L Account") and (GenJnlLine."Bal. Account No." <> '') and
                   (GenJnlLine."Bal. Gen. Posting Type" in [GenJnlLine."Bal. Gen. Posting Type"::Purchase, GenJnlLine."Bal. Gen. Posting Type"::Sale]));
                if ((GenJnlLine."Account Type" in [GenJnlLine."Account Type"::Customer, GenJnlLine."Account Type"::Vendor]) and
                    (GenJnlLine."Account No." <> '')) or
                   ((GenJnlLine."Bal. Account Type" in [GenJnlLine."Bal. Account Type"::Customer, GenJnlLine."Bal. Account Type"::Vendor]) and
                    (GenJnlLine."Bal. Account No." <> ''))
                then
                    CurrentCustomerVendors := CurrentCustomerVendors + 1;
                if (CurrentCustomerVendors > 1) and VATEntryCreated then
                    AddError(
                      StrSubstNo(
                        E024Err,
                        GenJnlLine."Document Type", GenJnlLine."Document No.", GenJnlLine."Posting Date"));
            end;
        end;

        if (LastDate <> 0D) and (LastDocNo <> '') and
           ((NextGenJnlLine."Posting Date" <> LastDate) or
            (NextGenJnlLine."Document Type" <> LastDocType) or
            (NextGenJnlLine."Document No." <> LastDocNo) or
            (NextGenJnlLine."Line No." = LastLineNo))
        then begin
            if GenJnlTemplate."Force Doc. Balance" then begin
                case true of
                    DocBalance <> 0:
                        AddError(StrSubstNo(E025Err, LastDocType, LastDocNo, DocBalance));
                    DocBalanceReverse <> 0:
                        AddError(StrSubstNo(E026Err, LastDocType, LastDocNo, DocBalanceReverse));
                end;
                DocBalance := 0;
                DocBalanceReverse := 0;
            end;
            if (NextGenJnlLine."Posting Date" <> LastDate) or
               (NextGenJnlLine."Document Type" <> LastDocType) or (NextGenJnlLine."Document No." <> LastDocNo)
            then begin
                CurrentCustomerVendors := 0;
                VATEntryCreated := false;
                CustPosting := false;
                VendPosting := false;
                SalesPostingType := false;
                PurchPostingType := false;
            end;
        end;

        if (LastDate <> 0D) and ((NextGenJnlLine."Posting Date" <> LastDate) or (NextGenJnlLine."Line No." = LastLineNo)) then begin
            case true of
                DateBalance <> 0:
                    AddError(
                      StrSubstNo(
                        E027Err,
                        LastDate, DateBalance));
                DateBalanceReverse <> 0:
                    AddError(
                      StrSubstNo(
                        E028Err,
                        LastDate, DateBalanceReverse));
            end;
            DocBalance := 0;
            DocBalanceReverse := 0;
            DateBalance := 0;
            DateBalanceReverse := 0;
        end;

        if NextGenJnlLine."Line No." = LastLineNo then begin
            case true of
                TotalBalance <> 0:
                    AddError(
                      StrSubstNo(
                        E029Err,
                        TotalBalance));
                TotalBalanceReverse <> 0:
                    AddError(
                      StrSubstNo(
                        E030Err,
                        TotalBalanceReverse));
            end;
            DocBalance := 0;
            DocBalanceReverse := 0;
            DateBalance := 0;
            DateBalanceReverse := 0;
            TotalBalance := 0;
            TotalBalanceReverse := 0;
            LastDate := 0D;
            LastDocType := LastDocType::" ";
            LastDocNo := '';
        end;
    end;

    local procedure AddError(Text: Text[250])
    begin
        ErrorCounter := ErrorCounter + 1;
        ErrorText[ErrorCounter] := Text;
    end;

    local procedure AddConditionalError(Condition: Boolean; Text: Text[250])
    begin
        if Condition then
            AddError(Text);
    end;

    local procedure ReconcileGLAccNo(GLAccNo: Code[20]; ReconcileAmount: Decimal)
    begin
        if not TempGLAccNetChange.Get(GLAccNo) then begin
            GLAcc.Get(GLAccNo);
            GLAcc.CalcFields("Balance at Date");
            TempGLAccNetChange.Init();
            TempGLAccNetChange."No." := GLAcc."No.";
            TempGLAccNetChange.Name := GLAcc.Name;
            TempGLAccNetChange."Balance after Posting" := GLAcc."Balance at Date";
            TempGLAccNetChange.Insert();
        end;
        TempGLAccNetChange."Net Change in Jnl." := TempGLAccNetChange."Net Change in Jnl." + ReconcileAmount;
        TempGLAccNetChange."Balance after Posting" := TempGLAccNetChange."Balance after Posting" + ReconcileAmount;
        TempGLAccNetChange.Modify();
    end;

    local procedure CheckGLAcc(var GenJnlLine: Record "Gen. Journal Line"; var AccName: Text[100])
    begin
        if not GLAcc.Get(GenJnlLine."Account No.") then
            AddError(
              StrSubstNo(
                E031Err,
                GLAcc.TableCaption(), GenJnlLine."Account No."))
        else begin
            AccName := GLAcc.Name;

            if GLAcc.Blocked then
                AddError(
                  StrSubstNo(
                    E032Err,
                    GLAcc.FieldCaption(Blocked), false, GLAcc.TableCaption(), GenJnlLine."Account No."));
            if GLAcc."Account Type" <> GLAcc."Account Type"::Posting then begin
                GLAcc."Account Type" := GLAcc."Account Type"::Posting;
                AddError(
                  StrSubstNo(
                    E032Err,
                    GLAcc.FieldCaption("Account Type"), GLAcc."Account Type", GLAcc.TableCaption(), GenJnlLine."Account No."));
            end;
            if not GenJnlLine."System-Created Entry" then
                if GenJnlLine."Posting Date" = NormalDate(GenJnlLine."Posting Date") then
                    if not GLAcc."Direct Posting" then
                        AddError(
                          StrSubstNo(
                            E032Err,
                            GLAcc.FieldCaption("Direct Posting"), true, GLAcc.TableCaption(), GenJnlLine."Account No."));

            if GenJnlLine."Gen. Posting Type" <> GenJnlLine."Gen. Posting Type"::" " then begin
                case GenJnlLine."Gen. Posting Type" of
                    GenJnlLine."Gen. Posting Type"::Sale:
                        SalesPostingType := true;
                    GenJnlLine."Gen. Posting Type"::Purchase:
                        PurchPostingType := true;
                end;
                TestPostingType();

                if not VATPostingSetup.Get(GenJnlLine."VAT Bus. Posting Group", GenJnlLine."VAT Prod. Posting Group") then
                    AddError(
                      StrSubstNo(
                        E036Err,
                        VATPostingSetup.TableCaption(), GenJnlLine."VAT Bus. Posting Group", GenJnlLine."VAT Prod. Posting Group"))
                else
                    if GenJnlLine."VAT Calculation Type" <> VATPostingSetup."VAT Calculation Type" then
                        AddError(
                          StrSubstNo(
                            E037Err,
                            GenJnlLine.FieldCaption("VAT Calculation Type"), VATPostingSetup."VAT Calculation Type"))
            end;

            if GLAcc."Reconciliation Account" then
                ReconcileGLAccNo(GenJnlLine."Account No.", Round(GenJnlLine."Amount (LCY)" / (1 + GenJnlLine."VAT %" / 100)));
        end;
    end;

    local procedure CheckCust(var GenJnlLine: Record "Gen. Journal Line"; var AccName: Text[100])
    begin
        if not Cust.Get(GenJnlLine."Account No.") then
            AddError(
              StrSubstNo(
                E031Err,
                Cust.TableCaption(), GenJnlLine."Account No."))
        else begin
            AccName := Cust.Name;
            if Cust."Privacy Blocked" then
                AddError(Cust.GetPrivacyBlockedGenericErrorText(Cust));
            if ((Cust.Blocked = Cust.Blocked::All) or
                ((Cust.Blocked in [Cust.Blocked::Invoice, Cust.Blocked::Ship]) and
                 (GenJnlLine."Document Type" in [GenJnlLine."Document Type"::Invoice, GenJnlLine."Document Type"::" "]))
                )
            then
                AddError(
                  StrSubstNo(
                    E065Err,
                    GenJnlLine."Account Type", Cust.Blocked, GenJnlLine.FieldCaption("Document Type"), GenJnlLine."Document Type"));
            if GenJnlLine."Currency Code" <> '' then
                if not Currency.Get(GenJnlLine."Currency Code") then
                    AddError(
                      StrSubstNo(
                        E038Err,
                        GenJnlLine."Currency Code"));
            if (Cust."IC Partner Code" <> '') and (GenJnlTemplate.Type = GenJnlTemplate.Type::Intercompany) then
                if ICPartner.Get(Cust."IC Partner Code") then begin
                    if ICPartner.Blocked then
                        AddError(
                          StrSubstNo(
                            '%1 %2',
                            StrSubstNo(
                              E067Err,
                              Cust.TableCaption(), GenJnlLine."Account No.", ICPartner.TableCaption(), GenJnlLine."IC Partner Code"),
                            StrSubstNo(
                              E032Err,
                              ICPartner.FieldCaption(Blocked), false, ICPartner.TableCaption(), Cust."IC Partner Code")));
                end else
                    AddError(
                      StrSubstNo(
                        '%1 %2',
                        StrSubstNo(
                          E067Err,
                          Cust.TableCaption(), GenJnlLine."Account No.", ICPartner.TableCaption(), Cust."IC Partner Code"),
                        StrSubstNo(
                          E031Err,
                          ICPartner.TableCaption(), Cust."IC Partner Code")));
            CustPosting := true;
            TestPostingType();

            if GenJnlLine."Recurring Method" = "Gen. Journal Recurring Method"::" " then
                if GenJnlLine."Document Type" in
                   [GenJnlLine."Document Type"::Invoice, GenJnlLine."Document Type"::"Credit Memo",
                    GenJnlLine."Document Type"::"Finance Charge Memo", GenJnlLine."Document Type"::Reminder]
                then begin
                    OldCustLedgEntry.Reset();
                    OldCustLedgEntry.SetCurrentKey("Document No.", "Document Type", "Customer No.");
                    OldCustLedgEntry.SetRange("Document Type", GenJnlLine."Document Type");
                    OldCustLedgEntry.SetRange("Document No.", GenJnlLine."Document No.");
                    if OldCustLedgEntry.FindFirst() then
                        AddError(
                          StrSubstNo(
                            E039Err, GenJnlLine."Document Type", GenJnlLine."Document No."));

                    if SalesSetup."Ext. Doc. No. Mandatory" or
                       (GenJnlLine."External Document No." <> '')
                    then begin
                        if GenJnlLine."External Document No." = '' then
                            AddError(
                              StrSubstNo(
                                E041Err, GenJnlLine.FieldCaption("External Document No.")));

                        OldCustLedgEntry.Reset();
                        OldCustLedgEntry.SetCurrentKey("Document Type", "External Document No.", "Customer No.");
                        OldCustLedgEntry.SetRange("Document Type", GenJnlLine."Document Type");
                        OldCustLedgEntry.SetRange("Customer No.", GenJnlLine."Account No.");
                        OldCustLedgEntry.SetRange("External Document No.", GenJnlLine."External Document No.");
                        if OldCustLedgEntry.FindFirst() then
                            AddError(
                              StrSubstNo(
                                E039Err,
                                GenJnlLine."Document Type", GenJnlLine."External Document No."));
                        CheckAgainstPrevLines("Gen. Journal Line");
                    end;
                end;
        end;
    end;

    local procedure CheckVend(var GenJnlLine: Record "Gen. Journal Line"; var AccName: Text[100])
    var
        VendorMgt: Codeunit "Vendor Mgt.";
    begin
        if not Vend.Get(GenJnlLine."Account No.") then
            AddError(
              StrSubstNo(
                E031Err,
                Vend.TableCaption(), GenJnlLine."Account No."))
        else begin
            AccName := Vend.Name;

            if Vend."Privacy Blocked" then
                AddError(Vend.GetPrivacyBlockedGenericErrorText(Vend));

            if ((Vend.Blocked = Vend.Blocked::All) or
                ((Vend.Blocked = Vend.Blocked::Payment) and (GenJnlLine."Document Type" = GenJnlLine."Document Type"::Payment))
                )
            then
                AddError(
                  StrSubstNo(
                    E065Err,
                    GenJnlLine."Account Type", Vend.Blocked, GenJnlLine.FieldCaption("Document Type"), GenJnlLine."Document Type"));

            if GenJnlLine."Currency Code" <> '' then
                if not Currency.Get(GenJnlLine."Currency Code") then
                    AddError(
                      StrSubstNo(
                        E038Err,
                        GenJnlLine."Currency Code"));

            if (Vend."IC Partner Code" <> '') and (GenJnlTemplate.Type = GenJnlTemplate.Type::Intercompany) then
                if ICPartner.Get(Cust."IC Partner Code") then begin
                    if ICPartner.Blocked then
                        AddError(
                          StrSubstNo(
                            '%1 %2',
                            StrSubstNo(
                              E067Err,
                              Vend.TableCaption(), GenJnlLine."Account No.", ICPartner.TableCaption(), Vend."IC Partner Code"),
                            StrSubstNo(
                              E032Err,
                              ICPartner.FieldCaption(Blocked), false, ICPartner.TableCaption(), Vend."IC Partner Code")));
                end else
                    AddError(
                      StrSubstNo(
                        '%1 %2',
                        StrSubstNo(
                          E067Err,
                          Vend.TableCaption(), GenJnlLine."Account No.", ICPartner.TableCaption(), GenJnlLine."IC Partner Code"),
                        StrSubstNo(
                          E031Err,
                          ICPartner.TableCaption(), Vend."IC Partner Code")));
            VendPosting := true;
            TestPostingType();

            if GenJnlLine."Recurring Method" = "Gen. Journal Recurring Method"::" " then
                if GenJnlLine."Document Type" in
                   [GenJnlLine."Document Type"::Invoice, GenJnlLine."Document Type"::"Credit Memo",
                    GenJnlLine."Document Type"::"Finance Charge Memo", GenJnlLine."Document Type"::Reminder]
                then begin
                    OldVendLedgEntry.Reset();
                    OldVendLedgEntry.SetCurrentKey("Document No.", "Document Type", "Vendor No.");
                    OldVendLedgEntry.SetRange("Document Type", GenJnlLine."Document Type");
                    OldVendLedgEntry.SetRange("Document No.", GenJnlLine."Document No.");
                    if OldVendLedgEntry.FindFirst() then
                        AddError(
                          StrSubstNo(
                            E040Err,
                            GenJnlLine."Document Type", GenJnlLine."Document No."));

                    if PurchSetup."Ext. Doc. No. Mandatory" or
                       (GenJnlLine."External Document No." <> '')
                    then begin
                        if GenJnlLine."External Document No." = '' then
                            AddError(
                              StrSubstNo(
                                E041Err, GenJnlLine.FieldCaption("External Document No.")));

                        OldVendLedgEntry.Reset();
                        OldVendLedgEntry.SetCurrentKey("External Document No.", "Document Type", "Vendor No.");
                        VendorMgt.SetFilterForExternalDocNo(
                          OldVendLedgEntry, GenJnlLine."Document Type", GenJnlLine."External Document No.", GenJnlLine."Account No.", GenJnlLine."Document Date");
                        if OldVendLedgEntry.FindFirst() then
                            AddError(
                              StrSubstNo(
                                E040Err,
                                GenJnlLine."Document Type", GenJnlLine."External Document No."));
                        CheckAgainstPrevLines("Gen. Journal Line");
                    end;
                end;
        end;
    end;

    local procedure CheckBankAcc(var GenJnlLine: Record "Gen. Journal Line"; var AccName: Text[100])
    begin
        if not BankAcc.Get(GenJnlLine."Account No.") then
            AddError(
              StrSubstNo(
                E031Err,
                BankAcc.TableCaption(), GenJnlLine."Account No."))
        else begin
            AccName := BankAcc.Name;

            if BankAcc.Blocked then
                AddError(
                  StrSubstNo(
                    E032Err,
                    BankAcc.FieldCaption(Blocked), false, BankAcc.TableCaption(), GenJnlLine."Account No."));
            if (GenJnlLine."Currency Code" <> BankAcc."Currency Code") and (BankAcc."Currency Code" <> '') then
                AddError(
                  StrSubstNo(
                    E037Err,
                    GenJnlLine.FieldCaption("Currency Code"), BankAcc."Currency Code"));

            if GenJnlLine."Currency Code" <> '' then
                if not Currency.Get(GenJnlLine."Currency Code") then
                    AddError(
                      StrSubstNo(
                        E038Err,
                        GenJnlLine."Currency Code"));

            if GenJnlLine."Bank Payment Type" <> GenJnlLine."Bank Payment Type"::" " then
                if (GenJnlLine."Bank Payment Type" = GenJnlLine."Bank Payment Type"::"Computer Check") and (GenJnlLine.Amount < 0) then
                    if BankAcc."Currency Code" <> GenJnlLine."Currency Code" then
                        AddError(
                          StrSubstNo(
                            E042Err,
                            GenJnlLine.FieldCaption("Bank Payment Type"), GenJnlLine.FieldCaption("Currency Code"),
                            GenJnlLine.TableCaption, BankAcc.TableCaption()));

            if BankAccPostingGr.Get(BankAcc."Bank Acc. Posting Group") then
                if BankAccPostingGr."G/L Account No." <> '' then
                    ReconcileGLAccNo(
                      BankAccPostingGr."G/L Account No.",
                      Round(GenJnlLine."Amount (LCY)" / (1 + GenJnlLine."VAT %" / 100)));
        end;
    end;

    local procedure CheckFixedAsset(var GenJnlLine: Record "Gen. Journal Line"; var AccName: Text[100])
    begin
        if not FA.Get(GenJnlLine."Account No.") then
            AddError(
              StrSubstNo(
                E031Err,
                FA.TableCaption(), GenJnlLine."Account No."))
        else begin
            AccName := FA.Description;
            if FA.Blocked then
                AddError(
                  StrSubstNo(
                    E032Err,
                    FA.FieldCaption(Blocked), false, FA.TableCaption(), GenJnlLine."Account No."));
            if FA.Inactive then
                AddError(
                  StrSubstNo(
                    E032Err,
                    FA.FieldCaption(Inactive), false, FA.TableCaption(), GenJnlLine."Account No."));
            if FA."Budgeted Asset" then
                AddError(
                  StrSubstNo(
                    E043Err,
                    FA.TableCaption(), GenJnlLine."Account No.", FA.FieldCaption("Budgeted Asset"), true));
            if DeprBook.Get(GenJnlLine."Depreciation Book Code") then
                CheckFAIntegration(GenJnlLine)
            else
                AddError(
                  StrSubstNo(
                    E031Err,
                    DeprBook.TableCaption(), GenJnlLine."Depreciation Book Code"));
            if not FADeprBook.Get(FA."No.", GenJnlLine."Depreciation Book Code") then
                AddError(
                  StrSubstNo(
                    E036Err,
                    FADeprBook.TableCaption(), FA."No.", GenJnlLine."Depreciation Book Code"));
        end;
    end;

    procedure CheckICPartner(var GenJnlLine: Record "Gen. Journal Line"; var AccName: Text[100])
    begin
        if not ICPartner.Get(GenJnlLine."Account No.") then
            AddError(
              StrSubstNo(
                E031Err,
                ICPartner.TableCaption(), GenJnlLine."Account No."))
        else begin
            AccName := ICPartner.Name;
            if ICPartner.Blocked then
                AddError(
                  StrSubstNo(
                    E032Err,
                    ICPartner.FieldCaption(Blocked), false, ICPartner.TableCaption(), GenJnlLine."Account No."));
        end;
    end;

    local procedure TestFixedAsset(var GenJnlLine: Record "Gen. Journal Line")
    begin
        case true of
            GenJnlLine."Job No." <> '':
                AddError(StrSubstNo(E044Err, GenJnlLine.FieldCaption("Job No.")));
            GenJnlLine."FA Posting Type" = GenJnlLine."FA Posting Type"::" ":
                AddError(StrSubstNo(E045Err, GenJnlLine.FieldCaption("FA Posting Type")));
            GenJnlLine."Depreciation Book Code" = '':
                AddError(StrSubstNo(E045Err, GenJnlLine.FieldCaption("Depreciation Book Code")));
            GenJnlLine."Depreciation Book Code" = GenJnlLine."Duplicate in Depreciation Book":
                AddError(
                  StrSubstNo(
                    E046Err, GenJnlLine.FieldCaption("Depreciation Book Code"), GenJnlLine.FieldCaption("Duplicate in Depreciation Book")));
            GenJnlLine."Account Type" = GenJnlLine."Bal. Account Type":
                AddError(
                  StrSubstNo(E047Err, GenJnlLine.FieldCaption("Account Type"), GenJnlLine.FieldCaption("Bal. Account Type"), GenJnlLine."Account Type"));
        end;
        if GenJnlLine."Account Type" = GenJnlLine."Account Type"::"Fixed Asset" then
            if GenJnlLine."FA Posting Type" in
               [GenJnlLine."FA Posting Type"::"Acquisition Cost", GenJnlLine."FA Posting Type"::Disposal, GenJnlLine."FA Posting Type"::Maintenance]
            then begin
                if ((GenJnlLine."Gen. Bus. Posting Group" <> '') or (GenJnlLine."Gen. Prod. Posting Group" <> '')) and
                   (GenJnlLine."Gen. Posting Type" = GenJnlLine."Gen. Posting Type"::" ")
                then
                    AddError(StrSubstNo(E002Err, GenJnlLine.FieldCaption("Gen. Posting Type")));
            end else begin
                AddConditionalError(
                  GenJnlLine."Gen. Posting Type" <> GenJnlLine."Gen. Posting Type"::" ",
                  StrSubstNo(
                    E048Err,
                    GenJnlLine.FieldCaption("Gen. Posting Type"), GenJnlLine.FieldCaption("FA Posting Type"), GenJnlLine."FA Posting Type"));
                AddConditionalError(
                  GenJnlLine."Gen. Bus. Posting Group" <> '',
                  StrSubstNo(
                    E049Err,
                    GenJnlLine.FieldCaption("Gen. Bus. Posting Group"), GenJnlLine.FieldCaption("FA Posting Type"), GenJnlLine."FA Posting Type"));
                AddConditionalError(
                  GenJnlLine."Gen. Prod. Posting Group" <> '',
                  StrSubstNo(
                    E049Err,
                    GenJnlLine.FieldCaption("Gen. Prod. Posting Group"), GenJnlLine.FieldCaption("FA Posting Type"), GenJnlLine."FA Posting Type"));
            end;
        if GenJnlLine."Bal. Account Type" = GenJnlLine."Bal. Account Type"::"Fixed Asset" then
            if GenJnlLine."FA Posting Type" in
               [GenJnlLine."FA Posting Type"::"Acquisition Cost", GenJnlLine."FA Posting Type"::Disposal, GenJnlLine."FA Posting Type"::Maintenance]
            then begin
                if (GenJnlLine."Bal. Gen. Bus. Posting Group" <> '') or (GenJnlLine."Bal. Gen. Prod. Posting Group" <> '') then
                    if GenJnlLine."Bal. Gen. Posting Type" = GenJnlLine."Bal. Gen. Posting Type"::" " then
                        AddError(StrSubstNo(E002Err, GenJnlLine.FieldCaption("Bal. Gen. Posting Type")));
            end else begin
                AddConditionalError(
                  GenJnlLine."Bal. Gen. Posting Type" <> GenJnlLine."Bal. Gen. Posting Type"::" ",
                  StrSubstNo(
                    E049Err,
                    GenJnlLine.FieldCaption("Bal. Gen. Posting Type"), GenJnlLine.FieldCaption("FA Posting Type"), GenJnlLine."FA Posting Type"));
                AddConditionalError(
                  GenJnlLine."Bal. Gen. Bus. Posting Group" <> '',
                  StrSubstNo(
                    E049Err,
                    GenJnlLine.FieldCaption("Bal. Gen. Bus. Posting Group"), GenJnlLine.FieldCaption("FA Posting Type"), GenJnlLine."FA Posting Type"));
                AddConditionalError(
                  GenJnlLine."Bal. Gen. Prod. Posting Group" <> '',
                  StrSubstNo(
                    E049Err,
                    GenJnlLine.FieldCaption("Bal. Gen. Prod. Posting Group"), GenJnlLine.FieldCaption("FA Posting Type"), GenJnlLine."FA Posting Type"));
            end;
        TempErrorText := '%1 ' + StrSubstNo(E050Err, GenJnlLine.FieldCaption("FA Posting Type"), GenJnlLine."FA Posting Type");
        if GenJnlLine."FA Posting Type" <> GenJnlLine."FA Posting Type"::"Acquisition Cost" then begin
            AddConditionalError(GenJnlLine."Depr. Acquisition Cost", StrSubstNo(TempErrorText, GenJnlLine.FieldCaption("Depr. Acquisition Cost")));
            AddConditionalError(GenJnlLine."Salvage Value" <> 0, StrSubstNo(TempErrorText, GenJnlLine.FieldCaption("Salvage Value")));
            AddConditionalError(
              (GenJnlLine."FA Posting Type" <> GenJnlLine."FA Posting Type"::Maintenance) and (GenJnlLine.Quantity <> 0),
              StrSubstNo(TempErrorText, GenJnlLine.FieldCaption(Quantity)));
            AddConditionalError(GenJnlLine."Insurance No." <> '', StrSubstNo(TempErrorText, GenJnlLine.FieldCaption("Insurance No.")));
        end;
        if (GenJnlLine."FA Posting Type" = GenJnlLine."FA Posting Type"::Maintenance) and GenJnlLine."Depr. until FA Posting Date" then
            AddError(StrSubstNo(TempErrorText, GenJnlLine.FieldCaption("Depr. until FA Posting Date")));
        if (GenJnlLine."FA Posting Type" <> GenJnlLine."FA Posting Type"::Maintenance) and (GenJnlLine."Maintenance Code" <> '') then
            AddError(StrSubstNo(TempErrorText, GenJnlLine.FieldCaption("Maintenance Code")));

        if (GenJnlLine."FA Posting Type" <> GenJnlLine."FA Posting Type"::Depreciation) and
           (GenJnlLine."FA Posting Type" <> GenJnlLine."FA Posting Type"::"Custom 1") and
           (GenJnlLine."No. of Depreciation Days" <> 0)
        then
            AddError(StrSubstNo(TempErrorText, GenJnlLine.FieldCaption("No. of Depreciation Days")));

        if GenJnlLine."FA Posting Type" = GenJnlLine."FA Posting Type"::Disposal then begin
            AddConditionalError(GenJnlLine."FA Reclassification Entry", StrSubstNo(TempErrorText, GenJnlLine.FieldCaption("FA Reclassification Entry")));
            AddConditionalError(GenJnlLine."Budgeted FA No." <> '', StrSubstNo(TempErrorText, GenJnlLine.FieldCaption("Budgeted FA No.")));
        end;

        if GenJnlLine."FA Posting Date" = 0D then
            GenJnlLine."FA Posting Date" := GenJnlLine."Posting Date";
        if DeprBook.Get(GenJnlLine."Depreciation Book Code") and
           DeprBook."Use Same FA+G/L Posting Dates" and
           (GenJnlLine."Posting Date" <> GenJnlLine."FA Posting Date")
        then
            AddError(StrSubstNo(E051Err, GenJnlLine.FieldCaption("Posting Date"), GenJnlLine.FieldCaption("FA Posting Date")));
        if GenJnlLine."FA Posting Date" <> 0D then begin
            AddConditionalError(GenJnlLine."FA Posting Date" <> NormalDate(GenJnlLine."FA Posting Date"), StrSubstNo(E052Err, GenJnlLine.FieldCaption("FA Posting Date")));
            AddConditionalError(
              not (GenJnlLine."FA Posting Date" in [DMY2Date(1, 1, 1) .. DMY2Date(31, 12, 9998)]), StrSubstNo(E053Err, GenJnlLine.FieldCaption("FA Posting Date")));
            if (AllowFAPostingFrom = 0D) and (AllowFAPostingTo = 0D) then begin
                if UserId <> '' then
                    if UserSetup.Get(UserId) then begin
                        AllowFAPostingFrom := UserSetup."Allow FA Posting From";
                        AllowFAPostingTo := UserSetup."Allow FA Posting To";
                    end;
                if (AllowFAPostingFrom = 0D) and (AllowFAPostingTo = 0D) then begin
                    FASetup.Get();
                    AllowFAPostingFrom := FASetup."Allow FA Posting From";
                    AllowFAPostingTo := FASetup."Allow FA Posting To";
                end;
                if AllowFAPostingTo = 0D then
                    AllowFAPostingTo := DMY2Date(31, 12, 9999);
            end;
            AddConditionalError(
              (GenJnlLine."FA Posting Date" < AllowFAPostingFrom) or
              (GenJnlLine."FA Posting Date" > AllowFAPostingTo),
              StrSubstNo(E053Err, GenJnlLine.FieldCaption("FA Posting Date")));
        end;
        FASetup.Get();
        if (GenJnlLine."FA Posting Type" = GenJnlLine."FA Posting Type"::"Acquisition Cost") and
           (GenJnlLine."Insurance No." <> '') and (GenJnlLine."Depreciation Book Code" <> FASetup."Insurance Depr. Book")
        then
            AddError(StrSubstNo(E054Err, GenJnlLine.FieldCaption("Depreciation Book Code"), GenJnlLine."Depreciation Book Code"));

        if GenJnlLine."FA Error Entry No." > 0 then begin
            TempErrorText := '%1 ' + StrSubstNo(E055Err, GenJnlLine.FieldCaption("FA Error Entry No."));
            AddConditionalError(GenJnlLine."Depr. until FA Posting Date", StrSubstNo(TempErrorText, GenJnlLine.FieldCaption("Depr. until FA Posting Date")));
            AddConditionalError(GenJnlLine."Depr. Acquisition Cost", StrSubstNo(TempErrorText, GenJnlLine.FieldCaption("Depr. Acquisition Cost")));
            AddConditionalError(
              GenJnlLine."Duplicate in Depreciation Book" <> '',
              StrSubstNo(TempErrorText, GenJnlLine.FieldCaption("Duplicate in Depreciation Book")));
            AddConditionalError(GenJnlLine."Use Duplication List", StrSubstNo(TempErrorText, GenJnlLine.FieldCaption("Use Duplication List")));
            AddConditionalError(GenJnlLine."Salvage Value" <> 0, StrSubstNo(TempErrorText, GenJnlLine.FieldCaption("Salvage Value")));
            AddConditionalError(GenJnlLine."Insurance No." <> '', StrSubstNo(TempErrorText, GenJnlLine.FieldCaption("Insurance No.")));
            AddConditionalError(GenJnlLine."Budgeted FA No." <> '', StrSubstNo(TempErrorText, GenJnlLine.FieldCaption("Budgeted FA No.")));
            AddConditionalError(GenJnlLine."Recurring Method".AsInteger() > 0, StrSubstNo(TempErrorText, GenJnlLine.FieldCaption("Recurring Method")));
            AddConditionalError(GenJnlLine."FA Posting Type" = GenJnlLine."FA Posting Type"::Maintenance, StrSubstNo(TempErrorText, GenJnlLine."FA Posting Type"));
        end;
    end;

    local procedure CheckFAIntegration(var GenJnlLine: Record "Gen. Journal Line")
    var
        GLIntegration: Boolean;
    begin
        if GenJnlLine."FA Posting Type" = GenJnlLine."FA Posting Type"::" " then
            exit;
        case GenJnlLine."FA Posting Type" of
            GenJnlLine."FA Posting Type"::"Acquisition Cost":
                GLIntegration := DeprBook."G/L Integration - Acq. Cost";
            GenJnlLine."FA Posting Type"::Depreciation:
                GLIntegration := DeprBook."G/L Integration - Depreciation";
            GenJnlLine."FA Posting Type"::"Write-Down":
                GLIntegration := DeprBook."G/L Integration - Write-Down";
            GenJnlLine."FA Posting Type"::Appreciation:
                GLIntegration := DeprBook."G/L Integration - Appreciation";
            GenJnlLine."FA Posting Type"::"Custom 1":
                GLIntegration := DeprBook."G/L Integration - Custom 1";
            GenJnlLine."FA Posting Type"::"Custom 2":
                GLIntegration := DeprBook."G/L Integration - Custom 2";
            GenJnlLine."FA Posting Type"::Disposal:
                GLIntegration := DeprBook."G/L Integration - Disposal";
            GenJnlLine."FA Posting Type"::Maintenance:
                GLIntegration := DeprBook."G/L Integration - Maintenance";
        end;
        if not GLIntegration then
            AddError(
              StrSubstNo(
                E056Err,
                GenJnlLine."FA Posting Type"));

        if not DeprBook."G/L Integration - Depreciation" then begin
            if GenJnlLine."Depr. until FA Posting Date" then
                AddError(
                  StrSubstNo(
                    E057Err,
                    GenJnlLine.FieldCaption("Depr. until FA Posting Date")));
            if GenJnlLine."Depr. Acquisition Cost" then
                AddError(
                  StrSubstNo(
                    E057Err,
                    GenJnlLine.FieldCaption("Depr. Acquisition Cost")));
        end;
    end;

    local procedure TestFixedAssetFields(var GenJnlLine: Record "Gen. Journal Line")
    begin
        if GenJnlLine."FA Posting Type" <> GenJnlLine."FA Posting Type"::" " then
            AddError(StrSubstNo(E058Err, GenJnlLine.FieldCaption("FA Posting Type")));
        if GenJnlLine."Depreciation Book Code" <> '' then
            AddError(StrSubstNo(E058Err, GenJnlLine.FieldCaption("Depreciation Book Code")));
    end;

    procedure TestPostingType()
    begin
        case true of
            CustPosting and PurchPostingType:
                AddError(E059Err);
            VendPosting and SalesPostingType:
                AddError(E060Err);
        end;
    end;

    local procedure WarningIfNegativeAmt(GenJnlLine: Record "Gen. Journal Line")
    begin
        if (GenJnlLine.Amount < 0) and not AmountError then begin
            AmountError := true;
            AddError(StrSubstNo(E007Err, GenJnlLine.FieldCaption(Amount)));
        end;
    end;

    local procedure WarningIfPositiveAmt(GenJnlLine: Record "Gen. Journal Line")
    begin
        if (GenJnlLine.Amount > 0) and not AmountError then begin
            AmountError := true;
            AddError(StrSubstNo(E006Err, GenJnlLine.FieldCaption(Amount)));
        end;
    end;

    local procedure WarningIfZeroAmt(GenJnlLine: Record "Gen. Journal Line")
    begin
        if (GenJnlLine.Amount = 0) and not AmountError then begin
            AmountError := true;
            AddError(StrSubstNo(E002Err, GenJnlLine.FieldCaption(Amount)));
        end;
    end;

    local procedure WarningIfNonZeroAmt(GenJnlLine: Record "Gen. Journal Line")
    begin
        if (GenJnlLine.Amount <> 0) and not AmountError then begin
            AmountError := true;
            AddError(StrSubstNo(E062Err, GenJnlLine.FieldCaption(Amount)));
        end;
    end;

    local procedure CheckAgainstPrevLines(GenJnlLine: Record "Gen. Journal Line")
    var
        i: Integer;
        AccType: Enum "Gen. Journal Account Type";
        AccNo: Code[20];
        ErrorFound: Boolean;
    begin
        if (GenJnlLine."External Document No." = '') or
           not (GenJnlLine."Account Type" in
                [GenJnlLine."Account Type"::Customer, GenJnlLine."Account Type"::Vendor]) and
           not (GenJnlLine."Bal. Account Type" in
                [GenJnlLine."Bal. Account Type"::Customer, GenJnlLine."Bal. Account Type"::Vendor])
        then
            exit;

        if GenJnlLine."Account Type" in [GenJnlLine."Account Type"::Customer, GenJnlLine."Account Type"::Vendor] then begin
            AccType := GenJnlLine."Account Type";
            AccNo := GenJnlLine."Account No.";
        end else begin
            AccType := GenJnlLine."Bal. Account Type";
            AccNo := GenJnlLine."Bal. Account No.";
        end;

        TempGenJnlLine.Reset();
        TempGenJnlLine.SetRange("External Document No.", GenJnlLine."External Document No.");

        i := 0;
        while (i < 2) and not ErrorFound do begin
            i := i + 1;
            if i = 1 then begin
                TempGenJnlLine.SetRange("Account Type", AccType);
                TempGenJnlLine.SetRange("Account No.", AccNo);
                TempGenJnlLine.SetRange("Bal. Account Type");
                TempGenJnlLine.SetRange("Bal. Account No.");
            end else begin
                TempGenJnlLine.SetRange("Account Type");
                TempGenJnlLine.SetRange("Account No.");
                TempGenJnlLine.SetRange("Bal. Account Type", AccType);
                TempGenJnlLine.SetRange("Bal. Account No.", AccNo);
            end;
            if TempGenJnlLine.FindFirst() then begin
                ErrorFound := true;
                AddError(
                  StrSubstNo(
                    E064Err, GenJnlLine.FieldCaption("External Document No."), GenJnlLine."External Document No.",
                    TempGenJnlLine."Line No.", GenJnlLine.FieldCaption("Document No."), TempGenJnlLine."Document No."));
            end;
        end;

        TempGenJnlLine.Reset();
        TempGenJnlLine := GenJnlLine;
        TempGenJnlLine.Insert();
    end;

    procedure CheckICDocument()
    var
        GenJnlLine4: Record "Gen. Journal Line";
    begin
        if GenJnlTemplate.Type = GenJnlTemplate.Type::Intercompany then begin
            if ("Gen. Journal Line"."Posting Date" <> LastDate) or ("Gen. Journal Line"."Document Type" <> LastDocType) or ("Gen. Journal Line"."Document No." <> LastDocNo) then begin
                GenJnlLine4.SetCurrentKey("Journal Template Name", "Journal Batch Name", "Posting Date", "Document No.");
                GenJnlLine4.SetRange("Journal Template Name", "Gen. Journal Line"."Journal Template Name");
                GenJnlLine4.SetRange("Journal Batch Name", "Gen. Journal Line"."Journal Batch Name");
                GenJnlLine4.SetRange("Posting Date", "Gen. Journal Line"."Posting Date");
                GenJnlLine4.SetRange("Document No.", "Gen. Journal Line"."Document No.");
                GenJnlLine4.SetFilter("IC Partner Code", '<>%1', '');
                if GenJnlLine4.FindFirst() then
                    CurrentICPartner := GenJnlLine4."IC Partner Code"
                else
                    CurrentICPartner := '';
            end;
            if (CurrentICPartner <> '') and ("Gen. Journal Line"."IC Direction" = "Gen. Journal Line"."IC Direction"::Outgoing) then
                if ("Gen. Journal Line"."Account Type" in ["Gen. Journal Line"."Account Type"::"G/L Account", "Gen. Journal Line"."Account Type"::"Bank Account"]) and
                   ("Gen. Journal Line"."Bal. Account Type" in ["Gen. Journal Line"."Bal. Account Type"::"G/L Account", "Gen. Journal Line"."Account Type"::"Bank Account"]) and
                   ("Gen. Journal Line"."Account No." <> '') and
                   ("Gen. Journal Line"."Bal. Account No." <> '')
                then
                    AddError(
                      StrSubstNo(
                        E066Err, "Gen. Journal Line".FieldCaption("Account No."), "Gen. Journal Line".FieldCaption("Bal. Account No.")))
                else
                    if (("Gen. Journal Line"."Account Type" in ["Gen. Journal Line"."Account Type"::"G/L Account", "Gen. Journal Line"."Account Type"::"Bank Account"]) and ("Gen. Journal Line"."Account No." <> '')) xor
                       (("Gen. Journal Line"."Bal. Account Type" in ["Gen. Journal Line"."Bal. Account Type"::"G/L Account", "Gen. Journal Line"."Account Type"::"Bank Account"]) and
                        ("Gen. Journal Line"."Bal. Account No." <> ''))
                    then
                        CheckICAccountNo();
        end;
    end;

    local procedure CheckICAccountNo()
    var
        ICGLAccount: Record "IC G/L Account";
        ICBankAccount: Record "IC Bank Account";
    begin
        if "Gen. Journal Line"."IC Account No." = '' then
            AddError(StrSubstNo(E002Err, "Gen. Journal Line".FieldCaption("IC Account No.")))
        else begin
            if "Gen. Journal Line"."IC Account Type" = "Gen. Journal Line"."IC Account Type"::"G/L Account" then
                if ICGLAccount.Get("Gen. Journal Line"."IC Account No.") then
                    if ICGLAccount.Blocked then
                        AddError(StrSubstNo(E032Err, ICGLAccount.FieldCaption(Blocked), false,
                            "Gen. Journal Line".FieldCaption("IC Account No."), "Gen. Journal Line"."IC Account No."))
                    else
                        if "Gen. Journal Line"."IC Account No." <> '' then
                            AddError(StrSubstNo(E009Err, "Gen. Journal Line".FieldCaption("IC Account No.")))
                        else begin
                            if "Gen. Journal Line"."IC Direction" = "Gen. Journal Line"."IC Direction"::Incoming then
                                AddError(StrSubstNo(E069Err, "Gen. Journal Line".FieldCaption("IC Account No."),
                                    "Gen. Journal Line".FieldCaption("IC Direction"), Format("Gen. Journal Line"."IC Direction")));
                            if CurrentICPartner = '' then
                                AddError(StrSubstNo(E070Err, "Gen. Journal Line".FieldCaption("IC Account No.")));
                        end;
            if "Gen. Journal Line"."IC Account Type" = "Gen. Journal Line"."IC Account Type"::"Bank Account" then
                if ICBankAccount.Get("Gen. Journal Line"."IC Account No.") then
                    if ICBankAccount.Blocked then
                        AddError(StrSubstNo(E032Err, ICBankAccount.FieldCaption(Blocked), false,
                            "Gen. Journal Line".FieldCaption("IC Account No."), "Gen. Journal Line"."IC Account No."))
                    else
                        if "Gen. Journal Line"."IC Account No." <> '' then
                            AddError(StrSubstNo(E009Err, "Gen. Journal Line".FieldCaption("IC Account No.")))
                        else begin
                            if "Gen. Journal Line"."IC Direction" = "Gen. Journal Line"."IC Direction"::Incoming then
                                AddError(StrSubstNo(E069Err, "Gen. Journal Line".FieldCaption("IC Account No."),
                                    "Gen. Journal Line".FieldCaption("IC Direction"), Format("Gen. Journal Line"."IC Direction")));
                            if CurrentICPartner = '' then
                                AddError(StrSubstNo(E070Err, "Gen. Journal Line".FieldCaption("IC Account No.")));
                        end;
        end;
    end;

    local procedure CalcAppliesToIDTotals()
    begin
        if "Gen. Journal Line"."Applies-to ID" = '' then
            exit;

        case "Gen. Journal Line"."Account Type" of
            "Gen. Journal Line"."Account Type"::Customer:
                begin
                    TotalCustAmount[Sign::Negative] := CalcCustRemainingAmount(false);
                    TotalCustAmount[Sign::Positive] := CalcCustRemainingAmount(true);
                end;
            "Gen. Journal Line"."Account Type"::Vendor:
                begin
                    TotalVendAmount[Sign::Negative] := CalcVendRemainingAmount(false);
                    TotalVendAmount[Sign::Positive] := CalcVendRemainingAmount(true);
                end;
        end;
    end;

    local procedure CalcCustRemainingAmount(PositiveFilter: Boolean) TotalAmount: Decimal
    begin
        OldCustLedgEntry.SetRange("Customer No.", "Gen. Journal Line"."Account No.");
        OldCustLedgEntry.SetRange("Applies-to ID", "Gen. Journal Line"."Applies-to ID");
        OldCustLedgEntry.SetRange(Positive, PositiveFilter);
        OldCustLedgEntry.SetAutoCalcFields("Remaining Amount");
        if OldCustLedgEntry.FindSet() then
            repeat
                TotalAmount += OldCustLedgEntry."Remaining Amount";
            until OldCustLedgEntry.Next() = 0;
    end;

    local procedure CalcVendRemainingAmount(PositiveFilter: Boolean) TotalAmount: Decimal
    begin
        OldVendLedgEntry.SetRange("Vendor No.", "Gen. Journal Line"."Account No.");
        OldVendLedgEntry.SetRange("Applies-to ID", "Gen. Journal Line"."Applies-to ID");
        OldVendLedgEntry.SetRange(Positive, PositiveFilter);
        OldVendLedgEntry.SetAutoCalcFields("Remaining Amount");
        if OldVendLedgEntry.FindSet() then
            repeat
                TotalAmount += OldVendLedgEntry."Remaining Amount";
            until OldVendLedgEntry.Next() = 0;
    end;

    local procedure InitPmtDisc(NewAmtPmtTolerance: Decimal; NewAmtDue: Decimal)
    begin
        AmountDiscounted := 0;
        AmountPmtDiscTolerance := 0;
        AmountPmtTolerance := NewAmtPmtTolerance;
        AmountDue := NewAmtDue;
    end;

    local procedure CalcPmtDisc(Positive: Boolean; RemPmtDiscPossible: Decimal; IsPostingDateBeforePmtDate: Boolean; AcceptedPmtTolerance: Boolean; TotalAmount: array[2] of Decimal)
    var
        OppositeSignAmount: Decimal;
    begin
        if RemPmtDiscPossible = 0 then
            exit;

        if Positive then
            OppositeSignAmount := TotalAmount[Sign::Negative]
        else
            OppositeSignAmount := TotalAmount[Sign::Positive];
        if IsPostingDateBeforePmtDate or AcceptedPmtTolerance then
            if IsPostingDateBeforePmtDate then
                AmountDiscounted := -RemPmtDiscPossible
            else
                AmountPmtDiscTolerance := -RemPmtDiscPossible;
    end;

    local procedure CheckAccountType(var GenJournalLine: Record "Gen. Journal Line"; AccName1: Text[100]; AccName2: Text[100])
    begin
        case GenJournalLine."Account Type" of
            GenJournalLine."Account Type"::"G/L Account":
                CheckGLAcc("Gen. Journal Line", AccName1);
            GenJournalLine."Account Type"::Customer:
                CheckCust("Gen. Journal Line", AccName1);
            GenJournalLine."Account Type"::Vendor:
                CheckVend("Gen. Journal Line", AccName1);
            GenJournalLine."Account Type"::"Bank Account":
                CheckBankAcc("Gen. Journal Line", AccName1);
            GenJournalLine."Account Type"::"Fixed Asset":
                CheckFixedAsset("Gen. Journal Line", AccName1);
            GenJournalLine."Account Type"::"IC Partner":
                CheckICPartner("Gen. Journal Line", AccName2);
        end;
    end;

    local procedure CheckOldCustomer()
    begin
        OldCustLedgEntry.Reset();
        OldCustLedgEntry.SetCurrentKey("Document No.", "Document Type");
        OldCustLedgEntry.SetRange("Document Type", "Gen. Journal Line"."Applies-to Doc. Type");
        OldCustLedgEntry.SetRange("Document No.", "Gen. Journal Line"."Applies-to Doc. No.");
        OldCustLedgEntry.SetRange("Customer No.", "Gen. Journal Line"."Account No.");
        if OldCustLedgEntry.FindFirst() then begin
            OldCustLedgEntry.CalcFields("Remaining Amount");
            "Gen. Journal Line"."Due Date" := OldCustLedgEntry."Due Date";
            "Gen. Journal Line".Description := OldCustLedgEntry.Description;
            AmountDue := -OldCustLedgEntry."Remaining Amount";
            AmountPmtTolerance := -OldCustLedgEntry."Accepted Payment Tolerance";
            if (OldCustLedgEntry."Remaining Pmt. Disc. Possible" <> 0) and
               ((OldCustLedgEntry."Pmt. Discount Date" >= "Gen. Journal Line"."Posting Date") or OldCustLedgEntry."Accepted Pmt. Disc. Tolerance") and
               (AmountPaid - AmountPmtTolerance - OldCustLedgEntry."Remaining Pmt. Disc. Possible" >= AmountDue)
            then
                if OldCustLedgEntry."Pmt. Discount Date" >= "Gen. Journal Line"."Posting Date" then
                    AmountDiscounted := -OldCustLedgEntry."Remaining Pmt. Disc. Possible"
                else
                    AmountPmtDiscTolerance := -OldCustLedgEntry."Remaining Pmt. Disc. Possible";
            AmountPaid := AmountPaid + AmountPmtTolerance + AmountDiscounted + AmountPmtDiscTolerance;
            TotalAmountDiscounted := TotalAmountDiscounted + AmountDiscounted;
            TotalAmountPmtTolerance := TotalAmountPmtTolerance + AmountPmtTolerance;
            TotalAmountPmtDiscTolerance := TotalAmountPmtDiscTolerance + AmountPmtDiscTolerance;
            AmountApplied := AmountApplied - AmountPaid;
        end else
            ShowApplyToOutput := false;
    end;

    local procedure CheckOldVendor()
    begin
        OldVendLedgEntry.Reset();
        OldVendLedgEntry.SetCurrentKey("Document No.", "Document Type");
        OldVendLedgEntry.SetRange("Document Type", "Gen. Journal Line"."Applies-to Doc. Type");
        OldVendLedgEntry.SetRange("Document No.", "Gen. Journal Line"."Applies-to Doc. No.");
        OldVendLedgEntry.SetRange("Vendor No.", "Gen. Journal Line"."Account No.");
        if OldVendLedgEntry.FindFirst() then begin
            OldVendLedgEntry.CalcFields("Remaining Amount");
            "Gen. Journal Line"."Due Date" := OldVendLedgEntry."Due Date";
            "Gen. Journal Line".Description := OldVendLedgEntry.Description;
            AmountDue := -OldVendLedgEntry."Remaining Amount";
            AmountPaid := "Gen. Journal Line".Amount;
            AmountPmtTolerance := -OldVendLedgEntry."Accepted Payment Tolerance";
            if (OldVendLedgEntry."Remaining Pmt. Disc. Possible" <> 0) and
               ((OldVendLedgEntry."Pmt. Discount Date" >= "Gen. Journal Line"."Posting Date") or OldVendLedgEntry."Accepted Pmt. Disc. Tolerance") and
               (AmountPaid - AmountPmtTolerance - OldVendLedgEntry."Remaining Pmt. Disc. Possible" >= AmountDue)
            then
                if OldVendLedgEntry."Pmt. Discount Date" >= "Gen. Journal Line"."Posting Date" then
                    AmountDiscounted := -OldVendLedgEntry."Remaining Pmt. Disc. Possible"
                else
                    AmountPmtDiscTolerance := -OldVendLedgEntry."Remaining Pmt. Disc. Possible";
            AmountPaid := AmountPaid + AmountPmtTolerance + AmountDiscounted + AmountPmtDiscTolerance;
            TotalAmountDiscounted := TotalAmountDiscounted + AmountDiscounted;
            TotalAmountPmtTolerance := TotalAmountPmtTolerance + AmountPmtTolerance;
            TotalAmountPmtDiscTolerance := TotalAmountPmtDiscTolerance + AmountPmtDiscTolerance;
            AmountApplied := AmountApplied - AmountPaid;
        end else
            ShowApplyToOutput := false;
    end;

    local procedure CheckGenJnlLineErrors(var GenJournalLine: Record "Gen. Journal Line")
    var
        PaymentTerms: Record "Payment Terms";
        DimMgt: Codeunit DimensionManagement;
        TableID: array[10] of Integer;
        No: array[10] of Code[20];
    begin
        if (GenJournalLine."Account No." = '') and (GenJournalLine."Bal. Account No." = '') then
            AddError(StrSubstNo(E001Err, GenJournalLine.FieldCaption("Account No."), GenJournalLine.FieldCaption("Bal. Account No.")))
        else
            if (GenJournalLine."Account Type" <> GenJournalLine."Account Type"::"Fixed Asset") and
               (GenJournalLine."Bal. Account Type" <> GenJournalLine."Bal. Account Type"::"Fixed Asset")
            then
                TestFixedAssetFields("Gen. Journal Line");
        CheckICDocument();
        if GenJournalLine."Account No." <> '' then
            CheckAccount(GenJournalLine);

        if GenJournalLine."Bal. Account No." <> '' then
            CheckBalAccount(GenJournalLine);

        if (GenJournalLine."Account No." <> '') and
           not GenJournalLine."System-Created Entry" and
           (GenJournalLine."Gen. Posting Type" = GenJournalLine."Gen. Posting Type"::" ") and
           (GenJournalLine.Amount = 0) and
           not GenJnlTemplate.Recurring and
           not GenJournalLine."Allow Zero-Amount Posting" and
           (GenJournalLine."Account Type" <> GenJournalLine."Account Type"::"Fixed Asset")
        then
            WarningIfZeroAmt("Gen. Journal Line");

        CheckRecurringLine("Gen. Journal Line");
        CheckAllocations("Gen. Journal Line");

        if GenJournalLine."Posting Date" = 0D then
            AddError(StrSubstNo(E002Err, GenJournalLine.FieldCaption("Posting Date")))
        else
            CheckNonZeroPostingDate(GenJournalLine);

        if GenJournalLine."Document Date" <> 0D then
            if (GenJournalLine."Document Date" <> NormalDate(GenJournalLine."Document Date")) and
               ((GenJournalLine."Account Type" <> GenJournalLine."Account Type"::"G/L Account") or
                (GenJournalLine."Bal. Account Type" <> GenJournalLine."Bal. Account Type"::"G/L Account"))
            then
                AddError(
                  StrSubstNo(
                    E013Err, GenJournalLine.FieldCaption("Document Date")));

        if GenJournalLine."Document No." = '' then begin
            AddError(StrSubstNo(E002Err, GenJournalLine.FieldCaption("Document No.")));
            Error(E002Err, GenJournalLine.FieldCaption("Document No."));
        end;
        if "Gen. Journal Batch"."No. Series" <> '' then begin
            if (LastEntrdDocNo <> '') and
               (GenJournalLine."Document No." <> LastEntrdDocNo) and
               (GenJournalLine."Document No." <> IncStr(LastEntrdDocNo))
            then
                AddError(E016Err);
            LastEntrdDocNo := GenJournalLine."Document No.";
        end;

        if (GenJournalLine."Account Type" in [GenJournalLine."Account Type"::Customer, GenJournalLine."Account Type"::Vendor, GenJournalLine."Account Type"::"Fixed Asset"]) and
           (GenJournalLine."Bal. Account Type" in [GenJournalLine."Bal. Account Type"::Customer, GenJournalLine."Bal. Account Type"::Vendor, GenJournalLine."Bal. Account Type"::"Fixed Asset"])
        then
            AddError(
              StrSubstNo(
                E017Err,
                GenJournalLine.FieldCaption("Account Type"), GenJournalLine.FieldCaption("Bal. Account Type")));

        if GenJournalLine.Amount * GenJournalLine."Amount (LCY)" < 0 then
            AddError(
              StrSubstNo(
                E008Err, GenJournalLine.FieldCaption("Amount (LCY)"), GenJournalLine.FieldCaption(Amount)));

        if (GenJournalLine."Account Type" = GenJournalLine."Account Type"::"G/L Account") and
           (GenJournalLine."Bal. Account Type" = GenJournalLine."Bal. Account Type"::"G/L Account")
        then
            if GenJournalLine."Applies-to Doc. No." <> '' then
                AddError(StrSubstNo(E009Err, GenJournalLine.FieldCaption("Applies-to Doc. No.")));

        if ((GenJournalLine."Account Type" = GenJournalLine."Account Type"::"G/L Account") and
            (GenJournalLine."Bal. Account Type" = GenJournalLine."Bal. Account Type"::"G/L Account")) or
           (GenJournalLine."Document Type" <> GenJournalLine."Document Type"::Invoice)
        then
            if PaymentTerms.Get(GenJournalLine."Payment Terms Code") then
                if (GenJournalLine."Document Type" = GenJournalLine."Document Type"::"Credit Memo") and
                   (not PaymentTerms."Calc. Pmt. Disc. on Cr. Memos")
                then begin
                    AddConditionalError(GenJournalLine."Pmt. Discount Date" <> 0D, StrSubstNo(E009Err, GenJournalLine.FieldCaption("Pmt. Discount Date")));
                    AddConditionalError(GenJournalLine."Payment Discount %" <> 0, StrSubstNo(E018Err, GenJournalLine.FieldCaption("Payment Discount %")));
                end else begin
                    AddConditionalError(GenJournalLine."Pmt. Discount Date" <> 0D, StrSubstNo(E009Err, GenJournalLine.FieldCaption("Pmt. Discount Date")));
                    AddConditionalError(GenJournalLine."Payment Discount %" <> 0, StrSubstNo(E018Err, GenJournalLine.FieldCaption("Payment Discount %")));
                end;

        if ((GenJournalLine."Account Type" = GenJournalLine."Account Type"::"G/L Account") and
            (GenJournalLine."Bal. Account Type" = GenJournalLine."Bal. Account Type"::"G/L Account")) or
           (GenJournalLine."Applies-to Doc. No." <> '')
        then
            AddConditionalError(GenJournalLine."Applies-to ID" <> '', StrSubstNo(E009Err, GenJournalLine.FieldCaption("Applies-to ID")));

        if (GenJournalLine."Account Type" <> GenJournalLine."Account Type"::"Bank Account") and
           (GenJournalLine."Bal. Account Type" <> GenJournalLine."Bal. Account Type"::"Bank Account")
        then
            AddConditionalError(
                GenJnlLine2."Bank Payment Type" <> GenJnlLine2."Bank Payment Type"::" ", StrSubstNo(E009Err, GenJournalLine.FieldCaption("Bank Payment Type")));

        if (GenJournalLine."Account No." <> '') and (GenJournalLine."Bal. Account No." <> '') then begin
            PurchPostingType := false;
            SalesPostingType := false;
        end;
        if GenJournalLine."Account No." <> '' then
            CheckAccountType("Gen. Journal Line", AccName, AccName);
        if GenJournalLine."Bal. Account No." <> '' then begin
            CODEUNIT.Run(CODEUNIT::"Exchange Acc. G/L Journal Line", "Gen. Journal Line");
            CheckAccountType("Gen. Journal Line", BalAccName, AccName);
            CODEUNIT.Run(CODEUNIT::"Exchange Acc. G/L Journal Line", "Gen. Journal Line");
        end;

        AddConditionalError(not DimMgt.CheckDimIDComb(GenJournalLine."Dimension Set ID"), DimMgt.GetDimCombErr());

        TableID[1] := DimMgt.TypeToTableID1(GenJournalLine."Account Type".AsInteger());
        No[1] := GenJournalLine."Account No.";
        TableID[2] := DimMgt.TypeToTableID1(GenJournalLine."Bal. Account Type".AsInteger());
        No[2] := GenJournalLine."Bal. Account No.";
        TableID[3] := Database::Job;
        No[3] := GenJournalLine."Job No.";
        TableID[4] := Database::"Salesperson/Purchaser";
        No[4] := GenJournalLine."Salespers./Purch. Code";
        TableID[5] := Database::Campaign;
        No[5] := GenJournalLine."Campaign No.";
        AddConditionalError(not DimMgt.CheckDimValuePosting(TableID, No, GenJournalLine."Dimension Set ID"), DimMgt.GetDimValuePostingErr());
    end;

    local procedure CheckBalAccount(var GenJournalLine: Record "Gen. Journal Line")
    begin
        case GenJournalLine."Bal. Account Type" of
            GenJournalLine."Bal. Account Type"::"G/L Account":
                begin
                    if (GenJournalLine."Bal. Gen. Bus. Posting Group" <> '') or (GenJournalLine."Bal. Gen. Prod. Posting Group" <> '') or
                       (GenJournalLine."Bal. VAT Bus. Posting Group" <> '') or (GenJournalLine."Bal. VAT Prod. Posting Group" <> '')
                    then
                        if GenJournalLine."Bal. Gen. Posting Type" = GenJournalLine."Bal. Gen. Posting Type"::" " then
                            AddError(StrSubstNo(E002Err, GenJournalLine.FieldCaption("Bal. Gen. Posting Type")));
                    if (GenJournalLine."Bal. Gen. Posting Type" <> GenJournalLine."Bal. Gen. Posting Type"::" ") and
                       (GenJournalLine."VAT Posting" = GenJournalLine."VAT Posting"::"Automatic VAT Entry")
                    then begin
                        if GenJournalLine."Bal. VAT Amount" + GenJournalLine."Bal. VAT Base Amount" <> -GenJournalLine.Amount then
                            AddError(
                              StrSubstNo(
                                E011Err, GenJournalLine.FieldCaption("Bal. VAT Amount"), GenJournalLine.FieldCaption("Bal. VAT Base Amount"),
                                GenJournalLine.FieldCaption(Amount)));
                        if GenJournalLine."Currency Code" <> '' then
                            if GenJournalLine."Bal. VAT Amount (LCY)" + GenJournalLine."Bal. VAT Base Amount (LCY)" <> -GenJournalLine."Amount (LCY)" then
                                AddError(
                                  StrSubstNo(
                                    E011Err, GenJournalLine.FieldCaption("Bal. VAT Amount (LCY)"),
                                    GenJournalLine.FieldCaption("Bal. VAT Base Amount (LCY)"), GenJournalLine.FieldCaption("Amount (LCY)")));
                    end;
                end;
            GenJournalLine."Bal. Account Type"::Customer, GenJournalLine."Bal. Account Type"::Vendor:
                begin
                    if GenJournalLine."Bal. Gen. Posting Type" <> GenJournalLine."Bal. Gen. Posting Type"::" " then
                        AddError(
                          StrSubstNo(
                            E004Err,
                            GenJournalLine.FieldCaption("Bal. Gen. Posting Type"), GenJournalLine.FieldCaption("Bal. Account Type"), GenJournalLine."Bal. Account Type"));

                    if (GenJournalLine."Bal. Gen. Bus. Posting Group" <> '') or (GenJournalLine."Bal. Gen. Prod. Posting Group" <> '') or
                       (GenJournalLine."Bal. VAT Bus. Posting Group" <> '') or (GenJournalLine."Bal. VAT Prod. Posting Group" <> '')
                    then
                        AddError(
                          StrSubstNo(
                            E005Err,
                            GenJournalLine.FieldCaption("Bal. Gen. Bus. Posting Group"), GenJournalLine.FieldCaption("Bal. Gen. Prod. Posting Group"),
                            GenJournalLine.FieldCaption("Bal. VAT Bus. Posting Group"), GenJournalLine.FieldCaption("Bal. VAT Prod. Posting Group"),
                            GenJournalLine.FieldCaption("Bal. Account Type"), GenJournalLine."Bal. Account Type"));

                    if GenJournalLine."Document Type" <> GenJournalLine."Document Type"::" " then
                        if (GenJournalLine."Bal. Account Type" = GenJournalLine."Bal. Account Type"::Customer) =
                           (GenJournalLine."Document Type" in [GenJournalLine."Document Type"::Payment, GenJournalLine."Document Type"::"Credit Memo"])
                        then
                            WarningIfNegativeAmt("Gen. Journal Line")
                        else
                            WarningIfPositiveAmt("Gen. Journal Line");
                    if GenJournalLine.Amount * GenJournalLine."Sales/Purch. (LCY)" > 0 then
                        AddError(
                          StrSubstNo(
                            E012Err,
                            GenJournalLine.FieldCaption("Sales/Purch. (LCY)"), GenJournalLine.FieldCaption(Amount)));
                    if GenJournalLine."Job No." <> '' then
                        AddError(StrSubstNo(E009Err, GenJournalLine.FieldCaption("Job No.")));
                end;
            GenJournalLine."Bal. Account Type"::"Bank Account":
                begin
                    if GenJournalLine."Bal. Gen. Posting Type" <> GenJournalLine."Bal. Gen. Posting Type"::" " then
                        AddError(
                          StrSubstNo(
                            E004Err,
                            GenJournalLine.FieldCaption("Bal. Gen. Posting Type"), GenJournalLine.FieldCaption("Bal. Account Type"), GenJournalLine."Bal. Account Type"));

                    if (GenJournalLine."Bal. Gen. Bus. Posting Group" <> '') or (GenJournalLine."Bal. Gen. Prod. Posting Group" <> '') or
                       (GenJournalLine."Bal. VAT Bus. Posting Group" <> '') or (GenJournalLine."Bal. VAT Prod. Posting Group" <> '')
                    then
                        AddError(
                          StrSubstNo(
                            E005Err,
                            GenJournalLine.FieldCaption("Bal. Gen. Bus. Posting Group"), GenJournalLine.FieldCaption("Bal. Gen. Prod. Posting Group"),
                            GenJournalLine.FieldCaption("Bal. VAT Bus. Posting Group"), GenJournalLine.FieldCaption("Bal. VAT Prod. Posting Group"),
                            GenJournalLine.FieldCaption("Bal. Account Type"), GenJournalLine."Bal. Account Type"));

                    AddConditionalError(GenJournalLine."Job No." <> '', StrSubstNo(E009Err, GenJournalLine.FieldCaption("Job No.")));
                end;
            GenJournalLine."Bal. Account Type"::"Fixed Asset":
                TestFixedAsset("Gen. Journal Line");
        end;
    end;

    local procedure CheckAccount(var GenJournalLine: Record "Gen. Journal Line")
    begin
        case GenJournalLine."Account Type" of
            GenJournalLine."Account Type"::"G/L Account":
                begin
                    if (GenJournalLine."Gen. Bus. Posting Group" <> '') or (GenJournalLine."Gen. Prod. Posting Group" <> '') or
                       (GenJournalLine."VAT Bus. Posting Group" <> '') or (GenJournalLine."VAT Prod. Posting Group" <> '')
                    then
                        AddConditionalError(
                            GenJournalLine."Gen. Posting Type" = GenJournalLine."Gen. Posting Type"::" ", StrSubstNo(E002Err, GenJournalLine.FieldCaption("Gen. Posting Type")));

                    if (GenJournalLine."Gen. Posting Type" <> GenJournalLine."Gen. Posting Type"::" ") and
                       (GenJournalLine."VAT Posting" = GenJournalLine."VAT Posting"::"Automatic VAT Entry")
                    then begin
                        AddConditionalError(
                          GenJournalLine."VAT Amount" + GenJournalLine."VAT Base Amount" <> GenJournalLine.Amount,
                          StrSubstNo(
                            E003Err, GenJournalLine.FieldCaption("VAT Amount"), GenJournalLine.FieldCaption("VAT Base Amount"),
                            GenJournalLine.FieldCaption(Amount)));
                        AddConditionalError((GenJournalLine."Currency Code" <> '') and
                          (GenJournalLine."VAT Amount (LCY)" + GenJournalLine."VAT Base Amount (LCY)" <> GenJournalLine."Amount (LCY)"),
                          StrSubstNo(
                            E003Err, GenJournalLine.FieldCaption("VAT Amount (LCY)"),
                            GenJournalLine.FieldCaption("VAT Base Amount (LCY)"), GenJournalLine.FieldCaption("Amount (LCY)")));
                    end;
                end;
            GenJournalLine."Account Type"::Customer, GenJournalLine."Account Type"::Vendor:
                begin
                    AddConditionalError(GenJournalLine."Gen. Posting Type" <> GenJournalLine."Gen. Posting Type"::" ",
                      StrSubstNo(
                        E004Err,
                        GenJournalLine.FieldCaption("Gen. Posting Type"), GenJournalLine.FieldCaption("Account Type"), GenJournalLine."Account Type"));

                    if (GenJournalLine."Gen. Bus. Posting Group" <> '') or (GenJournalLine."Gen. Prod. Posting Group" <> '') or
                       (GenJournalLine."VAT Bus. Posting Group" <> '') or (GenJournalLine."VAT Prod. Posting Group" <> '')
                    then
                        AddError(
                          StrSubstNo(
                            E005Err,
                            GenJournalLine.FieldCaption("Gen. Bus. Posting Group"), GenJournalLine.FieldCaption("Gen. Prod. Posting Group"),
                            GenJournalLine.FieldCaption("VAT Bus. Posting Group"), GenJournalLine.FieldCaption("VAT Prod. Posting Group"),
                            GenJournalLine.FieldCaption("Account Type"), GenJournalLine."Account Type"));

                    if GenJournalLine."Document Type" <> GenJournalLine."Document Type"::" " then
                        if GenJournalLine."Account Type" = GenJournalLine."Account Type"::Customer then
                            case GenJournalLine."Document Type" of
                                GenJournalLine."Document Type"::"Credit Memo":
                                    WarningIfPositiveAmt("Gen. Journal Line");
                                GenJournalLine."Document Type"::Payment:
                                    if (GenJournalLine."Applies-to Doc. Type" = GenJournalLine."Applies-to Doc. Type"::"Credit Memo") and
                                       (GenJournalLine."Applies-to Doc. No." <> '')
                                    then
                                        WarningIfNegativeAmt("Gen. Journal Line")
                                    else
                                        WarningIfPositiveAmt("Gen. Journal Line");
                                GenJournalLine."Document Type"::Refund:
                                    WarningIfNegativeAmt("Gen. Journal Line");
                                else
                                    WarningIfNegativeAmt("Gen. Journal Line");
                            end
                        else
                            case GenJournalLine."Document Type" of
                                GenJournalLine."Document Type"::"Credit Memo":
                                    WarningIfNegativeAmt("Gen. Journal Line");
                                GenJournalLine."Document Type"::Payment:
                                    if (GenJournalLine."Applies-to Doc. Type" = GenJournalLine."Applies-to Doc. Type"::"Credit Memo") and
                                       (GenJournalLine."Applies-to Doc. No." <> '')
                                    then
                                        WarningIfPositiveAmt("Gen. Journal Line")
                                    else
                                        WarningIfNegativeAmt("Gen. Journal Line");
                                GenJournalLine."Document Type"::Refund:
                                    WarningIfPositiveAmt("Gen. Journal Line");
                                else
                                    WarningIfPositiveAmt("Gen. Journal Line");
                            end;

                    if GenJournalLine.Amount * GenJournalLine."Sales/Purch. (LCY)" < 0 then
                        AddError(
                          StrSubstNo(
                            E008Err,
                            GenJournalLine.FieldCaption("Sales/Purch. (LCY)"), GenJournalLine.FieldCaption(Amount)));
                    if GenJournalLine."Job No." <> '' then
                        AddError(StrSubstNo(E009Err, GenJournalLine.FieldCaption("Job No.")));
                end;
            GenJournalLine."Account Type"::"Bank Account":
                begin
                    if GenJournalLine."Gen. Posting Type" <> GenJournalLine."Gen. Posting Type"::" " then
                        AddError(
                          StrSubstNo(
                            E004Err,
                            GenJournalLine.FieldCaption("Gen. Posting Type"), GenJournalLine.FieldCaption("Account Type"), GenJournalLine."Account Type"));

                    if (GenJournalLine."Gen. Bus. Posting Group" <> '') or (GenJournalLine."Gen. Prod. Posting Group" <> '') or
                       (GenJournalLine."VAT Bus. Posting Group" <> '') or (GenJournalLine."VAT Prod. Posting Group" <> '')
                    then
                        AddError(
                          StrSubstNo(
                            E005Err,
                            GenJournalLine.FieldCaption("Gen. Bus. Posting Group"), GenJournalLine.FieldCaption("Gen. Prod. Posting Group"),
                            GenJournalLine.FieldCaption("VAT Bus. Posting Group"), GenJournalLine.FieldCaption("VAT Prod. Posting Group"),
                            GenJournalLine.FieldCaption("Account Type"), GenJournalLine."Account Type"));

                    if GenJournalLine."Job No." <> '' then
                        AddError(StrSubstNo(E009Err, GenJournalLine.FieldCaption("Job No.")));
                end;
            GenJournalLine."Account Type"::"Fixed Asset":
                TestFixedAsset("Gen. Journal Line");
        end;
    end;

    local procedure CheckNonZeroPostingDate(var GenJournalLine: Record "Gen. Journal Line")
    var
        UserSetupManagement: Codeunit "User Setup Management";
    begin
        if GenJournalLine."Posting Date" <> NormalDate(GenJournalLine."Posting Date") then
            if (GenJournalLine."Account Type" <> GenJournalLine."Account Type"::"G/L Account") or
               (GenJournalLine."Bal. Account Type" <> GenJournalLine."Bal. Account Type"::"G/L Account")
            then
                AddError(
                  StrSubstNo(
                    E013Err, GenJournalLine.FieldCaption("Posting Date")));

        if not UserSetupManagement.TestAllowedPostingDate(GenJournalLine."Posting Date", TempErrorText) then
            AddError(TempErrorText);

        if "Gen. Journal Batch"."No. Series" <> '' then begin
            if NoSeries."Date Order" and (GenJournalLine."Posting Date" < LastEntrdDate) then
                AddError(E015Err);
            LastEntrdDate := GenJournalLine."Posting Date";
        end;
    end;

    local procedure CheckIfExistProcessedCustVendLedgerEntryApplicationGroup(var GenJournalLine: Record "Gen. Journal Line"): Boolean
    begin
        if (GenJournalLine."Document No." = '') or (GenJournalLine."Account No." = '') or (GenJournalLine."Applies-to ID" = '') then
            exit(false);

        TempGenJnlLineForProcessedCustVendLedgerEntryApplicationGroups.Reset();
        TempGenJnlLineForProcessedCustVendLedgerEntryApplicationGroups.SetRange("Document No.", GenJournalLine."Document No.");
        TempGenJnlLineForProcessedCustVendLedgerEntryApplicationGroups.SetRange("Account Type", GenJournalLine."Account Type");
        TempGenJnlLineForProcessedCustVendLedgerEntryApplicationGroups.SetRange("Account No.", GenJournalLine."Account No.");
        TempGenJnlLineForProcessedCustVendLedgerEntryApplicationGroups.SetRange("Applies-to ID", GenJournalLine."Applies-to ID");
        exit(not TempGenJnlLineForProcessedCustVendLedgerEntryApplicationGroups.IsEmpty());
    end;

    local procedure AddProcessedCustVendLedgerEntryApplicationGroup(var GenJournalLine: Record "Gen. Journal Line")
    begin
        if (GenJournalLine."Document No." = '') or (GenJournalLine."Account No." = '') or (GenJournalLine."Applies-to ID" = '') then
            exit;

        Clear(TempGenJnlLineForProcessedCustVendLedgerEntryApplicationGroups);
        TempGenJnlLineForProcessedCustVendLedgerEntryApplicationGroups.Init();
        TempGenJnlLineForProcessedCustVendLedgerEntryApplicationGroups := GenJournalLine;
        if TempGenJnlLineForProcessedCustVendLedgerEntryApplicationGroups.Insert() then;
    end;

    local procedure ClearProcessedCustVendLedgerEntryApplicationGroups()
    begin
        TempGenJnlLineForProcessedCustVendLedgerEntryApplicationGroups.DeleteAll();
    end;
}