Page 1179 Job Queue Notification Wizard

App
Base Application
Namespace
Microsoft.System.Threading
Versions
25-28
Source table
9066

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Modules/System/JobQueue/JobQueueNotificationWizard.Page.al418 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.System.Threading;

using System.Environment;
using System.Environment.Configuration;
using System.Telemetry;
using System.Threading;
using System.Utilities;

page 1179 "Job Queue Notification Wizard"
{
    PageType = NavigatePage;
    RefreshOnActivate = true;
    Caption = 'Set Up Job Queue Notifications';
    SourceTable = "Job Queue Notification Setup";
    Editable = true;
    Extensible = false;

    layout
    {
        area(Content)
        {
            group(Control17)
            {
                Editable = false;
                ShowCaption = false;
                Visible = TopBannerVisible and not (Step = Step::Finish);
                field(MediaResourcesStandardMediaReference; MediaResourcesStandard."Media Reference")
                {
                    ApplicationArea = Jobs;
                    Editable = false;
                    ShowCaption = false;
                }
            }
            group(Control19)
            {
                Editable = false;
                ShowCaption = false;
                Visible = TopBannerVisible and (Step = Step::Finish);
                field(MediaResourcesDoneMediaReference; MediaResourcesDone."Media Reference")
                {
                    ApplicationArea = Jobs;
                    Editable = false;
                    ShowCaption = false;
                }
            }
            group(Step1)
            {
                Visible = Step = Step::Start;
                group("Para1.1")
                {
                    Caption = 'Welcome to Job Queue notifications';
                    InstructionalText = 'Get notified about background tasks that Business Central executes with Job Queues.';
                }
                group("Para1.2")
                {
                    Caption = 'Let''s go!';
                    InstructionalText = 'Choose Next to specify who to notify about issues with job queue entries that run in the background.';
                }
            }
            group(Step2)
            {
                ShowCaption = false;
                Visible = Step = Step::Participants;
                group("Para2.1")
                {
                    Caption = 'Who should know about issues with job queue entries?';
                    group("Para2.1.1")
                    {
                        ShowCaption = false;
                        field(NotifyUserInitiatingBackgroundTasks; NotifyUserInitiatingTask)
                        {
                            ApplicationArea = All;
                            Visible = true;
                            ToolTip = 'Specifies whether the user who initiates a background task should receive a notification when the task is failed.';
                            Caption = 'Notify the user who initiates background tasks';
                        }
                        field(NotifyAdmin; NotifyAdmin)
                        {
                            ApplicationArea = All;
                            Visible = true;
                            ToolTip = 'Specifies whether these job queue notification administrators should receive a notification when any task is failed in Job Queue.';
                            Caption = 'Notify these job queue notification administrators';
                        }
                    }
                    group("Para2.1.2")
                    {
                        ShowCaption = false;
                        Visible = NotifyAdmin;
                        InstructionalText = 'Choose one or more job queue notification administrators to notify about issues.';
                        part("Job Queue Admin List"; "Job Queue Admin Setup")
                        {
                            Caption = 'Job Queue Notification Administrators List';
                            ApplicationArea = All;
                            Visible = NotifyAdmin;
                        }
                    }
                }
            }
            group(Step3)
            {
                Visible = Step = Step::NotificationType;
                group("Para3.1")
                {
                    Caption = 'How do you want to notify users?';

                    field(InProductNotification; InProductNotification)
                    {
                        ApplicationArea = All;
                        Visible = true;
                        ToolTip = 'Specifies if the notifications should be displayed in the Business Central web client.';
                        Caption = 'In-product notifications';
                    }
                    field(NotifyWithPowerAutomateFlow; PowerAutomateFlowNotification)
                    {
                        ApplicationArea = All;
                        Editable = true;
                        Visible = true;
                        ToolTip = 'Specifies if the external business event will be enabled.';
                        Caption = 'Control notifications with business events (preview)';
                    }
                }
                group("Para3.3")
                {
                    ShowCaption = false;
                    InstructionalText = 'Choose Next to specify when to show in-product notifications.';
                }
            }
            group(Step4)
            {
                Visible = Step = Step::NotificationTime;
                group("Para4.1")
                {
                    Caption = 'When do you want to display in-product notifications?';
                    field(ShowNotificationImmediately; NotifyWhenJobFailed)
                    {
                        ApplicationArea = All;
                        Caption = 'Immediately for each job queue entry';
                        ToolTip = 'Specifies the user should receive a notification once the task is failed.';
                        trigger OnValidate()
                        begin
                            if NotifyWhenJobFailed then
                                NotifyAfterThreshold := false;
                        end;
                    }
                    field(ShowNotificationReachingThreshold; NotifyAfterThreshold)
                    {
                        ApplicationArea = All;
                        Caption = 'After a threshold is reached';
                        ToolTip = 'Specifies the user should receive a notification when the count of failed jobs reach the low threshold.';
                        trigger OnValidate()
                        begin
                            if NotifyAfterThreshold then
                                NotifyWhenJobFailed := false;
                        end;
                    }
                    field(Threshold1; Threshold1)
                    {
                        ApplicationArea = All;
                        Caption = 'Low threshold';
                        ToolTip = 'Specifies the low threshold for the cue set up of failed jobs.';
                        Editable = NotifyAfterThreshold;
                        trigger OnValidate()
                        begin
                            if Threshold1 < 0 then
                                Error(Threshold1MustBeGreaterThanOrEqualTo0Err);
                            if Threshold1 > Threshold2 then
                                Error(Threshold1MustBeLessThanOrEqualToThreshold2Err);
                        end;
                    }
                    field(Threshold2; Threshold2)
                    {
                        ApplicationArea = All;
                        Caption = 'High threshold';
                        ToolTip = 'Specifies the high threshold for the cue set up of failed jobs.';
                        Editable = NotifyAfterThreshold;
                        trigger OnValidate()
                        begin
                            if Threshold2 < 0 then
                                Error(Threshold2MustBeGreaterThanOrEqualTo0Err);
                            if Threshold1 > Threshold2 then
                                Error(Threshold1MustBeLessThanOrEqualToThreshold2Err);
                        end;
                    }
                }
                group("Para4.2")
                {
                    Caption = 'NOTE: Job queue entries have issues when they fail more times than their Maximum number of attempts to run setting allows.';
                    InstructionalText = 'Choose Next to finish the in-product notifications setup.';
                }
            }
            group(Step5)
            {
                InstructionalText = 'The Job Queue notification setup is complete.';
                Visible = Step = Step::Finish;
                group(FinishGroup)
                {
                    Caption = 'To enable notifications using Power Automate:';
                    Visible = PowerAutomateFlowNotification;
                    field(CreateFlowFromTemplateTip; CreateFlowFromTemplateTipLbl)
                    {
                        ApplicationArea = All;
                        Editable = false;
                        ShowCaption = false;
                    }
                    field(CreateFlowFromTemplate; CreateFlowFromTemplateLbl)
                    {
                        ApplicationArea = All;
                        Editable = false;
                        ShowCaption = false;

                        trigger OnDrillDown()
                        begin
                            Page.RunModal(Page::"Job Queue Entries");
                        end;
                    }
                }
                label(Finish2)
                {
                    ApplicationArea = All;
                    Caption = 'Choose Finish to apply the setup and complete the guide.';
                }
            }
        }
    }
    actions
    {
        area(Processing)
        {
            action(BackAction)
            {
                ApplicationArea = Jobs;
                Caption = '&Back';
                Enabled = BackActionEnabled;
                Image = PreviousRecord;
                InFooterBar = true;

                trigger OnAction()
                begin
                    NextStep(true);
                end;
            }
            action(NextAction)
            {
                ApplicationArea = Jobs;
                Caption = '&Next';
                Enabled = NextActionEnabled;
                Image = NextRecord;
                InFooterBar = true;

                trigger OnAction()
                begin
                    NextStep(false);
                end;
            }
            action(FinishAction)
            {
                ApplicationArea = Jobs;
                Caption = '&Finish';
                Enabled = FinishActionEnabled;
                Image = Approve;
                InFooterBar = true;

                trigger OnAction()
                var
                    FeatureTelemetry: Codeunit "Feature Telemetry";
                    GuidedExperience: Codeunit "Guided Experience";
                begin
                    if Rec.InProductNotification then
                        FeatureTelemetry.LogUptake('0000OK8', 'JobQueueFailedNotification-InProd ', Enum::"Feature Uptake Status"::"Set up");
                    if Rec.PowerAutomateFlowNotification then
                        FeatureTelemetry.LogUptake('0000OK9', 'JobQueueFailedNotification-External ', Enum::"Feature Uptake Status"::"Set up");

                    GuidedExperience.CompleteAssistedSetup(ObjectType::Page, Page::"Job Queue Notification Wizard");
                    UpdateJobQueueNotificationSetup();
                    CurrPage.Close();
                end;
            }
        }
    }

    trigger OnInit()
    begin
        LoadTopBanners();
        Step := Step::Start;
        UpdateControls();
    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 Start,Participants,NotificationType,NotificationTime,Finish;
        TopBannerVisible: Boolean;
        BackActionEnabled: Boolean;
        NextActionEnabled: Boolean;
        FinishActionEnabled: Boolean;
        NotifyUserInitiatingTask: Boolean;
        NotifyAdmin: Boolean;
        InProductNotification: Boolean;
        PowerAutomateFlowNotification: Boolean;
        NotifyWhenJobFailed: Boolean;
        NotifyAfterThreshold: Boolean;
        Threshold1: Integer;
        Threshold2: Integer;
        CreateFlowFromTemplateTipLbl: Label 'You can set up automated flow to be used to notify users of Job Queue issues on Job Queue Entries page.';
        CreateFlowFromTemplateLbl: Label 'Open Job Queue Entries page to create an automated flow for Job Queue failure notification.';
        Threshold1MustBeGreaterThanOrEqualTo0Err: Label 'Threshold 1 must be greater than or equal to 0.';
        Threshold2MustBeGreaterThanOrEqualTo0Err: Label 'Threshold 2 must be greater than or equal to 0.';
        Threshold1MustBeLessThanOrEqualToThreshold2Err: Label 'Threshold 1 must be less than or equal to Threshold 2.';

    local procedure UpdateJobQueueNotificationSetup()
    begin
        Rec.NotifyUserInitiatingTask := NotifyUserInitiatingTask;
        Rec.NotifyJobQueueAdmin := NotifyAdmin;
        Rec.InProductNotification := InProductNotification;
        Rec.PowerAutomateFlowNotification := PowerAutomateFlowNotification;
        Rec.NotifyWhenJobFailed := NotifyWhenJobFailed;
        Rec.NotifyAfterThreshold := NotifyAfterThreshold;
        Rec.Threshold1 := Threshold1;
        Rec.Threshold2 := Threshold2;
        Rec.Modify();

        UpdateMyNotificationSetup();
    end;

    local procedure UpdateMyNotificationSetup()
    var
        MyNotifications: Record "My Notifications";
        JobQueueNotifiedAdmin: Record "Job Queue Notified Admin";
        JobQueueSendNotificationMgt: Codeunit "Job Queue - Send Notification";
        MyNotificationGUID: Guid;
    begin
        MyNotificationGUID := JobQueueSendNotificationMgt.GetJobQueueFailedNotificationId();
        MyNotifications.SetRange("Notification Id", MyNotificationGUID);
        if MyNotifications.FindSet() then
            if NotifyUserInitiatingTask then
                repeat
                    MyNotifications.Enabled := true;
                    MyNotifications.Modify();
                until MyNotifications.Next() = 0
            else
                repeat
                    MyNotifications.Enabled := false;
                    MyNotifications.Modify();
                until MyNotifications.Next() = 0;

        if not NotifyUserInitiatingTask and NotifyAdmin and JobQueueNotifiedAdmin.FindSet() then
            repeat
                if MyNotifications.Get(JobQueueNotifiedAdmin."User Name", MyNotificationGUID) then begin
                    MyNotifications.Enabled := true;
                    MyNotifications.Modify();
                end;
            until JobQueueNotifiedAdmin.Next() = 0;

    end;

    local procedure LoadFromJobQueueNotificationSetup()
    begin
        Rec.FindLast();

        NotifyUserInitiatingTask := Rec.NotifyUserInitiatingTask;
        NotifyAdmin := Rec.NotifyJobQueueAdmin;
        InProductNotification := Rec.InProductNotification;
        PowerAutomateFlowNotification := Rec.PowerAutomateFlowNotification;
        NotifyWhenJobFailed := Rec.NotifyWhenJobFailed;
        NotifyAfterThreshold := Rec.NotifyAfterThreshold;
        Threshold1 := Rec.Threshold1;
        Threshold2 := Rec.Threshold2;
    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;

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

        UpdateControls();
    end;

    local procedure UpdateControls()
    begin
        NextActionEnabled := Step <> Step::Finish;
        BackActionEnabled := Step <> Step::Start;
        FinishActionEnabled := Step = Step::Finish;
    end;

    trigger OnOpenPage()
    var
        FeatureTelemetry: Codeunit "Feature Telemetry";
    begin
        FeatureTelemetry.LogUptake('0000OKA', 'JobQueueFailedNotification-InProd ', Enum::"Feature Uptake Status"::Discovered);
        FeatureTelemetry.LogUptake('0000OKB', 'JobQueueFailedNotification-External ', Enum::"Feature Uptake Status"::Discovered);

        if Rec.IsEmpty() then
            Rec.Insert(true);

        LoadFromJobQueueNotificationSetup();
    end;
}