Table 383 Detailed CV Ledg. Entry Buffer, source in 29

Source29

src/Layers/W1/BaseApp/Finance/ReceivablesPayables/DetailedCVLedgEntryBuffer.Table.al824 lines, Copyright (c) Microsoft Corporation. MIT

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

using Microsoft.Finance.Currency;
using Microsoft.Finance.GeneralLedger.Journal;
using Microsoft.Finance.GeneralLedger.Setup;
using Microsoft.Finance.SalesTax;
using Microsoft.Finance.VAT.Ledger;
using Microsoft.Finance.VAT.Setup;
using Microsoft.Foundation.AuditCodes;
using Microsoft.Foundation.Enums;
using Microsoft.Sales.Receivables;
using System.Security.AccessControl;

/// <summary>
/// Buffer table for detailed customer and vendor ledger entry data including applications, payments, and adjustments.
/// Stores temporary copies of detailed entry information for analysis, reporting, and batch processing operations.
/// </summary>
/// <remarks>
/// Mirrors the structure of detailed customer and vendor ledger entries for processing scenarios requiring data manipulation.
/// Supports application tracking, currency amounts, VAT processing, and tax calculations.
/// Used by reports and processes analyzing payment applications, discounts, and detailed transaction history.
/// </remarks>
table 383 "Detailed CV Ledg. Entry Buffer"
{
    Caption = 'Detailed CV Ledg. Entry Buffer';
    DrillDownPageID = "Detailed Cust. Ledg. Entries";
    LookupPageID = "Detailed Cust. Ledg. Entries";
    ReplicateData = false;
    DataClassification = CustomerContent;

    fields
    {
        /// <summary>
        /// Unique entry number identifying the detailed ledger entry record.
        /// </summary>
        field(1; "Entry No."; Integer)
        {
            Caption = 'Entry No.';
            DataClassification = SystemMetadata;
        }
        /// <summary>
        /// Reference to the parent customer or vendor ledger entry.
        /// </summary>
        field(2; "CV Ledger Entry No."; Integer)
        {
            Caption = 'CV Ledger Entry No.';
            DataClassification = SystemMetadata;
        }
        /// <summary>
        /// Type of detailed entry indicating the specific transaction purpose.
        /// </summary>
        field(3; "Entry Type"; Enum "Detailed CV Ledger Entry Type")
        {
            Caption = 'Entry Type';
            DataClassification = SystemMetadata;
        }
        /// <summary>
        /// Date when the detailed entry was posted to the ledger.
        /// </summary>
        field(4; "Posting Date"; Date)
        {
            Caption = 'Posting Date';
            DataClassification = SystemMetadata;
        }
        /// <summary>
        /// Document type associated with the detailed entry transaction.
        /// </summary>
        field(5; "Document Type"; Enum "Gen. Journal Document Type")
        {
            Caption = 'Document Type';
            DataClassification = SystemMetadata;
        }
        /// <summary>
        /// Document number for the detailed entry transaction.
        /// </summary>
        field(6; "Document No."; Code[20])
        {
            Caption = 'Document No.';
            DataClassification = SystemMetadata;
        }
        /// <summary>
        /// Transaction amount in the original currency for the detailed entry.
        /// </summary>
        field(7; Amount; Decimal)
        {
            AutoFormatExpression = Rec."Currency Code";
            AutoFormatType = 1;
            Caption = 'Amount';
            DataClassification = SystemMetadata;
        }
        /// <summary>
        /// Amount in local currency (LCY) for the detailed entry transaction.
        /// </summary>
        field(8; "Amount (LCY)"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = '';
            Caption = 'Amount (LCY)';
            DataClassification = SystemMetadata;
        }
        /// <summary>
        /// Customer or vendor number associated with this detailed entry.
        /// </summary>
        field(9; "CV No."; Code[20])
        {
            Caption = 'CV No.';
            DataClassification = SystemMetadata;
        }
        /// <summary>
        /// Currency code for foreign currency amounts, blank for LCY.
        /// </summary>
        field(10; "Currency Code"; Code[10])
        {
            Caption = 'Currency Code';
            DataClassification = SystemMetadata;
            TableRelation = Currency;
        }
        /// <summary>
        /// User ID who created or modified this detailed entry record.
        /// </summary>
        field(11; "User ID"; Code[50])
        {
            Caption = 'User ID';
            DataClassification = SystemMetadata;
            TableRelation = User."User Name";
        }
        /// <summary>
        /// Source code identifying the origin of this detailed entry transaction.
        /// </summary>
        field(12; "Source Code"; Code[10])
        {
            Caption = 'Source Code';
            DataClassification = SystemMetadata;
            TableRelation = "Source Code";
        }
        /// <summary>
        /// Transaction number linking related detailed entries and postings.
        /// </summary>
        field(13; "Transaction No."; Integer)
        {
            Caption = 'Transaction No.';
            DataClassification = SystemMetadata;
        }
        /// <summary>
        /// Journal batch name from which this detailed entry was created.
        /// </summary>
        /// <summary>
        /// Journal batch name from which this detailed entry was created.
        /// </summary>
        field(14; "Journal Batch Name"; Code[10])
        {
            Caption = 'Journal Batch Name';
            DataClassification = SystemMetadata;
        }
        /// <summary>
        /// Reason code explaining the business purpose of this detailed entry.
        /// </summary>
        field(15; "Reason Code"; Code[10])
        {
            Caption = 'Reason Code';
            DataClassification = SystemMetadata;
            TableRelation = "Reason Code";
        }
        /// <summary>
        /// Debit amount for the detailed entry in original currency.
        /// </summary>
        field(16; "Debit Amount"; Decimal)
        {
            AutoFormatExpression = Rec."Currency Code";
            AutoFormatType = 1;
            BlankZero = true;
            Caption = 'Debit Amount';
            DataClassification = SystemMetadata;
        }
        /// <summary>
        /// Credit amount for the detailed entry in original currency.
        /// </summary>
        field(17; "Credit Amount"; Decimal)
        {
            AutoFormatExpression = Rec."Currency Code";
            AutoFormatType = 1;
            BlankZero = true;
            Caption = 'Credit Amount';
            DataClassification = SystemMetadata;
        }
        /// <summary>
        /// Debit amount for the detailed entry in local currency.
        /// </summary>
        field(18; "Debit Amount (LCY)"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = '';
            BlankZero = true;
            Caption = 'Debit Amount (LCY)';
            DataClassification = SystemMetadata;
        }
        /// <summary>
        /// Credit amount for the detailed entry in local currency.
        /// </summary>
        field(19; "Credit Amount (LCY)"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = '';
            BlankZero = true;
            Caption = 'Credit Amount (LCY)';
            DataClassification = SystemMetadata;
        }
        /// <summary>
        /// Due date from the initial entry before any applications or adjustments.
        /// </summary>
        field(20; "Initial Entry Due Date"; Date)
        {
            Caption = 'Initial Entry Due Date';
            DataClassification = SystemMetadata;
        }
        /// <summary>
        /// Global dimension 1 code from the initial entry for reporting and analysis.
        /// </summary>
        field(21; "Initial Entry Global Dim. 1"; Code[20])
        {
            Caption = 'Initial Entry Global Dim. 1';
            DataClassification = SystemMetadata;
        }
        /// <summary>
        /// Global dimension 2 code from the initial entry for cost center and project analysis.
        /// </summary>
        field(22; "Initial Entry Global Dim. 2"; Code[20])
        {
            Caption = 'Initial Entry Global Dim. 2';
            DataClassification = SystemMetadata;
        }
        /// <summary>
        /// General posting type for G/L account determination and posting setup.
        /// </summary>
        field(23; "Gen. Posting Type"; Enum "General Posting Type")
        {
            Caption = 'Gen. Posting Type';
            DataClassification = SystemMetadata;
        }
        /// <summary>
        /// General business posting group for G/L account determination and posting setup.
        /// </summary>
        field(24; "Gen. Bus. Posting Group"; Code[20])
        {
            Caption = 'Gen. Bus. Posting Group';
            DataClassification = SystemMetadata;
            TableRelation = "Gen. Business Posting Group";
        }
        /// <summary>
        /// General product posting group for G/L account determination and posting setup.
        /// </summary>
        field(25; "Gen. Prod. Posting Group"; Code[20])
        {
            Caption = 'Gen. Prod. Posting Group';
            DataClassification = SystemMetadata;
            TableRelation = "Gen. Product Posting Group";
        }
        /// <summary>
        /// Tax area code for sales tax calculation and reporting by geographical location.
        /// </summary>
        field(26; "Tax Area Code"; Code[20])
        {
            Caption = 'Tax Area Code';
            DataClassification = SystemMetadata;
            TableRelation = "Tax Area";
        }
        /// <summary>
        /// Indicates whether the entry is subject to sales tax calculation.
        /// </summary>
        field(27; "Tax Liable"; Boolean)
        {
            Caption = 'Tax Liable';
            DataClassification = SystemMetadata;
        }
        /// <summary>
        /// Tax group code defining the type of items subject to specific tax rates.
        /// </summary>
        field(28; "Tax Group Code"; Code[20])
        {
            Caption = 'Tax Group Code';
            DataClassification = SystemMetadata;
            TableRelation = "Tax Group";
        }
        /// <summary>
        /// Indicates whether use tax applies instead of regular sales tax.
        /// </summary>
        field(29; "Use Tax"; Boolean)
        {
            Caption = 'Use Tax';
            DataClassification = SystemMetadata;
        }
        /// <summary>
        /// VAT business posting group for VAT calculation and posting setup.
        /// </summary>
        field(30; "VAT Bus. Posting Group"; Code[20])
        {
            Caption = 'VAT Bus. Posting Group';
            DataClassification = SystemMetadata;
            TableRelation = "VAT Business Posting Group";
        }
        /// <summary>
        /// VAT product posting group for VAT calculation and posting setup.
        /// </summary>
        field(31; "VAT Prod. Posting Group"; Code[20])
        {
            Caption = 'VAT Prod. Posting Group';
            DataClassification = SystemMetadata;
            TableRelation = "VAT Product Posting Group";
        }
        /// <summary>
        /// Additional reporting currency amount for detailed entry.
        /// </summary>
        field(32; "Additional-Currency Amount"; Decimal)
        {
            AutoFormatExpression = GetAdditionalReportingCurrencyCode();
            AutoFormatType = 1;
            Caption = 'Additional-Currency Amount';
            DataClassification = SystemMetadata;
        }
        /// <summary>
        /// VAT amount in local currency for the detailed entry.
        /// </summary>
        field(33; "VAT Amount (LCY)"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = '';
            Caption = 'VAT Amount (LCY)';
            DataClassification = SystemMetadata;
        }
        /// <summary>
        /// Indicates whether to use additional reporting currency amount calculations.
        /// </summary>
        field(34; "Use Additional-Currency Amount"; Boolean)
        {
            Caption = 'Use Additional-Currency Amount';
            DataClassification = SystemMetadata;
        }
        /// <summary>
        /// Document type from the initial entry before applications or adjustments.
        /// </summary>
        field(35; "Initial Document Type"; Enum "Gen. Journal Document Type")
        {
            Caption = 'Initial Document Type';
            DataClassification = SystemMetadata;
        }
        /// <summary>
        /// Entry number of the CV ledger entry that this detailed entry was applied to.
        /// </summary>
        field(36; "Applied CV Ledger Entry No."; Integer)
        {
            Caption = 'Applied CV Ledger Entry No.';
            DataClassification = SystemMetadata;
        }
        /// <summary>
        /// Remaining payment discount amount that can still be taken.
        /// </summary>
        field(39; "Remaining Pmt. Disc. Possible"; Decimal)
        {
            AutoFormatExpression = Rec."Currency Code";
            AutoFormatType = 1;
            Caption = 'Remaining Pmt. Disc. Possible';
            DataClassification = SystemMetadata;
        }
        /// <summary>
        /// Maximum payment tolerance amount allowed for this detailed entry.
        /// </summary>
        field(40; "Max. Payment Tolerance"; Decimal)
        {
            AutoFormatExpression = Rec."Currency Code";
            AutoFormatType = 1;
            Caption = 'Max. Payment Tolerance';
            DataClassification = SystemMetadata;
        }
        /// <summary>
        /// Tax jurisdiction code for sales tax calculation and reporting requirements.
        /// </summary>
        field(41; "Tax Jurisdiction Code"; Code[10])
        {
            Caption = 'Tax Jurisdiction Code';
            DataClassification = SystemMetadata;
            Editable = false;
            TableRelation = "Tax Jurisdiction";
        }
        /// <summary>
        /// Exchange rate adjustment register number for currency revaluation tracking.
        /// </summary>
        field(45; "Exch. Rate Adjmt. Reg. No."; Integer)
        {
            Caption = 'Exch. Rate Adjmt. Reg. No.';
            DataClassification = SystemMetadata;
            Editable = false;
            TableRelation = "Exch. Rate Adjmt. Reg.";
        }
        /// <summary>
        /// Non-deductible VAT amount in local currency for partial VAT deduction scenarios.
        /// </summary>
        field(6200; "Non-Deductible VAT Amount LCY"; Decimal)
        {
            Caption = 'Non-Deductible VAT Amount LCY';
            Editable = false;
            AutoFormatType = 1;
            AutoFormatExpression = '';
        }
        /// <summary>
        /// Non-deductible VAT amount in additional reporting currency for partial VAT deduction scenarios.
        /// </summary>
        field(6201; "Non-Deductible VAT Amount ACY"; Decimal)
        {
            AutoFormatExpression = GetAdditionalReportingCurrencyCode();
            AutoFormatType = 1;
            Caption = 'Non-Deductible VAT Amount ACY';
            Editable = false;
        }
    }

    keys
    {
        key(Key1; "Entry No.")
        {
            Clustered = true;
        }
        key(Key2; "CV Ledger Entry No.", "Entry Type")
        {
            SumIndexFields = Amount, "Amount (LCY)", "Debit Amount", "Credit Amount", "Debit Amount (LCY)", "Credit Amount (LCY)";
        }
        key(Key3; "CV No.", "Initial Entry Due Date", "Posting Date", "Currency Code")
        {
            SumIndexFields = Amount, "Amount (LCY)", "Debit Amount", "Credit Amount", "Debit Amount (LCY)", "Credit Amount (LCY)";
        }
        key(Key4; "CV No.", "Posting Date", "Entry Type", "Currency Code")
        {
            SumIndexFields = Amount, "Amount (LCY)";
        }
        key(Key5; "CV No.", "Initial Document Type", "Document Type")
        {
            SumIndexFields = Amount, "Amount (LCY)";
        }
        key(Key6; "Document Type", "Document No.", "Posting Date")
        {
        }
        key(Key7; "Initial Document Type", "CV No.", "Posting Date", "Currency Code", "Entry Type")
        {
            SumIndexFields = Amount, "Amount (LCY)";
        }
        key(Key8; "CV No.", "Initial Entry Due Date", "Posting Date", "Initial Entry Global Dim. 1", "Initial Entry Global Dim. 2", "Currency Code")
        {
            Enabled = false;
            SumIndexFields = Amount, "Amount (LCY)", "Debit Amount", "Credit Amount", "Debit Amount (LCY)", "Credit Amount (LCY)";
        }
        key(Key9; "CV No.", "Posting Date", "Entry Type", "Initial Entry Global Dim. 1", "Initial Entry Global Dim. 2", "Currency Code")
        {
            Enabled = false;
            SumIndexFields = Amount, "Amount (LCY)";
        }
        key(Key10; "CV No.", "Initial Document Type", "Document Type", "Initial Entry Global Dim. 1", "Initial Entry Global Dim. 2")
        {
            Enabled = false;
            SumIndexFields = Amount, "Amount (LCY)";
        }
        key(Key11; "Initial Document Type", "CV No.", "Posting Date", "Currency Code", "Entry Type", "Initial Entry Global Dim. 1", "Initial Entry Global Dim. 2")
        {
            Enabled = false;
            SumIndexFields = Amount, "Amount (LCY)";
        }
    }

    fieldgroups
    {
    }

    protected var
        GeneralLedgerSetup: Record "General Ledger Setup";
        GeneralLedgerSetupRead: Boolean;

    local procedure GetAdditionalReportingCurrencyCode(): Code[10]
    begin
        if not GeneralLedgerSetupRead then begin
            GeneralLedgerSetup.Get();
            GeneralLedgerSetupRead := true;
        end;
        exit(GeneralLedgerSetup."Additional Reporting Currency")
    end;

    /// <summary>
    /// Inserts or updates a detailed CV ledger entry buffer record with consolidation logic.
    /// Combines entries with matching key fields to avoid duplicate buffer records.
    /// </summary>
    /// <param name="DtldCVLedgEntryBuf">Detailed CV ledger entry buffer record to insert</param>
    /// <param name="CVLedgEntryBuf">Parent CV ledger entry buffer record</param>
    /// <param name="InsertZeroAmout">Whether to insert entries with zero amounts</param>
    procedure InsertDtldCVLedgEntry(var DtldCVLedgEntryBuf: Record "Detailed CV Ledg. Entry Buffer"; var CVLedgEntryBuf: Record "CV Ledger Entry Buffer"; InsertZeroAmout: Boolean)
    var
        NewDtldCVLedgEntryBuf: Record "Detailed CV Ledg. Entry Buffer";
        NextDtldBufferEntryNo: Integer;
        IsHandled: Boolean;
    begin
        if (DtldCVLedgEntryBuf.Amount = 0) and
           (DtldCVLedgEntryBuf."Amount (LCY)" = 0) and
           (DtldCVLedgEntryBuf."VAT Amount (LCY)" = 0) and
           (DtldCVLedgEntryBuf."Additional-Currency Amount" = 0) and
           (not InsertZeroAmout)
        then
            exit;

        DtldCVLedgEntryBuf.TestField("Entry Type");

        OnInsertDtldCVLedgEntryOnBeforeNewDtldCVLedgEntryBufInit(DtldCVLedgEntryBuf, CVLedgEntryBuf);
        NewDtldCVLedgEntryBuf.Init();
        NewDtldCVLedgEntryBuf := DtldCVLedgEntryBuf;

        if NextDtldBufferEntryNo = 0 then begin
            DtldCVLedgEntryBuf.Reset();
            if DtldCVLedgEntryBuf.FindLast() then
                NextDtldBufferEntryNo := DtldCVLedgEntryBuf."Entry No." + 1
            else
                NextDtldBufferEntryNo := 1;
        end;

        DtldCVLedgEntryBuf.Reset();
        DtldCVLedgEntryBuf.SetRange("CV Ledger Entry No.", CVLedgEntryBuf."Entry No.");
        DtldCVLedgEntryBuf.SetRange("Entry Type", NewDtldCVLedgEntryBuf."Entry Type");
        DtldCVLedgEntryBuf.SetRange("Posting Date", NewDtldCVLedgEntryBuf."Posting Date");
        DtldCVLedgEntryBuf.SetRange("Document Type", NewDtldCVLedgEntryBuf."Document Type");
        DtldCVLedgEntryBuf.SetRange("Document No.", NewDtldCVLedgEntryBuf."Document No.");
        DtldCVLedgEntryBuf.SetRange("CV No.", NewDtldCVLedgEntryBuf."CV No.");
        DtldCVLedgEntryBuf.SetRange("Gen. Posting Type", NewDtldCVLedgEntryBuf."Gen. Posting Type");
        DtldCVLedgEntryBuf.SetRange(
          "Gen. Bus. Posting Group", NewDtldCVLedgEntryBuf."Gen. Bus. Posting Group");
        DtldCVLedgEntryBuf.SetRange(
          "Gen. Prod. Posting Group", NewDtldCVLedgEntryBuf."Gen. Prod. Posting Group");
        DtldCVLedgEntryBuf.SetRange(
          "VAT Bus. Posting Group", NewDtldCVLedgEntryBuf."VAT Bus. Posting Group");
        DtldCVLedgEntryBuf.SetRange(
          "VAT Prod. Posting Group", NewDtldCVLedgEntryBuf."VAT Prod. Posting Group");
        DtldCVLedgEntryBuf.SetRange("Tax Area Code", NewDtldCVLedgEntryBuf."Tax Area Code");
        DtldCVLedgEntryBuf.SetRange("Tax Liable", NewDtldCVLedgEntryBuf."Tax Liable");
        DtldCVLedgEntryBuf.SetRange("Tax Group Code", NewDtldCVLedgEntryBuf."Tax Group Code");
        DtldCVLedgEntryBuf.SetRange("Use Tax", NewDtldCVLedgEntryBuf."Use Tax");
        DtldCVLedgEntryBuf.SetRange(
          "Tax Jurisdiction Code", NewDtldCVLedgEntryBuf."Tax Jurisdiction Code");

        IsHandled := false;
        OnBeforeCreateDtldCVLedgEntryBuf(DtldCVLedgEntryBuf, NewDtldCVLedgEntryBuf, NextDtldBufferEntryNo, IsHandled, CVLedgEntryBuf);
        if IsHandled then
            exit;

        if DtldCVLedgEntryBuf.FindFirst() then begin
            DtldCVLedgEntryBuf.Amount := DtldCVLedgEntryBuf.Amount + NewDtldCVLedgEntryBuf.Amount;
            DtldCVLedgEntryBuf."Amount (LCY)" :=
              DtldCVLedgEntryBuf."Amount (LCY)" + NewDtldCVLedgEntryBuf."Amount (LCY)";
            DtldCVLedgEntryBuf."VAT Amount (LCY)" :=
              DtldCVLedgEntryBuf."VAT Amount (LCY)" + NewDtldCVLedgEntryBuf."VAT Amount (LCY)";
            DtldCVLedgEntryBuf."Additional-Currency Amount" :=
              DtldCVLedgEntryBuf."Additional-Currency Amount" +
              NewDtldCVLedgEntryBuf."Additional-Currency Amount";
            OnInsertDtldCVLedgEntryOnBeforeModify(DtldCVLedgEntryBuf, NewDtldCVLedgEntryBuf);
            DtldCVLedgEntryBuf.Modify();
        end else begin
            NewDtldCVLedgEntryBuf."Entry No." := NextDtldBufferEntryNo;
            NextDtldBufferEntryNo := NextDtldBufferEntryNo + 1;
            DtldCVLedgEntryBuf := NewDtldCVLedgEntryBuf;
            OnInsertDtldCVLedgEntryOnBeforeInsert(DtldCVLedgEntryBuf);
            DtldCVLedgEntryBuf.Insert();
        end;

        CVLedgEntryBuf."Amount to Apply" := NewDtldCVLedgEntryBuf.Amount + CVLedgEntryBuf."Amount to Apply";
        CVLedgEntryBuf."Remaining Amount" := NewDtldCVLedgEntryBuf.Amount + CVLedgEntryBuf."Remaining Amount";
        CVLedgEntryBuf."Remaining Amt. (LCY)" :=
          NewDtldCVLedgEntryBuf."Amount (LCY)" + CVLedgEntryBuf."Remaining Amt. (LCY)";

        if DtldCVLedgEntryBuf."Entry Type" = DtldCVLedgEntryBuf."Entry Type"::"Initial Entry" then begin
            CVLedgEntryBuf."Original Amount" := NewDtldCVLedgEntryBuf.Amount;
            CVLedgEntryBuf."Original Amt. (LCY)" := NewDtldCVLedgEntryBuf."Amount (LCY)";
        end;
        DtldCVLedgEntryBuf.Reset();

        OnAfterInsertDtldCVLedgEntry(DtldCVLedgEntryBuf, CVLedgEntryBuf, NewDtldCVLedgEntryBuf, NextDtldBufferEntryNo);
    end;

    /// <summary>
    /// Copies posting group fields from a VAT entry to the detailed CV ledger entry buffer.
    /// Used for VAT-related detailed entries to maintain proper posting setup references.
    /// </summary>
    /// <param name="VATEntry">VAT entry containing posting group information to copy</param>
    procedure CopyPostingGroupsFromVATEntry(VATEntry: Record "VAT Entry")
    begin
        "Gen. Posting Type" := VATEntry.Type;
        "Gen. Bus. Posting Group" := VATEntry."Gen. Bus. Posting Group";
        "Gen. Prod. Posting Group" := VATEntry."Gen. Prod. Posting Group";
        "VAT Bus. Posting Group" := VATEntry."VAT Bus. Posting Group";
        "VAT Prod. Posting Group" := VATEntry."VAT Prod. Posting Group";
        "Tax Area Code" := VATEntry."Tax Area Code";
        "Tax Liable" := VATEntry."Tax Liable";
        "Tax Group Code" := VATEntry."Tax Group Code";
        "Use Tax" := VATEntry."Use Tax";
        OnAfterCopyPostingGroupsFromVATEntry(Rec, VATEntry);
    end;

    /// <summary>
    /// Copies relevant fields from a general journal line to create an initial detailed CV ledger entry.
    /// Sets up the buffer with transaction amounts, dimensions, and basic posting information.
    /// </summary>
    /// <param name="GenJnlLine">General journal line containing source transaction data</param>
    procedure CopyFromGenJnlLine(GenJnlLine: Record "Gen. Journal Line")
    begin
        "Entry Type" := "Entry Type"::"Initial Entry";
        "Posting Date" := GenJnlLine."Posting Date";
        "Document Type" := GenJnlLine."Document Type";
        "Document No." := GenJnlLine."Document No.";
        Amount := GenJnlLine.Amount;
        "Amount (LCY)" := GenJnlLine."Amount (LCY)";
        "Additional-Currency Amount" := GenJnlLine.Amount;
        "CV No." := GenJnlLine."Account No.";
        "Currency Code" := GenJnlLine."Currency Code";
        "User ID" := CopyStr(UserId(), 1, MaxStrLen("User ID"));
        "Initial Entry Due Date" := GenJnlLine."Due Date";
        "Initial Entry Global Dim. 1" := GenJnlLine."Shortcut Dimension 1 Code";
        "Initial Entry Global Dim. 2" := GenJnlLine."Shortcut Dimension 2 Code";
        "Initial Document Type" := GenJnlLine."Document Type";
        OnAfterCopyFromGenJnlLine(Rec, GenJnlLine);
    end;

    /// <summary>
    /// Initializes the detailed CV ledger entry buffer with basic posting information from a general journal line.
    /// Sets up document and user identification fields without amounts or detailed data.
    /// </summary>
    /// <param name="GenJnlLine">General journal line containing basic posting information</param>
    procedure InitFromGenJnlLine(GenJnlLine: Record "Gen. Journal Line")
    begin
        Init();
        "Posting Date" := GenJnlLine."Posting Date";
        "Document Type" := GenJnlLine."Document Type";
        "Document No." := GenJnlLine."Document No.";
        "User ID" := CopyStr(UserId(), 1, MaxStrLen("User ID"));
        OnAfterInitFromGenJnlLine(Rec, GenJnlLine);
    end;

    /// <summary>
    /// Copies key reference fields from a CV ledger entry buffer to establish parent-child relationship.
    /// Links the detailed entry to its parent ledger entry with currency and dimension information.
    /// </summary>
    /// <param name="CVLedgEntryBuf">Parent CV ledger entry buffer containing reference data</param>
    procedure CopyFromCVLedgEntryBuf(CVLedgEntryBuf: Record "CV Ledger Entry Buffer")
    begin
        "CV Ledger Entry No." := CVLedgEntryBuf."Entry No.";
        "CV No." := CVLedgEntryBuf."CV No.";
        "Currency Code" := CVLedgEntryBuf."Currency Code";
        "Initial Entry Due Date" := CVLedgEntryBuf."Due Date";
        "Initial Entry Global Dim. 1" := CVLedgEntryBuf."Global Dimension 1 Code";
        "Initial Entry Global Dim. 2" := CVLedgEntryBuf."Global Dimension 2 Code";
        "Initial Document Type" := CVLedgEntryBuf."Document Type";
        OnAfterCopyFromCVLedgEntryBuf(Rec, CVLedgEntryBuf);
    end;

    /// <summary>
    /// Initializes and inserts a complete detailed CV ledger entry buffer with specified amounts and application data.
    /// Creates fully populated detailed entry for payment applications, discounts, and tolerance scenarios.
    /// </summary>
    /// <param name="GenJnlLine">Source general journal line</param>
    /// <param name="CVLedgEntryBuf">Parent CV ledger entry buffer</param>
    /// <param name="DtldCVLedgEntryBuf">Detailed CV ledger entry buffer to initialize</param>
    /// <param name="EntryType">Type of detailed entry to create</param>
    /// <param name="AmountFCY">Amount in foreign currency</param>
    /// <param name="AmountLCY">Amount in local currency</param>
    /// <param name="AmountAddCurr">Amount in additional reporting currency</param>
    /// <param name="AppliedEntryNo">Entry number of applied ledger entry</param>
    /// <param name="RemainingPmtDiscPossible">Remaining payment discount available</param>
    /// <param name="MaxPaymentTolerance">Maximum payment tolerance amount</param>
    procedure InitDetailedCVLedgEntryBuf(GenJnlLine: Record "Gen. Journal Line"; var CVLedgEntryBuf: Record "CV Ledger Entry Buffer"; var DtldCVLedgEntryBuf: Record "Detailed CV Ledg. Entry Buffer"; EntryType: Enum "Detailed CV Ledger Entry Type"; AmountFCY: Decimal; AmountLCY: Decimal; AmountAddCurr: Decimal; AppliedEntryNo: Integer; RemainingPmtDiscPossible: Decimal; MaxPaymentTolerance: Decimal)
    var
        IsHandled: Boolean;
    begin
        DtldCVLedgEntryBuf.InitFromGenJnlLine(GenJnlLine);
        DtldCVLedgEntryBuf.CopyFromCVLedgEntryBuf(CVLedgEntryBuf);
        DtldCVLedgEntryBuf."Entry Type" := EntryType;
        DtldCVLedgEntryBuf.Amount := AmountFCY;
        DtldCVLedgEntryBuf."Amount (LCY)" := AmountLCY;
        DtldCVLedgEntryBuf."Additional-Currency Amount" := AmountAddCurr;
        DtldCVLedgEntryBuf."Applied CV Ledger Entry No." := AppliedEntryNo;
        DtldCVLedgEntryBuf."Remaining Pmt. Disc. Possible" := RemainingPmtDiscPossible;
        DtldCVLedgEntryBuf."Max. Payment Tolerance" := MaxPaymentTolerance;
        IsHandled := false;
        OnBeforeInsertDtldCVLedgEntry(DtldCVLedgEntryBuf, GenJnlLine, IsHandled, CVLedgEntryBuf);
        if not IsHandled then
            DtldCVLedgEntryBuf.InsertDtldCVLedgEntry(DtldCVLedgEntryBuf, CVLedgEntryBuf, false);
    end;

    /// <summary>
    /// Finds the corresponding VAT entry for the detailed CV ledger entry using transaction number and posting groups.
    /// Used to link detailed entries with their related VAT transactions for reporting and analysis.
    /// </summary>
    /// <param name="VATEntry">VAT entry record to populate with found entry</param>
    /// <param name="TransactionNo">Transaction number to search for</param>
    procedure FindVATEntry(var VATEntry: Record "VAT Entry"; TransactionNo: Integer)
    begin
        VATEntry.Reset();
        VATEntry.SetCurrentKey("Transaction No.");
        VATEntry.SetRange("Transaction No.", TransactionNo);
        VATEntry.SetRange("VAT Bus. Posting Group", "VAT Bus. Posting Group");
        VATEntry.SetRange("VAT Prod. Posting Group", "VAT Prod. Posting Group");
        VATEntry.FindFirst();
    end;

    /// <summary>
    /// Integration event raised after copying fields from a general journal line to the detailed CV ledger entry buffer.
    /// Enables customization of field mapping and additional data population from journal lines.
    /// </summary>
    /// <param name="DtldCVLedgEntryBuffer">Detailed CV ledger entry buffer being populated</param>
    /// <param name="GenJnlLine">Source general journal line</param>
    [IntegrationEvent(false, false)]
    local procedure OnAfterCopyFromGenJnlLine(var DtldCVLedgEntryBuffer: Record "Detailed CV Ledg. Entry Buffer"; GenJnlLine: Record "Gen. Journal Line")
    begin
    end;

    /// <summary>
    /// Integration event raised after copying reference fields from a CV ledger entry buffer.
    /// Enables customization of field mapping and additional data population from parent ledger entries.
    /// </summary>
    /// <param name="DetailedCVLedgEntryBuffer">Detailed CV ledger entry buffer being populated</param>
    /// <param name="CVLedgerEntryBuffer">Source CV ledger entry buffer</param>
    [IntegrationEvent(false, false)]
    local procedure OnAfterCopyFromCVLedgEntryBuf(var DetailedCVLedgEntryBuffer: Record "Detailed CV Ledg. Entry Buffer"; CVLedgerEntryBuffer: Record "CV Ledger Entry Buffer")
    begin
    end;

    /// <summary>
    /// Integration event raised after copying posting groups from a VAT entry.
    /// Enables customization of VAT-related posting group assignments and validation.
    /// </summary>
    /// <param name="DetailedCVLedgEntryBuffer">Detailed CV ledger entry buffer being updated</param>
    /// <param name="VATEntry">Source VAT entry with posting group information</param>
    [IntegrationEvent(false, false)]
    local procedure OnAfterCopyPostingGroupsFromVATEntry(var DetailedCVLedgEntryBuffer: Record "Detailed CV Ledg. Entry Buffer"; VATEntry: Record "VAT Entry")
    begin
    end;

    /// <summary>
    /// Integration event raised after initializing basic fields from a general journal line.
    /// Enables customization of initialization logic and additional field setup.
    /// </summary>
    /// <param name="DetailedCVLedgEntryBuffer">Detailed CV ledger entry buffer being initialized</param>
    /// <param name="GenJournalLine">Source general journal line</param>
    [IntegrationEvent(false, false)]
    local procedure OnAfterInitFromGenJnlLine(var DetailedCVLedgEntryBuffer: Record "Detailed CV Ledg. Entry Buffer"; GenJournalLine: Record "Gen. Journal Line")
    begin
    end;

    /// <summary>
    /// Integration event raised after inserting a detailed CV ledger entry buffer record.
    /// Enables post-processing of inserted detailed entries and related buffer updates.
    /// </summary>
    /// <param name="DtldCVLedgEntryBuf">Current detailed CV ledger entry buffer</param>
    /// <param name="CVLedgEntryBuf">Parent CV ledger entry buffer</param>
    /// <param name="NewDtldCVLedgEntryBuf">Newly inserted detailed entry</param>
    /// <param name="NextDtldBufferEntryNo">Next available entry number for sequencing</param>
    [IntegrationEvent(false, false)]
    local procedure OnAfterInsertDtldCVLedgEntry(var DtldCVLedgEntryBuf: Record "Detailed CV Ledg. Entry Buffer"; var CVLedgEntryBuf: Record "CV Ledger Entry Buffer"; var NewDtldCVLedgEntryBuf: Record "Detailed CV Ledg. Entry Buffer"; var NextDtldBufferEntryNo: Integer)
    begin
    end;

    /// <summary>
    /// Integration event raised before inserting a detailed CV ledger entry buffer in the initialization process.
    /// Enables custom validation and processing before detailed entry creation.
    /// </summary>
    /// <param name="DetailedCVLedgEntryBuffer">Detailed CV ledger entry buffer to be inserted</param>
    /// <param name="GenJournalLine">Source general journal line</param>
    /// <param name="IsHanled">Set to true to skip standard insertion logic</param>
    /// <param name="CVLedgerEntryBuffer">Parent CV ledger entry buffer</param>
    [IntegrationEvent(false, false)]
    local procedure OnBeforeInsertDtldCVLedgEntry(var DetailedCVLedgEntryBuffer: Record "Detailed CV Ledg. Entry Buffer"; GenJournalLine: Record "Gen. Journal Line"; var IsHanled: Boolean; var CVLedgerEntryBuffer: Record "CV Ledger Entry Buffer")
    begin
    end;

    /// <summary>
    /// Integration event raised before creating a detailed CV ledger entry buffer during consolidation.
    /// Enables custom logic for entry consolidation and duplicate detection.
    /// </summary>
    /// <param name="DtldCVLedgEntryBuf">Current detailed CV ledger entry buffer for comparison</param>
    /// <param name="NewDtldCVLedgEntryBuf">New detailed entry being processed</param>
    /// <param name="NextDtldBufferEntryNo">Next available entry number</param>
    /// <param name="IsHandled">Set to true to skip standard consolidation logic</param>
    /// <param name="CVLedgEntryBuf">Parent CV ledger entry buffer</param>
    [IntegrationEvent(false, false)]
    local procedure OnBeforeCreateDtldCVLedgEntryBuf(var DtldCVLedgEntryBuf: Record "Detailed CV Ledg. Entry Buffer"; var NewDtldCVLedgEntryBuf: Record "Detailed CV Ledg. Entry Buffer"; var NextDtldBufferEntryNo: Integer; var IsHandled: Boolean; var CVLedgEntryBuf: Record "CV Ledger Entry Buffer")
    begin
    end;

    /// <summary>
    /// Integration event raised before inserting a new detailed CV ledger entry buffer record.
    /// Enables final validation and field modifications before database insertion.
    /// </summary>
    /// <param name="DetailedCVLedgEntryBuffer">Detailed CV ledger entry buffer about to be inserted</param>
    [IntegrationEvent(false, false)]
    local procedure OnInsertDtldCVLedgEntryOnBeforeInsert(var DetailedCVLedgEntryBuffer: Record "Detailed CV Ledg. Entry Buffer")
    begin
    end;

    /// <summary>
    /// Integration event raised before modifying an existing detailed CV ledger entry buffer during consolidation.
    /// Enables custom logic for amount aggregation and field updates in consolidated entries.
    /// </summary>
    /// <param name="DetailedCVLedgEntryBuffer">Existing detailed CV ledger entry buffer being modified</param>
    /// <param name="NewDtldCVLedgEntryBuf">New detailed entry being consolidated</param>
    [IntegrationEvent(false, false)]
    local procedure OnInsertDtldCVLedgEntryOnBeforeModify(var DetailedCVLedgEntryBuffer: Record "Detailed CV Ledg. Entry Buffer"; NewDtldCVLedgEntryBuf: Record "Detailed CV Ledg. Entry Buffer")
    begin
    end;

    /// <summary>
    /// Integration event raised before initializing a new detailed CV ledger entry buffer during the insertion process.
    /// Enables custom setup and field population before detailed entry processing begins.
    /// </summary>
    /// <param name="DtldCVLedgEntryBuf">Source detailed CV ledger entry buffer</param>
    /// <param name="CVLedgEntryBuf">Parent CV ledger entry buffer</param>
    [IntegrationEvent(false, false)]
    local procedure OnInsertDtldCVLedgEntryOnBeforeNewDtldCVLedgEntryBufInit(var DtldCVLedgEntryBuf: Record "Detailed CV Ledg. Entry Buffer"; CVLedgEntryBuf: Record "CV Ledger Entry Buffer")
    begin
    end;
}