Page 1571 G/L Entries Preview Subform, source in 29

Source29

src/Layers/W1/BaseApp/Finance/GeneralLedger/Preview/GLEntriesPreviewSubform.Page.al374 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.GeneralLedger.Preview;

using Microsoft.Finance.Dimension;
using Microsoft.Finance.GeneralLedger.Account;
using Microsoft.Finance.GeneralLedger.Ledger;
using System.Security.User;

/// <summary>
/// G/L entries preview subform displaying hierarchical view of general ledger entries during posting preview.
/// Provides detailed analysis of G/L posting results with account grouping and dimension support.
/// </summary>
/// <remarks>
/// Features hierarchical display with account grouping for easy analysis of posting distributions.
/// Includes dimension viewing capabilities and supports both flat and grouped entry displays.
/// Integrates with posting preview framework to show temporary G/L entries without database commits.
/// </remarks>
page 1571 "G/L Entries Preview Subform"
{
    PageType = ListPart;
    Editable = false;
    SourceTable = "G/L Entry Posting Preview";
    SourceTableTemporary = true;
    Caption = 'G/L Entries';

    layout
    {
        area(Content)
        {
            repeater(GroupName)
            {
                ShowAsTree = true;
                IndentationColumn = Rec.Indentation;
                ShowCaption = false;
                TreeInitialState = CollapseAll;
                field("G/L Account No."; Rec."G/L Account No.")
                {
                    ApplicationArea = Basic, Suite;
                    Style = Strong;
                    StyleExpr = Emphasize;
                }
                field("G/L Account Name"; Rec."G/L Account Name")
                {
                    ApplicationArea = Basic, Suite;
                    DrillDown = false;
                    Visible = false;
                }
                field(Description; Rec.Description)
                {
                    ApplicationArea = Basic, Suite;
                    Style = Strong;
                    StyleExpr = Emphasize;
                }
                field("Posting Date"; Rec."Posting Date")
                {
                    ApplicationArea = Basic, Suite;
                }
                field("Document Type"; Rec."Document Type")
                {
                    ApplicationArea = Basic, Suite;
                }
                field("Document No."; Rec."Document No.")
                {
                    ApplicationArea = Basic, Suite;
                }
                field("Gen. Posting Type"; Rec."Gen. Posting Type")
                {
                    ApplicationArea = Basic, Suite;
                }
                field("Gen. Bus. Posting Group"; Rec."Gen. Bus. Posting Group")
                {
                    ApplicationArea = Basic, Suite;
                }
                field("Gen. Prod. Posting Group"; Rec."Gen. Prod. Posting Group")
                {
                    ApplicationArea = Basic, Suite;
                }
                field(Amount; Rec.Amount)
                {
                    ApplicationArea = Basic, Suite;
                    Style = Strong;
                    StyleExpr = Emphasize;
                }
                field("Debit Amount"; Rec."Debit Amount")
                {
                    ApplicationArea = Basic, Suite;
                    Visible = false;
                }
                field("Credit Amount"; Rec."Credit Amount")
                {
                    ApplicationArea = Basic, Suite;
                    Visible = false;
                }
                field("Additional-Currency Amount"; Rec."Additional-Currency Amount")
                {
                    ApplicationArea = Basic, Suite;
                    Visible = false;
                }
                field("VAT Amount"; Rec."VAT Amount")
                {
                    ApplicationArea = Basic, Suite;
                    Visible = false;
                }
                field("Bal. Account Type"; Rec."Bal. Account Type")
                {
                    ApplicationArea = Basic, Suite;
                }
                field("Bal. Account No."; Rec."Bal. Account No.")
                {
                    ApplicationArea = Basic, Suite;
                }
                field("User ID"; Rec."User ID")
                {
                    ApplicationArea = Basic, Suite;
                    Visible = false;

                    trigger OnDrillDown()
                    var
                        UserMgt: Codeunit "User Management";
                    begin
                        UserMgt.DisplayUserInformation(Rec."User ID");
                    end;
                }
                field("Source Code"; Rec."Source Code")
                {
                    ApplicationArea = Suite;
                    Visible = false;
                }
                field("Reason Code"; Rec."Reason Code")
                {
                    ApplicationArea = Suite;
                    Visible = false;
                }
                field(Reversed; Rec.Reversed)
                {
                    ApplicationArea = Basic, Suite;
                    Visible = false;
                }
                field("Reversed by Entry No."; Rec."Reversed by Entry No.")
                {
                    ApplicationArea = Basic, Suite;
                    Visible = false;
                }
                field("Reversed Entry No."; Rec."Reversed Entry No.")
                {
                    ApplicationArea = Basic, Suite;
                    Visible = false;
                }
                field("FA Entry Type"; Rec."FA Entry Type")
                {
                    ApplicationArea = Basic, Suite;
                    Visible = false;
                }
                field("FA Entry No."; Rec."FA Entry No.")
                {
                    ApplicationArea = Basic, Suite;
                    Visible = false;
                }
                field("Dimension Set ID"; Rec."Dimension Set ID")
                {
                    ApplicationArea = Dimensions;
                    Visible = false;
                }
                field("Global Dimension 1 Code"; Rec."Global Dimension 1 Code")
                {
                    ApplicationArea = Dimensions;
                    Visible = Dim1Visible;
                }
                field("Global Dimension 2 Code"; Rec."Global Dimension 2 Code")
                {
                    ApplicationArea = Dimensions;
                    Visible = Dim2Visible;
                }
                field("Shortcut Dimension 3 Code"; Rec."Shortcut Dimension 3 Code")
                {
                    ApplicationArea = Dimensions;
                    Editable = false;
                    Visible = Dim3Visible;
                }
                field("Shortcut Dimension 4 Code"; Rec."Shortcut Dimension 4 Code")
                {
                    ApplicationArea = Dimensions;
                    Editable = false;
                    Visible = Dim4Visible;
                }
                field("Shortcut Dimension 5 Code"; Rec."Shortcut Dimension 5 Code")
                {
                    ApplicationArea = Dimensions;
                    Editable = false;
                    Visible = Dim5Visible;
                }
                field("Shortcut Dimension 6 Code"; Rec."Shortcut Dimension 6 Code")
                {
                    ApplicationArea = Dimensions;
                    Editable = false;
                    Visible = Dim6Visible;
                }
                field("Shortcut Dimension 7 Code"; Rec."Shortcut Dimension 7 Code")
                {
                    ApplicationArea = Dimensions;
                    Editable = false;
                    Visible = Dim7Visible;
                }
                field("Shortcut Dimension 8 Code"; Rec."Shortcut Dimension 8 Code")
                {
                    ApplicationArea = Dimensions;
                    Editable = false;
                    Visible = Dim8Visible;
                }
            }
        }
    }

    actions
    {
        area(Processing)
        {
            action(Dimensions)
            {
                ApplicationArea = Dimensions;
                Caption = 'Dimensions';
                Image = Dimensions;
                ShortCutKey = 'Alt+D';
                ToolTip = 'View or edit dimensions, such as area, project, or department, that you can assign to sales and purchase documents to distribute costs and analyze transaction history.';
                Enabled = ShowDimensionEnabled;

                trigger OnAction()
                begin
                    GenJnlPostPreview.ShowDimensions(DATABASE::"G/L Entry", Rec."G/L Entry No.", Rec."Dimension Set ID");
                end;
            }
        }
    }

    trigger OnOpenPage()
    begin
        SetDimVisibility();
    end;

    trigger OnAfterGetRecord()
    begin
        Emphasize := Rec.Indentation = 0;
        ShowDimensionEnabled := Rec."G/L Entry No." <> 0;

        if Rec."G/L Entry No." <> 0 then
            TempGLEntry.Get(Rec."G/L Entry No.")
        else begin
            TempGLEntry.Init();
            TempGLEntry."G/L Account No." := Rec."G/L Account No.";
            TempGLEntry.Description := Rec.Description;
            TempGLEntry.Amount := Rec.Amount;
        end;
    end;

    var
        GenJnlPostPreview: Codeunit "Gen. Jnl.-Post Preview";
        ShowDimensionEnabled: Boolean;

    protected var
        TempGLEntry: Record "G/L Entry" temporary;
        Dim1Visible: Boolean;
        Dim2Visible: Boolean;
        Dim3Visible: Boolean;
        Dim4Visible: Boolean;
        Dim5Visible: Boolean;
        Dim6Visible: Boolean;
        Dim7Visible: Boolean;
        Dim8Visible: Boolean;
        Emphasize: Boolean;

    local procedure SetDimVisibility()
    var
        DimensionManagement: Codeunit DimensionManagement;
    begin
        DimensionManagement.UseShortcutDims(Dim1Visible, Dim2Visible, Dim3Visible, Dim4Visible, Dim5Visible, Dim6Visible, Dim7Visible, Dim8Visible);
    end;

    /// <summary>
    /// Initializes the hierarchical G/L entries subform with preview entries from posting operations.
    /// Loads and organizes G/L entries with account grouping for structured analysis of posting results.
    /// </summary>
    /// <param name="PostingPreviewEventHandler">Event handler containing captured G/L entries from posting preview</param>
    procedure Set(PostingPreviewEventHandler: Codeunit "Posting Preview Event Handler")
    var
        TempGLEntryPostingPreview: Record "G/L Entry Posting Preview" temporary;
        RecRef: RecordRef;
    begin
        Rec.Reset();
        Rec.DeleteAll();
        TempGLEntryPostingPreview.Reset();
        TempGLEntryPostingPreview.DeleteAll();
        TempGLEntry.Reset();
        TempGLEntry.DeleteAll();

        PostingPreviewEventHandler.GetEntries(Database::"G/L Entry", RecRef);

        LoadBufferAsHierarchicalView(RecRef, TempGLEntryPostingPreview);

        Rec.Copy(TempGLEntryPostingPreview, true);
    end;

    local procedure LoadBufferAsHierarchicalView(var RecRef: RecordRef; var TempGLEntryPostingPreview: Record "G/L Entry Posting Preview" temporary)
    var
        GLAccount: Record "G/L Account";
        TempGLAccount: Record "G/L Account" temporary;
        EntryNo: Integer;
    begin
        if RecRef.FindSet() then
            repeat
                RecRef.SetTable(TempGLEntry);
                TempGLEntry.Insert();

                if not TempGLAccount.Get(TempGLEntry."G/L Account No.") then begin
                    GLAccount.Get(TempGLEntry."G/L Account No.");
                    TempGLAccount."No." := TempGLEntry."G/L Account No.";
                    TempGLAccount.Name := GLAccount.Name;
                    TempGLAccount.Insert();
                end;
            until RecRef.Next() = 0;

        EntryNo := 1;
        if TempGLAccount.FindSet() then
            repeat
                TempGLEntry.SetRange("G/L Account No.", TempGLAccount."No.");
                TempGLEntry.CalcSums(Amount);
                TempGLEntryPostingPreview.Init();
                TempGLEntryPostingPreview."Entry No." := EntryNo;
                TempGLEntryPostingPreview."G/L Account No." := TempGLAccount."No.";
                TempGLEntryPostingPreview.Description := TempGLAccount.Name;
                TempGLEntryPostingPreview.Amount := TempGLEntry.Amount;
                TempGLEntryPostingPreview.Indentation := 0;
                OnLoadBufferAsHierarchicalViewOnBeforeInsertGroupEntry(TempGLEntryPostingPreview, TempGLEntry);
                TempGLEntryPostingPreview.Insert();
                EntryNo += 1;

                if TempGLEntry.FindSet() then
                    repeat
                        TempGLEntryPostingPreview.Init();
                        TempGLEntryPostingPreview.TransferFields(TempGLEntry);
                        TempGLEntryPostingPreview."G/L Entry No." := TempGLEntry."Entry No.";
                        TempGLEntryPostingPreview."Entry No." := EntryNo;
                        TempGLEntryPostingPreview.Indentation := 1;
                        OnLoadBufferAsHierarchicalViewOnBeforeInsertEntry(TempGLEntryPostingPreview, TempGLEntry);
                        TempGLEntryPostingPreview.Insert();
                        EntryNo += 1;
                    until TempGLEntry.Next() = 0;
            until TempGLAccount.Next() = 0;
    end;
    /// <summary>
    /// Integration event raised before inserting G/L account group entries in hierarchical preview display.
    /// Enables customization of account group presentation and additional fields in preview hierarchy.
    /// </summary>
    /// <param name="TempGLEntryPostingPreview">Temporary preview record being prepared for group entry insertion</param>
    /// <param name="TempGLEntry">Source G/L entry record for group creation</param>
    [IntegrationEvent(false, false)]
    local procedure OnLoadBufferAsHierarchicalViewOnBeforeInsertGroupEntry(var TempGLEntryPostingPreview: Record "G/L Entry Posting Preview" temporary; var TempGLEntry: Record "G/L Entry" temporary)
    begin
    end;

    /// <summary>
    /// Integration event raised before inserting individual G/L entries in hierarchical preview display.
    /// Enables customization of individual entry presentation and field modifications in preview.
    /// </summary>
    /// <param name="TempGLEntryPostingPreview">Temporary preview record being prepared for entry insertion</param>
    /// <param name="TempGLEntry">Source G/L entry record for individual entry creation</param>
    [IntegrationEvent(false, false)]
    local procedure OnLoadBufferAsHierarchicalViewOnBeforeInsertEntry(var TempGLEntryPostingPreview: Record "G/L Entry Posting Preview" temporary; var TempGLEntry: Record "G/L Entry" temporary)
    begin
    end;
}