Codeunit 9075 Check Res. Jnl. Line. Backgr., source in 29

Source29

src/Layers/W1/BaseApp/Projects/Resources/Journal/CheckResJnlLineBackgr.Codeunit.al156 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.Projects.Resources.Journal;

using Microsoft.Utilities;
using System.Utilities;

codeunit 9075 "Check Res. Jnl. Line. Backgr."
{
    trigger OnRun()
    var
        TempErrorMessage: Record "Error Message" temporary;
        Args: Dictionary of [Text, Text];
        Results: Dictionary of [Text, Text];
    begin
        Args := Page.GetBackgroundParameters();

        RunCheck(Args, TempErrorMessage);

        PackErrorMessagesToResults(TempErrorMessage, Results);

        Page.SetBackgroundTaskResult(Results);
    end;

    procedure RunCheck(Args: Dictionary of [Text, Text]; var TempErrorMessage: Record "Error Message" temporary)
    var
        ResJnlLine: Record "Res. Journal Line";
        ErrorHandlingParameters: Record "Error Handling Parameters";
    begin
        ErrorHandlingParameters.FromArgs(Args);

        if ErrorHandlingParameters."Full Batch Check" then begin
            ResJnlLine.SetRange("Journal Template Name", ErrorHandlingParameters."Journal Template Name");
            ResJnlLine.SetRange("Journal Batch Name", ErrorHandlingParameters."Journal Batch Name");
            CheckResJnlLines(ResJnlLine, TempErrorMessage)
        end else begin
            if ResJnlLine.Get(ErrorHandlingParameters."Journal Template Name", ErrorHandlingParameters."Journal Batch Name", ErrorHandlingParameters."Line No.") then
                CheckResJnlLine(ResJnlLine, TempErrorMessage);

            if ErrorHandlingParameters."Line No." <> ErrorHandlingParameters."Previous Line No." then
                if ResJnlLine.Get(ErrorHandlingParameters."Journal Template Name", ErrorHandlingParameters."Journal Batch Name", ErrorHandlingParameters."Previous Line No.") then
                    CheckResJnlLine(ResJnlLine, TempErrorMessage);
        end;
    end;

    local procedure CheckResJnlLines(var ResJnlLine: Record "Res. Journal Line"; var TempErrorMessage: Record "Error Message" temporary)
    begin
        if ResJnlLine.FindSet() then
            repeat
                CheckResJnlLine(ResJnlLine, TempErrorMessage);
            until ResJnlLine.Next() = 0;
    end;

    local procedure CheckResJnlLine(var ResJnlLine: Record "Res. Journal Line"; var TempErrorMessage: Record "Error Message" temporary)
    begin
        RunResJnlCheckLineCodeunit(ResJnlLine, TempErrorMessage);

        OnAfterCheckResJnlLine(ResJnlLine, TempErrorMessage);
    end;

    [ErrorBehavior(ErrorBehavior::Collect)]
    local procedure RunResJnlCheckLineCodeunit(ResJnlLine: Record "Res. Journal Line"; var TempErrorMessage: Record "Error Message" temporary)
    var
        TempLineErrorMessage: Record "Error Message" temporary;
        ResJnlCheckLine: Codeunit "Res. Jnl.-Check Line";
    begin
        if not ResJnlCheckLine.Run(ResJnlLine) then
            InsertTempLineErrorMessage(
                TempLineErrorMessage,
                ResJnlLine.RecordId(),
                0,
                GetLastErrorText(),
                false);

        if HasCollectedErrors then begin
            CollectErrors(ResJnlLine, TempLineErrorMessage);
            CopyErrorsToBuffer(TempLineErrorMessage, TempErrorMessage);
        end;
    end;

    procedure CollectErrors(ResJnlLine: Record "Res. Journal Line"; var TempLineErrorMessage: Record "Error Message" temporary)
    var
        ErrorList: list of [ErrorInfo];
        ErrInfo: ErrorInfo;
    begin
        if HasCollectedErrors() then begin
            ErrorList := GetCollectedErrors(true);
            foreach ErrInfo in ErrorList do begin
                TempLineErrorMessage.Init();
                TempLineErrorMessage.ID := TempLineErrorMessage.ID + 1;
                TempLineErrorMessage."Message" := copystr(ErrInfo.Message, 1, MaxStrLen(TempLineErrorMessage."Message"));
                TempLineErrorMessage."Context Table Number" := Database::"Res. Journal Line";
                TempLineErrorMessage.Validate("Context Record ID", ResJnlLine.RecordId);
                if ErrInfo.RecordId = ResJnlLine.RecordId then
                    TempLineErrorMessage."Context Field Number" := ErrInfo.FieldNo
                else begin
                    TempLineErrorMessage."Table Number" := ErrInfo.TableId;
                    TempLineErrorMessage."Field Number" := ErrInfo.FieldNo;
                    TempLineErrorMessage.Validate("Record ID", ErrInfo.RecordId);
                end;

                TempLineErrorMessage.SetErrorCallStack(ErrInfo.Callstack);
                TempLineErrorMessage.Insert();
            end;
        end;
    end;

    local procedure InsertTempLineErrorMessage(var TempLineErrorMessage: Record "Error Message" temporary; ContextRecordId: RecordId; ContextFieldNo: Integer; Description: Text; Duplicate: Boolean)
    begin
        TempLineErrorMessage."Record ID" := ContextRecordId;
        TempLineErrorMessage."Field Number" := ContextFieldNo;
        TempLineErrorMessage."Table Number" := Database::"Res. Journal Line";
        TempLineErrorMessage."Context Record ID" := ContextRecordId;
        TempLineErrorMessage."Context Field Number" := ContextFieldNo;
        TempLineErrorMessage."Context Table Number" := Database::"Res. Journal Line";
        TempLineErrorMessage."Message" := CopyStr(Description, 1, MaxStrLen(TempLineErrorMessage."Message"));
        TempLineErrorMessage.Duplicate := Duplicate;
        TempLineErrorMessage.Insert();
    end;

    local procedure CopyErrorsToBuffer(var TempLineErrorMessage: Record "Error Message" temporary; var TempErrorMessage: Record "Error Message" temporary)
    var
        ID: Integer;
    begin
        if TempErrorMessage.FindLast() then;
        ID := TempErrorMessage.ID + 1;

        if TempLineErrorMessage.FindSet() then
            repeat
                TempErrorMessage.TransferFields(TempLineErrorMessage);
                TempErrorMessage.ID := ID;
                TempErrorMessage.Insert();
                ID += 1;
            until TempLineErrorMessage.Next() = 0;
    end;

    local procedure PackErrorMessagesToResults(var TempErrorMessage: Record "Error Message" temporary; var Results: Dictionary of [Text, Text])
    var
        ErrorMessageMgt: Codeunit "Error Message Management";
        JSON: Text;
    begin
        if TempErrorMessage.FindSet() then
            repeat
                JSON := ErrorMessageMgt.ErrorMessage2JSON(TempErrorMessage);
                Results.Add(Format(TempErrorMessage.ID), JSON);
            until TempErrorMessage.Next() = 0;
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCheckResJnlLine(var ResJnlLine: Record "Res. Journal Line"; var TempErrorMessage: Record "Error Message" temporary)
    begin
    end;
}