Table 1573 Workflow Approvers Buffer, source in 29

Source29

src/Layers/W1/BaseApp/System/Workflow/WorkflowApproversBuffer.Table.al190 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 System.Automation;

using Microsoft.Purchases.Document;
using Microsoft.Sales.Document;
using System.Security.AccessControl;

table 1573 "Workflow Approvers Buffer"
{
    Caption = 'Workflow Approvers Buffer';
    DataClassification = CustomerContent;
    TableType = Temporary;
    InherentEntitlements = RIMDX;
    InherentPermissions = RIMDX;

    fields
    {
        field(1; WorkflowCode; Code[20])
        {
            Caption = 'Workflow Code';
            AllowInCustomizations = AsReadOnly;
        }
        field(2; WorkflowStepId; Integer)
        {
            Caption = 'Workflow Step Id';
            AllowInCustomizations = AsReadOnly;
        }
        field(3; WorkflowType; Enum "Approval Workflow Type")
        {
            Caption = 'Workflow Type';
            AllowInCustomizations = AsReadOnly;
        }
        field(4; ArgumentId; Guid)
        {
            Caption = 'Argument Id';
            AllowInCustomizations = AsReadOnly;
        }
        field(5; UserName; Code[50])
        {
            Caption = 'User Name';
            AllowInCustomizations = AsReadOnly;
        }
        field(6; Sequence; Integer)
        {
            Caption = 'Sequence';
            AllowInCustomizations = AsReadOnly;
        }
        field(7; ApproverType; enum "Workflow Approver Type")
        {
            Caption = 'Approver Type';
            AllowInCustomizations = AsReadOnly;
        }
        field(8; ApproverLimitType; enum "Workflow Approver Limit Type")
        {
            Caption = 'Approver Limit Type';
            AllowInCustomizations = AsReadOnly;
        }
        field(9; WorkflowDescription; Text[100])
        {
            Caption = 'Workflow Description';
            AllowInCustomizations = AsReadOnly;
        }
        field(10; Category; Code[20])
        {
            Caption = 'Category';
            AllowInCustomizations = AsReadOnly;
        }
        field(11; Enabled; Boolean)
        {
            Caption = 'Enabled';
            AllowInCustomizations = AsReadOnly;
        }
        field(12; UserGroupCode; Code[20])
        {
            Caption = 'User Group Code';
            AllowInCustomizations = AsReadOnly;
        }
        field(13; UserGroupDescription; Text[100])
        {
            Caption = 'User Group Description';
            CalcFormula = lookup("Workflow User Group".Description where(Code = field(UserGroupCode)));
            FieldClass = FlowField;
        }
        field(14; UserId; Guid)
        {
            Caption = 'User Id';
        }
        field(15; UserFullName; Text[100])
        {
            Caption = 'User Full Name';
            CalcFormula = lookup(User."Full Name" where("User Security ID" = field(UserId)));
            FieldClass = FlowField;
        }

    }

    keys
    {
        key(Key1; WorkflowCode, WorkflowStepId, ArgumentId, UserName, Sequence)
        {
            Clustered = true;
        }
    }

    procedure FillBuffer()
    var
        Workflow: Record Workflow;
        WorkflowStepArgument: Record "Workflow Step Argument";
        WorkflowStep: Record "Workflow Step";
        WorkflowUserGroupMember: Record "Workflow User Group Member";
    begin
        WorkflowStepArgument.SetRange(Type, WorkflowStepArgument.Type::Response);
        WorkflowStepArgument.SetRange("Response Option Group", 'GROUP 5');
        if WorkflowStepArgument.FindSet() then
            repeat
                WorkflowStep.SetLoadFields(ID, "Workflow Code");
                WorkflowStep.SetRange(Argument, WorkflowStepArgument.ID);
                if WorkflowStep.FindFirst() then
                    if Workflow.Get(WorkflowStep."Workflow Code") and (not Workflow.Template) then begin
                        Rec.Init();
                        Rec.WorkflowCode := Workflow.Code;
                        Rec.WorkflowDescription := Workflow.Description;
                        Rec.WorkflowStepId := WorkflowStep.ID;
                        Rec.ArgumentId := WorkflowStepArgument.ID;
                        Rec.ApproverType := WorkflowStepArgument."Approver Type";
                        Rec.ApproverLimitType := WorkflowStepArgument."Approver Limit Type";
                        Rec.Category := Workflow.Category;
                        Rec.Enabled := Workflow.Enabled;
                        Rec.WorkflowType := GetWorkflowType(Workflow.Code);

                        if WorkflowStepArgument."Approver Type" = WorkflowStepArgument."Approver Type"::"Workflow User Group" then begin
                            WorkflowUserGroupMember.SetRange("Workflow User Group Code", WorkflowStepArgument."Workflow User Group Code");
                            if WorkflowUserGroupMember.FindSet() then
                                repeat
                                    Rec.UserName := WorkflowUserGroupMember."User Name";
                                    Rec.Sequence := WorkflowUserGroupMember."Sequence No.";
                                    Rec.UserGroupCode := WorkflowUserGroupMember."Workflow User Group Code";
                                    Rec.UserId := GetUserId(Rec.UserName);
                                    Rec.Insert();

                                until WorkflowUserGroupMember.Next() = 0;
                        end else begin
                            if WorkflowStepArgument."Approver Limit Type" = WorkflowStepArgument."Approver Limit Type"::"Specific Approver" then begin
                                Rec.UserName := WorkflowStepArgument."Approver User ID";
                                Rec.UserId := GetUserId(Rec.UserName);
                            end;

                            Rec.Insert();
                        end;

                        Clear(Rec);
                    end;
            until WorkflowStepArgument.Next() = 0;
    end;

    local procedure GetWorkflowType(Code: Code[20]): Enum "Approval Workflow Type"
    var
        WorkflowStep: Record "Workflow Step";
        WorkflowEvent: Record "Workflow Event";
    begin
        WorkflowStep.SetLoadFields("Function Name");
        WorkflowStep.SetRange("Workflow Code", Code);
        WorkflowStep.SetRange("Entry Point", true);
        if WorkflowStep.FindFirst() then begin
            WorkflowEvent.SetLoadFields("Table ID");
            if WorkflowEvent.Get(WorkflowStep."Function Name") then
                case WorkflowEvent."Table ID" of
                    Database::"Sales Header":
                        exit(WorkflowType::Sales);
                    Database::"Purchase Header":
                        exit(WorkflowType::Purchase);
                    else
                        exit(WorkflowType::Request);
                end;
        end
    end;

    local procedure GetUserId(ApproverUserName: Code[50]): Guid
    var
        User: Record User;
    begin
        User.SetLoadFields("User Security ID");
        User.SetRange("User Name", ApproverUserName);
        if User.FindFirst() then
            exit(User."User Security ID");
    end;
}