Page 2875 Cost Adj. Scheduling Wizard, source in 29

Source29

src/Layers/W1/BaseApp/Inventory/Costing/CostAdjSchedulingWizard.Page.al276 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.Inventory.Costing;

using System.Environment;
using System.Threading;

page 2875 "Cost Adj. Scheduling Wizard"
{
    PageType = NavigatePage;
    Extensible = false;
    Caption = 'Schedule Cost Adjustment and Posting';

    layout
    {
        area(Content)
        {
            group(Done)
            {
                ShowCaption = false;
                Visible = TopBannerVisible and DoneVisible;

                field(NotDoneIcon; MediaResourcesDone."Media Reference")
                {
                    ApplicationArea = All;
                    Editable = false;
                    ShowCaption = false;
                }
            }
            group(NotDone)
            {
                ShowCaption = false;
                Visible = TopBannerVisible and not DoneVisible;

                field(DoneIcon; MediaResourcesStandard."Media Reference")
                {
                    ApplicationArea = All;
                    Editable = false;
                    ShowCaption = false;
                }
            }

            group(Welcome)
            {
                ShowCaption = false;
                Visible = Step = Step::Welcome;

                group("Welcome to Schedule Cost Adjustment and Posting setup guide")
                {
                    Caption = 'Welcome to the Schedule Cost Adjustment and Posting setup guide';
                    InstructionalText = 'Optimize performance by creating and scheduling job queue entries to run in the background for inventory cost adjustments and posting. Background job queue entries do not affect the work you’re doing in the foreground and run on the schedule you specify.';
                }
                group("Let's go!")
                {
                    Caption = 'Let''s go!';
                    InstructionalText = 'Choose Next to choose the job queue entry to create.';
                }
            }
            group(Selection)
            {
                ShowCaption = false;
                Visible = Step = Step::Selection;

                group(ChoseEntries)
                {
                    Caption = 'Choose the job queue entry to create.​';

                    field(CreatePostToGLSchedule; CreatePostInvCostToGLSchedule)
                    {
                        ApplicationArea = All;
                        Caption = 'Post Inventory Cost to G/L​​';
                        ToolTip = 'Create a job queue entry that will post costs for all items at a specified time. For example, outside working hours. The default will be 2 AM, but you can change that.';
                        Enabled = PostInvCostToGLOptionEnabled;

                        trigger OnValidate()
                        begin
                            UpdateViewState();
                        end;
                    }

                    field(CreateCostAdjSchedule; CreateAdjCostSchedule)
                    {
                        ApplicationArea = All;
                        Caption = 'Adjust Cost – Item Entries​';
                        ToolTip = 'Create a job queue entry that will adjust costs for all items at a specified time. For example, outside working hours. The default will be 1 AM, but you can change that.';
                        Enabled = AdjCostOptionEnabled;

                        trigger OnValidate()
                        begin
                            UpdateViewState();
                        end;
                    }

                    group(ExistingJobQueueHelperText)
                    {
                        Visible = not AdjCostOptionEnabled or not PostInvCostToGLOptionEnabled;
                        Caption = 'One, or both, of the job queue entries already exist';
                        InstructionalText = 'If a toggle is not available for a job queue entry above, it already exists. You can edit, delete, and replace job queue entries on the Job Queue Entries page.';
                    }
                }
            }
            group(Finish)
            {
                ShowCaption = false;
                Visible = Step = Step::Finish;

                group("That's it!")
                {
                    Caption = 'That''s it!';
                    InstructionalText = 'You are about to create and schedule the job queue entries to run at the default times. You can edit the schedule on the Job Queue Entries page afterward.';

                    group(PostToGLSchedule)
                    {
                        Visible = CreatePostInvCostToGLSchedule;
                        Caption = 'Post Inventory Cost to G/L';
                        InstructionalText = 'Scheduled to run every day at 2 AM.';
                    }

                    group(CostAdjSchedule)
                    {
                        Visible = CreateAdjCostSchedule;
                        Caption = 'Adjust Cost - Item Entries';
                        InstructionalText = 'Scheduled to run every day at 1 AM.';
                    }
                }

                group(OpenAfterFinishGroup)
                {
                    ShowCaption = false;

                    field(OpenJobQueueListAfterFinish; OpenJobQueueListAfterFinish)
                    {
                        ApplicationArea = All;
                        Caption = 'View the job queue entries when finished.';
                        ToolTip = 'Open the Job Queue Entries page to view and edit details for job queue entries when you choose Finish.';
                    }
                }
            }
        }
    }

    actions
    {
        area(processing)
        {
            action(ActionBack)
            {
                ApplicationArea = All;
                Caption = 'Back';
                InFooterBar = true;
                Image = PreviousRecord;
                Enabled = PrevButtonEnabled;

                trigger OnAction()
                begin
                    Step := Step - 1;
                    UpdateViewState();
                end;
            }
            action(ActionNext)
            {
                ApplicationArea = All;
                Caption = 'Next';
                InFooterBar = true;
                Image = NextRecord;
                Enabled = NextButtonEnabled;

                trigger OnAction()
                begin
                    Step := Step + 1;
                    UpdateViewState();
                end;
            }
            action(ActionFinish)
            {
                ApplicationArea = All;
                Caption = 'Finish';
                InFooterBar = true;
                Image = NextRecord;
                Enabled = FinishButtonEnabled;

                trigger OnAction()
                begin
                    OnFinish();
                end;
            }
        }
    }

    trigger OnInit()
    begin
        LoadTopBanners();

        // Check if there is an existing schedule for each type. We do not support disabling of the schedule.
        AdjCostOptionEnabled := not SchedulingManager.AdjCostJobQueueExists();
        PostInvCostToGLOptionEnabled := not SchedulingManager.PostInvCostToGLJobQueueExists();

        Step := Step::Welcome;
        UpdateViewState();
    end;

    local procedure LoadTopBanners()
    begin
        if MediaResourcesStandard.Get('ASSISTEDSETUP-NOTEXT-400PX.PNG') and
            MediaResourcesDone.Get('ASSISTEDSETUPDONE-NOTEXT-400PX.PNG') and (CurrentClientType() = ClientType::Web)
        then
            TopBannerVisible := MediaResourcesDone."Media Reference".HasValue();
    end;

    local procedure UpdateViewState()
    begin
        case Step of
            Step::Welcome:
                begin
                    PrevButtonEnabled := false;
                    NextButtonEnabled := true;
                    FinishButtonEnabled := false;
                    DoneVisible := false;
                end;

            Step::Selection:
                begin
                    PrevButtonEnabled := true;
                    NextButtonEnabled := CreateAdjCostSchedule or CreatePostInvCostToGLSchedule;
                    FinishButtonEnabled := false;
                    DoneVisible := false;
                end;

            Step::Finish:
                begin
                    PrevButtonEnabled := true;
                    NextButtonEnabled := false;
                    FinishButtonEnabled := true;
                    DoneVisible := true;
                    CurrPage.Update(false);
                end;
        end;
    end;

    local procedure OnFinish()
    var
        JobQueueEntry: Record "Job Queue Entry";
    begin
        CurrPage.Close();

        if CreateAdjCostSchedule then
            SchedulingManager.CreateAdjCostJobQueue();

        if CreatePostInvCostToGLSchedule then
            SchedulingManager.CreatePostInvCostToGLJobQueue();

        if OpenJobQueueListAfterFinish then begin
            SchedulingManager.SetupDisplayJobQueueEntriesFilter(JobQueueEntry);
            Page.Run(Page::"Job Queue Entries", JobQueueEntry);
        end;
    end;

    var
        MediaResourcesStandard: Record "Media Resources";
        MediaResourcesDone: Record "Media Resources";
        SchedulingManager: Codeunit "Cost Adj. Scheduling Manager";
        Step: Option Welcome,Selection,Finish;
        TopBannerVisible: Boolean;
        DoneVisible: Boolean;
        PrevButtonEnabled: Boolean;
        NextButtonEnabled: Boolean;
        FinishButtonEnabled: Boolean;
        AdjCostOptionEnabled: Boolean;
        CreateAdjCostSchedule: Boolean;
        PostInvCostToGLOptionEnabled: Boolean;
        CreatePostInvCostToGLSchedule: Boolean;
        OpenJobQueueListAfterFinish: Boolean;
}