Codeunit 343 Dimension CaptionClass Mgmt, source in 29

Source29

src/Layers/W1/BaseApp/Finance/Dimension/DimensionCaptionClassMgmt.Codeunit.al380 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.Dimension;

using Microsoft.Finance.GeneralLedger.Setup;
using System.Text;

/// <summary>
/// Manages dynamic caption translation for dimension fields using CaptionClass expressions.
/// Provides localized captions for global and shortcut dimensions based on General Ledger Setup configuration.
/// </summary>
/// <remarks>
/// Singleton codeunit that translates dimension field captions for different languages.
/// Supports global dimensions, shortcut dimensions, and custom dimension caption expressions.
/// Extensibility through OnTranslateDimCaptionClassOnDimCaptionTypeCaseElse event for custom caption logic.
/// </remarks>
codeunit 343 "Dimension CaptionClass Mgmt"
{
    SingleInstance = true;

    trigger OnRun()
    begin
    end;

    var
        GLSetup: Record "General Ledger Setup";
        GLSetupRead: Boolean;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Caption Class", 'OnResolveCaptionClass', '', true, true)]
    local procedure ResolveCaptionClass(CaptionArea: Text; CaptionExpr: Text; Language: Integer; var Caption: Text; var Resolved: Boolean)
    begin
        if CaptionArea = '1' then
            Caption := DimCaptionClassTranslate(Language, CaptionExpr, Resolved);
    end;

    local procedure DimCaptionClassTranslate(Language: Integer; CaptionExpr: Text; var Resolved: Boolean) Result: Text
    var
        Dim: Record Dimension;
        DimCaptionType: Text[80];
        DimCaptionRef: Text[80];
        DimOptionalParam1: Text[80];
        DimOptionalParam2: Text[80];
        CommaPosition: Integer;
        IsHandled: Boolean;
    begin
        // DIMCAPTIONTYPE
        // <DataType>   := [SubString]
        // <Length>     <= 10
        // <DataValue>  := 1..6
        // 1 to retrieve Code Caption of Global Dimension
        // 2 to retrieve Code Caption of Shortcut Dimension
        // 3 to retrieve Filter Caption of Global Dimension
        // 4 to retrieve Filter Caption of Shortcut Dimension
        // 5 to retrieve Code Caption of any kind of Dimensions
        // 6 to retrieve Filter Caption of any kind of Dimensions
        // 7 to retrieve Name Caption of Shortcut Dimension

        // DIMCAPTIONREF
        // <DataType>   := [SubString]
        // <Length>     <= 10
        // <DataValue>  :=
        // if (<DIMCAPTIONTYPE> = 1) 1..2,<DIMOPTIONALPARAM1>,<DIMOPTIONALPARAM2>
        // if (<DIMCAPTIONTYPE> = 2) 1..8,<DIMOPTIONALPARAM1>,<DIMOPTIONALPARAM2>
        // if (<DIMCAPTIONTYPE> = 3) 1..2,<DIMOPTIONALPARAM1>,<DIMOPTIONALPARAM2>
        // if (<DIMCAPTIONTYPE> = 4) 1..8,<DIMOPTIONALPARAM1>,<DIMOPTIONALPARAM2>
        // if (<DIMCAPTIONTYPE> = 5) [Table]Dimension.[Field]Code,<DIMOPTIONALPARAM1>,<DIMOPTIONALPARAM2>
        // if (<DIMCAPTIONTYPE> = 6) [Table]Dimension.[Field]Code,<DIMOPTIONALPARAM1>,<DIMOPTIONALPARAM2>
        // if (<DIMCAPTIONTYPE> = 7) 1..8,<DIMOPTIONALPARAM1>,<DIMOPTIONALPARAM2>

        // DIMOPTIONALPARAM1
        // <DataType>   := [SubString]
        // <Length>     <= 30
        // <DataValue>  := [String]
        // a string added before the dimension name

        // DIMOPTIONALPARAM2
        // <DataType>   := [SubString]
        // <Length>     <= 30
        // <DataValue>  := [String]
        // a string added after the dimension name

        Resolved := false;
        if not GetGLSetup() then
            exit('');

        CommaPosition := StrPos(CaptionExpr, ',');
        if CommaPosition > 0 then begin
            Resolved := true;
            DimCaptionType := CopyStr(CaptionExpr, 1, CommaPosition - 1);
            DimCaptionRef := CopyStr(CaptionExpr, CommaPosition + 1);
            CommaPosition := StrPos(DimCaptionRef, ',');
            if CommaPosition > 0 then begin
                DimOptionalParam1 := CopyStr(DimCaptionRef, CommaPosition + 1);
                DimCaptionRef := CopyStr(DimCaptionRef, 1, CommaPosition - 1);
                CommaPosition := StrPos(DimOptionalParam1, ',');
                if CommaPosition > 0 then begin
                    DimOptionalParam2 := CopyStr(DimOptionalParam1, CommaPosition + 1);
                    DimOptionalParam1 := CopyStr(DimOptionalParam1, 1, CommaPosition - 1);
                end else
                    DimOptionalParam2 := '';
            end else begin
                DimOptionalParam1 := '';
                DimOptionalParam2 := '';
            end;
            case DimCaptionType of
                '1':  // Code Caption - Global Dimension using No. as Reference
                    case DimCaptionRef of
                        '1':
                            exit(
                              CodeCaption(
                                Language, DimOptionalParam1, DimOptionalParam2,
                                GLSetup."Global Dimension 1 Code",
                                GLSetup.FieldCaption("Global Dimension 1 Code")));
                        '2':
                            exit(
                              CodeCaption(
                                Language, DimOptionalParam1, DimOptionalParam2,
                                GLSetup."Global Dimension 2 Code",
                                GLSetup.FieldCaption("Global Dimension 2 Code")));
                    end;
                '2':  // Code Caption - Shortcut Dimension using No. as Reference
                    case DimCaptionRef of
                        '1':
                            exit(
                              CodeCaption(
                                Language, DimOptionalParam1, DimOptionalParam2,
                                GLSetup."Shortcut Dimension 1 Code",
                                GLSetup.FieldCaption("Shortcut Dimension 1 Code")));
                        '2':
                            exit(
                              CodeCaption(
                                Language, DimOptionalParam1, DimOptionalParam2,
                                GLSetup."Shortcut Dimension 2 Code",
                                GLSetup.FieldCaption("Shortcut Dimension 2 Code")));
                        '3':
                            exit(
                              CodeCaption(
                                Language, DimOptionalParam1, DimOptionalParam2,
                                GLSetup."Shortcut Dimension 3 Code",
                                GLSetup.FieldCaption("Shortcut Dimension 3 Code")));
                        '4':
                            exit(
                              CodeCaption(
                                Language, DimOptionalParam1, DimOptionalParam2,
                                GLSetup."Shortcut Dimension 4 Code",
                                GLSetup.FieldCaption("Shortcut Dimension 4 Code")));
                        '5':
                            exit(
                              CodeCaption(
                                Language, DimOptionalParam1, DimOptionalParam2,
                                GLSetup."Shortcut Dimension 5 Code",
                                GLSetup.FieldCaption("Shortcut Dimension 5 Code")));
                        '6':
                            exit(
                              CodeCaption(
                                Language, DimOptionalParam1, DimOptionalParam2,
                                GLSetup."Shortcut Dimension 6 Code",
                                GLSetup.FieldCaption("Shortcut Dimension 6 Code")));
                        '7':
                            exit(
                              CodeCaption(
                                Language, DimOptionalParam1, DimOptionalParam2,
                                GLSetup."Shortcut Dimension 7 Code",
                                GLSetup.FieldCaption("Shortcut Dimension 7 Code")));
                        '8':
                            exit(
                              CodeCaption(
                                Language, DimOptionalParam1, DimOptionalParam2,
                                GLSetup."Shortcut Dimension 8 Code",
                                GLSetup.FieldCaption("Shortcut Dimension 8 Code")));
                    end;
                '3':  // Filter Caption - Global Dimension using No. as Reference
                    case DimCaptionRef of
                        '1':
                            exit(
                              FilterCaption(
                                Language, DimOptionalParam1, DimOptionalParam2,
                                GLSetup."Global Dimension 1 Code",
                                GLSetup.FieldCaption("Global Dimension 1 Code")));
                        '2':
                            exit(
                              FilterCaption(
                                Language, DimOptionalParam1, DimOptionalParam2,
                                GLSetup."Global Dimension 2 Code",
                                GLSetup.FieldCaption("Global Dimension 2 Code")));
                    end;
                '4':  // Filter Caption - Shortcut Dimension using No. as Reference
                    case DimCaptionRef of
                        '1':
                            exit(
                              FilterCaption(
                                Language, DimOptionalParam1, DimOptionalParam2,
                                GLSetup."Shortcut Dimension 1 Code",
                                GLSetup.FieldCaption("Shortcut Dimension 1 Code")));
                        '2':
                            exit(
                              FilterCaption(
                                Language, DimOptionalParam1, DimOptionalParam2,
                                GLSetup."Shortcut Dimension 2 Code",
                                GLSetup.FieldCaption("Shortcut Dimension 2 Code")));
                        '3':
                            exit(
                              FilterCaption(
                                Language, DimOptionalParam1, DimOptionalParam2,
                                GLSetup."Shortcut Dimension 3 Code",
                                GLSetup.FieldCaption("Shortcut Dimension 3 Code")));
                        '4':
                            exit(
                              FilterCaption(
                                Language, DimOptionalParam1, DimOptionalParam2,
                                GLSetup."Shortcut Dimension 4 Code",
                                GLSetup.FieldCaption("Shortcut Dimension 4 Code")));
                        '5':
                            exit(
                              FilterCaption(
                                Language, DimOptionalParam1, DimOptionalParam2,
                                GLSetup."Shortcut Dimension 5 Code",
                                GLSetup.FieldCaption("Shortcut Dimension 5 Code")));
                        '6':
                            exit(
                              FilterCaption(
                                Language, DimOptionalParam1, DimOptionalParam2,
                                GLSetup."Shortcut Dimension 6 Code",
                                GLSetup.FieldCaption("Shortcut Dimension 6 Code")));
                        '7':
                            exit(
                              FilterCaption(
                                Language, DimOptionalParam1, DimOptionalParam2,
                                GLSetup."Shortcut Dimension 7 Code",
                                GLSetup.FieldCaption("Shortcut Dimension 7 Code")));
                        '8':
                            exit(
                              FilterCaption(
                                Language, DimOptionalParam1, DimOptionalParam2,
                                GLSetup."Shortcut Dimension 8 Code",
                                GLSetup.FieldCaption("Shortcut Dimension 8 Code")));
                    end;
                '5':  // Code Caption - using Dimension Code as Reference
                    begin
                        if Dim.Get(DimCaptionRef) then
                            exit(DimOptionalParam1 + Dim.GetMLCodeCaption(Language) + DimOptionalParam2);
                        exit(DimOptionalParam1);
                    end;
                '6':  // Filter Caption - using Dimension Code as Reference
                    begin
                        if Dim.Get(DimCaptionRef) then
                            exit(DimOptionalParam1 + Dim.GetMLFilterCaption(Language) + DimOptionalParam2);
                        exit(DimOptionalParam1);
                    end;
                '7':   // Name Caption - Shortcut Dimension using No. as Reference
                    exit(ShortcutDimNameTranslate(Language, DimCaptionRef, DimOptionalParam1, DimOptionalParam2));

                else begin
                    IsHandled := false;
                    OnTranslateDimCaptionClassOnDimCaptionTypeCaseElse(DimCaptionType, DimCaptionRef, Language, DimOptionalParam1, DimOptionalParam2, Result, IsHandled);
                    if IsHandled then
                        exit(Result);
                end;
            end;
        end;
        Resolved := false;
        exit('');
    end;

    local procedure ShortcutDimNameTranslate(Language: Integer; DimCaptionRef: Text[80]; DimOptionalParam1: Text[80]; DimOptionalParam2: Text[80]) Result: Text
    begin
        if not GetGLSetup() then
            exit;
        case DimCaptionRef of
            '1':
                Result :=
                  DimNameCaption(
                    Language, DimOptionalParam1, DimOptionalParam2,
                    GLSetup."Shortcut Dimension 1 Code",
                    GLSetup.FieldCaption("Shortcut Dimension 1 Code"));
            '2':
                Result :=
                  DimNameCaption(
                    Language, DimOptionalParam1, DimOptionalParam2,
                    GLSetup."Shortcut Dimension 2 Code",
                    GLSetup.FieldCaption("Shortcut Dimension 2 Code"));
            '3':
                Result :=
                  DimNameCaption(
                    Language, DimOptionalParam1, DimOptionalParam2,
                    GLSetup."Shortcut Dimension 3 Code",
                    GLSetup.FieldCaption("Shortcut Dimension 3 Code"));
            '4':
                Result :=
                  DimNameCaption(
                    Language, DimOptionalParam1, DimOptionalParam2,
                    GLSetup."Shortcut Dimension 4 Code",
                    GLSetup.FieldCaption("Shortcut Dimension 4 Code"));
            '5':
                Result :=
                  DimNameCaption(
                    Language, DimOptionalParam1, DimOptionalParam2,
                    GLSetup."Shortcut Dimension 5 Code",
                    GLSetup.FieldCaption("Shortcut Dimension 5 Code"));
            '6':
                Result :=
                  DimNameCaption(
                    Language, DimOptionalParam1, DimOptionalParam2,
                    GLSetup."Shortcut Dimension 6 Code",
                    GLSetup.FieldCaption("Shortcut Dimension 6 Code"));
            '7':
                Result :=
                  DimNameCaption(
                    Language, DimOptionalParam1, DimOptionalParam2,
                    GLSetup."Shortcut Dimension 7 Code",
                    GLSetup.FieldCaption("Shortcut Dimension 7 Code"));
            '8':
                Result :=
                  DimNameCaption(
                    Language, DimOptionalParam1, DimOptionalParam2,
                    GLSetup."Shortcut Dimension 8 Code",
                    GLSetup.FieldCaption("Shortcut Dimension 8 Code"));
        end;
    end;

    local procedure CodeCaption(Language: Integer; DimOptionalParam1: Text; DimOptionalParam2: Text; DimCode: Code[20]; DimFieldCaption: Text[1024]): Text
    var
        Dim: Record Dimension;
    begin
        if Dim.Get(DimCode) then
            exit(DimOptionalParam1 + Dim.GetMLCodeCaption(Language) + DimOptionalParam2);
        exit(
          DimOptionalParam1 +
          DimFieldCaption +
          DimOptionalParam2);
    end;

    local procedure DimNameCaption(Language: Integer; DimOptionalParam1: Text; DimOptionalParam2: Text; DimCode: Code[20]; DimFieldCaption: Text): Text
    var
        Dim: Record Dimension;
    begin
        if Dim.Get(DimCode) then
            exit(DimOptionalParam1 + Dim.GetMLName(Language) + DimOptionalParam2);
        exit(DimOptionalParam1 + DimFieldCaption + DimOptionalParam2);
    end;

    local procedure FilterCaption(Language: Integer; DimOptionalParam1: Text; DimOptionalParam2: Text; DimCode: Code[20]; DimFieldCaption: Text[1024]): Text
    var
        Dim: Record Dimension;
    begin
        if Dim.Get(DimCode) then
            exit(DimOptionalParam1 + Dim.GetMLFilterCaption(Language) + DimOptionalParam2);
        exit(
          DimOptionalParam1 +
          DimFieldCaption +
          DimOptionalParam2);
    end;

    local procedure GetGLSetup(): Boolean
    begin
        if not GLSetupRead then
            GLSetupRead := GLSetup.Get();
        exit(GLSetupRead);
    end;

    /// <summary>
    /// Integration event raised for custom dimension caption type handling.
    /// Enables extension of dimension caption translation logic for custom caption types.
    /// </summary>
    /// <param name="DimCaptionType">The dimension caption type from the CaptionClass expression</param>
    /// <param name="DimCaptionRef">The dimension caption reference from the CaptionClass expression</param>
    /// <param name="Language">Language code for caption translation</param>
    /// <param name="DimOptionalParam1">First optional parameter from the CaptionClass expression</param>
    /// <param name="DimOptionalParam2">Second optional parameter from the CaptionClass expression</param>
    /// <param name="Result">Set to return custom caption text</param>
    /// <param name="IsHandled">Set to true to indicate custom caption handling was performed</param>
    [IntegrationEvent(false, false)]
    local procedure OnTranslateDimCaptionClassOnDimCaptionTypeCaseElse(DimCaptionType: Text[80]; DimCaptionRef: Text[80]; Language: Integer; DimOptionalParam1: Text[80]; DimOptionalParam2: Text[80]; var Result: Text; var IsHandled: Boolean)
    begin
    end;
}