Page 1804 Approval Workflow Setup Wizard, source in 29

Source29

src/Layers/W1/BaseApp/System/Workflow/ApprovalWorkflowSetupWizard.Page.al418 lines, Copyright (c) Microsoft Corporation. MIT

namespace System.Automation;

using System.Environment;
using System.Environment.Configuration;
using System.Security.AccessControl;
using System.Security.User;
using System.Utilities;

page 1804 "Approval Workflow Setup Wizard"
{
    Caption = 'Approval Workflow Setup';
    DeleteAllowed = false;
    InsertAllowed = false;
    LinksAllowed = false;
    PageType = NavigatePage;
    ShowFilter = false;
    SourceTable = "Approval Workflow Wizard";
    SourceTableTemporary = true;

    layout
    {
        area(content)
        {
            group(Control96)
            {
                Editable = false;
                ShowCaption = false;
                Visible = TopBannerVisible and not DoneVisible;
#pragma warning disable AA0100
                field("MediaResourcesStandard.""Media Reference"""; MediaResourcesStandard."Media Reference")
#pragma warning restore AA0100
                {
                    ApplicationArea = Suite;
                    Editable = false;
                    ShowCaption = false;
                }
            }
            group(Control98)
            {
                Editable = false;
                ShowCaption = false;
                Visible = TopBannerVisible and DoneVisible;
#pragma warning disable AA0100
                field("MediaResourcesDone.""Media Reference"""; MediaResourcesDone."Media Reference")
#pragma warning restore AA0100
                {
                    ApplicationArea = Suite;
                    Editable = false;
                    ShowCaption = false;
                }
            }
            group(Step1)
            {
                Caption = '';
                Visible = IntroVisible;
                group("Para1.1")
                {
                    Caption = 'Welcome to Approval Workflow Setup';
                    group("Para1.1.1")
                    {
                        Caption = '';
                        InstructionalText = 'You can create approval workflows that automatically notify an approver when a user tries to create or change certain values on documents, journal lines, or cards, such as an amount above a specified limit.';
                    }
                    group("Para1.1.2")
                    {
                        Caption = '';
                        InstructionalText = 'To enable typical approval workflows, such as for amounts on purchase invoices, you must specify basic settings, such as the approver, the amount limit and when the approval is due. More advanced settings are preset on the related approval workflow, which you can modify later.';
                    }
                }
                group("Para1.2")
                {
                    Caption = 'Let''s go!';
                    InstructionalText = 'Choose Next to select from a list of typical approval workflows and then start specifying basic settings for each workflow.';
                }
            }
            group(Step2)
            {
                Caption = '';
                Visible = ApprovalDocumentTypesVisible;
                group("Para2.1")
                {
                    Caption = 'Which approval workflow do you want to set up?';
                    field("Purchase Invoice Approval"; Rec."Purch Invoice App. Workflow")
                    {
                        ApplicationArea = Suite;
                        Caption = 'Purchase Invoice Approval';

                        trigger OnValidate()
                        begin
                            NextEnabled := Rec."Purch Invoice App. Workflow" or Rec."Sales Invoice App. Workflow"
                        end;
                    }
                    field("Sales Invoice Approval"; Rec."Sales Invoice App. Workflow")
                    {
                        ApplicationArea = Suite;
                        Caption = 'Sales Invoice Approval';

                        trigger OnValidate()
                        begin
                            NextEnabled := Rec."Purch Invoice App. Workflow" or Rec."Sales Invoice App. Workflow"
                        end;
                    }
                }
            }
            group(Step3)
            {
                Caption = '';
                Visible = UseExistingApprovalSetupVisible;
                group("Para3.1")
                {
                    Caption = 'An approval user setup already exists.';
                    field("Use Exist. Approval User Setup"; Rec."Use Exist. Approval User Setup")
                    {
                        ApplicationArea = Suite;
                        Caption = 'Use the existing setup';
                    }
                    field(ApprovalUserSetupLabel; ApprovalUserSetupLabel)
                    {
                        ApplicationArea = Suite;
                        Editable = false;
                        ShowCaption = false;

                        trigger OnDrillDown()
                        begin
                            PAGE.RunModal(PAGE::"Approval User Setup");
                        end;
                    }
                }
            }
            group(Step4)
            {
                Caption = '';
                Visible = ApprovalUserSetupVisible;
                group("Para4.1")
                {
                    Caption = 'To set up the approval users, answer the following questions.';
                    Visible = PurchInvoiceApprovalDetailsVisible or SalesInvoiceApprovalDetailsVisible;
                    field("Who is the approver?"; Rec."Approver ID")
                    {
                        ApplicationArea = Suite;
                        Caption = 'Who is the approver?';
                        Enabled = Rec."Purch Invoice App. Workflow" or Rec."Sales Invoice App. Workflow";
                        TableRelation = User."User Name";
                    }
                }
                group("Para4.2")
                {
                    Caption = '';
                    InstructionalText = 'Which amount can the user enter on purchase invoices before the invoice requires approval?';
                    Visible = PurchInvoiceApprovalDetailsVisible;
                    field("Purch Amount Approval Limit"; Rec."Purch Amount Approval Limit")
                    {
                        ApplicationArea = Suite;
                        Caption = 'Amount Limit';
                    }
                }
                group("Para4.3")
                {
                    Caption = '';
                    InstructionalText = 'Which amount can the user enter on sales invoices before the invoice requires approval?';
                    Visible = SalesInvoiceApprovalDetailsVisible;
                    field("Sales Amount Approval Limit"; Rec."Sales Amount Approval Limit")
                    {
                        ApplicationArea = Suite;
                        Caption = 'Amount Limit';
                    }
                }
            }
            group(Step5)
            {
                Caption = '';
                Visible = DoneVisible;
                group("Para5.1")
                {
                    Caption = 'That''s it!';
                    InstructionalText = 'Choose Finish to enable the selected approval workflows with the specified settings.';
                }
            }
        }
    }

    actions
    {
        area(processing)
        {
            action(Back)
            {
                ApplicationArea = Suite;
                Caption = 'Back';
                Enabled = BackEnabled;
                Image = PreviousRecord;
                InFooterBar = true;

                trigger OnAction()
                begin
                    NextStep(true);
                end;
            }
            action(Next)
            {
                ApplicationArea = Suite;
                Caption = 'Next';
                Enabled = NextEnabled;
                Image = NextRecord;
                InFooterBar = true;

                trigger OnAction()
                begin
                    if Step = Step::"Approval User Setup" then
                        ValidateApproverUserSetup(Rec."Approver ID");
                    NextStep(false);
                end;
            }
            action(Finish)
            {
                ApplicationArea = Suite;
                Caption = 'Finish';
                Enabled = FinishEnabled;
                Image = Approve;
                InFooterBar = true;

                trigger OnAction()
                var
                    GuidedExperience: Codeunit "Guided Experience";
                    ApprovalWorkflowSetupMgt: Codeunit "Approval Workflow Setup Mgt.";
                begin
                    ApprovalWorkflowSetupMgt.ApplyInitialWizardUserInput(Rec);
                    GuidedExperience.CompleteAssistedSetup(ObjectType::Page, Page::"Approval Workflow Setup Wizard");

                    CurrPage.Close();
                end;
            }
        }
    }

    trigger OnInit()
    begin
        if not Rec.Get() then begin
            Rec.Init();
            Rec."Use Exist. Approval User Setup" := true;
            SetDefaultValues();
            Rec.Insert();
        end;
        LoadTopBanners();
    end;

    trigger OnOpenPage()
    var
        ApprovalUserSetup: Page "Approval User Setup";
    begin
        ShowIntroStep();
        ApprovalUserSetupLabel := StrSubstNo(OpenPageTxt, ApprovalUserSetup.Caption);
    end;

    trigger OnQueryClosePage(CloseAction: Action): Boolean
    var
        GuidedExperience: Codeunit "Guided Experience";
    begin
        if CloseAction = ACTION::OK then
            if GuidedExperience.AssistedSetupExistsAndIsNotComplete(ObjectType::Page, Page::"Approval Workflow Setup Wizard") then
                if not Confirm(NAVNotSetUpQst, false) then
                    Error('');
    end;

    var
        MediaRepositoryStandard: Record "Media Repository";
        MediaRepositoryDone: Record "Media Repository";
        MediaResourcesStandard: Record "Media Resources";
        MediaResourcesDone: Record "Media Resources";
        ClientTypeManagement: Codeunit "Client Type Management";
        Step: Option Intro,"Approval Document Types","Use Existing Approval User Setup","Approval User Setup",Done;
        BackEnabled: Boolean;
        NextEnabled: Boolean;
        FinishEnabled: Boolean;
        TopBannerVisible: Boolean;
        IntroVisible: Boolean;
        ApprovalDocumentTypesVisible: Boolean;
        UseExistingApprovalSetupVisible: Boolean;
        ApprovalUserSetupVisible: Boolean;
        SalesInvoiceApprovalDetailsVisible: Boolean;
        PurchInvoiceApprovalDetailsVisible: Boolean;
        DoneVisible: Boolean;
        NAVNotSetUpQst: Label 'Document Approval has not been set up.\\Are you sure that you want to exit?';
        NoUnlimitedApproverErr: Label 'Select a user that has unlimited approval rights.';
        OpenPageTxt: Label 'Open %1', Comment = '%1 is the page that will be opened when clicking the control';
        ApprovalUserSetupLabel: Text;

    local procedure NextStep(Backwards: Boolean)
    begin
        if Backwards then
            Step := Step - 1
        else
            Step := Step + 1;

        case Step of
            Step::Intro:
                ShowIntroStep();
            Step::"Approval Document Types":
                ShowApprovalDocumentTypesStep();
            Step::"Use Existing Approval User Setup":
                begin
                    ShowUseExistingApprovalSetupQstStep();
                    if not UseExistingApprovalSetupVisible then
                        NextStep(Backwards)
                end;
            Step::"Approval User Setup":
                if not Rec."Use Exist. Approval User Setup" then
                    ShowApprovalUserSetupDetailsStep()
                else
                    NextStep(Backwards);
            Step::Done:
                ShowDoneStep();
        end;
        CurrPage.Update(true);
    end;

    local procedure ShowIntroStep()
    begin
        ResetWizardControls();
        IntroVisible := true;
        BackEnabled := false;
    end;

    local procedure ShowApprovalDocumentTypesStep()
    begin
        ResetWizardControls();
        ApprovalDocumentTypesVisible := true;
        NextEnabled := Rec."Purch Invoice App. Workflow" or Rec."Sales Invoice App. Workflow";
    end;

    local procedure ShowApprovalUserSetupDetailsStep()
    begin
        ResetWizardControls();
        ApprovalUserSetupVisible := not Rec."Use Exist. Approval User Setup";
        SalesInvoiceApprovalDetailsVisible := not Rec."Use Exist. Approval User Setup" and Rec."Sales Invoice App. Workflow";
        PurchInvoiceApprovalDetailsVisible := not Rec."Use Exist. Approval User Setup" and Rec."Purch Invoice App. Workflow";
    end;

    local procedure ShowUseExistingApprovalSetupQstStep()
    var
        ApprovalUserSetup: Record "User Setup";
    begin
        ResetWizardControls();
        UseExistingApprovalSetupVisible := not ApprovalUserSetup.IsEmpty();
        if not UseExistingApprovalSetupVisible then
            Rec."Use Exist. Approval User Setup" := false;
    end;

    local procedure ShowDoneStep()
    begin
        ResetWizardControls();
        DoneVisible := true;
        NextEnabled := false;
        FinishEnabled := true;
    end;

    local procedure ResetWizardControls()
    begin
        // Buttons
        BackEnabled := true;
        NextEnabled := true;
        FinishEnabled := false;

        // Tabs
        IntroVisible := false;
        ApprovalDocumentTypesVisible := false;
        UseExistingApprovalSetupVisible := false;
        ApprovalUserSetupVisible := false;
        PurchInvoiceApprovalDetailsVisible := false;
        SalesInvoiceApprovalDetailsVisible := false;
        DoneVisible := false;
    end;

    local procedure ValidateApproverUserSetup(UserName: Code[50])
    begin
        if UserName = '' then
            Error(NoUnlimitedApproverErr);
    end;

    local procedure SetDefaultValues()
    var
        ApprovalUserSetup: Record "User Setup";
        Workflow: Record Workflow;
        WorkflowSetup: Codeunit "Workflow Setup";
        WorkflowCode: Code[20];
    begin
        // Specific Purchase Invoice Approval Workflow: WZ-PIAPW
        WorkflowCode := WorkflowSetup.GetWorkflowWizardCode(WorkflowSetup.PurchaseInvoiceApprovalWorkflowCode());
        if Workflow.Get(WorkflowCode) then
            Rec."Purch Invoice App. Workflow" := true;

        // Specific Sales Invoice Approval Workflow: WZ-SIAPW
        WorkflowCode := WorkflowSetup.GetWorkflowWizardCode(WorkflowSetup.SalesInvoiceApprovalWorkflowCode());
        if Workflow.Get(WorkflowCode) then
            Rec."Sales Invoice App. Workflow" := true;

        ApprovalUserSetup.SetRange("Unlimited Sales Approval", true);
        ApprovalUserSetup.SetRange("Unlimited Purchase Approval", true);
        if ApprovalUserSetup.FindFirst() then
            Rec."Approver ID" := ApprovalUserSetup."User ID";

        Rec."Purch Amount Approval Limit" := ApprovalUserSetup.GetDefaultPurchaseAmountApprovalLimit();
        Rec."Sales Amount Approval Limit" := ApprovalUserSetup.GetDefaultSalesAmountApprovalLimit();
    end;

    local procedure LoadTopBanners()
    begin
        if MediaRepositoryStandard.Get('AssistedSetup-NoText-400px.png', Format(ClientTypeManagement.GetCurrentClientType())) and
           MediaRepositoryDone.Get('AssistedSetupDone-NoText-400px.png', Format(ClientTypeManagement.GetCurrentClientType()))
        then
            if MediaResourcesStandard.Get(MediaRepositoryStandard."Media Resources Ref") and
               MediaResourcesDone.Get(MediaRepositoryDone."Media Resources Ref")
            then
                TopBannerVisible := MediaResourcesDone."Media Reference".HasValue;
    end;
}