Codeunit 198 Acc. Sched. KPI Event Handler

App
Base Application
Namespace
Microsoft.Finance.FinancialReports
Versions
17-28

Procedures, 1

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Finance/FinancialReports/AccSchedKPIEventHandler.Codeunit.al204 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.FinancialReports;

using Microsoft.Finance.GeneralLedger.Budget;
using System.Environment;

/// <summary>
/// Single-instance event handler for account schedule KPI processing and data management.
/// Manages KPI-related events and provides centralized handling for account schedule calculations.
/// </summary>
/// <remarks>
/// Primary functionality: KPI event handling, centralized processing coordination.
/// Integration: Links with Account Schedule system and KPI calculation processes.
/// Extensibility: Event-driven architecture for KPI processing customization.
/// </remarks>
codeunit 198 "Acc. Sched. KPI Event Handler"
{
    SingleInstance = true;

    trigger OnRun()
    begin
    end;

    var
        TempAccSchedKPIWebSrvLine: Record "Acc. Sched. KPI Web Srv. Line" temporary;
        AccSchedKPIWebSrvSetup: Record "Acc. Sched. KPI Web Srv. Setup";
        PrevAccSchedName: Code[10];
        PrevGlBudgetName: Code[10];

    [EventSubscriber(ObjectType::Table, Database::"Acc. Sched. KPI Web Srv. Setup", 'OnAfterModifyEvent', '', false, false)]
    local procedure OnModifyAccSchedKpiSetup(var Rec: Record "Acc. Sched. KPI Web Srv. Setup"; var xRec: Record "Acc. Sched. KPI Web Srv. Setup"; RunTrigger: Boolean)
    begin
        if Rec.IsTemporary then
            exit;
        PrevAccSchedName := '';
        PrevGlBudgetName := '';
    end;

    [EventSubscriber(ObjectType::Table, Database::"Acc. Sched. KPI Web Srv. Line", 'OnAfterInsertEvent', '', false, false)]
    local procedure OnInsertAccSchedKpiLine(var Rec: Record "Acc. Sched. KPI Web Srv. Line"; RunTrigger: Boolean)
    begin
        if Rec.IsTemporary then
            exit;
        ResetAccSchedKPIWevSrvSetup();
    end;

    [EventSubscriber(ObjectType::Table, Database::"Acc. Sched. KPI Web Srv. Line", 'OnAfterModifyEvent', '', false, false)]
    local procedure OnModifyAccSchedKpiLine(var Rec: Record "Acc. Sched. KPI Web Srv. Line"; var xRec: Record "Acc. Sched. KPI Web Srv. Line"; RunTrigger: Boolean)
    begin
        if Rec.IsTemporary then
            exit;
        ResetAccSchedKPIWevSrvSetup();
    end;

    [EventSubscriber(ObjectType::Table, Database::"Acc. Sched. KPI Web Srv. Line", 'OnAfterDeleteEvent', '', false, false)]
    local procedure OnDeleteAccSchedKpiLine(var Rec: Record "Acc. Sched. KPI Web Srv. Line"; RunTrigger: Boolean)
    begin
        if Rec.IsTemporary then
            exit;
        ResetAccSchedKPIWevSrvSetup();
        if TempAccSchedKPIWebSrvLine.Get(Rec."Acc. Schedule Name") then
            TempAccSchedKPIWebSrvLine.Delete();
    end;

    [EventSubscriber(ObjectType::Table, Database::"Acc. Schedule Line", 'OnAfterInsertEvent', '', true, true)]
    local procedure OnInsertAccSchedLine(var Rec: Record "Acc. Schedule Line"; RunTrigger: Boolean)
    begin
        if Rec.IsTemporary then
            exit;
        ResetIfAccSchedChanged(Rec."Schedule Name");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Acc. Schedule Line", 'OnAfterModifyEvent', '', true, true)]
    local procedure OnModifyAccSchedLine(var Rec: Record "Acc. Schedule Line"; var xRec: Record "Acc. Schedule Line"; RunTrigger: Boolean)
    begin
        if Rec.IsTemporary then
            exit;
        ResetIfAccSchedChanged(Rec."Schedule Name");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Acc. Schedule Line", 'OnAfterDeleteEvent', '', true, true)]
    local procedure OnDeleteAccSchedLine(var Rec: Record "Acc. Schedule Line"; RunTrigger: Boolean)
    begin
        if Rec.IsTemporary then
            exit;
        ResetIfAccSchedChanged(Rec."Schedule Name");
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::GlobalTriggerManagement, 'OnAfterOnDatabaseInsert', '', true, true)]
    local procedure OnInsertGlBudgetEntry(RecRef: RecordRef)
    begin
        if RecRef.Number <> Database::"G/L Budget Entry" then
            exit;

        if RecRef.IsTemporary then
            exit;

        ResetIfGlBudgetChanged(RecRef);
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::GlobalTriggerManagement, 'OnAfterOnDatabaseModify', '', true, true)]
    local procedure OnModifyGlBudgetEntry(RecRef: RecordRef)
    begin
        if RecRef.Number <> Database::"G/L Budget Entry" then
            exit;

        if RecRef.IsTemporary then
            exit;

        ResetIfGlBudgetChanged(RecRef);
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::GlobalTriggerManagement, 'OnAfterOnDatabaseDelete', '', true, true)]
    local procedure OnDeleteGlBudgetEntry(RecRef: RecordRef)
    begin
        if RecRef.Number <> Database::"G/L Budget Entry" then
            exit;

        if RecRef.IsTemporary then
            exit;

        ResetIfGlBudgetChanged(RecRef);
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::GlobalTriggerManagement, 'OnAfterGetDatabaseTableTriggerSetup', '', true, true)]
    local procedure EnableGLBudgetEntryTriggers(TableId: Integer; var OnDatabaseInsert: Boolean; var OnDatabaseModify: Boolean; var OnDatabaseDelete: Boolean; var OnDatabaseRename: Boolean)
    begin
        if TableId <> Database::"G/L Budget Entry" then
            exit;

        AccSchedKPIWebSrvSetup.SetLoadFields("Primary Key");
        AccSchedKPIWebSrvSetup.SetAutoCalcFields(Published);
        if not AccSchedKPIWebSrvSetup.Get() then
            exit;

        if AccSchedKPIWebSrvSetup.Published then begin
            OnDatabaseDelete := true;
            OnDatabaseInsert := true;
            OnDatabaseModify := true;
        end;
    end;

    internal procedure ResetAccSchedKPIWevSrvSetup()
    begin
        if not AccSchedKPIWebSrvSetup.Get() then
            exit;
        if AccSchedKPIWebSrvSetup."Last G/L Entry Included" = 0 then
            exit;
        AccSchedKPIWebSrvSetup.LockTable();
        AccSchedKPIWebSrvSetup.Get();
        AccSchedKPIWebSrvSetup."Last G/L Entry Included" := 0;
        AccSchedKPIWebSrvSetup."Data Last Updated" := 0DT;
        AccSchedKPIWebSrvSetup.Modify();
    end;

    local procedure ResetIfAccSchedChanged(AccSchedName: Code[10])
    var
        [SecurityFiltering(SecurityFilter::Ignored)]
        AccSchedKPIWebSrvSetup2: Record "Acc. Sched. KPI Web Srv. Setup";
        AccSchedKPIWebSrvLine: Record "Acc. Sched. KPI Web Srv. Line";
    begin
        if AccSchedName = PrevAccSchedName then
            exit;
        PrevAccSchedName := AccSchedName;
        if not AccSchedKPIWebSrvSetup2.WritePermission() then
            exit;
        if TempAccSchedKPIWebSrvLine.Get(AccSchedName) then begin
            ResetAccSchedKPIWevSrvSetup();
            exit;
        end;

        if AccSchedKPIWebSrvLine.Get(AccSchedName) then begin
            TempAccSchedKPIWebSrvLine := AccSchedKPIWebSrvLine;
            TempAccSchedKPIWebSrvLine.Insert();
            ResetAccSchedKPIWevSrvSetup();
        end;
    end;

    local procedure ResetIfGlBudgetChanged(GLBudgetEntryRecRef: RecordRef)
    var
        GLBudgetEntry: Record "G/L Budget Entry";
        [SecurityFiltering(SecurityFilter::Ignored)]
        AccSchedKPIWebSrvSetup2: Record "Acc. Sched. KPI Web Srv. Setup";
    begin
        GLBudgetEntryRecRef.SetTable(GLBudgetEntry);

        if GLBudgetEntry."Budget Name" = PrevGlBudgetName then
            exit;
        PrevGlBudgetName := GLBudgetEntry."Budget Name";
        if not AccSchedKPIWebSrvSetup2.WritePermission() then
            exit;
        if not AccSchedKPIWebSrvSetup.Get() then
            exit;
        if AccSchedKPIWebSrvSetup."G/L Budget Name" = '' then
            exit;
        if AccSchedKPIWebSrvSetup."G/L Budget Name" = GLBudgetEntry."Budget Name" then
            ResetAccSchedKPIWevSrvSetup();
    end;
}