Page 1872 Item Availability Check, source in 29

Source29

src/Layers/W1/BaseApp/Inventory/Availability/ItemAvailabilityCheck.Page.al352 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.Availability;

using Microsoft.Inventory.Item;
using Microsoft.Purchases.Document;
using Microsoft.Purchases.Vendor;

page 1872 "Item Availability Check"
{
    AutoSplitKey = false;
    Caption = 'Availability Check';
    DelayedInsert = false;
    DeleteAllowed = false;
    Editable = false;
    InsertAllowed = false;
    LinksAllowed = false;
    ModifyAllowed = false;
    MultipleNewLines = false;
    PopulateAllFields = false;
    SaveValues = false;
    ShowFilter = true;
    SourceTable = Item;
    SourceTableTemporary = false;

    layout
    {
        area(content)
        {
            label(Control2)
            {
                ApplicationArea = Basic, Suite;
                CaptionClass = Heading;
                ShowCaption = false;
            }
            group(Inventory)
            {
                Caption = 'Inventory';
                field(InventoryQty; InventoryQty)
                {
                    ApplicationArea = Basic, Suite;
                    AutoFormatType = 0;
                    CaptionClass = AvailableInventoryCaption;
                    DecimalPlaces = 0 : 5;
                    Editable = false;
                    ToolTip = 'Specifies the quantity of the item that is currently in inventory and not reserved for other demand.';
                }
                field(TotalQuantity; TotalQuantity)
                {
                    ApplicationArea = Basic, Suite;
                    AutoFormatType = 0;
                    Caption = 'Inventory Shortage';
                    DecimalPlaces = 0 : 5;
                    Editable = false;
                    ToolTip = 'Specifies the total quantity of the item that is currently in inventory. The Total Quantity field is used to calculate the Available Inventory field as follows: Available Inventory = Total Quantity - Reserved Quantity.';
                }
                field("All locations"; Rec.Inventory)
                {
                    ApplicationArea = Location;
                    Caption = 'All locations';
                    DecimalPlaces = 0 : 5;
                    ToolTip = 'Specifies the total quantity of the item that is currently in inventory at all locations.';

                    trigger OnDrillDown()
                    begin
                        PAGE.RunModal(PAGE::"Item Availability by Location", Rec)
                    end;
                }
            }
            part(AvailabilityCheckDetails; "Item Availability Check Det.")
            {
                ApplicationArea = Basic, Suite;
                Editable = false;
                SubPageLink = "No." = field("No.");
            }
        }
    }

    actions
    {
        area(navigation)
        {
            group("&Manage")
            {
                Caption = '&Manage';
                action("Page Item Card")
                {
                    ApplicationArea = Basic, Suite;
                    Caption = 'Item';
                    Image = Item;
                    RunObject = Page "Item Card";
                    RunPageLink = "No." = field("No."),
                                  "Date Filter" = field("Date Filter"),
                                  "Global Dimension 1 Filter" = field("Global Dimension 1 Filter"),
                                  "Global Dimension 2 Filter" = field("Global Dimension 2 Filter");
                    RunPageMode = View;
                    ToolTip = 'View and edit detailed information for the item.';
                }
            }
            group(Create)
            {
                Caption = 'Create';
                action("Purchase Invoice")
                {
                    ApplicationArea = Basic, Suite;
                    Caption = 'Create Purchase Invoice';
                    Image = NewPurchaseInvoice;
                    ToolTip = 'Create a new purchase invoice.';

                    trigger OnAction()
                    begin
                        ShowNewPurchaseDocument(DummyPurchaseHeader."Document Type"::Invoice);
                    end;
                }
                action("Purchase Order")
                {
                    ApplicationArea = Basic, Suite;
                    Caption = 'Create Purchase Order';
                    Image = NewOrder;
                    ToolTip = 'Create a new purchase order.';

                    trigger OnAction()
                    begin
                        ShowNewPurchaseDocument(DummyPurchaseHeader."Document Type"::Order);
                    end;
                }
            }
        }
        area(Promoted)
        {
            group(Category_Process)
            {
                Caption = 'Process', Comment = 'Generated from the PromotedActionCategories property index 1.';

                actionref("Purchase Order_Promoted"; "Purchase Order")
                {
                }
                actionref("Purchase Invoice_Promoted"; "Purchase Invoice")
                {
                }
                actionref("Page Item Card_Promoted"; "Page Item Card")
                {
                }
            }
            group(Category_Category4)
            {
                Caption = 'Manage', Comment = 'Generated from the PromotedActionCategories property index 3.';
            }
            group(Category_Report)
            {
                Caption = 'Report', Comment = 'Generated from the PromotedActionCategories property index 2.';
            }
        }
    }

    var
        DummyPurchaseHeader: Record "Purchase Header";
        TotalQuantity: Decimal;
        InventoryQty: Decimal;
        LocationCode: Code[10];
        VariantCode: Code[10];
        UnitOfMeasureCode: Code[20];
        Heading: Text;
        SelectVentorTxt: Label 'Select a vendor';
        AvailableInventoryLbl: Label 'Available Inventory';
        AvailableInventoryCaptionLbl: Label '%1 (%2)', Comment = '%1 = Available Inventory Label, %2 = Location Code';
        AvailableInventoryCaption: Text;

    procedure PopulateDataOnNotification(var AvailabilityCheckNotification: Notification; ItemNo: Code[20]; UnitOfMeasureCode: Code[20]; InventoryQty: Decimal; GrossReq: Decimal; ReservedReq: Decimal; SchedRcpt: Decimal; ReservedRcpt: Decimal; CurrentQuantity: Decimal; CurrentReservedQty: Decimal; TotalQuantity: Decimal; EarliestAvailDate: Date; LocationCode: Code[10])
    begin
        AvailabilityCheckNotification.SetData('ItemNo', ItemNo);
        AvailabilityCheckNotification.SetData('UnitOfMeasureCode', UnitOfMeasureCode);
        AvailabilityCheckNotification.SetData('GrossReq', Format(GrossReq));
        AvailabilityCheckNotification.SetData('ReservedReq', Format(ReservedReq));
        AvailabilityCheckNotification.SetData('SchedRcpt', Format(SchedRcpt));
        AvailabilityCheckNotification.SetData('ReservedRcpt', Format(ReservedRcpt));
        AvailabilityCheckNotification.SetData('CurrentQuantity', Format(CurrentQuantity));
        AvailabilityCheckNotification.SetData('CurrentReservedQty', Format(CurrentReservedQty));
        AvailabilityCheckNotification.SetData('TotalQuantity', Format(TotalQuantity));
        AvailabilityCheckNotification.SetData('InventoryQty', Format(InventoryQty));
        AvailabilityCheckNotification.SetData('EarliestAvailDate', Format(EarliestAvailDate));
        AvailabilityCheckNotification.SetData('LocationCode', LocationCode);
    end;

    procedure PopulateDataOnNotification(var AvailabilityCheckNotification: Notification; Name: Text; Value: Text)
    begin
        AvailabilityCheckNotification.SetData(Name, Value);
    end;

    procedure InitializeFromNotification(AvailabilityCheckNotification: Notification)
    var
        GrossReq: Decimal;
        SchedRcpt: Decimal;
        ReservedReq: Decimal;
        ReservedRcpt: Decimal;
        CurrentQuantity: Decimal;
        CurrentReservedQty: Decimal;
        EarliestAvailDate: Date;
    begin
        Rec.Get(AvailabilityCheckNotification.GetData('ItemNo'));
        Rec.SetRange("No.", AvailabilityCheckNotification.GetData('ItemNo'));
        Evaluate(TotalQuantity, AvailabilityCheckNotification.GetData('TotalQuantity'));
        Evaluate(InventoryQty, AvailabilityCheckNotification.GetData('InventoryQty'));
        Evaluate(LocationCode, AvailabilityCheckNotification.GetData('LocationCode'));
        if AvailabilityCheckNotification.GetData('VariantCode') <> '' then
            Evaluate(VariantCode, AvailabilityCheckNotification.GetData('VariantCode'));
        if AvailabilityCheckNotification.GetData('UnitOfMeasureCode') <> '' then begin
            Evaluate(UnitOfMeasureCode, AvailabilityCheckNotification.GetData('UnitOfMeasureCode'));
            CurrPage.AvailabilityCheckDetails.PAGE.SetUnitOfMeasureCode(AvailabilityCheckNotification.GetData('UnitOfMeasureCode'));
        end;

        if AvailabilityCheckNotification.GetData('GrossReq') <> '' then begin
            Evaluate(GrossReq, AvailabilityCheckNotification.GetData('GrossReq'));
            CurrPage.AvailabilityCheckDetails.PAGE.SetGrossReq(GrossReq);
        end;
        if AvailabilityCheckNotification.GetData('ReservedReq') <> '' then begin
            Evaluate(ReservedReq, AvailabilityCheckNotification.GetData('ReservedReq'));
            CurrPage.AvailabilityCheckDetails.PAGE.SetReservedReq(ReservedReq);
        end;
        if AvailabilityCheckNotification.GetData('SchedRcpt') <> '' then begin
            Evaluate(SchedRcpt, AvailabilityCheckNotification.GetData('SchedRcpt'));
            CurrPage.AvailabilityCheckDetails.PAGE.SetSchedRcpt(SchedRcpt);
        end;
        if AvailabilityCheckNotification.GetData('ReservedRcpt') <> '' then begin
            Evaluate(ReservedRcpt, AvailabilityCheckNotification.GetData('ReservedRcpt'));
            CurrPage.AvailabilityCheckDetails.PAGE.SetReservedRcpt(ReservedRcpt);
        end;
        if AvailabilityCheckNotification.GetData('CurrentQuantity') <> '' then begin
            Evaluate(CurrentQuantity, AvailabilityCheckNotification.GetData('CurrentQuantity'));
            CurrPage.AvailabilityCheckDetails.PAGE.SetCurrentQuantity(CurrentQuantity);
        end;
        if AvailabilityCheckNotification.GetData('CurrentReservedQty') <> '' then begin
            Evaluate(CurrentReservedQty, AvailabilityCheckNotification.GetData('CurrentReservedQty'));
            CurrPage.AvailabilityCheckDetails.PAGE.SetCurrentReservedQty(CurrentReservedQty);
        end;
        if AvailabilityCheckNotification.GetData('EarliestAvailDate') <> '' then begin
            Evaluate(EarliestAvailDate, AvailabilityCheckNotification.GetData('EarliestAvailDate'));
            CurrPage.AvailabilityCheckDetails.PAGE.SetEarliestAvailDate(EarliestAvailDate);
        end;

        if LocationCode = '' then
            AvailableInventoryCaption := AvailableInventoryLbl
        else
            AvailableInventoryCaption := StrSubstNo('%1 (%2)', AvailableInventoryLbl, LocationCode);

        OnAfterInitializeFromNotification(Rec, AvailabilityCheckNotification);
    end;

    procedure InitializeFromData(ItemNo: Code[20]; NewUnitOfMeasureCode: Code[20]; InventoryQty2: Decimal; GrossReq: Decimal; ReservedReq: Decimal; SchedRcpt: Decimal; ReservedRcpt: Decimal; CurrentQuantity: Decimal; CurrentReservedQty: Decimal; TotalQuantity2: Decimal; EarliestAvailDate: Date; LocationCode2: Code[10])
    begin
        Rec.Get(ItemNo);
        Rec.SetRange("No.", ItemNo);
        TotalQuantity := TotalQuantity2;
        InventoryQty := InventoryQty2;
        LocationCode := LocationCode2;
        UnitOfMeasureCode := NewUnitOfMeasureCode;

        CurrPage.AvailabilityCheckDetails.PAGE.SetUnitOfMeasureCode(UnitOfMeasureCode);
        CurrPage.AvailabilityCheckDetails.PAGE.SetGrossReq(GrossReq);
        CurrPage.AvailabilityCheckDetails.PAGE.SetReservedReq(ReservedReq);
        CurrPage.AvailabilityCheckDetails.PAGE.SetSchedRcpt(SchedRcpt);
        CurrPage.AvailabilityCheckDetails.PAGE.SetReservedRcpt(ReservedRcpt);
        CurrPage.AvailabilityCheckDetails.PAGE.SetCurrentQuantity(CurrentQuantity);
        CurrPage.AvailabilityCheckDetails.PAGE.SetCurrentReservedQty(CurrentReservedQty);
        CurrPage.AvailabilityCheckDetails.PAGE.SetEarliestAvailDate(EarliestAvailDate);

        if LocationCode = '' then
            AvailableInventoryCaption := AvailableInventoryLbl
        else
            AvailableInventoryCaption := StrSubstNo(AvailableInventoryCaptionLbl, AvailableInventoryLbl, LocationCode);
    end;

    procedure SetHeading(Value: Text)
    begin
        Heading := Value;
    end;

    local procedure SelectVendor(var Vendor: Record Vendor): Boolean
    var
        VendorList: Page "Vendor List";
    begin
        VendorList.LookupMode(true);
        VendorList.Caption(SelectVentorTxt);
        if VendorList.RunModal() = ACTION::LookupOK then begin
            VendorList.GetRecord(Vendor);
            exit(true);
        end;

        exit(false);
    end;

    local procedure ShowNewPurchaseDocument(DocumentType: Enum "Purchase Document Type")
    var
        PurchaseHeader: Record "Purchase Header";
    begin
        if CreateNewPurchaseDocument(DocumentType, PurchaseHeader) then
            case DocumentType of
                PurchaseHeader."Document Type"::Invoice:
                    PAGE.Run(PAGE::"Purchase Invoice", PurchaseHeader);
                PurchaseHeader."Document Type"::Order:
                    PAGE.Run(PAGE::"Purchase Order", PurchaseHeader);
            end;
    end;

    local procedure CreateNewPurchaseDocument(DocumentType: Enum "Purchase Document Type"; var PurchaseHeader: Record "Purchase Header"): Boolean
    var
        PurchaseLine: Record "Purchase Line";
        Vendor: Record Vendor;
    begin
        if Rec."Vendor No." = '' then begin
            if not SelectVendor(Vendor) then
                exit(false);

            Rec."Vendor No." := Vendor."No."
        end;
        PurchaseHeader.Init();
        PurchaseHeader.Validate("Document Type", DocumentType);
        PurchaseHeader.Insert(true);
        PurchaseHeader.Validate("Buy-from Vendor No.", Rec."Vendor No.");
        PurchaseHeader.Modify(true);

        PurchaseLine.Init();
        PurchaseLine.Validate("Document Type", PurchaseHeader."Document Type");
        PurchaseLine.Validate("Document No.", PurchaseHeader."No.");
        PurchaseLine.Validate("Line No.", 10000);
        PurchaseLine.Insert(true);

        PurchaseLine.Validate(Type, PurchaseLine.Type::Item);
        PurchaseLine.Validate("No.", Rec."No.");
        PurchaseLine.Validate("Location Code", LocationCode);
        PurchaseLine.Validate("Variant Code", VariantCode);
        PurchaseLine.Validate("Unit of Measure Code", UnitOfMeasureCode);
        PurchaseLine.Validate(Quantity, -TotalQuantity);
        PurchaseLine.Modify(true);

        exit(true);
    end;

    procedure GetLocationCode(): Code[10]
    begin
        exit(LocationCode);
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterInitializeFromNotification(var Item: Record Item; var AvailabilityCheckNotification: Notification)
    begin
    end;
}