Codeunit 2583 Dim Correction Validate

App
Base Application
Namespace
Microsoft.Finance.Dimension.Correction
Versions
18-28

Procedures, 2

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Finance/Dimension/Correction/DimCorrectionValidate.Codeunit.al116 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.Correction;

using System.Threading;

/// <summary>
/// Validates dimension correction operations for both draft and undo scenarios.
/// Provides validation logic for dimension correction processes through job queue integration.
/// </summary>
/// <remarks>
/// Implements job queue processing for dimension correction validation operations.
/// Supports validation of both new corrections and undo operations for completed corrections.
/// Integrates with the dimension correction framework to ensure data integrity before processing.
/// </remarks>
codeunit 2583 "Dim Correction Validate"
{
    TableNo = "Job Queue Entry";

    trigger OnRun()
    var
        DimensionCorrection: Record "Dimension Correction";
    begin
        DimensionCorrection.Get(Rec."Record ID to Process");

        if DimensionCorrection.Completed then
            ValidateUndoCorrection(DimensionCorrection)
        else
            ValidateDraftCorrection(DimensionCorrection);
    end;

    /// <summary>
    /// Validates a draft dimension correction before it can be processed or completed.
    /// Performs comprehensive validation of dimension sets and dimension changes.
    /// </summary>
    /// <param name="DimensionCorrection">Dimension correction record to validate</param>
    procedure ValidateDraftCorrection(var DimensionCorrection: Record "Dimension Correction")
    var
        TempDimCorrectionSetBuffer: Record "Dim Correction Set Buffer" temporary;
        DimensionCorrectionMgt: Codeunit "Dimension Correction Mgt";
        ErrorCount: Integer;
    begin
        Session.LogMessage('0000EL9', StrSubstNo(StartingValidateDimensionCorrectionJobLbl, DimensionCorrection."Entry No."), Verbosity::Normal, DataClassification::SystemMetadata, TelemetryScope::ExtensionPublisher, 'Category', DimensionCorrectionTok);
        DimensionCorrectionMgt.VerifyCanValidateDimensionCorrection(DimensionCorrection);
        DimensionCorrectionMgt.ValidateBlockedNotUsed(DimensionCorrection);
        DimensionCorrectionMgt.SetValidatingStatusInProgress(DimensionCorrection);
        Commit();

        DimensionCorrectionMgt.GenerateSupportingTables(DimensionCorrection, TempDimCorrectionSetBuffer);
        DimensionCorrectionMgt.ValidateDimensionSets(DimensionCorrection, TempDimCorrectionSetBuffer, ErrorCount);
        DimensionCorrectionMgt.ValidateDimensionChanges(DimensionCorrection, TempDimCorrectionSetBuffer, ErrorCount);

        DimensionCorrection.Status := DimensionCorrection.Status::Draft;
        DimensionCorrection.Modify();
        Commit();

        DimensionCorrectionMgt.UpdateValidationStatusAndThrowErrorIfFailed(DimensionCorrection, ErrorCount);

        Session.LogMessage('0000ELA', StrSubstNo(CompletedValidateDimensionCorrectionJobLbl, DimensionCorrection."Entry No."), Verbosity::Normal, DataClassification::SystemMetadata, TelemetryScope::ExtensionPublisher, 'Category', DimensionCorrectionTok);
    end;

    /// <summary>
    /// Validates an undo operation for a completed dimension correction.
    /// Verifies that the correction can be safely undone and reverted.
    /// </summary>
    /// <param name="DimensionCorrection">Completed dimension correction record to validate for undo</param>
    procedure ValidateUndoCorrection(var DimensionCorrection: Record "Dimension Correction")
    var
        TempDimCorrectionSetBuffer: Record "Dim Correction Set Buffer" temporary;
        DimensionCorrectionMgt: Codeunit "Dimension Correction Mgt";
        ErrorCount: Integer;
    begin
        Session.LogMessage('0000ELB', StrSubstNo(StartingValidateUndoDimensionCorrectionJobLbl, DimensionCorrection."Entry No."), Verbosity::Normal, DataClassification::SystemMetadata, TelemetryScope::ExtensionPublisher, 'Category', DimensionCorrectionTok);
        DimensionCorrectionMgt.VerifyCanValidateDimensionCorrection(DimensionCorrection);
        DimensionCorrectionMgt.VerifyCanUndoDimensionCorrection(DimensionCorrection);
        DimensionCorrectionMgt.ValidateBlockedNotUsed(DimensionCorrection);
        DimensionCorrectionMgt.SetValidatingStatusInProgress(DimensionCorrection);
        Commit();

        GetUndoDimensionCorrectionChanges(DimensionCorrection, TempDimCorrectionSetBuffer);
        DimensionCorrectionMgt.ValidateDimensionSets(DimensionCorrection, TempDimCorrectionSetBuffer, ErrorCount);
        DimensionCorrectionMgt.ValidateDimensionChanges(DimensionCorrection, TempDimCorrectionSetBuffer, ErrorCount);

        DimensionCorrection.Status := DimensionCorrection.Status::Completed;
        DimensionCorrection.Modify();
        Commit();

        DimensionCorrectionMgt.UpdateValidationStatusAndThrowErrorIfFailed(DimensionCorrection, ErrorCount);

        Session.LogMessage('0000ELC', StrSubstNo(CompletedValidateUndoDimensionCorrectionJobLbl, DimensionCorrection."Entry No."), Verbosity::Normal, DataClassification::SystemMetadata, TelemetryScope::ExtensionPublisher, 'Category', DimensionCorrectionTok);
    end;

    local procedure GetUndoDimensionCorrectionChanges(DimensionCorrection: Record "Dimension Correction"; var TempDimCorrectionSetBuffer: Record "Dim Correction Set Buffer" temporary)
    var
        DimCorrectionSetBuffer: Record "Dim Correction Set Buffer";
    begin
        DimCorrectionSetBuffer.SetRange("Dimension Correction Entry No.", DimensionCorrection."Entry No.");
        DimCorrectionSetBuffer.FindSet();
        repeat
            TempDimCorrectionSetBuffer.TransferFields(DimCorrectionSetBuffer, true);
            TempDimCorrectionSetBuffer."Target Set ID" := DimCorrectionSetBuffer."Dimension Set ID";
            TempDimCorrectionSetBuffer."Dimension Set ID" := DimCorrectionSetBuffer."Target Set ID";
            TempDimCorrectionSetBuffer.Insert();
        until DimCorrectionSetBuffer.Next() = 0;
    end;

    var
        StartingValidateDimensionCorrectionJobLbl: Label 'Starting Validate Dimension Correction Job, Dimension Correction Entry No.: %1.', Locked = true, Comment = '%1 Dimension Correction Entry No.';
        CompletedValidateDimensionCorrectionJobLbl: Label 'Completed Validate Dimension Correction Job, Dimension Correction Entry No.: %1.', Locked = true, Comment = '%1 Dimension Correction Entry No.';
        StartingValidateUndoDimensionCorrectionJobLbl: Label 'Starting Validate Undo Dimension Correction Job, Dimension Correction Entry No.: %1.', Locked = true, Comment = '%1 Dimension Correction Entry No.';
        CompletedValidateUndoDimensionCorrectionJobLbl: Label 'Completed Validate Undo Dimension Correction Job, Dimension Correction Entry No.: %1.', Locked = true, Comment = '%1 Dimension Correction Entry No.';
        DimensionCorrectionTok: Label 'DimensionCorrection', Locked = true;
}