Table 5767 Warehouse Activity Line, source in 29

Source29

src/Layers/W1/BaseApp/Warehouse/Activity/WarehouseActivityLine.Table.al3884 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.Warehouse.Activity;

using Microsoft.Assembly.Document;
using Microsoft.Foundation.Shipping;
using Microsoft.Foundation.UOM;
using Microsoft.Inventory.Availability;
using Microsoft.Inventory.BOM;
using Microsoft.Inventory.Item;
using Microsoft.Inventory.Ledger;
using Microsoft.Inventory.Location;
using Microsoft.Inventory.Tracking;
using Microsoft.Projects.Project.Job;
using Microsoft.Projects.Project.Planning;
using Microsoft.Purchases.Document;
using Microsoft.Purchases.Vendor;
using Microsoft.Sales.Customer;
using Microsoft.Sales.Document;
using Microsoft.Warehouse.Activity.History;
using Microsoft.Warehouse.Availability;
using Microsoft.Warehouse.Document;
using Microsoft.Warehouse.History;
using Microsoft.Warehouse.InternalDocument;
using Microsoft.Warehouse.Journal;
using Microsoft.Warehouse.Ledger;
using Microsoft.Warehouse.Request;
using Microsoft.Warehouse.Setup;
using Microsoft.Warehouse.Structure;
using Microsoft.Warehouse.Tracking;
using Microsoft.Warehouse.Worksheet;
using System.Environment.Configuration;
using System.Utilities;

table 5767 "Warehouse Activity Line"
{
    Caption = 'Warehouse Activity Line';
    DrillDownPageID = "Warehouse Activity Lines";
    LookupPageID = "Warehouse Activity Lines";
    Permissions = TableData "Whse. Item Tracking Line" = rmd;
    DataClassification = CustomerContent;

    fields
    {
        field(1; "Activity Type"; Enum "Warehouse Activity Type")
        {
            Caption = 'Activity Type';
            ToolTip = 'Specifies the type of warehouse activity for the line.';
            Editable = false;
        }
        field(2; "No."; Code[20])
        {
            Caption = 'No.';
            ToolTip = 'Specifies the number of the involved entry or record, according to the specified number series.';
            Editable = false;
        }
        field(3; "Line No."; Integer)
        {
            Caption = 'Line No.';
            ToolTip = 'Specifies the number of the warehouse activity line.';
            Editable = false;
        }
        field(4; "Source Type"; Integer)
        {
            Caption = 'Source Type';
            ToolTip = 'Specifies the type of source document to which the warehouse activity line relates, such as sales, purchase, and production.';
            Editable = false;
        }
        field(5; "Source Subtype"; Option)
        {
            Caption = 'Source Subtype';
            ToolTip = 'Specifies the source subtype of the document related to the warehouse request.';
            Editable = false;
            OptionCaption = '0,1,2,3,4,5,6,7,8,9,10';
            OptionMembers = "0","1","2","3","4","5","6","7","8","9","10";
        }
        field(6; "Source No."; Code[20])
        {
            Caption = 'Source No.';
            ToolTip = 'Specifies the number of the source document that the entry originates from.';
            Editable = false;
        }
        field(7; "Source Line No."; Integer)
        {
            BlankZero = true;
            Caption = 'Source Line No.';
            ToolTip = 'Specifies the line number of the source document that the entry originates from.';
            Editable = false;
        }
        field(8; "Source Subline No."; Integer)
        {
            BlankZero = true;
            Caption = 'Source Subline No.';
            ToolTip = 'Specifies the source subline number.';
            Editable = false;
        }
        field(9; "Source Document"; Enum "Warehouse Activity Source Document")
        {
            BlankZero = true;
            Caption = 'Source Document';
            ToolTip = 'Specifies the type of document that the line relates to.';
            Editable = false;
        }
        field(11; "Location Code"; Code[10])
        {
            Caption = 'Location Code';
            ToolTip = 'Specifies the code for the location where the activity occurs.';
            Editable = false;
            TableRelation = Location;
        }
        field(12; "Shelf No."; Code[10])
        {
            Caption = 'Shelf No.';
            ToolTip = 'Specifies the shelf number of the item for informational use.';
        }
        field(13; "Sorting Sequence No."; Integer)
        {
            Caption = 'Sorting Sequence No.';
            Editable = false;
        }
        field(14; "Item No."; Code[20])
        {
            Caption = 'Item No.';
            ToolTip = 'Specifies the item number of the item to be handled, such as picked or put away.';
            Editable = false;
            TableRelation = Item;

            trigger OnValidate()
            begin
                if "Item No." <> xRec."Item No." then
                    "Variant Code" := '';

                if "Item No." <> '' then begin
                    GetItemUnitOfMeasure();
                    Description := Item.Description;
                    "Description 2" := Item."Description 2";
                    Validate("Unit of Measure Code", ItemUnitOfMeasure.Code);
                    OnValidateItemNoOnAfterValidateUoMCode(Rec, Item, CurrFieldNo);
                end else begin
                    Description := '';
                    "Description 2" := '';
                    "Variant Code" := '';
                    Validate("Unit of Measure Code", '');
                end;
            end;
        }
        field(15; "Variant Code"; Code[10])
        {
            Caption = 'Variant Code';
            ToolTip = 'Specifies the variant of the item on the line.';
            Editable = false;
            TableRelation = "Item Variant".Code where("Item No." = field("Item No."));

            trigger OnValidate()
            var
                ItemVariant: Record "Item Variant";
                IsHandled: Boolean;
            begin
                IsHandled := false;
                OnBeforeValidateVariantCode(Rec, IsHandled);
                if IsHandled then
                    exit;

                if Rec."Variant Code" = '' then
                    Validate("Item No.")
                else begin
                    ItemVariant.Get("Item No.", "Variant Code");
                    IsHandled := false;
                    OnValidateVariantCodeOnAfterGetItemVariant(Rec, ItemVariant, IsHandled);
                    if not IsHandled then begin
                        Description := ItemVariant.Description;
                        "Description 2" := ItemVariant."Description 2";
                    end;
                end;
            end;
        }
        field(16; "Unit of Measure Code"; Code[10])
        {
            Caption = 'Unit of Measure Code';
            ToolTip = 'Specifies how each unit of the item or resource is measured, such as in pieces or hours. By default, the value in the Base Unit of Measure field on the item or resource card is inserted.';
            Editable = false;
            TableRelation = "Item Unit of Measure".Code where("Item No." = field("Item No."));

            trigger OnValidate()
            begin
                if "Item No." <> '' then begin
                    GetItemUnitOfMeasure();
                    "Qty. per Unit of Measure" := ItemUnitOfMeasure."Qty. per Unit of Measure";
                    "Qty. Rounding Precision" := UOMMgt.GetQtyRoundingPrecision(Item, "Unit of Measure Code");
                    "Qty. Rounding Precision (Base)" := UOMMgt.GetQtyRoundingPrecision(Item, Item."Base Unit of Measure");
                end else
                    "Qty. per Unit of Measure" := 1;

                Validate(Quantity);
                Validate("Qty. Outstanding");
                Validate("Qty. to Handle");
            end;
        }
        field(17; "Qty. per Unit of Measure"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Qty. per Unit of Measure';
            ToolTip = 'Specifies the quantity per unit of measure of the item on the line.';
            DecimalPlaces = 0 : 5;
            Editable = false;
            InitValue = 1;
        }
        field(18; Description; Text[100])
        {
            Caption = 'Description';
            ToolTip = 'Specifies a description of the item on the line.';
            Editable = false;
        }
        field(19; "Description 2"; Text[50])
        {
            Caption = 'Description 2';
            ToolTip = 'Specifies information in addition to the description.';
            Editable = false;
        }
        field(20; Quantity; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Quantity';
            ToolTip = 'Specifies the quantity of the item to be handled, such as received, put-away, or assigned.';
            DecimalPlaces = 0 : 5;

            trigger OnValidate()
            var
                QuantityNotRounded: Decimal;
            begin
                QuantityNotRounded := Quantity;
                Quantity := UOMMgt.RoundAndValidateQty(Quantity, "Qty. Rounding Precision", FieldCaption(Quantity));
                "Qty. (Base)" := CalcBaseQty(QuantityNotRounded, FieldCaption(Quantity), FieldCaption("Qty. (Base)"));
                Validate("Qty. Outstanding", (QuantityNotRounded - "Qty. Handled"));

                UpdateQtyOnRelatedPlaceLine(Rec, xRec);
            end;
        }
        field(21; "Qty. (Base)"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Qty. (Base)';
            DecimalPlaces = 0 : 5;
            Editable = false;

            trigger OnValidate()
            var
                IsHandled: Boolean;
            begin
                IsHandled := false;
                OnBeforeValidateQtyBase(Rec, xRec, CurrFieldNo, IsHandled);
                if IsHandled then
                    exit;

                TestField("Qty. per Unit of Measure", 1);
                Validate(Quantity, "Qty. (Base)");
            end;
        }
        field(24; "Qty. Outstanding"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Qty. Outstanding';
            ToolTip = 'Specifies the number of items that have not yet been handled for this warehouse activity line.';
            DecimalPlaces = 0 : 5;
            Editable = false;

            trigger OnValidate()
            var
                QuantityNotRounded: Decimal;
                IsHandled: Boolean;
            begin
                IsHandled := false;
                OnBeforeValidateQtyOutstanding(Rec, xRec, CurrFieldNo, IsHandled);
                if IsHandled then
                    exit;
                QuantityNotRounded := "Qty. Outstanding";
                "Qty. Outstanding" := UOMMgt.RoundAndValidateQty("Qty. Outstanding", "Qty. Rounding Precision", FieldCaption("Qty. Outstanding"));
                "Qty. Outstanding (Base)" :=
                    CalcBaseQty(QuantityNotRounded, FieldCaption("Qty. Outstanding"), FieldCaption("Qty. Outstanding (Base)"));
                Validate("Qty. to Handle", QuantityNotRounded);
            end;
        }
        field(25; "Qty. Outstanding (Base)"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Qty. Outstanding (Base)';
            DecimalPlaces = 0 : 5;
            Editable = false;

            trigger OnValidate()
            begin
                TestField("Qty. per Unit of Measure", 1);
                Validate("Qty. Outstanding", "Qty. Outstanding (Base)");
            end;
        }
        field(26; "Qty. to Handle"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Qty. to Handle';
            ToolTip = 'Specifies how many units to handle in this warehouse activity.';
            DecimalPlaces = 0 : 5;
            MinValue = 0;

            trigger OnValidate()
            var
                BinContent: Record "Bin Content";
                QtyToHandleBase: Decimal;
                QuantityNotRounded, QuantityRounded : Decimal;
                IsHandled: Boolean;
            begin
                IsHandled := false;
                OnBeforeValidateQtyToHandle(Rec, IsHandled);
                if not OverReceiptProcessing() then
                    if not IsHandled then begin
                        QuantityRounded := UOMMgt.RoundAndValidateQty("Qty. to Handle", "Qty. Rounding Precision", FieldCaption("Qty. to Handle"));
                        if QuantityRounded > "Qty. Outstanding" then
                            Error(Text002, "Qty. Outstanding");
                    end;

                GetLocation("Location Code");
                if Location."Bin Capacity Policy" <> Location."Bin Capacity Policy"::"Never Check Capacity" then
                    WMSMgt.CalcCubageAndWeight(
                      "Item No.", "Unit of Measure Code", "Qty. to Handle", Cubage, Weight);

                if (CurrFieldNo <> 0) and
                   ("Action Type" = "Action Type"::Place) and
                   ("Breakbulk No." = 0) and
                   ("Qty. to Handle" > 0)
                then
                    if GetBin("Location Code", "Bin Code") then
                        if Location."Bin Capacity Policy" <> Location."Bin Capacity Policy"::"Never Check Capacity" then
                            CheckIncreaseCapacity(true)
                        else
                            if ("Item No." <> '') and Location."Check Whse. Class" then
                                if BinContent.Get("Location Code", "Bin Code", "Item No.", "Variant Code", "Unit of Measure Code") then
                                    BinContent.CheckWhseClass(false)
                                else
                                    Bin.CheckWhseClass("Item No.", false);

                OnValidateQtyToHandleOnBeforeCalcQtyToHandleBase(Rec, xRec, Location, CurrFieldNo);

                if not UseBaseQty then begin
                    QuantityNotRounded := "Qty. to Handle";
                    "Qty. to Handle" :=
                        UOMMgt.RoundAndValidateQty("Qty. to Handle", "Qty. Rounding Precision", FieldCaption("Qty. to Handle"));
                    "Qty. to Handle (Base)" :=
                        CalcBaseQty(QuantityNotRounded, FieldCaption("Qty. to Handle"), FieldCaption("Qty. to Handle (Base)"));

                    if (("Qty. to Handle" = "Qty. Outstanding") and ("Qty. to Handle (Base)" < "Qty. Outstanding (Base)")) then // Rounding fix (Round Down)- Qty same, not Base Qty
                        "Qty. to Handle (Base)" := "Qty. Outstanding (Base)";

                    if "Qty. to Handle (Base)" > "Qty. Outstanding (Base)" then begin // Rounding fix (Round Up)- Qty same, not Base Qty
                        QtyToHandleBase := "Qty. Outstanding (Base)";
                        OnValidateQtyToHandleOnAfterCalcQtyToHandleBase(Rec, "Qty. To Handle (Base)", QtyToHandleBase);
                        "Qty. to Handle (Base)" := QtyToHandleBase;
                    end;
                    ValidateQuantityIsBalanced();
                end;

                if ("Activity Type" = "Activity Type"::"Put-away") and
                   ("Action Type" = "Action Type"::Take) and
                   (CurrFieldNo <> 0)
                then
                    if ("Breakbulk No." <> 0) or "Original Breakbulk" then
                        UpdateBreakbulkQtytoHandle();

                if ("Activity Type" in ["Activity Type"::Pick, "Activity Type"::"Invt. Pick"]) and
                   ("Action Type" <> "Action Type"::Place) and ("Lot No." <> '') and (CurrFieldNo <> 0)
                then
                    CheckReservedItemTrkg(ItemTrackingType::"Lot No.", "Lot No.");
            end;
        }
        field(27; "Qty. to Handle (Base)"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Qty. to Handle (Base)';
            DecimalPlaces = 0 : 5;

            trigger OnValidate()
            begin
                UseBaseQty := true;
                Validate("Qty. to Handle", CalcQty("Qty. to Handle (Base)"));
            end;
        }
        field(28; "Qty. Handled"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Qty. Handled';
            ToolTip = 'Specifies the number of items on the line that have been handled in this warehouse activity.';
            DecimalPlaces = 0 : 5;
            Editable = false;

            trigger OnValidate()
            begin
                "Qty. Handled" := UOMMgt.RoundAndValidateQty("Qty. Handled", "Qty. Rounding Precision", FieldCaption("Qty. Handled"));
                "Qty. Handled (Base)" :=
                    CalcBaseQty("Qty. Handled", FieldCaption("Qty. Handled"), FieldCaption("Qty. Handled (Base)"));
            end;
        }
        field(29; "Qty. Handled (Base)"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Qty. Handled (Base)';
            DecimalPlaces = 0 : 5;
            Editable = false;
        }
        field(31; "Shipping Advice"; Enum "Sales Header Shipping Advice")
        {
            Caption = 'Shipping Advice';
            ToolTip = 'Specifies the shipping advice, which informs whether partial deliveries are acceptable.';
            Editable = false;
            FieldClass = Normal;
        }
        field(34; "Due Date"; Date)
        {
            Caption = 'Due Date';
            ToolTip = 'Specifies the date when the warehouse activity must be completed.';
        }
        field(39; "Destination Type"; enum "Warehouse Destination Type")
        {
            Caption = 'Destination Type';
            ToolTip = 'Specifies information about the type of destination, such as customer or vendor, associated with the warehouse activity line.';
            Editable = false;
        }
        field(40; "Destination No."; Code[20])
        {
            Caption = 'Destination No.';
            ToolTip = 'Specifies the number or code of the customer, vendor or location related to the activity line.';
            Editable = false;
            TableRelation = if ("Destination Type" = const(Vendor)) Vendor
            else
            if ("Destination Type" = const(Customer)) Customer
            else
            if ("Destination Type" = const(Location)) Location
            else
            if ("Destination Type" = const(Item)) Item
            else
            if ("Destination Type" = const("Sales Order")) "Sales Header"."No." where("Document Type" = const(Order));
        }
        field(42; "Shipping Agent Code"; Code[10])
        {
            Caption = 'Shipping Agent Code';
            ToolTip = 'Specifies the code for the shipping agent who is transporting the items.';
            TableRelation = "Shipping Agent";
        }
        field(43; "Shipping Agent Service Code"; Code[10])
        {
            Caption = 'Shipping Agent Service Code';
            ToolTip = 'Specifies the code for the service, such as a one-day delivery, that is offered by the shipping agent.';
            TableRelation = "Shipping Agent Services".Code where("Shipping Agent Code" = field("Shipping Agent Code"));
        }
        field(44; "Shipment Method Code"; Code[10])
        {
            Caption = 'Shipment Method Code';
            ToolTip = 'Specifies the delivery conditions of the related shipment, such as free on board (FOB).';
            TableRelation = "Shipment Method";
        }
        field(47; "Starting Date"; Date)
        {
            Caption = 'Starting Date';
        }
        field(50; "Qty. Rounding Precision"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Qty. Rounding Precision';
            InitValue = 0;
            DecimalPlaces = 0 : 5;
            MinValue = 0;
            MaxValue = 1;
            Editable = false;
        }
        field(51; "Qty. Rounding Precision (Base)"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Qty. Rounding Precision (Base)';
            InitValue = 0;
            DecimalPlaces = 0 : 5;
            MinValue = 0;
            MaxValue = 1;
            Editable = false;
        }
        field(900; "Assemble to Order"; Boolean)
        {
            AccessByPermission = TableData "BOM Component" = R;
            Caption = 'Assemble to Order';
            ToolTip = 'Specifies that the inventory pick line is for assembly items that are assembled to a sales order before being shipped.';
            Editable = false;
        }
        field(901; "ATO Component"; Boolean)
        {
            Caption = 'ATO Component';
            Editable = false;
        }
        field(6500; "Serial No."; Code[50])
        {
            Caption = 'Serial No.';
            ToolTip = 'Specifies the serial number to handle in the document.';
            ExtendedDatatype = Barcode;

            trigger OnLookup()
            begin
                LookUpTrackingSummary(Rec, ShouldLookUpBinContent(), -1, ItemTrackingType::"Serial No.");
            end;

            trigger OnValidate()
            var
                WhseItemTrackingSetup: Record "Item Tracking Setup";
                IsHandled: Boolean;
            begin
                IsHandled := false;
                OnBeforeValidateSerialNo(Rec, IsHandled);
                if IsHandled then
                    exit;
                if "Serial No." <> '' then begin
                    ItemTrackingMgt.CheckWhseItemTrkgSetup("Item No.");
                    TestField("Qty. (Base)", 1);

                    if "Activity Type" in ["Activity Type"::Pick, "Activity Type"::"Invt. Pick"] then
                        CheckReservedItemTrkg(ItemTrackingType::"Serial No.", "Serial No.");

                    CheckSNSpecificationExists();

                    ItemTrackingMgt.GetWhseItemTrkgSetup("Item No.", WhseItemTrackingSetup);
                    if WhseItemTrackingSetup."Serial No. Required" then
                        FindLotAndPackageNoBySerialNo(WhseItemTrackingSetup);
                end;

                if "Serial No." <> xRec."Serial No." then
                    "Expiration Date" := 0D;

                if CurrFieldNo = FieldNo("Serial No.") then
                    CopyItemTrackingToRelatedLine(xRec, FieldNo("Serial No."));
            end;
        }
        field(6501; "Lot No."; Code[50])
        {
            Caption = 'Lot No.';
            ToolTip = 'Specifies the lot number to handle in the document.';
            ExtendedDatatype = Barcode;

            trigger OnLookup()
            begin
                LookUpTrackingSummary(Rec, ShouldLookUpBinContent(), -1, ItemTrackingType::"Lot No.");
            end;

            trigger OnValidate()
            begin
                OnBeforeValidateLotNo(Rec);
                if "Lot No." <> '' then begin
                    ItemTrackingMgt.CheckWhseItemTrkgSetup("Item No.");

                    if "Activity Type" in ["Activity Type"::Pick, "Activity Type"::"Invt. Pick"] then
                        CheckReservedItemTrkg(ItemTrackingType::"Lot No.", "Lot No.");
                end;

                if "Lot No." <> xRec."Lot No." then
                    "Expiration Date" := 0D;

                if CurrFieldNo = FieldNo("Lot No.") then
                    CopyItemTrackingToRelatedLine(xRec, FieldNo("Lot No."));
            end;
        }
        field(6502; "Warranty Date"; Date)
        {
            Caption = 'Warranty Date';
        }
        field(6503; "Expiration Date"; Date)
        {
            Caption = 'Expiration Date';
            ToolTip = 'Specifies the expiration date of the serial/lot numbers if you are putting items away.';

            trigger OnValidate()
            var
                WarehouseActivityLine: Record "Warehouse Activity Line";
            begin
                if (Rec."Lot No." <> '') and (Rec."Expiration Date" <> 0D) then begin
                    WarehouseActivityLine.SetCurrentKey("No.", "Line No.", "Activity Type");
                    WarehouseActivityLine.SetRange("No.", Rec."No.");
                    WarehouseActivityLine.SetRange("Item No.", Rec."Item No.");
                    WarehouseActivityLine.SetRange("Lot No.", Rec."Lot No.");
                    WarehouseActivityLine.SetFilter("Line No.", '<>%1', Rec."Line No.");
                    WarehouseActivityLine.SetFilter("Expiration Date", '<>%1&<>%2', 0D, Rec."Expiration Date");
                    if not WarehouseActivityLine.IsEmpty() then
                        Rec.FieldError("Expiration Date");
                end;
            end;
        }
        field(6504; "Serial No. Blocked"; Boolean)
        {
            CalcFormula = lookup("Serial No. Information".Blocked where("Item No." = field("Item No."),
                                                                        "Variant Code" = field("Variant Code"),
                                                                        "Serial No." = field("Serial No.")));
            Caption = 'Serial No. Blocked';
            ToolTip = 'Specifies the serial number is blocked, on its information card.';
            Editable = false;
            FieldClass = FlowField;
        }
        field(6505; "Lot No. Blocked"; Boolean)
        {
            CalcFormula = lookup("Lot No. Information".Blocked where("Item No." = field("Item No."),
                                                                     "Variant Code" = field("Variant Code"),
                                                                     "Lot No." = field("Lot No.")));
            Caption = 'Lot No. Blocked';
            ToolTip = 'Specifies the lot number is blocked, on its information card.';
            Editable = false;
            FieldClass = FlowField;
        }
        field(6515; "Package No."; Code[50])
        {
            Caption = 'Package No.';
            ToolTip = 'Specifies the package number to handle in the document.';
            CaptionClass = '6,1';
            ExtendedDatatype = Barcode;

            trigger OnLookup()
            begin
                LookUpTrackingSummary(Rec, ShouldLookUpBinContent(), -1, Enum::"Item Tracking Type"::"Package No.");
            end;

            trigger OnValidate()
            begin
                if "Package No." <> '' then begin
                    ItemTrackingMgt.CheckWhseItemTrkgSetup("Item No.");

                    if "Activity Type" in ["Activity Type"::Pick, "Activity Type"::"Invt. Pick"] then
                        CheckReservedItemTrkg(Enum::"Item Tracking Type"::"Package No.", "Package No.");
                end;

                if CurrFieldNo = FieldNo("Package No.") then
                    CopyItemTrackingToRelatedLine(xRec, FieldNo("Package No."));
            end;
        }
        field(7300; "Bin Code"; Code[20])
        {
            AccessByPermission = TableData "Warehouse Source Filter" = R;
            Caption = 'Bin Code';
            ToolTip = 'Specifies the bin where the items are picked or put away.';
            TableRelation = if ("Zone Code" = filter('')) Bin.Code where("Location Code" = field("Location Code"))
            else
            if ("Zone Code" = filter(<> '')) Bin.Code where("Location Code" = field("Location Code"),
                                                            "Zone Code" = field("Zone Code"));

            trigger OnLookup()
            var
                BinCode: Code[20];
            begin
                BinCode := FindBinCode();

                if BinCode <> '' then begin
                    Validate("Bin Code", BinCode);
                    Modify();
                end;
            end;

            trigger OnValidate()
            var
                BinContent: Record "Bin Content";
                BinType: Record "Bin Type";
                WhseItemTrackingLine: Record "Whse. Item Tracking Line";
                QtyAvailBase: Decimal;
                AvailableQtyBase: Decimal;
                UOMCode: Code[10];
                NewBinCode: Code[20];
                IsHandled: Boolean;
            begin
                CheckBinInSourceDoc();

                if "Bin Code" <> '' then
                    FindBinContent();

                if "Bin Code" <> xRec."Bin Code" then begin
                    CheckInvalidBinCode();
                    IsHandled := false;
                    OnValidateBinCodeOnAfterCheckInvalidBinCode(Rec, xRec, CurrFieldNo, IsHandled);
                    if IsHandled then
                        exit;
                    if GetBin("Location Code", "Bin Code") then begin
                        if CurrFieldNo <> 0 then begin
                            if ("Activity Type" = "Activity Type"::"Put-away") and
                               ("Breakbulk No." <> 0)
                            then
                                Error(Text005, FieldCaption("Bin Code"));
                            CheckWhseDocLine();
                            if "Action Type" = "Action Type"::Take then begin
                                if (("Whse. Document Type" <> "Whse. Document Type"::Receipt) and
                                    (Bin."Bin Type Code" <> ''))
                                then
                                    if BinType.Get(Bin."Bin Type Code") then
                                        BinType.TestField(Receive, false);
                                GetLocation("Location Code");
                                UOMCode := GetUOMCode();
                                NewBinCode := "Bin Code";
                                if BinContent.Get("Location Code", "Bin Code", "Item No.", "Variant Code", UOMCode) then begin
                                    if "Activity Type" in ["Activity Type"::Pick, "Activity Type"::"Invt. Pick", "Activity Type"::"Invt. Movement"] then
                                        QtyAvailBase := BinContent.CalcQtyAvailToPick(0)
                                    else
                                        QtyAvailBase := BinContent.CalcQtyAvailToTake(0);
                                    if Location."Directed Put-away and Pick" then begin
                                        CreatePick.SetCrossDock(Bin."Cross-Dock Bin");
                                        WhseItemTrackingLine.CopyTrackingFromWhseActivityLine(Rec);
                                        AvailableQtyBase :=
                                          CreatePick.CalcTotalAvailQtyToPick(
                                            "Location Code", "Item No.", "Variant Code", WhseItemTrackingLine,
                                            "Source Type", "Source Subtype", "Source No.", "Source Line No.", "Source Subline No.", 0, false);
                                        AvailableQtyBase += "Qty. Outstanding (Base)";
                                        if AvailableQtyBase < 0 then
                                            AvailableQtyBase := 0;

                                        if AvailableQtyBase = 0 then
                                            Error(Text015);
                                    end else
                                        AvailableQtyBase := QtyAvailBase;

                                    if AvailableQtyBase < QtyAvailBase then
                                        QtyAvailBase := AvailableQtyBase;

                                    OnValidateBinCodeOnAfterCalcQtyAvailBase(Rec, QtyAvailBase, NewBinCode);
                                end;

                                CheckExceedQtyAvailBase(BinContent, QtyAvailBase, NewBinCode);
                            end else begin
                                if "Qty. to Handle" > 0 then
                                    CheckIncreaseCapacity(false);
                                xRec.DeleteBinContent(Enum::"Warehouse Action Type"::Place.AsInteger());
                            end;
                        end;

                        if "Action Type" = "Action Type"::Place then
                            if (("Whse. Document Type" = "Whse. Document Type"::Receipt) and (Bin."Bin Type Code" <> '')) then
                                if BinType.Get(Bin."Bin Type Code") then
                                    if BinType.Receive then
                                        BinType.TestField(Receive, false);

                        Dedicated := Bin.Dedicated;
                        "Bin Ranking" := Bin."Bin Ranking";
                        "Zone Code" := Bin."Zone Code";
                        if Location."Directed Put-away and Pick" then
                            "Bin Type Code" := Bin."Bin Type Code";

                        UpdateSpecialEquipment();
                        OnValidateBinCodeOnAfterGetBin(Rec, Bin);
                    end else begin
                        xRec.DeleteBinContent(xRec."Action Type"::Place.AsInteger());
                        Dedicated := false;
                        "Bin Ranking" := 0;
                        "Bin Type Code" := '';
                    end;
                end;
            end;
        }
        field(7301; "Zone Code"; Code[10])
        {
            Caption = 'Zone Code';
            ToolTip = 'Specifies the zone code where the bin on this line is located.';
            TableRelation = Zone.Code where("Location Code" = field("Location Code"));

            trigger OnValidate()
            begin
                if xRec."Zone Code" <> "Zone Code" then begin
                    GetLocation("Location Code");
                    xRec.DeleteBinContent(xRec."Action Type"::Place.AsInteger());
                    "Bin Code" := '';
                    "Bin Ranking" := 0;
                    "Bin Type Code" := '';
                end;
            end;
        }
        field(7305; "Action Type"; Enum "Warehouse Action Type")
        {
            Caption = 'Action Type';
            ToolTip = 'Specifies the action type for the warehouse activity line.';
            Editable = false;
        }
        field(7306; "Whse. Document Type"; Enum "Warehouse Activity Document Type")
        {
            Caption = 'Whse. Document Type';
            ToolTip = 'Specifies the type of warehouse document from which the line originated.';
            Editable = false;
        }
        field(7307; "Whse. Document No."; Code[20])
        {
            Caption = 'Whse. Document No.';
            ToolTip = 'Specifies the number of the warehouse document that is the basis for the action on the line.';
            Editable = false;
            TableRelation = if ("Whse. Document Type" = const(Receipt)) "Posted Whse. Receipt Header"."No." where("No." = field("Whse. Document No."))
            else
            if ("Whse. Document Type" = const(Shipment)) "Warehouse Shipment Header"."No." where("No." = field("Whse. Document No."))
            else
            if ("Whse. Document Type" = const("Internal Put-away")) "Whse. Internal Put-away Header"."No." where("No." = field("Whse. Document No."))
            else
            if ("Whse. Document Type" = const("Internal Pick")) "Whse. Internal Pick Header"."No." where("No." = field("Whse. Document No."))
            else
            if ("Whse. Document Type" = const(Assembly)) "Assembly Header"."No." where("Document Type" = const(Order),
                                                                                       "No." = field("Whse. Document No."))
            else
            if ("Whse. Document Type" = const(Job)) "Job"."No." where("No." = field("Whse. Document No."));
        }
        field(7308; "Whse. Document Line No."; Integer)
        {
            BlankZero = true;
            Caption = 'Whse. Document Line No.';
            ToolTip = 'Specifies the number of the line in the warehouse document that is the basis for the action on the line.';
            Editable = false;
            TableRelation = if ("Whse. Document Type" = const(Receipt)) "Posted Whse. Receipt Line"."Line No." where("No." = field("Whse. Document No."),
                                                                                                                     "Line No." = field("Whse. Document Line No."))
            else
            if ("Whse. Document Type" = const(Shipment)) "Warehouse Shipment Line"."Line No." where("No." = field("Whse. Document No."),
                                                                                                    "Line No." = field("Whse. Document Line No."))
            else
            if ("Whse. Document Type" = const("Internal Put-away")) "Whse. Internal Put-away Line"."Line No." where("No." = field("Whse. Document No."),
                                                                                                                    "Line No." = field("Whse. Document Line No."))
            else
            if ("Whse. Document Type" = const("Internal Pick")) "Whse. Internal Pick Line"."Line No." where("No." = field("Whse. Document No."),
                                                                                                            "Line No." = field("Whse. Document Line No."))
            else
            if ("Whse. Document Type" = const(Assembly)) "Assembly Line"."Line No." where("Document Type" = const(Order),
                                                                                          "Document No." = field("Whse. Document No."),
                                                                                          "Line No." = field("Whse. Document Line No."))
            else
            if ("Whse. Document Type" = const(Job)) "Job Planning Line"."Job Contract Entry No." where("Job No." = field("Whse. Document No."),
                                                                                                       "Job Contract Entry No." = field("Whse. Document Line No."));
        }
        field(7309; "Bin Ranking"; Integer)
        {
            Caption = 'Bin Ranking';
            Editable = false;
        }
        field(7310; Cubage; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Cubage';
            ToolTip = 'Specifies the total cubage of items on the line, calculated based on the Quantity field.';
            DecimalPlaces = 0 : 5;
        }
        field(7311; Weight; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Weight';
            ToolTip = 'Specifies the weight of one item unit when measured in the specified unit of measure.';
            DecimalPlaces = 0 : 5;
        }
        field(7312; "Special Equipment Code"; Code[10])
        {
            Caption = 'Special Equipment Code';
            ToolTip = 'Specifies the code of the equipment required when you perform the action on the line.';
            TableRelation = "Special Equipment";
        }
        field(7313; "Bin Type Code"; Code[10])
        {
            Caption = 'Bin Type Code';
            TableRelation = "Bin Type";
        }
        field(7314; "Breakbulk No."; Integer)
        {
            BlankZero = true;
            Caption = 'Breakbulk No.';
        }
        field(7315; "Original Breakbulk"; Boolean)
        {
            Caption = 'Original Breakbulk';
        }
        field(7316; Breakbulk; Boolean)
        {
            Caption = 'Breakbulk';
        }
        field(7317; "Cross-Dock Information"; Option)
        {
            Caption = 'Cross-Dock Information';
            ToolTip = 'Specifies an option for specific information regarding the cross-dock activity.';
            OptionCaption = ' ,Cross-Dock Items,Some Items Cross-Docked';
            OptionMembers = " ","Cross-Dock Items","Some Items Cross-Docked";
        }
        field(7318; Dedicated; Boolean)
        {
            Caption = 'Dedicated';
            Editable = false;
        }
        field(7319; "Over-Receipt Quantity"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Over-Receipt Quantity';
            ToolTip = 'Specifies over-receipt quantity.';
            DecimalPlaces = 0 : 5;
            BlankZero = false;
            MinValue = 0;

            trigger OnValidate()
            var
                PurchaseLine: Record "Purchase Line";
                OverReceiptMgt: Codeunit "Over-Receipt Mgt.";
            begin
                if not OverReceiptMgt.IsOverReceiptAllowed() then begin
                    "Over-Receipt Quantity" := 0;
                    exit;
                end;

                TestField("Source Document", "Source Document"::"Purchase Order");

                if xRec."Over-Receipt Quantity" = "Over-Receipt Quantity" then
                    exit;

                if "Over-Receipt Quantity" <> 0 then begin
                    if "Over-Receipt Code" = '' then begin
                        PurchaseLine.Get("Source Subtype", "Source No.", "Source Line No.");
                        "Over-Receipt Code" := OverReceiptMgt.GetDefaultOverReceiptCode(PurchaseLine);
                    end;
                    TestField("Over-Receipt Code");
                end;

                Validate(Quantity, Quantity - xRec."Over-Receipt Quantity" + "Over-Receipt Quantity");
                Modify();

                OverReceiptMgt.UpdatePurchaseLineOverReceiptQuantityFromWarehouseActivityLine(Rec, CurrFieldNo);
            end;
        }
        field(7320; "Over-Receipt Code"; Code[20])
        {
            Caption = 'Over-Receipt Code';
            ToolTip = 'Specifies over-receipt code.';
            TableRelation = "Over-Receipt Code";

            trigger OnValidate()
            begin
                if ((Rec."Over-Receipt Code" = '') and (xRec."Over-Receipt Code" <> '')) then
                    Validate("Over-Receipt Quantity", 0);
            end;
        }
        field(7321; "Warehouse Reason Code"; Code[10])
        {
            Caption = 'Warehouse Reason Code';
            ToolTip = 'Specifies the reason for the warehouse activity.';
            TableRelation = "Warehouse Reason Code";
        }
    }
    keys
    {
        key(Key1; "Activity Type", "No.", "Line No.")
        {
            Clustered = true;
        }
        key(Key2; "No.", "Line No.", "Activity Type")
        {
        }
        key(Key3; "Source Type", "Source Subtype", "Source No.", "Source Line No.", "Source Subline No.", "Unit of Measure Code", "Action Type", "Breakbulk No.", "Original Breakbulk", "Activity Type", "Assemble to Order")
        {
            IncludedFields = "Qty. Outstanding", "Qty. Outstanding (Base)";
        }
        key(Key4; "Activity Type", "No.", "Sorting Sequence No.")
        {
            IncludedFields = "Shelf No.";
        }
#pragma warning disable AS0009
        key(Key14; "Whse. Document No.", "Whse. Document Type", "Activity Type", "Whse. Document Line No.", "Action Type", "Unit of Measure Code", "Original Breakbulk", "Breakbulk No.", "Lot No.", "Serial No.", "Assemble to Order", "Package No.")
#pragma warning restore AS0009
        {
            IncludedFields = "Qty. Outstanding (Base)", "Qty. Outstanding";
        }
        key(Key15; "Item No.", "Bin Code", "Location Code", "Action Type", "Variant Code", "Unit of Measure Code", "Breakbulk No.", "Activity Type", "Lot No.", "Serial No.", "Original Breakbulk", "Assemble to Order", "ATO Component")
        {
            IncludedFields = Quantity, "Qty. (Base)", "Qty. Outstanding", "Qty. Outstanding (Base)", Cubage, Weight;
        }
#pragma warning disable AS0009
        key(Key16; "Item No.", "Location Code", "Activity Type", "Bin Type Code", "Unit of Measure Code", "Variant Code", "Breakbulk No.", "Action Type", "Lot No.", "Serial No.", "Assemble to Order", "Package No.")
#pragma warning restore AS0009
        {
            IncludedFields = "Qty. Outstanding (Base)";
        }
        key(Key17; "Bin Code", "Location Code", "Action Type", "Breakbulk No.")
        {
            IncludedFields = Cubage, Weight;
        }
        key(Key18; "Location Code", "Activity Type")
        {
        }
        key(Key19; "Source No.", "Source Line No.", "Source Subline No.")
        {
            IncludedFields = "Serial No.", "Lot No.", "Package No.";
        }
    }
    fieldgroups
    {
        fieldgroup(Brick; "Action Type", "Item No.", Quantity, Description, "Unit of Measure Code", "Bin Code")
        {
        }
    }

    trigger OnDelete()
    begin
        DeleteRelatedWhseActivLines(Rec, false);
    end;

    trigger OnRename()
    begin
        Error(Text001, TableCaption);
    end;

    var
        Location: Record Location;
        Item: Record Item;
        SKU: Record "Stockkeeping Unit";
        Bin: Record Bin;
        ItemUnitOfMeasure: Record "Item Unit of Measure";
        ItemTrackingCode: Record "Item Tracking Code";
        ItemTrackingMgt: Codeunit "Item Tracking Management";
        ItemTrackingDataCollection: Codeunit "Item Tracking Data Collection";
        WarehouseAvailabilityMgt: Codeunit "Warehouse Availability Mgt.";
        WMSMgt: Codeunit "WMS Management";
        CreatePick: Codeunit "Create Pick";
        UOMMgt: Codeunit "Unit of Measure Management";
        ItemTrackingType: Enum "Item Tracking Type";
        UseBaseQty: Boolean;
#pragma warning disable AA0074
#pragma warning disable AA0470
        Text001: Label 'You cannot rename a %1.';
        Text002: Label 'You cannot handle more than the outstanding %1 units.';
        Text003: Label 'must not be %1';
        Text004: Label 'If you delete %1 %2, %3 %4, %5 %6\the quantity to %7 will be imbalanced.\Do you still want to delete the %8?';
        Text005: Label 'You must not change the %1 in breakbulk lines.';
#pragma warning restore AA0470
        Text006: Label 'The update was interrupted to respect the warning.';
#pragma warning restore AA0074        
#pragma warning disable AA0074
        Text007: Label 'You must not split breakbulk lines.';
        Text008: Label 'Quantity available to pick is not enough to fill in all the lines.';
#pragma warning disable AA0470
        Text009: Label 'If you delete the %1\you must recreate related Warehouse Worksheet Lines manually.\\Do you want to delete the %1?';
        Text011: Label 'You cannot enter the %1 of the %2 as %3.';
        Text012: Label 'The %1 %2 exceeds the quantity available to pick %3 of the %4.\Do you still want to enter this %5?';
#pragma warning restore AA0470
        Text013: Label 'All related Warehouse Activity Lines are deleted.';
#pragma warning disable AA0470
        Text014: Label '%1 %2 has already been reserved for another document.';
#pragma warning restore AA0470
        Text015: Label 'The total available quantity has already been applied.';
#pragma warning restore AA0074
        InventoryNotAvailableErr: Label '%1 %2 is not available in inventory, it has already been reserved for another document, or the quantity available is lower than the quantity to handle specified on the line.', Comment = '%1 = CD No. Caption; %2 = CD No. Value';
#pragma warning disable AA0074
#pragma warning disable AA0470
        Text018: Label '%1 already exists with %2 %3.', Comment = 'Warehouse Activity Line already exists with Serial No. XXX';
        Text019: Label 'The %1 bin code must be different from the %2 bin code on location %3.';
        Text020: Label 'The %1 bin code must not be the Receipt Bin Code or the Shipment Bin Code that are set up on location %2.';
#pragma warning restore AA0470
#pragma warning restore AA0074
        ValidValuesIfSNDefinedErr: Label 'Field %1 can only have values -1, 0 or 1 when serial no. is defined. Current value is %2.', Comment = '%1 = field name, %2 = field value';
        NotEnoughQtyToPickMsg: Label 'Quantity available to pick is not enough.';
        OutstandingQtyCannotbeLessThanZeroErr: Label 'Outstanding Qty. base cannot be less than 0.';

    procedure CalcQty(QtyBase: Decimal): Decimal
    var
        NewQtyBase: Decimal;
        IsHandled: Boolean;
    begin
        OnBeforeCalcQty(Rec, QtyBase, NewQtyBase, IsHandled);
        if IsHandled then
            exit(Round(NewQtyBase, UOMMgt.QtyRndPrecision()));
        TestField("Qty. per Unit of Measure");
        exit(Round(QtyBase / "Qty. per Unit of Measure", UOMMgt.QtyRndPrecision()));
    end;

    procedure AutofillQtyToHandle(var WarehouseActivityLine: Record "Warehouse Activity Line")
    var
        NotEnough: Boolean;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeAutofillQtyToHandle(WarehouseActivityLine, IsHandled);
        if not IsHandled then begin
            UpdateDoNotFillQtyToHandle(WarehouseActivityLine);
            NotEnough := false;
            if WarehouseActivityLine.Find('-') then
                repeat
                    IsHandled := false;
                    OnBeforeAutofillQtyToHandleLine(WarehouseActivityLine, IsHandled);
                    if not IsHandled then begin
                        WarehouseActivityLine.Validate("Qty. to Handle", WarehouseActivityLine."Qty. Outstanding");
                        if WarehouseActivityLine."Qty. to Handle (Base)" <> WarehouseActivityLine."Qty. Outstanding (Base)" then
                            WarehouseActivityLine.Validate("Qty. to Handle (Base)", WarehouseActivityLine."Qty. Outstanding (Base)");
                    end;
                    WarehouseActivityLine.Modify();
                    OnAfterAutofillQtyToHandleLine(WarehouseActivityLine);

                    if not NotEnough then
                        if WarehouseActivityLine."Qty. to Handle" < WarehouseActivityLine."Qty. Outstanding" then
                            NotEnough := true;
                until WarehouseActivityLine.Next() = 0;

            if GuiAllowed() and NotEnough then
                Message(Text008);
        end;

        OnAfterAutofillQtyToHandle(WarehouseActivityLine);
    end;

    procedure DeleteQtyToHandle(var WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
        OnBeforeDeleteQtyToHandle(WarehouseActivityLine);
        if WarehouseActivityLine.Find('-') then
            repeat
                WarehouseActivityLine.Validate("Qty. to Handle", 0);
                WarehouseActivityLine.Modify();
                OnAfterUpdateQtyToHandleWhseActivLine(WarehouseActivityLine);
            until WarehouseActivityLine.Next() = 0;

        OnAfterDeleteQtyToHandle(WarehouseActivityLine);
    end;

    procedure AutofillQtyToHandleOnLine(var WarehouseActivityLine: Record "Warehouse Activity Line")
    var
        IsHandled: Boolean;
    begin
        OnBeforeAutofillQtyToHandleOnLine(WarehouseActivityLine);

        IsHandled := false;
        OnBeforeAutofillQtyToHandleLine(WarehouseActivityLine, IsHandled);
        if not IsHandled then begin
            WarehouseActivityLine.Validate("Qty. to Handle", WarehouseActivityLine."Qty. Outstanding");
            if WarehouseActivityLine."Qty. to Handle (Base)" <> WarehouseActivityLine."Qty. Outstanding (Base)" then
                WarehouseActivityLine.Validate("Qty. to Handle (Base)", WarehouseActivityLine."Qty. Outstanding (Base)");
        end;
        WarehouseActivityLine.Modify();

        if WarehouseActivityLine."Qty. to Handle" < WarehouseActivityLine."Qty. Outstanding" then
            if GuiAllowed() then
                Message(NotEnoughQtyToPickMsg);
    end;

    procedure DeleteQtyToHandleOnLine(var WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
        OnBeforeDeleteQtyToHandleOnLine(WarehouseActivityLine);
        WarehouseActivityLine.Validate("Qty. to Handle", 0);
        WarehouseActivityLine.Modify();
    end;

    local procedure GetItem()
    begin
        if Item."No." = "Item No." then
            exit;

        Item.Get("Item No.");
        if Item."Item Tracking Code" <> '' then
            ItemTrackingCode.Get(Item."Item Tracking Code")
        else
            Clear(ItemTrackingCode);
    end;

    procedure DeleteRelatedWhseActivLines(WarehouseActivityLine: Record "Warehouse Activity Line"; CalledFromHeader: Boolean)
    var
        WarehouseActivityLine2: Record "Warehouse Activity Line";
        WhseWkshLine: Record "Whse. Worksheet Line";
        DeletedWarehouseActivityLine: Record "Warehouse Activity Line";
        Confirmed: Boolean;
        DeleteLineConfirmed: Boolean;
    begin
        OnBeforeDeleteRelatedWhseActivLines(WarehouseActivityLine, CalledFromHeader);

        if (WarehouseActivityLine."Activity Type" in [WarehouseActivityLine."Activity Type"::"Invt. Put-away", WarehouseActivityLine."Activity Type"::"Invt. Pick"]) and
            (not CalledFromHeader)
        then
            exit;

        WarehouseActivityLine2.SetCurrentKey(
          "Activity Type", "No.", "Whse. Document Type", "Whse. Document No.", "Whse. Document Line No.");
        WarehouseActivityLine2.SetRange("Activity Type", WarehouseActivityLine."Activity Type");
        WarehouseActivityLine2.SetRange("No.", WarehouseActivityLine."No.");
        WhseWkshLine.SetCurrentKey("Whse. Document Type", "Whse. Document No.", "Whse. Document Line No.");
        if WarehouseActivityLine2.Find('-') then
            repeat
                Confirmed := ConfirmWhseActivLinesDeletionRecreate(WarehouseActivityLine2, WhseWkshLine);
            until (WarehouseActivityLine2.Next() = 0) or Confirmed;

        OnDeleteRelatedWhseActivLinesOnBeforeConfirmWhseActivLinesDeletionOutOfBalance(WarehouseActivityLine, CalledFromHeader, DeleteLineConfirmed);
        if DeleteLineConfirmed then
            exit;

        if (not CalledFromHeader) and (WarehouseActivityLine."Action Type" <> WarehouseActivityLine."Action Type"::" ") then begin
            ConfirmWhseActivLinesDeletionOutOfBalance(WarehouseActivityLine, WarehouseActivityLine2, DeleteLineConfirmed);
            if DeleteLineConfirmed then
                exit;
        end;

        if not CalledFromHeader then
            if WarehouseActivityLine."Action Type" <> WarehouseActivityLine."Action Type"::" " then
                WarehouseActivityLine2.SetFilter("Line No.", '<>%1', WarehouseActivityLine."Line No.")
            else
                WarehouseActivityLine2.SetRange("Line No.", WarehouseActivityLine."Line No.");
        OnDeleteRelatedWhseActivLinesOnBeforeWhseActivLine2Find(WarehouseActivityLine, WarehouseActivityLine2);
        if WarehouseActivityLine2.Find('-') then
            repeat
                OnDeleteRelatedWhseActivLinesOnBeforeDeleteWhseActivLine2(WarehouseActivityLine, WarehouseActivityLine2, CalledFromHeader);
                DeletedWarehouseActivityLine := WarehouseActivityLine2;
                DeleteWarehouseActivityLine2(WarehouseActivityLine2, CalledFromHeader);
                WarehouseActivityLine2.DeleteBinContent(Enum::"Warehouse Action Type"::Place.AsInteger());
                WarehouseActivityLine.UpdateRelatedItemTrkg(WarehouseActivityLine2);
                CleanupJobWhseItemTrackingLineOnDelete(DeletedWarehouseActivityLine);
                OnDeleteRelatedWhseActivLinesOnAfterUpdateRelatedItemTrkg(WarehouseActivityLine, WarehouseActivityLine2, CalledFromHeader);
            until WarehouseActivityLine2.Next() = 0;

        if (not CalledFromHeader) and (WarehouseActivityLine."Action Type" <> WarehouseActivityLine."Action Type"::" ") then
            ShowDeletedMessage(WarehouseActivityLine);
    end;

    local procedure DeleteWarehouseActivityLine2(var WarehouseActivityLine2: Record "Warehouse Activity Line"; CalledFromHeader: Boolean)
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeDeleteWhseActivLine2(WarehouseActivityLine2, CalledFromHeader, IsHandled);
        if IsHandled then
            exit;

        WarehouseActivityLine2.Delete(); // to ensure correct item tracking update
    end;

    procedure CheckWhseDocLine()
    var
        PostedWhseReceiptLine: Record "Posted Whse. Receipt Line";
        WarehouseShipmentLine: Record "Warehouse Shipment Line";
        WhseInternalPutAwayLine: Record "Whse. Internal Put-away Line";
        WhseInternalPickLine: Record "Whse. Internal Pick Line";
        AssemblyLine: Record "Assembly Line";
        JobPlanningLine: Record "Job Planning Line";
        WhseDocType2: Enum "Warehouse Activity Document Type";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCheckWhseDocLine(Rec, IsHandled);
        if IsHandled then
            exit;

        if "Bin Code" <> '' then begin
            if "Breakbulk No." <> 0 then
                exit;
            if ("Activity Type" = "Activity Type"::Pick) and ("Action Type" = "Action Type"::Place) then begin
                if ("Whse. Document Type" = "Whse. Document Type"::Shipment) and "Assemble to Order" then
                    WhseDocType2 := "Whse. Document Type"::Assembly
                else
                    WhseDocType2 := "Whse. Document Type";

                case WhseDocType2 of
                    "Whse. Document Type"::Shipment:
                        begin
                            WarehouseShipmentLine.Get("Whse. Document No.", "Whse. Document Line No.");
                            CheckBinCodeFromWhseShptLine(WarehouseShipmentLine);
                        end;
                    "Whse. Document Type"::"Internal Pick":
                        begin
                            WhseInternalPickLine.SetLoadFields("To Bin Code");
                            WhseInternalPickLine.Get("Whse. Document No.", "Whse. Document Line No.");
                            TestField("Bin Code", WhseInternalPickLine."To Bin Code");
                        end;
                    "Whse. Document Type"::Assembly:
                        begin
                            GetLocation("Location Code");
                            if Location."Directed Put-away and Pick" then begin
                                AssemblyLine.SetLoadFields("Bin Code");
                                AssemblyLine.Get("Source Subtype", "Source No.", "Source Line No.");
                                TestField("Bin Code", AssemblyLine."Bin Code");
                            end;
                        end;
                    "Whse. Document Type"::Job:
                        begin
                            GetLocation("Location Code");
                            if Location."Directed Put-away and Pick" then begin
                                JobPlanningLine.SetRange("Job Contract Entry No.", "Source Line No.");
                                JobPlanningLine.SetLoadFields("Bin Code");
                                if JobPlanningLine.FindFirst() then
                                    TestField("Bin Code", JobPlanningLine."Bin Code");
                            end;
                        end;
                    else
                        CheckWhseDocLineOnCheckSourceDocument(Rec, WhseDocType2);
                end;
            end;

            if ("Activity Type" = "Activity Type"::"Put-away") and ("Action Type" = "Action Type"::Take) then
                case "Whse. Document Type" of
                    "Whse. Document Type"::Receipt:
                        begin
                            PostedWhseReceiptLine.SetLoadFields("Bin Code");
                            PostedWhseReceiptLine.Get("Whse. Document No.", "Whse. Document Line No.");
                            TestField("Bin Code", PostedWhseReceiptLine."Bin Code");
                        end;
                    "Whse. Document Type"::"Internal Put-away":
                        begin
                            WhseInternalPutAwayLine.SetLoadFields("From Bin Code");
                            WhseInternalPutAwayLine.Get("Whse. Document No.", "Whse. Document Line No.");
                            TestField("Bin Code", WhseInternalPutAwayLine."From Bin Code");
                        end;
                end;
        end;
    end;

    procedure CheckBinInSourceDoc()
    var
        AssemblyLine: Record "Assembly Line";
        JobPlanningLine: Record "Job Planning Line";
        IsHandled: Boolean;
    begin
        if not (("Activity Type" = "Activity Type"::"Invt. Movement") and ("Action Type" = "Action Type"::Place) and ("Source Type" <> 0))
        then
            exit;

        IsHandled := false;
        OnBeforeCheckBinInSourceDoc(Rec, IsHandled);
        if IsHandled then
            exit;

        case "Source Type" of
            Database::"Assembly Line":
                begin
                    AssemblyLine.SetLoadFields("Bin Code");
                    AssemblyLine.Get("Source Subtype", "Source No.", "Source Line No.");
                    TestField("Bin Code", AssemblyLine."Bin Code");
                end;
            Database::Job, Database::"Job Planning Line":
                begin
                    JobPlanningLine.SetRange("Job Contract Entry No.", "Source Line No.");
                    JobPlanningLine.SetLoadFields("Bin Code");
                    if JobPlanningLine.FindFirst() then
                        TestField("Bin Code", JobPlanningLine."Bin Code");
                end;
            else
                OnCheckBinInSourceDoc(Rec);
        end;
    end;

    procedure GetBin(LocationCode: Code[10]; BinCode: Code[20]): Boolean
    begin
        if (Bin."Location Code" <> LocationCode) or
           (Bin.Code <> BinCode)
        then begin
            GetLocation(LocationCode);
            if Bin.Get(LocationCode, BinCode) then begin
                if not Location."Directed Put-away and Pick" then
                    exit(true);
                CheckBin();
                exit(true);
            end;
            exit(false);
        end;

        CheckBin();
        exit(true);
    end;

    local procedure GetItemUnitOfMeasure()
    begin
        GetItem();
        Item.TestField("No.");
        if (Item."No." <> ItemUnitOfMeasure."Item No.") or
           ("Unit of Measure Code" <> ItemUnitOfMeasure.Code)
        then
            if not ItemUnitOfMeasure.Get(Item."No.", "Unit of Measure Code") then
                ItemUnitOfMeasure.Get(Item."No.", Item."Base Unit of Measure");
    end;

    local procedure GetLocation(LocationCode: Code[10])
    begin
        if LocationCode = '' then
            Clear(Location)
        else
            if Location.Code <> LocationCode then
                Location.Get(LocationCode);
    end;

    local procedure GetUOMCode() UOMCode: Code[10];
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeGetUOMCode(Rec, UOMCode, IsHandled, Location);
        if IsHandled then
            exit(UOMCode);

        if Location."Directed Put-away and Pick" then
            UOMCode := "Unit of Measure Code"
        else
            UOMCode := WMSMgt.GetBaseUOM("Item No.");
    end;

    local procedure CheckBin()
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCheckBin(Bin, IsHandled);
        if IsHandled then
            exit;

        GetLocation("Location Code");
        if Location."Directed Put-away and Pick" then
            if Location."Adjustment Bin Code" <> '' then
                if "Bin Code" = Location."Adjustment Bin Code" then
                    Error(
                      Text011,
                      Location.FieldCaption("Adjustment Bin Code"), Location.TableCaption(),
                      FieldCaption("Bin Code"));
    end;

    procedure CheckIncreaseCapacity(DeductLineCapacity: Boolean)
    begin
        CheckIncreaseCapacity(DeductLineCapacity, true);
    end;

    internal procedure CheckIncreaseCapacity(DeductLineCapacity: Boolean; CalledByPosting: Boolean)
    var
        BinContent: Record "Bin Content";
        DeductCubage: Decimal;
        DeductWeight: Decimal;
        IsHandled: Boolean;
    begin
        if DeductLineCapacity then begin
            DeductCubage := xRec.Cubage;
            DeductWeight := xRec.Weight;
        end;

        IsHandled := false;
        OnCheckIncreaseCapacityOnBeforeCheckIncreaseBinContent(Rec, Bin, DeductCubage, DeductWeight, IsHandled);
        if IsHandled then
            exit;

        if BinContent.Get("Location Code", "Bin Code", "Item No.", "Variant Code", "Unit of Measure Code") then
            BinContent.CheckIncreaseBinContent(
              "Qty. to Handle (Base)", "Qty. Outstanding (Base)",
              DeductCubage, DeductWeight, Cubage, Weight, CalledByPosting, false)
        else
            if GetBin("Location Code", "Bin Code") then
                Bin.CheckIncreaseBin(
                  "Bin Code", "Item No.", "Qty. to Handle",
                  DeductCubage, DeductWeight, Cubage, Weight, CalledByPosting, false);
    end;

    local procedure CheckExceedQtyAvailBase(BinContent: Record "Bin Content"; QtyAvailBase: Decimal; NewBinCode: Code[20])
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCheckExceedQtyAvailBase(Rec, QtyAvailBase, NewBinCode, IsHandled);
        if IsHandled then
            exit;

        if (QtyAvailBase < "Qty. Outstanding (Base)") and not "Assemble to Order" then begin
            if not
               Confirm(
                 StrSubstNo(
                   Text012,
                   FieldCaption("Qty. Outstanding (Base)"), "Qty. Outstanding (Base)",
                   QtyAvailBase, BinContent.TableCaption(), FieldCaption("Bin Code")),
                 false)
            then
                Error(Text006);

            "Bin Code" := NewBinCode;
            Modify();
        end;
    end;

    local procedure CheckBinCodeFromWhseShptLine(WarehouseShipmentLine: Record "Warehouse Shipment Line")
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCheckBinCodeFromWhseShptLine(Rec, WarehouseShipmentLine, IsHandled);
        if IsHandled then
            exit;

        TestField("Bin Code", WarehouseShipmentLine."Bin Code");
    end;

    procedure SplitLine(var WarehouseActivityLine: Record "Warehouse Activity Line")
    var
        NewWarehouseActivityLine: Record "Warehouse Activity Line";
    begin
        SplitLine(WarehouseActivityLine, NewWarehouseActivityLine);
    end;

    procedure SplitLine(var WarehouseActivityLine: Record "Warehouse Activity Line"; var NewWarehouseActivityLine: Record "Warehouse Activity Line")
    var
        LineSpacing: Integer;
        NewLineNo: Integer;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeSplitLines(WarehouseActivityLine, IsHandled);
        if IsHandled then
            exit;

        CheckSplitLine(WarehouseActivityLine);

        NewWarehouseActivityLine := WarehouseActivityLine;
        NewWarehouseActivityLine.SetRange("No.", WarehouseActivityLine."No.");
        if NewWarehouseActivityLine.Find('>') then
            LineSpacing :=
              (NewWarehouseActivityLine."Line No." - WarehouseActivityLine."Line No.") div 2
        else
            LineSpacing := 10000;

        OnSplitLineOnBeforeRenumberAllLines(WarehouseActivityLine, LineSpacing);
        if LineSpacing = 0 then
            ReNumberWhseActivityLines(NewWarehouseActivityLine, WarehouseActivityLine, NewLineNo, LineSpacing);

        NewWarehouseActivityLine.Reset();
        NewWarehouseActivityLine.Init();
        NewWarehouseActivityLine := WarehouseActivityLine;
        NewWarehouseActivityLine."Line No." := NewWarehouseActivityLine."Line No." + LineSpacing;
        NewWarehouseActivityLine.Quantity :=
          WarehouseActivityLine."Qty. Outstanding" - WarehouseActivityLine."Qty. to Handle";
        NewWarehouseActivityLine."Qty. (Base)" :=
          WarehouseActivityLine."Qty. Outstanding (Base)" - WarehouseActivityLine."Qty. to Handle (Base)";
        NewWarehouseActivityLine."Qty. Outstanding" := NewWarehouseActivityLine.Quantity;
        NewWarehouseActivityLine."Qty. Outstanding (Base)" := NewWarehouseActivityLine."Qty. (Base)";
        UpdateQtyToHandleOnSplitLine(NewWarehouseActivityLine);
        NewWarehouseActivityLine."Qty. Handled" := 0;
        NewWarehouseActivityLine."Qty. Handled (Base)" := 0;
        OnSplitLineOnAfterInitNewWhseActivLine(NewWarehouseActivityLine);
        GetLocation("Location Code");
        if Location."Bin Capacity Policy" <> Location."Bin Capacity Policy"::"Never Check Capacity" then
            WMSMgt.CalcCubageAndWeight(
              NewWarehouseActivityLine."Item No.", NewWarehouseActivityLine."Unit of Measure Code",
              NewWarehouseActivityLine."Qty. to Handle", NewWarehouseActivityLine.Cubage, NewWarehouseActivityLine.Weight);

        if Location."Directed Put-away and Pick" then
            if not
               (((NewWarehouseActivityLine."Activity Type" = NewWarehouseActivityLine."Activity Type"::"Put-away") and
                 (NewWarehouseActivityLine."Action Type" = NewWarehouseActivityLine."Action Type"::Take)) or
                ((NewWarehouseActivityLine."Activity Type" = NewWarehouseActivityLine."Activity Type"::Pick) and
                 (NewWarehouseActivityLine."Action Type" = NewWarehouseActivityLine."Action Type"::Place)) or
                ("Breakbulk No." <> 0))
            then begin
                NewWarehouseActivityLine."Zone Code" := '';
                NewWarehouseActivityLine."Bin Code" := '';
            end;

        OnBeforeInsertNewWhseActivLine(NewWarehouseActivityLine, WarehouseActivityLine);
        NewWarehouseActivityLine.Insert();

        WarehouseActivityLine.Quantity := WarehouseActivityLine."Qty. to Handle" + WarehouseActivityLine."Qty. Handled";
        WarehouseActivityLine."Qty. (Base)" :=
          WarehouseActivityLine."Qty. to Handle (Base)" + WarehouseActivityLine."Qty. Handled (Base)";
        WarehouseActivityLine."Qty. Outstanding" := WarehouseActivityLine."Qty. to Handle";
        WarehouseActivityLine."Qty. Outstanding (Base)" := WarehouseActivityLine."Qty. to Handle (Base)";
        if Location."Bin Capacity Policy" <> Location."Bin Capacity Policy"::"Never Check Capacity" then
            WMSMgt.CalcCubageAndWeight(
              WarehouseActivityLine."Item No.", WarehouseActivityLine."Unit of Measure Code",
              WarehouseActivityLine."Qty. to Handle", WarehouseActivityLine.Cubage, WarehouseActivityLine.Weight);
        OnBeforeModifyOldWhseActivLine(WarehouseActivityLine);
        WarehouseActivityLine.Modify();

        OnAfterSplitLines(WarehouseActivityLine, NewWarehouseActivityLine);
    end;

    local procedure CheckSplitLine(WarehouseActivityLine: Record "Warehouse Activity Line")
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCheckLine(WarehouseActivityLine, IsHandled);
        if not IsHandled then begin
            WarehouseActivityLine.TestField("Qty. to Handle");
            if WarehouseActivityLine."Activity Type" = WarehouseActivityLine."Activity Type"::"Put-away" then begin
                if WarehouseActivityLine."Breakbulk No." <> 0 then
                    Error(Text007);

                IsHandled := false;
                OnCheckSplitLineOnBeforeTestFieldActionType(WarehouseActivityLine, IsHandled);
                if not IsHandled then
                    WarehouseActivityLine.TestField("Action Type", WarehouseActivityLine."Action Type"::Place);
            end;
            if WarehouseActivityLine."Qty. to Handle" = WarehouseActivityLine."Qty. Outstanding" then
                WarehouseActivityLine.FieldError(
                "Qty. to Handle", StrSubstNo(Text003, WarehouseActivityLine.FieldCaption("Qty. Outstanding")));
        end;
    end;

    procedure FindBinCode() BinCode: Code[20]
    var
        WhseItemTrackingSetup: Record "Item Tracking Setup";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeFindBinCode(Rec, Item, BinCode, IsHandled);
        if IsHandled then
            exit(BinCode);

        if "Action Type" = "Action Type"::Take then begin
            WhseItemTrackingSetup.CopyTrackingFromWhseActivityLine(Rec);
            BinCode :=
                WMSMgt.BinContentLookUp(
                    "Location Code", "Item No.", "Variant Code", "Zone Code", WhseItemTrackingSetup, "Bin Code")
        end else
            BinCode := WMSMgt.BinLookUp("Location Code", "Item No.", "Variant Code", "Zone Code");
    end;

    procedure FindBinContent()
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeFindBinContent(Rec, IsHandled);
        if IsHandled then
            exit;

        if not "Assemble to Order" and ("Action Type" = "Action Type"::Take) then
            WMSMgt.FindBinContent("Location Code", "Bin Code", "Item No.", "Variant Code", "Zone Code")
        else
            WMSMgt.FindBin("Location Code", "Bin Code", "Zone Code");
    end;

    procedure UpdateBreakbulkQtytoHandle()
    var
        WarehouseActivityLine: Record "Warehouse Activity Line";
    begin
        WarehouseActivityLine.SetCurrentKey(
          "Activity Type", "No.", "Whse. Document Type",
          "Whse. Document No.", "Whse. Document Line No.");
        WarehouseActivityLine.SetRange("Activity Type", "Activity Type");
        WarehouseActivityLine.SetRange("No.", "No.");
        WarehouseActivityLine.SetRange("Whse. Document Type", "Whse. Document Type");
        WarehouseActivityLine.SetRange("Whse. Document No.", "Whse. Document No.");
        WarehouseActivityLine.SetRange("Whse. Document Line No.", "Whse. Document Line No.");
        WarehouseActivityLine.SetTrackingFilterFromWhseActivityLine(Rec);
        if "Original Breakbulk" then
            WarehouseActivityLine.SetRange("Original Breakbulk", true)
        else
            WarehouseActivityLine.SetRange("Breakbulk No.", "Breakbulk No.");
        WarehouseActivityLine.SetRange("Action Type", WarehouseActivityLine."Action Type"::Place);
        if WarehouseActivityLine.FindFirst() then begin
            UpdateQtyToHandle(WarehouseActivityLine);

            WarehouseActivityLine.SetRange("Action Type", WarehouseActivityLine."Action Type"::Take);
            if "Original Breakbulk" then begin
                WarehouseActivityLine.SetRange("Original Breakbulk");
                WarehouseActivityLine.SetRange("Breakbulk No.", WarehouseActivityLine."Breakbulk No.")
            end else begin
                WarehouseActivityLine.SetRange("Breakbulk No.");
                WarehouseActivityLine.SetRange("Original Breakbulk", true);
            end;
            if WarehouseActivityLine.FindFirst() then
                UpdateQtyToHandle(WarehouseActivityLine);
        end;
    end;

    local procedure UpdateQtyToHandle(var WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
        WarehouseActivityLine."Qty. to Handle (Base)" := "Qty. to Handle (Base)";
        WarehouseActivityLine."Qty. to Handle" := WarehouseActivityLine.CalcQty("Qty. to Handle (Base)");
        WMSMgt.CalcCubageAndWeight(
            WarehouseActivityLine."Item No.", WarehouseActivityLine."Unit of Measure Code",
            WarehouseActivityLine."Qty. to Handle", WarehouseActivityLine.Cubage, WarehouseActivityLine.Weight);
        OnUpdateQtyToHandleOnBeforeWhseActivLineModify(WarehouseActivityLine);
        WarehouseActivityLine.Modify();
    end;

    local procedure UpdateQtyToHandleOnSplitLine(var WarehouseActivityLine: Record "Warehouse Activity Line")
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeUpdateQtyToHandleOnSplitLine(WarehouseActivityLine, IsHandled);
        if IsHandled then
            exit;

        WarehouseActivityLine."Qty. to Handle" := WarehouseActivityLine.Quantity;
        WarehouseActivityLine."Qty. to Handle (Base)" := WarehouseActivityLine."Qty. (Base)";
    end;

    procedure ShowWhseDoc()
    var
        WarehouseShipmentHeader: Record "Warehouse Shipment Header";
        PostedWhseReceiptHeader: Record "Posted Whse. Receipt Header";
        WhseInternalPickHeader: Record "Whse. Internal Pick Header";
        WhseInternalPutAwayHeader: Record "Whse. Internal Put-away Header";
        AssemblyHeader: Record "Assembly Header";
        Job: Record Job;
        WarehouseShipmentCard: Page "Warehouse Shipment";
        PostedWhseReceiptCard: Page "Posted Whse. Receipt";
        WhseInternalPickCard: Page "Whse. Internal Pick";
        WhseInternalPutawayCard: Page "Whse. Internal Put-away";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeShowWhseDoc(Rec, IsHandled);
        if IsHandled then
            exit;

        case "Whse. Document Type" of
            "Whse. Document Type"::Shipment:
                begin
                    WarehouseShipmentHeader.SetRange("No.", "Whse. Document No.");
                    WarehouseShipmentCard.SetTableView(WarehouseShipmentHeader);
                    WarehouseShipmentCard.RunModal();
                end;
            "Whse. Document Type"::Receipt:
                begin
                    PostedWhseReceiptHeader.SetRange("No.", "Whse. Document No.");
                    PostedWhseReceiptCard.SetTableView(PostedWhseReceiptHeader);
                    PostedWhseReceiptCard.RunModal();
                end;
            "Whse. Document Type"::"Internal Pick":
                begin
                    WhseInternalPickHeader.SetRange("No.", "Whse. Document No.");
                    WhseInternalPickHeader.FindFirst();
                    WhseInternalPickCard.SetRecord(WhseInternalPickHeader);
                    WhseInternalPickCard.SetTableView(WhseInternalPickHeader);
                    WhseInternalPickCard.RunModal();
                end;
            "Whse. Document Type"::"Internal Put-away":
                begin
                    WhseInternalPutAwayHeader.SetRange("No.", "Whse. Document No.");
                    WhseInternalPutAwayHeader.FindFirst();
                    WhseInternalPutawayCard.SetRecord(WhseInternalPutAwayHeader);
                    WhseInternalPutawayCard.SetTableView(WhseInternalPutAwayHeader);
                    WhseInternalPutawayCard.RunModal();
                end;
            "Whse. Document Type"::Assembly:
                begin
                    AssemblyHeader.SetRange("Document Type", "Source Subtype");
                    AssemblyHeader.SetRange("No.", "Source No.");
                    Page.RunModal(Page::"Assembly Order", AssemblyHeader);
                end;
            "Whse. Document Type"::Job:
                begin
                    Job.SetRange("No.", "Source No.");
                    Page.RunModal(Page::"Job Card", Job);
                end;
            else
                OnShowWhseDoc(Rec);
        end;
    end;

    procedure ShowActivityDoc()
    var
        WarehouseActivityHeader: Record "Warehouse Activity Header";
        WarehousePutAwayCard: Page "Warehouse Put-away";
        WarehouseMovementCard: Page "Warehouse Movement";
        InventoryPickCard: Page "Inventory Pick";
        InventoryPutAwayCard: Page "Inventory Put-away";
    begin
        WarehouseActivityHeader.SetRange(Type, "Activity Type");
        WarehouseActivityHeader.SetRange("No.", "No.");
        case "Activity Type" of
            "Activity Type"::Pick:
                RunWhsePickCard(WarehouseActivityHeader);
            "Activity Type"::"Put-away":
                begin
                    WarehousePutAwayCard.SetTableView(WarehouseActivityHeader);
                    WarehousePutAwayCard.RunModal();
                end;
            "Activity Type"::Movement:
                begin
                    WarehouseMovementCard.SetTableView(WarehouseActivityHeader);
                    WarehouseMovementCard.RunModal();
                end;
            "Activity Type"::"Invt. Pick":
                begin
                    InventoryPickCard.SetTableView(WarehouseActivityHeader);
                    InventoryPickCard.RunModal();
                end;
            "Activity Type"::"Invt. Put-away":
                begin
                    InventoryPutAwayCard.SetTableView(WarehouseActivityHeader);
                    InventoryPutAwayCard.RunModal();
                end;
            "Activity Type"::"Invt. Movement":
                Page.RunModal(Page::"Inventory Movement", WarehouseActivityHeader);
        end;
    end;

    procedure ChangeUOMCode(var WarehouseActivityLine: Record "Warehouse Activity Line"; var WarehouseActivityLine2: Record "Warehouse Activity Line")
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeChangeUOMCode(WarehouseActivityLine, WarehouseActivityLine2, IsHandled);
        if IsHandled then
            exit;

        if "Breakbulk No." = 0 then
            if (Quantity <> "Qty. to Handle") or ("Qty. Handled" <> 0) then
                CreateNewUOMLine("Action Type", WarehouseActivityLine, WarehouseActivityLine2)
            else begin
                Rec := WarehouseActivityLine2;
                GetLocation("Location Code");
                if Location."Bin Capacity Policy" <> Location."Bin Capacity Policy"::"Never Check Capacity" then
                    WMSMgt.CalcCubageAndWeight(
                      "Item No.", "Unit of Measure Code", "Qty. to Handle", Cubage, Weight);
                OnChangeUOMCodeOnBeforeRecModify(Rec, Location);
                Modify();
            end;
    end;

    local procedure CreateNewUOMLine(ActType: Enum "Warehouse Action Type"; WarehouseActivityLine: Record "Warehouse Activity Line"; WarehouseActivityLine2: Record "Warehouse Activity Line")
    var
        NewWarehouseActivityLine: Record "Warehouse Activity Line";
        LineSpacing: Integer;
    begin
        NewWarehouseActivityLine := WarehouseActivityLine;
        if NewWarehouseActivityLine.Find('>') then
            LineSpacing := (NewWarehouseActivityLine."Line No." - WarehouseActivityLine."Line No.") div 2
        else
            LineSpacing := 10000;

        NewWarehouseActivityLine.Reset();
        NewWarehouseActivityLine.Init();
        NewWarehouseActivityLine := WarehouseActivityLine2;
        NewWarehouseActivityLine."Line No." := NewWarehouseActivityLine."Line No." + LineSpacing;
        GetLocation("Location Code");
        if Location."Bin Capacity Policy" <> Location."Bin Capacity Policy"::"Never Check Capacity" then
            WMSMgt.CalcCubageAndWeight(
              NewWarehouseActivityLine."Item No.", NewWarehouseActivityLine."Unit of Measure Code",
              NewWarehouseActivityLine."Qty. to Handle", NewWarehouseActivityLine.Cubage, NewWarehouseActivityLine.Weight);
        NewWarehouseActivityLine."Action Type" := ActType;
        NewWarehouseActivityLine.Validate("Qty. Handled", 0);
        OnCreateNewUOMLineOnBeforeNewWhseActivLineInsert(NewWarehouseActivityLine, WarehouseActivityLine);
        NewWarehouseActivityLine.Insert();

        WarehouseActivityLine."Qty. Outstanding" :=
          WarehouseActivityLine."Qty. Outstanding" - WarehouseActivityLine."Qty. to Handle";
        WarehouseActivityLine."Qty. Outstanding (Base)" :=
          WarehouseActivityLine."Qty. Outstanding (Base)" - WarehouseActivityLine."Qty. to Handle (Base)";
        WarehouseActivityLine.Quantity :=
          WarehouseActivityLine.Quantity - WarehouseActivityLine."Qty. to Handle";
        WarehouseActivityLine."Qty. (Base)" :=
          WarehouseActivityLine."Qty. (Base)" - WarehouseActivityLine."Qty. to Handle (Base)";
        WarehouseActivityLine.Validate("Qty. to Handle", WarehouseActivityLine."Qty. Outstanding");
        if Location."Bin Capacity Policy" <> Location."Bin Capacity Policy"::"Never Check Capacity" then
            WMSMgt.CalcCubageAndWeight(
              WarehouseActivityLine."Item No.", WarehouseActivityLine."Unit of Measure Code",
              WarehouseActivityLine."Qty. to Handle", WarehouseActivityLine.Cubage, WarehouseActivityLine.Weight);
        OnCreateNewUOMLineOnBeforeNewWhseActivLineModify(NewWarehouseActivityLine, WarehouseActivityLine);
        WarehouseActivityLine.Modify();
    end;

    procedure UpdateRelatedItemTrkg(WarehouseActivityLine: Record "Warehouse Activity Line")
    var
        WhseItemTrackingLine: Record "Whse. Item Tracking Line";
        WhseDocType2: Enum "Warehouse Activity Document Type";
    begin
        if WarehouseActivityLine.TrackingExists() then begin
            WhseItemTrackingLine.SetTrackingKey();
            WhseItemTrackingLine.SetTrackingFilterFromWhseActivityLine(WarehouseActivityLine);
            if (WarehouseActivityLine."Whse. Document Type" = WarehouseActivityLine."Whse. Document Type"::Shipment) and
               WarehouseActivityLine."Assemble to Order"
            then
                WhseDocType2 := WarehouseActivityLine."Whse. Document Type"::Assembly
            else
                WhseDocType2 := WarehouseActivityLine."Whse. Document Type";
            case WhseDocType2 of
                WarehouseActivityLine."Whse. Document Type"::Shipment:
                    SetWhseItemTrkgLineFiltersWhseShipment(WhseItemTrackingLine, WarehouseActivityLine);
                WarehouseActivityLine."Whse. Document Type"::"Internal Pick":
                    begin
                        WhseItemTrackingLine.SetRange("Source Type", Database::"Whse. Internal Pick Line");
                        WhseItemTrackingLine.SetRange("Source ID", WarehouseActivityLine."Whse. Document No.");
                        WhseItemTrackingLine.SetRange("Source Ref. No.", WarehouseActivityLine."Whse. Document Line No.");
                    end;
                WarehouseActivityLine."Whse. Document Type"::"Internal Put-away":
                    begin
                        WhseItemTrackingLine.SetRange("Source Type", Database::"Whse. Internal Put-away Line");
                        WhseItemTrackingLine.SetRange("Source ID", WarehouseActivityLine."Whse. Document No.");
                        WhseItemTrackingLine.SetRange("Source Ref. No.", WarehouseActivityLine."Whse. Document Line No.");
                    end;
                WarehouseActivityLine."Whse. Document Type"::Production:
                    begin
                        WhseItemTrackingLine.SetRange("Source Type", WarehouseActivityLine."Source Type");
                        WhseItemTrackingLine.SetRange("Source Subtype", WarehouseActivityLine."Source Subtype");
                        WhseItemTrackingLine.SetRange("Source ID", WarehouseActivityLine."Source No.");
                        WhseItemTrackingLine.SetRange("Source Prod. Order Line", WarehouseActivityLine."Source Line No.");
                        WhseItemTrackingLine.SetRange("Source Ref. No.", WarehouseActivityLine."Source Subline No.");
                    end;
                WarehouseActivityLine."Whse. Document Type"::Assembly:
                    begin
                        WhseItemTrackingLine.SetRange("Source Type", WarehouseActivityLine."Source Type");
                        WhseItemTrackingLine.SetRange("Source Subtype", WarehouseActivityLine."Source Subtype");
                        WhseItemTrackingLine.SetRange("Source ID", WarehouseActivityLine."Source No.");
                        WhseItemTrackingLine.SetRange("Source Ref. No.", WarehouseActivityLine."Source Line No.");
                    end;
                WarehouseActivityLine."Whse. Document Type"::Job:
                    begin
                        WhseItemTrackingLine.SetFilter("Source Type", '%1|%2', WarehouseActivityLine."Source Type", Database::"Job Planning Line");
                        WhseItemTrackingLine.SetRange("Source ID", WarehouseActivityLine."Source No.");
                        WhseItemTrackingLine.SetRange("Source Ref. No.", WarehouseActivityLine."Source Line No.");
                    end;
            end;
            if WarehouseActivityLine."Activity Type" = WarehouseActivityLine."Activity Type"::"Invt. Movement" then
                case WarehouseActivityLine."Source Type" of
                    Database::"Assembly Line":
                        begin
                            WhseItemTrackingLine.SetRange("Source Type", Database::"Assembly Line");
                            WhseItemTrackingLine.SetRange("Source Subtype", WarehouseActivityLine."Source Subtype");
                            WhseItemTrackingLine.SetRange("Source ID", WarehouseActivityLine."Source No.");
                            WhseItemTrackingLine.SetRange("Source Ref. No.", WarehouseActivityLine."Source Line No.");
                        end;
                    else
                        OnUpdateRelatedItemTrkgForInvtMovement(WarehouseActivityLine, WhseItemTrackingLine);
                end;
            if WhseItemTrackingLine.Find('-') then
                repeat
                    ItemTrackingMgt.CalcWhseItemTrkgLine(WhseItemTrackingLine);
                    UpdateReservation(WarehouseActivityLine, true);
                    if (WarehouseActivityLine."Whse. Document Type" in
                        [WarehouseActivityLine."Whse. Document Type"::Production, WarehouseActivityLine."Whse. Document Type"::Assembly, WarehouseActivityLine."Whse. Document Type"::Job]) and
                       not WarehouseActivityLine."Assemble to Order"
                    then
                        if WhseItemTrackingLine."Quantity Handled (Base)" = 0 then
                            WhseItemTrackingLine.Delete()
                        else begin
                            WhseItemTrackingLine.Validate("Quantity (Base)", WhseItemTrackingLine."Quantity Handled (Base)");
                            WhseItemTrackingLine.Modify();
                        end
                    else
                        if (WarehouseActivityLine."Activity Type" = WarehouseActivityLine."Activity Type"::"Invt. Movement") and
                           (WhseItemTrackingLine."Quantity Handled (Base)" = 0)
                        then
                            WhseItemTrackingLine.Delete()
                        else
                            WhseItemTrackingLine.Modify();
                until WhseItemTrackingLine.Next() = 0;
        end;
    end;

    local procedure CleanupJobWhseItemTrackingLineOnDelete(DeletedWarehouseActivityLine: Record "Warehouse Activity Line")
    var
        RemainingWarehouseActivityLine: Record "Warehouse Activity Line";
    begin
        if DeletedWarehouseActivityLine."Whse. Document Type" <> DeletedWarehouseActivityLine."Whse. Document Type"::Job then
            exit;

        RemainingWarehouseActivityLine.SetRange("Activity Type", DeletedWarehouseActivityLine."Activity Type");
        RemainingWarehouseActivityLine.SetSourceFilter(
          DeletedWarehouseActivityLine."Source Type", DeletedWarehouseActivityLine."Source Subtype", DeletedWarehouseActivityLine."Source No.",
          DeletedWarehouseActivityLine."Source Line No.", -1, false);
        RemainingWarehouseActivityLine.SetRange("Location Code", DeletedWarehouseActivityLine."Location Code");
        if not RemainingWarehouseActivityLine.IsEmpty() then
            exit;

        ItemTrackingMgt.DeleteWhseItemTrkgLines(
            Database::"Job Planning Line", DeletedWarehouseActivityLine."Source Subtype", DeletedWarehouseActivityLine."Source No.", '', 0,
            DeletedWarehouseActivityLine."Source Line No.", DeletedWarehouseActivityLine."Location Code", true);
    end;

    local procedure SetWhseItemTrkgLineFiltersWhseShipment(var WhseItemTrackingLine: Record "Whse. Item Tracking Line"; WarehouseActivityLine: Record "Warehouse Activity Line")
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeSetWhseItemTrkgLineFiltersWhseShipment(Rec, WhseItemTrackingLine, WarehouseActivityLine, IsHandled);
        if IsHandled then
            exit;

        WhseItemTrackingLine.SetRange("Source Type", Database::"Warehouse Shipment Line");
        WhseItemTrackingLine.SetRange("Source ID", WarehouseActivityLine."Whse. Document No.");
        WhseItemTrackingLine.SetRange("Source Ref. No.", WarehouseActivityLine."Whse. Document Line No.");
    end;

    procedure LookUpTrackingSummary(var WarehouseActivityLine: Record "Warehouse Activity Line"; SearchForSupply: Boolean; SignFactor: Integer; TrackingType: Enum "Item Tracking Type")
    var
        TempTrackingSpecification: Record "Tracking Specification" temporary;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeLookUpTrackingSummary(WarehouseActivityLine, TrackingType, IsHandled);
        if IsHandled then
            exit;

        InitTrackingSpecFromWhseActivLine(TempTrackingSpecification, WarehouseActivityLine);
        TempTrackingSpecification."Quantity (Base)" := WarehouseActivityLine."Qty. Outstanding (Base)";
        TempTrackingSpecification."Qty. to Handle" := WarehouseActivityLine."Qty. Outstanding";
        TempTrackingSpecification."Qty. to Handle (Base)" := WarehouseActivityLine."Qty. Outstanding (Base)";
        TempTrackingSpecification."Qty. to Invoice" := 0;
        TempTrackingSpecification."Qty. to Invoice (Base)" := 0;
        TempTrackingSpecification."Quantity Handled (Base)" := 0;
        TempTrackingSpecification."Quantity Invoiced (Base)" := 0;

        GetItem();
        if not ItemTrackingDataCollection.CurrentDataSetMatches(
            WarehouseActivityLine."Item No.", WarehouseActivityLine."Variant Code", WarehouseActivityLine."Location Code")
        then
            Clear(ItemTrackingDataCollection);
        OnLookUpTrackingSummaryOnAfterCheckDataSet(WarehouseActivityLine, Item, TempTrackingSpecification);
        ItemTrackingDataCollection.SetCurrentBinAndItemTrkgCode(WarehouseActivityLine."Bin Code", ItemTrackingCode);
        ItemTrackingDataCollection.AssistEditTrackingNo(
            TempTrackingSpecification, SearchForSupply, SignFactor, TrackingType, WarehouseActivityLine."Qty. Outstanding");

        OnLookUpTrackingSummaryOnAfterAssistEditTrackingNo(WarehouseActivityLine, TempTrackingSpecification, TrackingType);

        case TrackingType of
            TrackingType::"Serial No.":
                if TempTrackingSpecification."Serial No." <> '' then begin
                    WarehouseActivityLine.Validate("Serial No.", TempTrackingSpecification."Serial No.");
                    WarehouseActivityLine.Validate("Lot No.", TempTrackingSpecification."Lot No.");
                    OnLookUpTrackingSummaryOnAfterAssignSerialNoTracking(WarehouseActivityLine, TempTrackingSpecification);
                    WarehouseActivityLine.Validate("Expiration Date", TempTrackingSpecification."Expiration Date");
                    WarehouseActivityLine.Validate("Warranty Date", TempTrackingSpecification."Warranty Date");
                    WarehouseActivityLine.Modify();
                end;
            TrackingType::"Lot No.":
                if TempTrackingSpecification."Lot No." <> '' then begin
                    WarehouseActivityLine.Validate("Lot No.", TempTrackingSpecification."Lot No.");
                    OnLookUpTrackingSummaryOnAfterAssignLotNoTracking(WarehouseActivityLine, TempTrackingSpecification);
                    WarehouseActivityLine.Validate("Expiration Date", TempTrackingSpecification."Expiration Date");
                    WarehouseActivityLine.Modify();
                end;
        end;

        OnAfterLookupTrackingSummary(WarehouseActivityLine, TempTrackingSpecification, TrackingType);
    end;

    procedure CheckItemTrackingAvailability(): Boolean
    var
        TempTrackingSpecification: Record "Tracking Specification" temporary;
    begin
        InitTrackingSpecFromWhseActivLine(TempTrackingSpecification, Rec);
        TempTrackingSpecification."Quantity (Base)" := "Qty. Outstanding (Base)";
        TempTrackingSpecification."Qty. to Handle" := "Qty. Outstanding";
        TempTrackingSpecification."Qty. to Handle (Base)" := "Qty. Outstanding (Base)";
        TempTrackingSpecification.Insert();

        GetItem();
        Clear(ItemTrackingDataCollection);
        ItemTrackingDataCollection.SetCurrentBinAndItemTrkgCode("Bin Code", ItemTrackingCode);
        exit(ItemTrackingDataCollection.CheckAvailableTrackingQuantity(TempTrackingSpecification));
    end;

    procedure CheckReservedItemTrkg(CheckType: Enum "Item Tracking Type"; ItemTrkgCode: Code[50])
    var
        IsHandled: Boolean;
    begin
        IsHandled := ("Activity Type" = "Activity Type"::"Invt. Pick") and "Assemble to Order";
        OnBeforeCheckReservedItemTrkg(Rec, CheckType, ItemTrkgCode, IsHandled);
        if IsHandled then
            exit;

        case CheckType of
            CheckType::"Serial No.":
                CheckReservedItemTrkgForSerialNo(ItemTrkgCode);
            CheckType::"Lot No.":
                CheckReservedItemTrkgForLotNo(ItemTrkgCode);
            else
                OnCheckReservedItemTrkgOnCheckTypeElseCase(Rec, CheckType, ItemTrkgCode);
        end;
    end;

    local procedure CheckReservedItemTrkgForSerialNo(ItemTrkgCode: Code[50])
    var
        ReservEntry: Record "Reservation Entry";
        WhseItemTrackingSetup: Record "Item Tracking Setup";
    begin
        ItemTrackingMgt.GetWhseItemTrkgSetup("Item No.", WhseItemTrackingSetup);
        if not WhseItemTrackingSetup."Serial No. Required" then
            exit;

        ReservEntry.SetCurrentKey("Item No.", "Variant Code", "Location Code", "Reservation Status");
        ReservEntry.SetRange("Item No.", "Item No.");
        ReservEntry.SetRange("Variant Code", "Variant Code");
        ReservEntry.SetRange("Location Code", "Location Code");
        ReservEntry.SetRange("Reservation Status", ReservEntry."Reservation Status"::Reservation);
        ReservEntry.SetRange("Serial No.", ItemTrkgCode);
        ReservEntry.SetRange(Positive, false);
        if ReservEntry.FindFirst() and
            ((ReservEntry."Source Type" <> "Source Type") or
            (ReservEntry."Source Subtype" <> "Source Subtype") or
            (ReservEntry."Source ID" <> "Source No.") or
            (((ReservEntry."Source Ref. No." <> "Source Line No.") and
                (ReservEntry."Source Type" <> ProdOrderComponentSourceID())) or
                (((ReservEntry."Source Prod. Order Line" <> "Source Line No.") or
                (ReservEntry."Source Ref. No." <> "Source Subline No.")) and
                (ReservEntry."Source Type" = ProdOrderComponentSourceID()))))
        then
            Error(Text014, FieldCaption("Serial No."), ItemTrkgCode);
    end;

    local procedure ProdOrderComponentSourceID(): Integer
    begin
        exit(5407);
    end;

    local procedure CheckReservedItemTrkgForLotNo(ItemTrkgCode: Code[50])
    var
        Item: Record Item;
        ReservEntry: Record "Reservation Entry";
        ReservEntry2: Record "Reservation Entry";
        TempWarehouseActivityLine: Record "Warehouse Activity Line" temporary;
        WhseItemTrackingSetup: Record "Item Tracking Setup";
        WhseAvailMgt: Codeunit "Warehouse Availability Mgt.";
        LineReservedQty: Decimal;
        AvailQtyFromOtherResvLines: Decimal;
    begin
        ItemTrackingMgt.GetWhseItemTrkgSetup("Item No.", WhseItemTrackingSetup);
        if not WhseItemTrackingSetup."Lot No. Required" then
            exit;

        Item.Get("Item No.");
        Item.SetRange("Location Filter", "Location Code");
        Item.SetRange("Variant Filter", "Variant Code");
        Item.SetRange("Lot No. Filter", ItemTrkgCode);
        Item.CalcFields(Inventory, "Reserved Qty. on Inventory");
        WhseItemTrackingSetup."Lot No." := ItemTrkgCode;
        ReservEntry.SetCurrentKey("Item No.", "Variant Code", "Location Code", "Reservation Status");
        ReservEntry.SetRange("Item No.", "Item No.");
        ReservEntry.SetRange("Variant Code", "Variant Code");
        ReservEntry.SetRange("Location Code", "Location Code");
        ReservEntry.SetRange("Reservation Status", ReservEntry."Reservation Status"::Reservation);
        ReservEntry.SetRange("Lot No.", ItemTrkgCode);
        ReservEntry.SetRange(Positive, true);
        if ReservEntry.Find('-') then
            repeat
                ReservEntry2.Get(ReservEntry."Entry No.", false);
                if ((ReservEntry2."Source Type" <> "Source Type") or
                    (ReservEntry2."Source Subtype" <> "Source Subtype") or
                    (ReservEntry2."Source ID" <> "Source No.") or
                    (((ReservEntry2."Source Ref. No." <> "Source Line No.") and
                        (ReservEntry2."Source Type" <> ProdOrderComponentSourceID())) or
                        (((ReservEntry2."Source Prod. Order Line" <> "Source Line No.") or
                        (ReservEntry2."Source Ref. No." <> "Source Subline No.")) and
                        (ReservEntry2."Source Type" = ProdOrderComponentSourceID())))) and
                    (ReservEntry2."Lot No." = '')
                then
                    AvailQtyFromOtherResvLines := AvailQtyFromOtherResvLines + Abs(ReservEntry2."Quantity (Base)");
            until ReservEntry.Next() = 0;

        TempWarehouseActivityLine := Rec;
        TempWarehouseActivityLine."Qty. Outstanding (Base)" *= -1;
        TempWarehouseActivityLine.Insert();

        LineReservedQty :=
            WhseAvailMgt.CalcLineReservedQtyOnInvt(
            "Source Type", "Source Subtype", "Source No.", "Source Line No.", "Source Subline No.", true, WhseItemTrackingSetup, TempWarehouseActivityLine);

        if (Item.Inventory - Abs(Item."Reserved Qty. on Inventory") +
            LineReservedQty + AvailQtyFromOtherResvLines +
            WhseAvailMgt.CalcReservQtyOnPicksShips("Location Code", "Item No.", "Variant Code", TempWarehouseActivityLine)) <
            "Qty. to Handle (Base)"
        then
            Error(InventoryNotAvailableErr, FieldCaption("Lot No."), ItemTrkgCode);

        OnAfterCheckReservedItemTrkg(Rec, xRec, CurrFieldNo, 0, LineReservedQty);
    end;

    procedure DeleteBinContent(ActionType: Option)
    var
        BinContent: Record "Bin Content";
        IsHandled: Boolean;
    begin
        if "Action Type".AsInteger() <> ActionType then
            exit;

        IsHandled := false;
        OnBeforeDeleteBinContent(Rec, IsHandled);
        if IsHandled then
            exit;

        BinContent.ReadIsolation(IsolationLevel::ReadCommitted);
        if BinContent.Get("Location Code", "Bin Code", "Item No.", "Variant Code", "Unit of Measure Code") then
            if not BinContent.Fixed and
               (BinContent."Min. Qty." = 0) and (BinContent."Max. Qty." = 0)
            then begin
                BinContent.CalcFields("Quantity (Base)", "Positive Adjmt. Qty. (Base)", "Put-away Quantity (Base)");
                if (BinContent."Quantity (Base)" = 0) and
                   (BinContent."Positive Adjmt. Qty. (Base)" = 0) and
                   (BinContent."Put-away Quantity (Base)" - "Qty. Outstanding (Base)" <= 0)
                then
                    BinContent.Delete();
            end;
    end;

    local procedure UpdateReservation(TempWarehouseActivityLine2: Record "Warehouse Activity Line" temporary; Deletion: Boolean)
    var
        TempTrackingSpecification: Record "Tracking Specification" temporary;
    begin
        if (TempWarehouseActivityLine2."Action Type" <> TempWarehouseActivityLine2."Action Type"::Take) and (TempWarehouseActivityLine2."Breakbulk No." = 0) and
           (TempWarehouseActivityLine2."Whse. Document Type" = TempWarehouseActivityLine2."Whse. Document Type"::Shipment)
        then begin
            InitTrackingSpecFromWhseActivLine(TempTrackingSpecification, TempWarehouseActivityLine2);
            TempTrackingSpecification."Qty. to Handle (Base)" := 0;
            TempTrackingSpecification."Entry No." := TempTrackingSpecification."Entry No." + 1;
            TempTrackingSpecification."Creation Date" := Today;
            TempTrackingSpecification."Warranty Date" := TempWarehouseActivityLine2."Warranty Date";
            TempTrackingSpecification."Expiration Date" := TempWarehouseActivityLine2."Expiration Date";
            TempTrackingSpecification.Correction := true;
            OnUpdateReservationOnBeforeTempTrackingSpecificationInsert(TempTrackingSpecification, TempWarehouseActivityLine2);
            TempTrackingSpecification.Insert();
        end;
        ItemTrackingMgt.SetPick(TempWarehouseActivityLine2."Activity Type" = TempWarehouseActivityLine2."Activity Type"::Pick);
        ItemTrackingMgt.SynchronizeWhseItemTracking(TempTrackingSpecification, '', Deletion);
    end;

    procedure TransferFromPickWkshLine(WhseWkshLine: Record "Whse. Worksheet Line")
    var
        WarehouseShipmentLine: Record "Warehouse Shipment Line";
        AssembleToOrderLink: Record "Assemble-to-Order Link";
    begin
        "Activity Type" := "Activity Type"::Pick;
        "Source Type" := WhseWkshLine."Source Type";
        "Source Subtype" := WhseWkshLine."Source Subtype";
        "Source No." := WhseWkshLine."Source No.";
        "Source Line No." := WhseWkshLine."Source Line No.";
        "Source Subline No." := WhseWkshLine."Source Subline No.";
        "Shelf No." := WhseWkshLine."Shelf No.";
        "Item No." := WhseWkshLine."Item No.";
        "Variant Code" := WhseWkshLine."Variant Code";
        Description := WhseWkshLine.Description;
        "Description 2" := WhseWkshLine."Description 2";
        "Due Date" := WhseWkshLine."Due Date";
        "Starting Date" := WorkDate();
        "Destination Type" := WhseWkshLine."Destination Type";
        "Destination No." := WhseWkshLine."Destination No.";
        "Shipping Agent Code" := WhseWkshLine."Shipping Agent Code";
        "Shipping Agent Service Code" := WhseWkshLine."Shipping Agent Service Code";
        "Shipment Method Code" := WhseWkshLine."Shipment Method Code";
        "Shipping Advice" := WhseWkshLine."Shipping Advice";
        "Whse. Document Type" := WhseWkshLine."Whse. Document Type";
        "Whse. Document No." := WhseWkshLine."Whse. Document No.";
        "Whse. Document Line No." := WhseWkshLine."Whse. Document Line No.";

        case "Whse. Document Type" of
            "Whse. Document Type"::Shipment:
                begin
                    WarehouseShipmentLine.SetLoadFields("Assemble to Order");
                    WarehouseShipmentLine.Get("Whse. Document No.", "Whse. Document Line No.");
                    "Assemble to Order" := WarehouseShipmentLine."Assemble to Order";
                    "ATO Component" := WarehouseShipmentLine."Assemble to Order";
                end;
            "Whse. Document Type"::Assembly:
                begin
                    AssembleToOrderLink.SetLoadFields("Assembly Document Type", "Assembly Document No.");
                    "Assemble to Order" := AssembleToOrderLink.Get("Source Subtype", "Source No.");
                    "ATO Component" := true;
                end;
        end;

        OnAfterTransferFromPickWkshLine(Rec, WhseWkshLine);
    end;

    procedure TransferFromShptLine(WhseShptLine: Record "Warehouse Shipment Line")
    begin
        "Activity Type" := "Activity Type"::Pick;
        "Source Type" := WhseShptLine."Source Type";
        "Source Subtype" := WhseShptLine."Source Subtype";
        "Source No." := WhseShptLine."Source No.";
        "Source Line No." := WhseShptLine."Source Line No.";
        "Shelf No." := WhseShptLine."Shelf No.";
        "Item No." := WhseShptLine."Item No.";
        "Variant Code" := WhseShptLine."Variant Code";
        Description := WhseShptLine.Description;
        "Description 2" := WhseShptLine."Description 2";
        "Due Date" := WhseShptLine."Due Date";
        "Starting Date" := WhseShptLine."Shipment Date";
        "Destination Type" := WhseShptLine."Destination Type";
        "Destination No." := WhseShptLine."Destination No.";
        "Shipping Advice" := WhseShptLine."Shipping Advice";
        "Whse. Document Type" := "Whse. Document Type"::Shipment;
        "Whse. Document No." := WhseShptLine."No.";
        "Whse. Document Line No." := WhseShptLine."Line No.";

        OnAfterTransferFromShptLine(Rec, WhseShptLine);
    end;

    procedure TransferFromATOShptLine(WhseShptLine: Record "Warehouse Shipment Line"; AssemblyLine: Record "Assembly Line")
    begin
        WhseShptLine.TestField("Assemble to Order", true);
        TransferFromShptLine(WhseShptLine);
        TransferAllButWhseDocDetailsFromAssemblyLine(AssemblyLine);
    end;

    procedure TransferFromATOJobPlanningLine(JobPlanningLine: Record "Job Planning Line"; AssemblyLine: Record "Assembly Line")
    begin
        JobPlanningLine.TestField("Assemble to Order", true);
        TransferFromJobPlanningLine(JobPlanningLine);
        TransferAllButWhseDocDetailsFromAssemblyLine(AssemblyLine);
    end;

    procedure TransferFromIntPickLine(WhseInternalPickLine: Record "Whse. Internal Pick Line")
    begin
        "Activity Type" := "Activity Type"::Pick;
        "Shelf No." := WhseInternalPickLine."Shelf No.";
        "Item No." := WhseInternalPickLine."Item No.";
        "Variant Code" := WhseInternalPickLine."Variant Code";
        Description := WhseInternalPickLine.Description;
        "Description 2" := WhseInternalPickLine."Description 2";
        "Due Date" := WhseInternalPickLine."Due Date";
        "Starting Date" := WorkDate();
        "Source Type" := Database::"Whse. Internal Pick Line";
        "Source No." := WhseInternalPickLine."No.";
        "Source Line No." := WhseInternalPickLine."Line No.";
        "Whse. Document Type" := "Whse. Document Type"::"Internal Pick";
        "Whse. Document No." := WhseInternalPickLine."No.";
        "Whse. Document Line No." := WhseInternalPickLine."Line No.";

        OnAfterTransferFromIntPickLine(Rec, WhseInternalPickLine);
    end;

    procedure TransferFromAssemblyLine(AssemblyLine: Record "Assembly Line")
    begin
        TransferAllButWhseDocDetailsFromAssemblyLine(AssemblyLine);
        "Whse. Document Type" := "Whse. Document Type"::Assembly;
        "Whse. Document No." := AssemblyLine."Document No.";
        "Whse. Document Line No." := AssemblyLine."Line No.";

        OnAfterTransferFromAssemblyLine(Rec, AssemblyLine);
    end;

    procedure TransferFromJobPlanningLine(JobPlanningLine: Record "Job Planning Line")
    var
        Job: Record Job;
    begin
        "Activity Type" := "Activity Type"::Pick;
        "Source Type" := Database::"Job Planning Line";
        "Source Subtype" := "Job Planning Line Status"::Order.AsInteger(); // Warehouse operations only apply to Order status
        "Source No." := JobPlanningLine."Job No.";
        "Source Line No." := JobPlanningLine."Job Contract Entry No.";
        "Source Subline No." := JobPlanningLine."Line No.";
        JobPlanningLine.TestField(Type, JobPlanningLine.Type::Item);
        "Item No." := JobPlanningLine."No.";
        "Variant Code" := JobPlanningLine."Variant Code";
        Description := JobPlanningLine.Description;
        "Due Date" := JobPlanningLine."Planning Due Date";
        "Whse. Document Type" := "Whse. Document Type"::Job;
        "Whse. Document No." := JobPlanningLine."Job No.";
        "Whse. Document Line No." := JobPlanningLine."Job Contract Entry No.";
        "Destination Type" := "Destination Type"::Customer;

        Job.SetLoadFields("Sell-to Customer No.");
        Job.Get(JobPlanningLine."Job No.");
        "Destination No." := Job."Sell-to Customer No.";

        OnAfterTransferFromJobPlanningLine(Rec, JobPlanningLine);
    end;

    procedure TransferFromMovWkshLine(WhseWkshLine: Record "Whse. Worksheet Line")
    begin
        "Activity Type" := "Activity Type"::Movement;
        "Item No." := WhseWkshLine."Item No.";
        "Variant Code" := WhseWkshLine."Variant Code";
        "Starting Date" := WorkDate();
        Description := WhseWkshLine.Description;
        "Description 2" := WhseWkshLine."Description 2";
        "Due Date" := WhseWkshLine."Due Date";
        Dedicated := Bin.Dedicated;
        "Zone Code" := Bin."Zone Code";
        "Bin Ranking" := Bin."Bin Ranking";
        "Bin Type Code" := Bin."Bin Type Code";
        "Whse. Document Type" := "Whse. Document Type"::"Movement Worksheet";
        "Whse. Document No." := WhseWkshLine.Name;
        "Whse. Document Line No." := WhseWkshLine."Line No.";

        OnAfterTransferFromMovWkshLine(Rec, WhseWkshLine);
    end;

    local procedure TransferAllButWhseDocDetailsFromAssemblyLine(AssemblyLine: Record "Assembly Line")
    var
        AssemblyHeader: Record "Assembly Header";
    begin
        "Activity Type" := "Activity Type"::Pick;
        "Source Type" := Database::"Assembly Line";
        "Source Subtype" := AssemblyLine."Document Type".AsInteger();
        "Source No." := AssemblyLine."Document No.";
        "Source Line No." := AssemblyLine."Line No.";
        "Source Subline No." := 0;
        AssemblyLine.TestField(Type, AssemblyLine.Type::Item);
        "Item No." := AssemblyLine."No.";
        "Variant Code" := AssemblyLine."Variant Code";
        Description := AssemblyLine.Description;
        "Description 2" := AssemblyLine."Description 2";
        "Due Date" := AssemblyLine."Due Date";
        AssemblyHeader.SetAutoCalcFields("Assemble to Order");
        AssemblyHeader.Get(AssemblyLine."Document Type", AssemblyLine."Document No.");
        "Assemble to Order" := AssemblyHeader."Assemble to Order";
        "ATO Component" := true;
        Item."No." := "Item No.";
        Item.ItemSKUGet(Item, "Location Code", "Variant Code");
        "Shelf No." := Item."Shelf No.";

        OnAfterTransferAllButWhseDocDetailsFromAssemblyLine(Rec, AssemblyLine);
    end;

    local procedure CheckSNSpecificationExists()
    var
        WarehouseActivityLine: Record "Warehouse Activity Line";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCheckSNSpecificationExists(Rec, IsHandled);
        if IsHandled then
            exit;

        if "Serial No." <> '' then begin
            WarehouseActivityLine.SetCurrentKey("Item No.");
            WarehouseActivityLine.SetRange("Activity Type", "Activity Type");
            WarehouseActivityLine.SetRange("Action Type", "Action Type");
            WarehouseActivityLine.SetRange("No.", "No.");
            WarehouseActivityLine.SetRange("Item No.", "Item No.");
            WarehouseActivityLine.SetRange("Variant Code", "Variant Code");
            WarehouseActivityLine.SetFilter("Line No.", '<>%1', "Line No.");
            WarehouseActivityLine.SetRange("Serial No.", "Serial No.");
            if not WarehouseActivityLine.IsEmpty() then
                Error(Text018, TableCaption(), FieldCaption("Serial No."), "Serial No.");
        end;
    end;

    local procedure InitTrackingSpecFromWhseActivLine(var TrackingSpecification: Record "Tracking Specification"; WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
        TrackingSpecification.Init();
        if WarehouseActivityLine."Source Type" = ProdOrderComponentSourceID() then
            TrackingSpecification.SetSource(
              WarehouseActivityLine."Source Type", WarehouseActivityLine."Source Subtype", WarehouseActivityLine."Source No.", WarehouseActivityLine."Source Subline No.", '', WarehouseActivityLine."Source Line No.")
        else
            TrackingSpecification.SetSource(
              WarehouseActivityLine."Source Type", WarehouseActivityLine."Source Subtype", WarehouseActivityLine."Source No.", WarehouseActivityLine."Source Line No.", '', 0);

        TrackingSpecification."Item No." := WarehouseActivityLine."Item No.";
        TrackingSpecification."Location Code" := WarehouseActivityLine."Location Code";
        TrackingSpecification.Description := WarehouseActivityLine.Description;
        TrackingSpecification."Variant Code" := WarehouseActivityLine."Variant Code";
        TrackingSpecification."Qty. per Unit of Measure" := WarehouseActivityLine."Qty. per Unit of Measure";
        TrackingSpecification.CopyTrackingFromWhseActivityLine(WarehouseActivityLine);
        TrackingSpecification."Expiration Date" := WarehouseActivityLine."Expiration Date";
        TrackingSpecification."Bin Code" := WarehouseActivityLine."Bin Code";
        TrackingSpecification."Qty. to Handle (Base)" := WarehouseActivityLine."Qty. to Handle (Base)";

        OnAfterInitTrackingSpecFromWhseActivLine(TrackingSpecification, WarehouseActivityLine);
    end;

    local procedure FindLotAndPackageNoBySerialNo(WhseItemTrackingSetup: Record "Item Tracking Setup")
    var
        TempTrackingSpecification: Record "Tracking Specification" temporary;
        CheckGlobalEntrySummary: Boolean;
        LotNo: Code[50];
        PackageNo: Code[50];
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeFindLotNoBySerialNo(Rec, IsHandled);
        if IsHandled then
            exit;

        InitTrackingSpecFromWhseActivLine(TempTrackingSpecification, Rec);
        CheckGlobalEntrySummary :=
          ("Activity Type" <> "Activity Type"::"Put-away") and
          (not ("Source Document" in
                ["Source Document"::"Purchase Order", "Source Document"::"Prod. Output", "Source Document"::"Assembly Order", "Source Document"::"Job Usage"]));
        if CheckGlobalEntrySummary then begin
            if WhseItemTrackingSetup."Lot No. Required" then
                Validate("Lot No.", ItemTrackingDataCollection.FindLotNoBySN(TempTrackingSpecification));
            if WhseItemTrackingSetup."Package No. Required" then
                Validate("Package No.", ItemTrackingDataCollection.FindPackageNoBySN(TempTrackingSpecification));
        end else begin
            if not ItemTrackingDataCollection.FindLotNoBySNSilent(LotNo, TempTrackingSpecification) then
                LotNo := TempTrackingSpecification."Lot No.";
            if not ItemTrackingDataCollection.FindPackageNoBySNSilent(PackageNo, TempTrackingSpecification) then
                PackageNo := TempTrackingSpecification."Package No.";
            Validate("Lot No.", LotNo);
            Validate("Package No.", PackageNo);
        end;
    end;

    local procedure CheckInvalidBinCode()
    var
        WarehouseActivityLine: Record "Warehouse Activity Line";
        Location: Record Location;
        Direction: Text[1];
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCheckInvalidBinCode(Rec, IsHandled);
        if IsHandled then
            exit;

        Location.Get("Location Code");
        if ("Action Type" = "Action Type"::" ") or (not Location."Bin Mandatory") then
            exit;
        WarehouseActivityLine := Rec;
        WarehouseActivityLine.SetRange("Activity Type", "Activity Type");
        WarehouseActivityLine.SetRange("No.", "No.");
        WarehouseActivityLine.SetRange("Whse. Document Line No.", "Whse. Document Line No.");
        WarehouseActivityLine.SetFilter("Action Type", '<>%1', "Action Type");
        if "Action Type" = "Action Type"::Take then
            Direction := '>'
        else
            Direction := '<';
        if WarehouseActivityLine.Find(Direction) then begin
            if ("Location Code" = WarehouseActivityLine."Location Code") and
               ("Bin Code" = WarehouseActivityLine."Bin Code") and
               ("Unit of Measure Code" = WarehouseActivityLine."Unit of Measure Code")
            then
                Error(Text019, Format("Action Type"), Format(WarehouseActivityLine."Action Type"), Location.Code);

            if (("Activity Type" = "Activity Type"::"Put-away") and ("Action Type" = "Action Type"::Place) and
                Location.IsBWReceive() or ("Activity Type" = "Activity Type"::Pick) and
                ("Action Type" = "Action Type"::Take) and Location.IsBWShip()) and Location.IsBinBWReceiveOrShip("Bin Code")
            then
                Error(Text020, Format("Action Type"), Location.Code);
        end;
    end;

    local procedure RegisteredWhseActLineIsEmpty(): Boolean
    var
        RegisteredWhseActivityLine: Record "Registered Whse. Activity Line";
    begin
        RegisteredWhseActivityLine.SetRange("Activity Type", "Activity Type"::Pick);
        RegisteredWhseActivityLine.SetRange("Source No.", "Source No.");
        RegisteredWhseActivityLine.SetRange("Source Line No.", "Source Line No.");
        RegisteredWhseActivityLine.SetRange("Source Type", "Source Type");
        RegisteredWhseActivityLine.SetRange("Source Subtype", "Source Subtype");
        RegisteredWhseActivityLine.SetTrackingFilterFromWhseActivityLine(Rec);
        exit(RegisteredWhseActivityLine.IsEmpty());
    end;

    internal procedure UpdateSpecialEquipment()
    begin
        Validate("Special Equipment Code", GetSpecialEquipment());
    end;

    local procedure GetSpecialEquipment(): Code[10]
    begin
        GetLocation("Location Code");
        case Location."Special Equipment" of
            Location."Special Equipment"::"According to Bin":
                begin
                    if GetBin(Location.Code, "Bin Code") then
                        if Bin."Special Equipment Code" <> '' then
                            exit(Bin."Special Equipment Code");

                    if GetSKU("Location Code", "Item No.", "Variant Code") then
                        if SKU."Special Equipment Code" <> '' then
                            exit(SKU."Special Equipment Code");

                    GetItem();
                    exit(Item."Special Equipment Code");
                end;

            Location."Special Equipment"::"According to SKU/Item":
                begin
                    if GetSKU("Location Code", "Item No.", "Variant Code") then
                        if SKU."Special Equipment Code" <> '' then
                            exit(SKU."Special Equipment Code");

                    GetItem();
                    if Item."Special Equipment Code" <> '' then
                        exit(Item."Special Equipment Code");

                    if GetBin(Location.Code, "Bin Code") then
                        exit(Bin."Special Equipment Code")
                end
        end;
    end;

    local procedure GetSKU(LocationCode: Code[10]; ItemNo: Code[20]; VariantCode: Code[10]): Boolean
    begin
        if (SKU."Location Code" <> LocationCode) or (SKU."Item No." <> ItemNo) or (SKU."Variant Code" <> VariantCode) then begin
            SKU.SetLoadFields("Location Code", "Item No.", "Variant Code", "Special Equipment Code");
            if not SKU.Get(LocationCode, ItemNo, VariantCode) then begin
                Clear(SKU);
                exit(false);
            end;
        end;
        exit(true);
    end;

    procedure ShowItemAvailabilityByPeriod()
    begin
        WarehouseAvailabilityMgt.ShowItemAvailabilityFromWhseActivLine(Rec, "Item Availability Type"::Period);
    end;

    procedure ShowItemAvailabilityByVariant()
    begin
        WarehouseAvailabilityMgt.ShowItemAvailabilityFromWhseActivLine(Rec, "Item Availability Type"::Variant);
    end;

    procedure ShowItemAvailabilityByLocation()
    begin
        WarehouseAvailabilityMgt.ShowItemAvailabilityFromWhseActivLine(Rec, "Item Availability Type"::Location);
    end;

    procedure ShowItemAvailabilityByEvent()
    begin
        WarehouseAvailabilityMgt.ShowItemAvailabilityFromWhseActivLine(Rec, "Item Availability Type"::"Event");
    end;

    local procedure ShowDeletedMessage(WarehouseActivityLine: Record "Warehouse Activity Line")
    var
        WarehouseActivityLine2: Record "Warehouse Activity Line";
        IsHandled: Boolean;
    begin
        WarehouseActivityLine2.Reset();
        WarehouseActivityLine2.SetRange("Activity Type", WarehouseActivityLine."Activity Type");
        WarehouseActivityLine2.SetRange("No.", WarehouseActivityLine."No.");
        if not WarehouseActivityLine2.IsEmpty() then begin
            IsHandled := false;
            OnBeforeShowDeletedMessage(WarehouseActivityLine2, IsHandled);
            if not IsHandled then
                SendDeleteWarehouseActivityLineNotification();
        end;

        OnAfterShowDeletedMessage(WarehouseActivityLine2);
    end;

    local procedure ConfirmWhseActivLinesDeletionRecreate(WarehouseActivityLine: Record "Warehouse Activity Line"; var WhseWorksheetLine: Record "Whse. Worksheet Line"): Boolean
    var
        IsHandled: Boolean;
    begin
        WhseWorksheetLine.SetRange("Whse. Document Type", WarehouseActivityLine."Whse. Document Type");
        WhseWorksheetLine.SetRange("Whse. Document No.", WarehouseActivityLine."Whse. Document No.");
        WhseWorksheetLine.SetRange("Whse. Document Line No.", WarehouseActivityLine."Whse. Document Line No.");
        if not WhseWorksheetLine.IsEmpty() then begin
            IsHandled := false;
            OnBeforeConfirmWhseActivLinesDeletionRecreate(WarehouseActivityLine, IsHandled);
            if not IsHandled then
                if not Confirm(Text009, false, WarehouseActivityLine.TableCaption()) then
                    Error(Text006);
            exit(true);
        end;
        exit(false);
    end;

    local procedure ConfirmWhseActivLinesDeletionOutOfBalance(WarehouseActivityLine: Record "Warehouse Activity Line"; var WarehouseActivityLine2: Record "Warehouse Activity Line"; var DeleteLineConfirmed: Boolean)
    var
        WarehouseActivityLine3: Record "Warehouse Activity Line";
        ConfirmManagement: Codeunit "Confirm Management";
        IsHandled: Boolean;
    begin
        WarehouseActivityLine2.SetRange("Whse. Document Type", WarehouseActivityLine."Whse. Document Type");
        WarehouseActivityLine2.SetRange("Whse. Document No.", WarehouseActivityLine."Whse. Document No.");
        WarehouseActivityLine2.SetRange("Whse. Document Line No.", WarehouseActivityLine."Whse. Document Line No.");
        WarehouseActivityLine2.SetRange("Breakbulk No.", WarehouseActivityLine."Breakbulk No.");
        WarehouseActivityLine2.SetRange("Source No.", WarehouseActivityLine."Source No.");
        WarehouseActivityLine2.SetRange("Source Line No.", WarehouseActivityLine."Source Line No.");
        WarehouseActivityLine2.SetRange("Source Subline No.", WarehouseActivityLine."Source Subline No.");
        WarehouseActivityLine2.SetTrackingFilterFromWhseActivityLine(WarehouseActivityLine);
        if WarehouseActivityLine2.Find('-') then begin
            WarehouseActivityLine3.Copy(WarehouseActivityLine2);
            WarehouseActivityLine3.SetRange("Action Type", WarehouseActivityLine."Action Type");
            WarehouseActivityLine3.SetFilter("Line No.", '<>%1', WarehouseActivityLine."Line No.");
            OnConfirmWhseActivLinesDeletionOutOfBalanceOnAfterWhseActivLine3SetFilters(WarehouseActivityLine, WarehouseActivityLine2, WarehouseActivityLine3);
            if not WarehouseActivityLine3.IsEmpty() then begin
                IsHandled := false;
                OnBeforeConfirmWhseActivLinesDeletionOutOfBalance(WarehouseActivityLine2, IsHandled);
                if not IsHandled then
                    if not DeleteLineConfirmed then
                        if not ConfirmManagement.GetResponseOrDefault(
                             StrSubstNo(
                               Text004,
                               WarehouseActivityLine.FieldCaption("Activity Type"), WarehouseActivityLine."Activity Type", WarehouseActivityLine2.FieldCaption(WarehouseActivityLine2."No."), WarehouseActivityLine2."No.",
                               WarehouseActivityLine.FieldCaption("Line No."), WarehouseActivityLine."Line No.", WarehouseActivityLine."Action Type",
                               WarehouseActivityLine.TableCaption()),
                             false)
                        then
                            Error(Text006);

                DeleteLineConfirmed := true;
            end;
        end;
    end;

    procedure ActivityExists(SourceType: Integer; SourceSubtype: Option; SourceNo: Code[20]; SourceLineNo: Integer; SourceSublineNo: Integer; ActivityType: Option): Boolean
    begin
        if ActivityType <> 0 then
            SetRange("Activity Type", ActivityType);
        SetSourceFilter(SourceType, SourceSubtype, SourceNo, SourceLineNo, SourceSublineNo, false);
        exit(not IsEmpty());
    end;

    procedure TrackingExists() IsTrackingExist: Boolean
    begin
        IsTrackingExist := ("Lot No." <> '') or ("Serial No." <> '');

        OnAfterTrackingExists(Rec, IsTrackingExist);
    end;

    procedure SetSource(SourceType: Integer; SourceSubtype: Option; SourceNo: Code[20]; SourceLineNo: Integer; SourceSublineNo: Integer)
    begin
        "Source Type" := SourceType;
        "Source Subtype" := SourceSubtype;
        "Source No." := SourceNo;
        "Source Line No." := SourceLineNo;
        "Source Subline No." := SourceSublineNo;
        OnAfterSetSource(Rec);
    end;

    procedure SetSourceFilter(SourceType: Integer; SourceSubType: Option; SourceNo: Code[20]; SourceLineNo: Integer; SourceSubLineNo: Integer; SetKey: Boolean)
    begin
        if SetKey then
            SetCurrentKey(Rec."Source Type", Rec."Source Subtype", Rec."Source No.", Rec."Source Line No.", Rec."Source Subline No.");
        SetRange("Source Type", SourceType);
        if SourceSubType >= 0 then
            SetRange("Source Subtype", SourceSubType);
        SetRange("Source No.", SourceNo);
        SetRange("Source Line No.", SourceLineNo);
        if SourceSubLineNo >= 0 then
            SetRange("Source Subline No.", SourceSubLineNo);

        OnAfterSetSourceFilter(Rec, SourceType, SourceSubtype, SourceNo, SourceLineNo, SourceSubLineNo, SetKey);
    end;

    procedure SetSumLinesFilters(WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
        SetCurrentKey("Activity Type", "No.", "Bin Code", "Breakbulk No.", "Action Type");
        SetRange("Activity Type", WarehouseActivityLine."Activity Type");
        SetRange("No.", WarehouseActivityLine."No.");
        SetRange("Bin Code", WarehouseActivityLine."Bin Code");
        SetRange("Item No.", WarehouseActivityLine."Item No.");
        SetRange("Action Type", WarehouseActivityLine."Action Type");
        SetRange("Variant Code", WarehouseActivityLine."Variant Code");
        SetRange("Unit of Measure Code", WarehouseActivityLine."Unit of Measure Code");
        SetRange("Due Date", WarehouseActivityLine."Due Date");
    end;

    procedure ClearSourceFilter()
    begin
        SetRange("Source Type");
        SetRange("Source Subtype");
        SetRange("Source No.");
        SetRange("Source Line No.");
        SetRange("Source Subline No.");
    end;

    procedure ClearTracking()
    begin
        "Serial No." := '';
        "Lot No." := '';
        "Expiration Date" := 0D;

        OnAfterClearTracking(Rec);
    end;

    procedure ClearTrackingFilter()
    begin
        SetRange("Serial No.");
        SetRange("Lot No.");

        OnAfterClearTrackingFilter(Rec);
    end;

    procedure CopyTrackingFromSpec(TrackingSpecification: Record "Tracking Specification")
    begin
        "Serial No." := TrackingSpecification."Serial No.";
        "Lot No." := TrackingSpecification."Lot No.";
        "Expiration Date" := TrackingSpecification."Expiration Date";

        OnAfterCopyTrackingFromSpec(Rec, TrackingSpecification);
    end;

    procedure CopyTrackingFromItemTrackingSetup(WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
        "Serial No." := WhseItemTrackingSetup."Serial No.";
        "Lot No." := WhseItemTrackingSetup."Lot No.";

        OnAfterCopyTrackingFromItemTrackingSetup(Rec, WhseItemTrackingSetup);
    end;

    procedure CopyTrackingFromPostedWhseRcptLine(PostedWhseReceiptLine: Record "Posted Whse. Receipt Line")
    begin
        "Serial No." := PostedWhseReceiptLine."Serial No.";
        "Lot No." := PostedWhseReceiptLine."Lot No.";

        OnAfterCopyTrackingFromPostedWhseRcptLine(Rec, PostedWhseReceiptLine);
    end;

    procedure CopyTrackingFromWhseItemTrackingLine(WhseItemTrackingLine: Record "Whse. Item Tracking Line")
    begin
        "Serial No." := WhseItemTrackingLine."Serial No.";
        "Lot No." := WhseItemTrackingLine."Lot No.";

        OnAfterCopyTrackingFromWhseItemTrackingLine(Rec, WhseItemTrackingLine);
    end;

    procedure CopyTrackingFromWhseActivityLine(WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
        "Serial No." := WarehouseActivityLine."Serial No.";
        "Lot No." := WarehouseActivityLine."Lot No.";

        OnAfterCopyTrackingFromWhseActivityLine(Rec, WarehouseActivityLine);
    end;

    procedure SetTrackingFilterIfNotEmpty()
    begin
        if "Serial No." <> '' then
            SetRange("Serial No.", "Serial No.");
        if "Lot No." <> '' then
            SetRange("Lot No.", "Lot No.");

        OnAfterSetTrackingFilterIfNotEmpty(Rec);
    end;

    procedure SetTrackingFilterFromBinContent(var BinContent: Record "Bin Content")
    begin
        SetFilter("Serial No.", BinContent.GetFilter("Serial No. Filter"));
        SetFilter("Lot No.", BinContent.GetFilter("Lot No. Filter"));

        OnAfterSetTrackingFilterFromBinContent(Rec, BinContent);
    end;

    procedure SetTrackingFilterFromBinContentBuffer(BinContentBuffer: Record "Bin Content Buffer")
    begin
        SetRange("Serial No.", BinContentBuffer."Serial No.");
        SetRange("Lot No.", BinContentBuffer."Lot No.");

        OnAfterSetTrackingFilterFromBinContentBuffer(Rec, BinContentBuffer);
    end;

    procedure SetTrackingFilterFromItemTrackingSetup(ItemTrackingSetup: Record "Item Tracking Setup")
    begin
        SetRange("Serial No.", ItemTrackingSetup."Serial No.");
        SetRange("Lot No.", ItemTrackingSetup."Lot No.");

        OnAfterSetTrackingFilterFromItemTrackingSetup(Rec, ItemTrackingSetup);
    end;

    procedure SetTrackingFilterFromReservEntry(ReservationEntry: Record "Reservation Entry")
    begin
        SetRange("Serial No.", ReservationEntry."Serial No.");
        SetRange("Lot No.", ReservationEntry."Lot No.");

        OnAfterSetTrackingFilterFromReservEntry(Rec, ReservationEntry);
    end;

    procedure SetTrackingFilterFromReservEntryIfRequired(ReservationEntry: Record "Reservation Entry")
    begin
        if ReservationEntry."Serial No." <> '' then
            SetRange("Serial No.", ReservationEntry."Serial No.");
        if ReservationEntry."Lot No." <> '' then
            SetRange("Lot No.", ReservationEntry."Lot No.");

        OnAfterSetTrackingFilterFromReservEntryIfRequired(Rec, ReservationEntry);
    end;

    procedure SetTrackingFilterFromWhseItemTrackingLineIfNotBlank(WhseItemTrackingLine: Record "Whse. Item Tracking Line")
    begin
        if WhseItemTrackingLine."Serial No." <> '' then
            SetRange("Serial No.", WhseItemTrackingLine."Serial No.");
        if WhseItemTrackingLine."Lot No." <> '' then
            SetRange("Lot No.", WhseItemTrackingLine."Lot No.");

        OnAfterSetTrackingFilterFromWhseItemTrackingLineIfNotBlank(Rec, WhseItemTrackingLine);
    end;

    procedure SetTrackingFilterFromWhseActivityLine(WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
        SetRange("Serial No.", WarehouseActivityLine."Serial No.");
        SetRange("Lot No.", WarehouseActivityLine."Lot No.");

        OnAfterSetTrackingFilterFromWhseActivityLine(Rec, WarehouseActivityLine);
    end;

    procedure SetTrackingFilterFromWhseItemTrackingSetup(WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if WhseItemTrackingSetup."Serial No. Required" then
            SetRange("Serial No.", WhseItemTrackingSetup."Serial No.")
        else
            SetFilter("Serial No.", '%1|%2', WhseItemTrackingSetup."Serial No.", '');
        if WhseItemTrackingSetup."Lot No. Required" then
            SetRange("Lot No.", WhseItemTrackingSetup."Lot No.")
        else
            SetFilter("Lot No.", '%1|%2', WhseItemTrackingSetup."Lot No.", '');

        OnAfterSetTrackingFilterFromWhseItemTrackingSetup(Rec, WhseItemTrackingSetup);
    end;

    procedure SetTrackingFilterFromWhseItemTrackingSetupifNotBlank(WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if WhseItemTrackingSetup."Serial No." <> '' then
            if WhseItemTrackingSetup."Serial No. Required" then
                SetRange("Serial No.", WhseItemTrackingSetup."Serial No.")
            else
                SetFilter("Serial No.", '%1|%2', WhseItemTrackingSetup."Serial No.", '');
        if WhseItemTrackingSetup."Lot No." <> '' then
            if WhseItemTrackingSetup."Lot No. Required" then
                SetRange("Lot No.", WhseItemTrackingSetup."Lot No.")
            else
                SetFilter("Lot No.", '%1|%2', WhseItemTrackingSetup."Lot No.", '');

        OnAfterSetTrackingFilterFromWhseItemTrackingSetupifNotBlank(Rec, WhseItemTrackingSetup);
    end;

    procedure SetTrackingFilterToItemIfRequired(var Item: Record Item; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if "Lot No." <> '' then begin
            if WhseItemTrackingSetup."Lot No. Required" then
                Item.SetRange("Lot No. Filter", "Lot No.")
            else
                Item.SetFilter("Lot No. Filter", '%1|%2', "Lot No.", '')
        end else
            Item.SetRange("Lot No. Filter");
        if "Serial No." <> '' then begin
            if WhseItemTrackingSetup."Serial No. Required" then
                Item.SetRange("Serial No. Filter", "Serial No.")
            else
                Item.SetFilter("Serial No. Filter", '%1|%2', "Serial No.", '');
        end else
            Item.SetRange("Serial No. Filter");

        OnAfterSetTrackingFilterToItemIfRequired(Rec, Item, WhseItemTrackingSetup);
    end;

    procedure SetTrackingFilterToItemLedgEntryIfRequired(var ItemLedgerEntry: Record "Item Ledger Entry"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if "Serial No." <> '' then
            if WhseItemTrackingSetup."Serial No. Required" then
                ItemLedgerEntry.SetRange("Serial No.", "Serial No.")
            else
                ItemLedgerEntry.SetFilter("Serial No.", '%1|%2', "Serial No.", '');
        if "Lot No." <> '' then
            if WhseItemTrackingSetup."Lot No. Required" then
                ItemLedgerEntry.SetRange("Lot No.", "Lot No.")
            else
                ItemLedgerEntry.SetFilter("Lot No.", '%1|%2', "Lot No.", '');

        OnAfterSetTrackingFilterToItemLedgEntryIfRequired(Rec, ItemLedgerEntry, WhseItemTrackingSetup);
    end;

    procedure SetTrackingFilterToWhseEntryIfRequired(var WhseEntry: Record "Warehouse Entry"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if "Serial No." <> '' then
            if WhseItemTrackingSetup."Serial No. Required" then
                WhseEntry.SetRange("Serial No.", "Serial No.")
            else
                WhseEntry.SetFilter("Serial No.", '%1|%2', "Serial No.", '');
        if "Lot No." <> '' then
            if WhseItemTrackingSetup."Lot No. Required" then
                WhseEntry.SetRange("Lot No.", "Lot No.")
            else
                WhseEntry.SetFilter("Lot No.", '%1|%2', "Lot No.", '');

        OnAfterSetTrackingFilterToWhseEntryIfRequired(Rec, WhseEntry, WhseItemTrackingSetup);
    end;

    procedure TestTrackingIfRequired(WhseItemTrackingSetup: Record "Item Tracking Setup")
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeTestTrackingIfRequired(Rec, WhseItemTrackingSetup, IsHandled);
        if not IsHandled then begin
            if WhseItemTrackingSetup."Serial No. Required" then begin
                TestField("Serial No.");
                TestField("Qty. (Base)", 1);
            end;
            if WhseItemTrackingSetup."Lot No. Required" then
                TestField("Lot No.");
        end;

        OnAfterTestTrackingIfRequired(Rec, WhseItemTrackingSetup);
    end;

    procedure HasRequiredTracking(WhseItemTrackingSetup: Record "Item Tracking Setup") Result: Boolean
    begin
        Result := true;

        if WhseItemTrackingSetup."Serial No. Required" <> ("Serial No." <> '') then
            Result := false;
        if WhseItemTrackingSetup."Lot No. Required" <> ("Lot No." <> '') then
            Result := false;

        OnAfterHasRequiredTracking(Rec, WhseItemTrackingSetup, Result);
    end;

    local procedure ReNumberWhseActivityLines(var NewWarehouseActivityLine: Record "Warehouse Activity Line"; var WarehouseActivityLine: Record "Warehouse Activity Line"; var NewLineNo: Integer; var LineSpacing: Integer)
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeReNumberWhseActivityLines(NewWarehouseActivityLine, WarehouseActivityLine, NewLineNo, LineSpacing, IsHandled);
        if IsHandled then
            exit;

        ReNumberAllLines(NewWarehouseActivityLine, WarehouseActivityLine."Line No.", NewLineNo);
        WarehouseActivityLine.Get(WarehouseActivityLine."Activity Type", WarehouseActivityLine."No.", NewLineNo);
        LineSpacing := 5000;
    end;

    local procedure ReNumberAllLines(var NewWarehouseActivityLine: Record "Warehouse Activity Line"; OldLineNo: Integer; var NewLineNo: Integer)
    var
        TempWarehouseActivityLine: Record "Warehouse Activity Line" temporary;
        OldLineNos: Dictionary of [Integer, Integer];
        LineNo: Integer;
    begin
        NewWarehouseActivityLine.FindSet();
        repeat
            LineNo += 10000;
            TempWarehouseActivityLine := NewWarehouseActivityLine;
            TempWarehouseActivityLine."Line No." := LineNo;
            TempWarehouseActivityLine.Insert();
            if not OldLineNos.ContainsKey(NewWarehouseActivityLine."Line No.") then
                OldLineNos.Add(LineNo, NewWarehouseActivityLine."Line No.");
            if NewWarehouseActivityLine."Line No." = OldLineNo then
                NewLineNo := LineNo;
        until NewWarehouseActivityLine.Next() = 0;
        NewWarehouseActivityLine.DeleteAll();

        TempWarehouseActivityLine.FindSet();
        repeat
            NewWarehouseActivityLine := TempWarehouseActivityLine;
            NewWarehouseActivityLine.Insert();
            if OldLineNos.ContainsKey(NewWarehouseActivityLine."Line No.") then
                OnAfterReNumberWhseActivLine(NewWarehouseActivityLine, OldLineNos.Get(NewWarehouseActivityLine."Line No."));
        until TempWarehouseActivityLine.Next() = 0;
    end;

    procedure TrackingFilterExists() IsTrackingFilterExist: Boolean
    begin
        IsTrackingFilterExist := (GetFilter("Serial No.") <> '') or (GetFilter("Lot No.") <> '');
        OnAfterTrackingFilterExists(Rec, IsTrackingFilterExist);
    end;

    procedure ValidateQtyWhenSNDefined()
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeValidateQtyWhenSNDefined(Rec, IsHandled);
        if IsHandled then
            exit;

        if Rec."Serial No." = '' then
            exit;

        if not (Rec."Qty. (Base)" in [-1, 0, 1]) then
            Error(ValidValuesIfSNDefinedErr, Rec.FieldCaption("Qty. (Base)"), Rec."Qty. (Base)");

        if not (Rec."Qty. to Handle (Base)" in [-1, 0, 1]) then
            Error(ValidValuesIfSNDefinedErr, Rec.FieldCaption("Qty. to Handle (Base)"), Rec."Qty. to Handle (Base)");
    end;

    local procedure ValidateQuantityIsBalanced()
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeValidateQuantityIsBalanced(Rec, xRec, IsHandled);
        if IsHandled then
            exit;

        UOMMgt.ValidateQtyIsBalanced(Quantity, "Qty. (Base)", "Qty. to Handle", "Qty. to Handle (Base)", "Qty. Handled", "Qty. Handled (Base)");
    end;

    local procedure RunWhsePickCard(var WarehouseActivityHeader: Record "Warehouse Activity Header")
    var
        WarehousePick: Page "Warehouse Pick";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeRunWhsePickCard(WarehouseActivityHeader, IsHandled);
        if IsHandled then
            exit;

        WarehousePick.SetTableView(WarehouseActivityHeader);
        WarehousePick.RunModal();
    end;

    local procedure CalcBaseQty(Qty: Decimal; FromFieldName: Text; ToFieldName: Text): Decimal
    begin
        OnBeforeCalcBaseQty(Rec, Qty, FromFieldName, ToFieldName);

        exit(
            UOMMgt.CalcBaseQty(
                "Item No.", "Variant Code", "Unit of Measure Code", Qty, "Qty. per Unit of Measure", "Qty. Rounding Precision (Base)", FieldCaption("Qty. Rounding Precision"), FromFieldName, ToFieldName));
    end;

    local procedure ShouldLookupBinContent(): Boolean
    begin
        exit(
            ("Activity Type".AsInteger() <= "Activity Type"::Movement.AsInteger()) or
            ("Action Type" <> "Action Type"::Place));
    end;

    procedure Lock()
    begin
        LockTable();
        if FindLast() then;
    end;

    procedure ResetQtyToHandleOnReservation()
    begin
        if ("Qty. to Handle" = 0) and TrackingExists() then
            if RegisteredWhseActLineIsEmpty() then
                if ItemTrackingMgt.GetWhseItemTrkgSetup("Item No.") then
                    UpdateReservation(Rec, false);
    end;

    procedure TestNonSpecificItemTracking()
    var
        WhseItemTrackingSetup: Record "Item Tracking Setup";
        ItemTrackingSetup: Record "Item Tracking Setup";
        NonWhseItemTrackingSetup: Record "Item Tracking Setup";
        ItemLedgerEntryType: Enum "Item Ledger Entry Type";
    begin
        case "Source Document" of
            "Source Document"::"Sales Order":
                ItemLedgerEntryType := ItemLedgerEntryType::Sale;
            "Source Document"::"Purchase Return Order":
                ItemLedgerEntryType := ItemLedgerEntryType::Purchase;
            "Source Document"::"Outbound Transfer":
                ItemLedgerEntryType := ItemLedgerEntryType::Transfer;
            "Source Document"::"Prod. Consumption":
                ItemLedgerEntryType := ItemLedgerEntryType::Consumption;
            "Source Document"::"Assembly Consumption":
                ItemLedgerEntryType := ItemLedgerEntryType::"Assembly Consumption";
            else
                exit;
        end;

        GetItem();
        ItemTrackingMgt.GetWhseItemTrkgSetup("Item No.", WhseItemTrackingSetup);
        ItemTrackingMgt.GetItemTrackingSetup(ItemTrackingCode, ItemLedgerEntryType, false, ItemTrackingSetup);

        NonWhseItemTrackingSetup.Code := ItemTrackingCode.Code;
        NonWhseItemTrackingSetup.GetNonWarehouseTrackingRequirements(WhseItemTrackingSetup, ItemTrackingSetup);

        TestTrackingIfRequired(NonWhseItemTrackingSetup);
    end;

    internal procedure CopyItemTrackingToRelatedLine(xWhseActivLine: Record "Warehouse Activity Line"; FieldNo: Integer)
    var
        WarehouseActivityLine2: Record "Warehouse Activity Line";
        IsHandled: Boolean;
    begin
        OnBeforeCopyItemTrackingToRelatedLine(Rec, xWhseActivLine, FieldNo, IsHandled);
        if IsHandled then
            exit;

        if ("Activity Type" in ["Activity Type"::"Invt. Put-away", "Activity Type"::"Invt. Pick"]) then
            exit;

        if "Action Type" <> "Action Type"::Take then
            exit;

        if "Sorting Sequence No." <> 0 then
            WarehouseActivityLine2.SetCurrentKey("Activity Type", "No.", "Sorting Sequence No.");
        WarehouseActivityLine2."Activity Type" := "Activity Type";
        WarehouseActivityLine2."No." := "No.";
        WarehouseActivityLine2."Line No." := "Line No.";
        WarehouseActivityLine2."Sorting Sequence No." := "Sorting Sequence No.";
        WarehouseActivityLine2.SetRange("Whse. Document Type", "Whse. Document Type");
        WarehouseActivityLine2.SetRange("Whse. Document No.", "Whse. Document No.");
        WarehouseActivityLine2.SetRange("Whse. Document Line No.", "Whse. Document Line No.");
        WarehouseActivityLine2.SetRange("Breakbulk No.", "Breakbulk No.");
        WarehouseActivityLine2.SetRange("Source No.", "Source No.");
        WarehouseActivityLine2.SetRange("Source Line No.", "Source Line No.");
        WarehouseActivityLine2.SetRange("Source Subline No.", "Source Subline No.");
        WarehouseActivityLine2.SetRange("Action Type", WarehouseActivityLine2."Action Type"::Place);
        WarehouseActivityLine2.SetTrackingFilterFromWhseActivityLine(xWhseActivLine);
        WarehouseActivityLine2.SetRange("Qty. (Base)", "Qty. (Base)");
        if WarehouseActivityLine2.Find('><') then begin
            WarehouseActivityLine2.CopyTrackingFromWhseActivityLine(Rec);
            WarehouseActivityLine2."Expiration Date" := 0D;
            WarehouseActivityLine2.UpdateExpirationDate(FieldNo);
            WarehouseActivityLine2."Warranty Date" := "Warranty Date";
            WarehouseActivityLine2.Modify();
        end;
    end;

    procedure UpdateExpirationDate(FieldNo: Integer)
    var
        ExpDate: Date;
        EntriesExist: Boolean;
    begin
        if (FieldNo = FieldNo("Lot No.")) and ("Lot No." <> '') or
           (FieldNo = FieldNo("Serial No.")) and ("Serial No." <> '') or
           (FieldNo = FieldNo("Package No.")) and ("Package No." <> '')
        then
            ExpDate := ItemTrackingMgt.ExistingExpirationDate(Rec, false, EntriesExist);

        if ExpDate <> 0D then
            "Expiration Date" := ExpDate;
    end;

    local procedure GetDeleteWarehouseActivityLineNotificationID(): Guid
    begin
        exit('963A9FD3-11E8-4CAA-BE3A-7F8CEC9EF8ED');
    end;

    local procedure SendDeleteWarehouseActivityLineNotification()
    var
        NotificationLifecycleMgt: Codeunit "Notification Lifecycle Mgt.";
        NotificationToSend: Notification;
    begin
        if not GuiAllowed() then
            exit;

        NotificationToSend.Id := GetDeleteWarehouseActivityLineNotificationID();
        NotificationToSend.Recall();
        NotificationToSend.Message := Text013;
        NotificationLifecycleMgt.SendNotification(NotificationToSend, RecordId());
    end;

    local procedure UpdateDoNotFillQtyToHandle(WarehouseActivityLine: Record "Warehouse Activity Line")
    var
        WarehouseActivityHeader: Record "Warehouse Activity Header";
    begin
        if not WarehouseActivityHeader.Get(WarehouseActivityLine."Activity Type", WarehouseActivityLine."No.") then
            exit;

        if not WarehouseActivityHeader."Do Not Fill Qty. to Handle" then
            exit;

        WarehouseActivityHeader."Do Not Fill Qty. to Handle" := false;
        WarehouseActivityHeader.Modify();
    end;

    local procedure UpdateQtyOnRelatedPlaceLine(FromWhseActivityLine: Record "Warehouse Activity Line"; xWhseActivityLine: Record "Warehouse Activity Line")
    var
        Item: Record Item;
        WhseActivityLine: Record "Warehouse Activity Line";
        QuantityUpdated: Boolean;
    begin
        if CurrFieldNo = 0 then
            exit;

        if FromWhseActivityLine."Source Document" <> FromWhseActivityLine."Source Document"::"Prod. Consumption" then
            exit;

        if FromWhseActivityLine."Activity Type" <> FromWhseActivityLine."Activity Type"::Pick then
            exit;

        if (xWhseActivityLine.Quantity = 0) and (FromWhseActivityLine.Quantity <> 0) then
            exit;

        if (xWhseActivityLine.Quantity <> 0) and (FromWhseActivityLine.Quantity = 0) then
            FromWhseActivityLine.TestField(Quantity);

        if FromWhseActivityLine."Qty. Outstanding (Base)" < 0 then
            Error(OutstandingQtyCannotbeLessThanZeroErr);

        Item.SetLoadFields("No.", "Allow Whse. Overpick");
        Item.Get(FromWhseActivityLine."Item No.");
        Item.TestField("Allow Whse. Overpick");

        SetFilterFromWhseActivityLineToUpdateQty(WhseActivityLine, FromWhseActivityLine, xWhseActivityLine, QuantityUpdated);
        if QuantityUpdated then
            WhseActivityLine.Modify(true);
    end;

    local procedure SetFilterFromWhseActivityLineToUpdateQty(
        var WhseActivityLine: Record "Warehouse Activity Line";
        FromWhseActivityLine: Record "Warehouse Activity Line";
        xWhseActivityLine: Record "Warehouse Activity Line";
        var QuantityUpdated: Boolean)
    begin
        WhseActivityLine.SetLoadFields("Activity Type", "No.", "Line No.", "Item No.", "Variant Code", "Location Code", "Action Type", Quantity, "Lot No.", "Serial No.", "Source No.", "Source Line No.", "Source Document");
        WhseActivityLine.SetRange("Activity Type", FromWhseActivityLine."Activity Type");
        WhseActivityLine.SetRange("No.", FromWhseActivityLine."No.");
        WhseActivityLine.SetFilter("Line No.", '>%1', FromWhseActivityLine."Line No.");
        WhseActivityLine.SetRange("Item No.", FromWhseActivityLine."Item No.");
        WhseActivityLine.SetRange("Variant Code", FromWhseActivityLine."Variant Code");
        WhseActivityLine.SetRange("Location Code", FromWhseActivityLine."Location Code");
        WhseActivityLine.SetRange("Action Type", WhseActivityLine."Action Type"::Place);
        WhseActivityLine.SetRange(Quantity, xWhseActivityLine.Quantity);
        WhseActivityLine.SetRange("Lot No.", FromWhseActivityLine."Lot No.");
        WhseActivityLine.SetRange("Serial No.", FromWhseActivityLine."Serial No.");
        WhseActivityLine.SetRange("Source Document", FromWhseActivityLine."Source Document");
        WhseActivityLine.SetRange("Source No.", FromWhseActivityLine."Source No.");
        WhseActivityLine.SetRange("Source Line No.", FromWhseActivityLine."Source Line No.");
        if WhseActivityLine.FindFirst() then begin
            WhseActivityLine.Validate(Quantity, FromWhseActivityLine.Quantity);
            QuantityUpdated := true;
            exit;
        end;

        WhseActivityLine.SetRange("Line No.");
        WhseActivityLine.SetFilter("Line No.", '<>%1', FromWhseActivityLine."Line No.");
        if WhseActivityLine.FindFirst() then begin
            WhseActivityLine.Validate(Quantity, FromWhseActivityLine.Quantity);
            QuantityUpdated := true;
        end
    end;

    local procedure OverReceiptProcessing(): Boolean
    var
        OverReceiptMgt: Codeunit "Over-Receipt Mgt.";
    begin
        if ("Source Document" <> "Source Document"::"Purchase Order") then
            exit(false);

        if CurrFieldNo <> FieldNo("Qty. to Handle") then
            exit(false);

        if not OverReceiptMgt.IsOverReceiptAllowed() or ("Qty. to Handle" <= "Qty. Outstanding") then
            exit(false);

        Validate("Over-Receipt Quantity", "Qty. to Handle" - Quantity + "Qty. Handled" + "Over-Receipt Quantity");
        exit(true);
    end;


    [IntegrationEvent(false, false)]
    local procedure OnAfterAutofillQtyToHandle(var WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterAutofillQtyToHandleLine(var WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterClearTracking(var WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterClearTrackingFilter(var WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCopyTrackingFromSpec(var WarehouseActivityLine: Record "Warehouse Activity Line"; TrackingSpecification: Record "Tracking Specification")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCopyTrackingFromItemTrackingSetup(var WarehouseActivityLine: Record "Warehouse Activity Line"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCopyTrackingFromPostedWhseRcptLine(var WarehouseActivityLine: Record "Warehouse Activity Line"; PostedWhseRcptLine: Record "Posted Whse. Receipt Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCopyTrackingFromWhseItemTrackingLine(var WarehouseActivityLine: Record "Warehouse Activity Line"; WhseItemTrackingLine: Record "Whse. Item Tracking Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCopyTrackingFromWhseActivityLine(var WarehouseActivityLine: Record "Warehouse Activity Line"; FromWarehouseActivityLine: Record "Warehouse Activity Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterDeleteQtyToHandle(var WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterInitTrackingSpecFromWhseActivLine(var TrackingSpecification: Record "Tracking Specification"; WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterLookupTrackingSummary(var WarehouseActivityLine: Record "Warehouse Activity Line"; var TempTrackingSpecification: Record "Tracking Specification" temporary; TrackingType: Enum "Item Tracking Type")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetTrackingFilterIfNotEmpty(var WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetTrackingFilterFromItemTrackingSetup(var WarehouseActivityLine: Record "Warehouse Activity Line"; ItemTrackingSetup: Record "Item Tracking Setup")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetTrackingFilterFromBinContent(var WarehouseActivityLine: Record "Warehouse Activity Line"; var BinContent: Record "Bin Content")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetTrackingFilterFromBinContentBuffer(var WarehouseActivityLine: Record "Warehouse Activity Line"; var BinContentBuffer: Record "Bin Content Buffer")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetTrackingFilterFromReservEntry(var WarehouseActivityLine: Record "Warehouse Activity Line"; ReservEntry: Record "Reservation Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetTrackingFilterFromReservEntryIfRequired(var WarehouseActivityLine: Record "Warehouse Activity Line"; ReservEntry: Record "Reservation Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetTrackingFilterFromWhseActivityLine(var WarehouseActivityLine: Record "Warehouse Activity Line"; FromWarehouseActivityLine: Record "Warehouse Activity Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetTrackingFilterFromWhseItemTrackingLineIfNotBlank(var WarehouseActivityLine: Record "Warehouse Activity Line"; WhseItemTrackingLine: Record "Whse. Item Tracking Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetTrackingFilterFromWhseItemTrackingSetupifNotBlank(var WarehouseActivityLine: Record "Warehouse Activity Line"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetTrackingFilterFromWhseItemTrackingSetup(var WarehouseActivityLine: Record "Warehouse Activity Line"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetTrackingFilterToItemIfRequired(var WarehouseActivityLine: Record "Warehouse Activity Line"; var Item: Record Item; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetTrackingFilterToItemLedgEntryIfRequired(var WarehouseActivityLine: Record "Warehouse Activity Line"; var ItemLedgerEntry: Record "Item Ledger Entry"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetTrackingFilterToWhseEntryIfRequired(var WarehouseActivityLine: Record "Warehouse Activity Line"; var WhseEntry: Record "Warehouse Entry"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterShowDeletedMessage(var WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSplitLines(var WarehouseActivityLine: Record "Warehouse Activity Line"; NewWarehouseActivityLine: Record "Warehouse Activity Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterTrackingFilterExists(var WarehouseActivityLine: Record "Warehouse Activity Line"; var IsTrackingFilterExist: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterTransferFromShptLine(var WarehouseActivityLine: Record "Warehouse Activity Line"; WarehouseShipmentLine: Record "Warehouse Shipment Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterTransferFromIntPickLine(var WarehouseActivityLine: Record "Warehouse Activity Line"; WhseInternalPickLine: Record "Whse. Internal Pick Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterTransferFromAssemblyLine(var WarehouseActivityLine: Record "Warehouse Activity Line"; AssemblyLine: Record "Assembly Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterTransferAllButWhseDocDetailsFromAssemblyLine(var WarehouseActivityLine: Record "Warehouse Activity Line"; AssemblyLine: Record "Assembly Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterTransferFromMovWkshLine(var WarehouseActivityLine: Record "Warehouse Activity Line"; WhseWorksheetLine: Record "Whse. Worksheet Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterTransferFromPickWkshLine(var WarehouseActivityLine: Record "Warehouse Activity Line"; WhseWorksheetLine: Record "Whse. Worksheet Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterTestTrackingIfRequired(var WarehouseActivityLine: Record "Warehouse Activity Line"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterHasRequiredTracking(var WarehouseActivityLine: Record "Warehouse Activity Line"; WhseItemTrackingSetup: Record "Item Tracking Setup"; var Result: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterTrackingExists(WarehouseActivityLine: Record "Warehouse Activity Line"; var IsTrackingExist: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterUpdateQtyToHandleWhseActivLine(var WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeAutofillQtyToHandle(var WarehouseActivityLine: Record "Warehouse Activity Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeAutofillQtyToHandleLine(var WarehouseActivityLine: Record "Warehouse Activity Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCalcQty(var WarehouseActivityLine: Record "Warehouse Activity Line"; QtyBase: Decimal; var NewQtyBase: Decimal; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCheckBinInSourceDoc(var WarehouseActivityLine: Record "Warehouse Activity Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCheckBinInSourceDoc(var WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCheckReservedItemTrkg(var WarehouseActivityLine: Record "Warehouse Activity Line"; CheckType: Enum "Item Tracking Type"; ItemTrkgCode: Code[50]; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCheckExceedQtyAvailBase(var WarehouseActivityLine: Record "Warehouse Activity Line"; QtyAvailBase: Decimal; NewBinCode: Code[20]; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCheckBinCodeFromWhseShptLine(var WarehouseActivityLine: Record "Warehouse Activity Line"; WhseShptLine: Record "Warehouse Shipment Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCheckInvalidBinCode(var WarehouseActivityLine: Record "Warehouse Activity Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCheckLine(WhseActivLine: Record "Warehouse Activity Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCheckWhseDocLine(var WarehouseActivityLine: Record "Warehouse Activity Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCheckSNSpecificationExists(var WarehouseActivityLine: Record "Warehouse Activity Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeConfirmWhseActivLinesDeletionRecreate(WarehouseActivityLine: Record "Warehouse Activity Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeConfirmWhseActivLinesDeletionOutOfBalance(WarehouseActivityLine: Record "Warehouse Activity Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeSplitLines(var WarehouseActivityLine: Record "Warehouse Activity Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeDeleteRelatedWhseActivLines(var WhseActivLine: Record "Warehouse Activity Line"; CalledFromHeader: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeDeleteQtyToHandle(var WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeDeleteWhseActivLine2(var WarehouseActivityLine2: Record "Warehouse Activity Line"; CalledFromHeader: Boolean; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeFindBinCode(var WarehouseActivityLine: Record "Warehouse Activity Line"; var Item: Record Item; var BinCode: Code[20]; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeFindBinContent(var WarehouseActivityLine: Record "Warehouse Activity Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeFindLotNoBySerialNo(var WarehouseActivityLine: Record "Warehouse Activity Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeGetUOMCode(var WarehouseActivityLine: Record "Warehouse Activity Line"; var UOMCode: Code[10]; var IsHandled: Boolean; Location: Record Location)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeInsertNewWhseActivLine(var NewWarehouseActivityLine: Record "Warehouse Activity Line"; var WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeLookUpTrackingSummary(var WhseActivLine: Record "Warehouse Activity Line"; TrackingType: Enum "Item Tracking Type"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeModifyOldWhseActivLine(var WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeSetWhseItemTrkgLineFiltersWhseShipment(var WarehouseActivityLine: Record "Warehouse Activity Line"; var WhseItemTrkgLine: Record "Whse. Item Tracking Line"; WhseActivLine: Record "Warehouse Activity Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeShowDeletedMessage(var WarehouseActivityLine: Record "Warehouse Activity Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeShowWhseDoc(var WarehouseActivityLine: Record "Warehouse Activity Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnShowWhseDoc(var WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateQtyToHandle(var WarehouseActivityLine: Record "Warehouse Activity Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateSerialNo(var WarehouseActivityLine: Record "Warehouse Activity Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateLotNo(var WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateQtyOutstanding(var WarehouseActivityLine: Record "Warehouse Activity Line"; xWarehouseActivityLine: Record "Warehouse Activity Line"; CurrentFieldNo: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateVariantCode(var WarehouseActivityLine: Record "Warehouse Activity Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateQtyBase(var WarehouseActivityLine: Record "Warehouse Activity Line"; xWarehouseActivityLine: Record "Warehouse Activity Line"; CurrentFieldNo: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnChangeUOMCodeOnBeforeRecModify(var WarehouseActivityLine: Record "Warehouse Activity Line"; Location: Record Location)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCreateNewUOMLineOnBeforeNewWhseActivLineInsert(var NewWarehouseActivityLine: Record "Warehouse Activity Line"; WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCreateNewUOMLineOnBeforeNewWhseActivLineModify(var NewWarehouseActivityLine: Record "Warehouse Activity Line"; var WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnLookUpTrackingSummaryOnAfterAssistEditTrackingNo(var WarehouseActivityLine: Record "Warehouse Activity Line"; var TrackingSpecification: Record "Tracking Specification"; TrackingType: Enum "Item Tracking Type")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnLookUpTrackingSummaryOnAfterCheckDataSet(WarehouseActivityLine: Record "Warehouse Activity Line"; Item: Record Item; var TempTrackingSpecification: Record "Tracking Specification" temporary)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnLookUpTrackingSummaryOnAfterAssignSerialNoTracking(var WarehouseActivityLine: Record "Warehouse Activity Line"; TempTrackingSpecification: Record "Tracking Specification" temporary)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnLookUpTrackingSummaryOnAfterAssignLotNoTracking(var WarehouseActivityLine: Record "Warehouse Activity Line"; TempTrackingSpecification: Record "Tracking Specification" temporary)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateBinCodeOnAfterGetBin(var WarehouseActivityLine: Record "Warehouse Activity Line"; Bin: Record Bin)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateBinCodeOnAfterCalcQtyAvailBase(var WarehouseActivityLine: Record "Warehouse Activity Line"; QtyAvailBase: Decimal; NewBinCode: Code[20])
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateItemNoOnAfterValidateUoMCode(var WarehouseActivityLine: Record "Warehouse Activity Line"; Item: Record Item; CurrentFieldNo: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateQtyToHandleOnAfterCalcQtyToHandleBase(var WarehouseActivityLine: Record "Warehouse Activity Line"; QtyToHandleBase: Decimal; var NewQtyToHandleBase: Decimal)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateQtyToHandleOnBeforeCalcQtyToHandleBase(var WarehouseActivityLine: Record "Warehouse Activity Line"; var xWarehouseActivityLine: Record "Warehouse Activity Line"; Location: Record Location; CallingFieldNo: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateVariantCodeOnAfterGetItemVariant(var WarehouseActivityLine: Record "Warehouse Activity Line"; ItemVariant: Record "Item Variant"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnBeforeCheckBin(var Bin: Record Bin; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeChangeUOMCode(var WhseActivLine: Record "Warehouse Activity Line"; var WhseActivLine2: Record "Warehouse Activity Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnBeforeReNumberWhseActivityLines(var NewWarehouseActivityLine: Record "Warehouse Activity Line"; var WarehouseActivityLine: Record "Warehouse Activity Line"; var NewLineNo: Integer; var LineSpacing: Integer; var sHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateQuantityIsBalanced(var WhseActivLine: Record "Warehouse Activity Line"; xWhseActivLine: Record "Warehouse Activity Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateQtyWhenSNDefined(WhseActivLine: Record "Warehouse Activity Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCheckReservedItemTrkgOnCheckTypeElseCase(var WarehouseActivityLine: Record "Warehouse Activity Line"; CheckType: Enum "Item Tracking Type"; ItemTrkgCode: Code[50])
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnDeleteRelatedWhseActivLinesOnBeforeWhseActivLine2Find(var WhseActivLine: Record "Warehouse Activity Line"; var WhseActivLine2: Record "Warehouse Activity Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnDeleteRelatedWhseActivLinesOnBeforeConfirmWhseActivLinesDeletionOutOfBalance(WhseActivLine: record "Warehouse Activity Line"; CalledFromHeader: Boolean; var DeleteLineConfirmed: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnDeleteRelatedWhseActivLinesOnBeforeDeleteWhseActivLine2(var WarehouseActivityLine: Record "Warehouse Activity Line"; var WarehouseActivityLine2: Record "Warehouse Activity Line"; var CalledFromHeader: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCheckIncreaseCapacityOnBeforeCheckIncreaseBinContent(var WarehouseActivityLine: Record "Warehouse Activity Line"; var Bin: Record Bin; DeductCubage: Decimal; DeductWeight: Decimal; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateBinCodeOnAfterCheckInvalidBinCode(var WarehouseActivityLine: Record "Warehouse Activity Line"; xWarehouseActivityLine: Record "Warehouse Activity Line"; CurrFieldNo: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeRunWhsePickCard(var WhseActivHeader: Record "Warehouse Activity Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnConfirmWhseActivLinesDeletionOutOfBalanceOnAfterWhseActivLine3SetFilters(var WhseActivLine: Record "Warehouse Activity Line"; var WhseActivLine2: Record "Warehouse Activity Line"; var WhseActivLine3: Record "Warehouse Activity Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCheckReservedItemTrkg(var WarehouseActivityLine: Record "Warehouse Activity Line"; xRec: Record "Warehouse Activity Line"; CurrFieldNo: Integer; LineReservedQty: Integer; ReservedQty: Decimal)
    begin
        // use ReservedQty parameter instead of LineReservedQty for the same purpose
    end;

    [IntegrationEvent(false, false)]
    local procedure OnSplitLineOnBeforeRenumberAllLines(var WarehouseActivityLine: Record "Warehouse Activity Line"; var LineSpacing: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnSplitLineOnAfterInitNewWhseActivLine(var WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnUpdateReservationOnBeforeTempTrackingSpecificationInsert(var TempTrackingSpecification: Record "Tracking Specification" temporary; var TempWarehouseActivityLine: Record "Warehouse Activity Line" temporary)
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnUpdateQtyToHandleOnBeforeWhseActivLineModify(var WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeDeleteBinContent(var WarehouseActivityLine: Record "Warehouse Activity Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterTransferFromJobPlanningLine(var WarehouseActivityLine: Record "Warehouse Activity Line"; JobPlanningLine: Record "Job Planning Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetSourceFilter(var WarehouseActivityLine: Record "Warehouse Activity Line"; SourceType: Integer; SourceSubtype: Option; SourceNo: Code[20]; SourceLineNo: Integer; SourceSubLineNo: Integer; SetKey: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCalcBaseQty(var WarehouseActivityLine: Record "Warehouse Activity Line"; var Qty: Decimal; FromFieldName: Text; ToFieldName: Text)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnDeleteRelatedWhseActivLinesOnAfterUpdateRelatedItemTrkg(var WarehouseActivityLine: Record "Warehouse Activity Line"; var WarehouseActivityLine2: Record "Warehouse Activity Line"; var CalledFromHeader: Boolean)
    begin
    end;

#pragma warning disable AS0077
    [IntegrationEvent(false, false)]
    local procedure OnBeforeTestTrackingIfRequired(WarehouseActivityLine: Record "Warehouse Activity Line"; WhseItemTrackingSetup: Record "Item Tracking Setup"; var IsHandled: Boolean)
    begin
    end;
#pragma warning restore AS0077

    [IntegrationEvent(false, false)]
    local procedure OnCheckSplitLineOnBeforeTestFieldActionType(var WarehouseActivityLine: Record "Warehouse Activity Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure CheckWhseDocLineOnCheckSourceDocument(var WarehouseActivityLine: Record "Warehouse Activity Line"; WhseDocType: Enum "Warehouse Activity Document Type")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnUpdateRelatedItemTrkgForInvtMovement(var WarehouseActivityLine: Record "Warehouse Activity Line"; var WhseItemTrackingLine: Record "Whse. Item Tracking Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeUpdateQtyToHandleOnSplitLine(var WarehouseActivityLine: Record "Warehouse Activity Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnAfterReNumberWhseActivLine(var WarehouseActivityLine: Record "Warehouse Activity Line"; OldLineNo: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCopyItemTrackingToRelatedLine(WarehouseActivityLine: Record "Warehouse Activity Line"; xWarehouseActivityLine: Record "Warehouse Activity Line"; FieldNo: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeAutofillQtyToHandleOnLine(var WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeDeleteQtyToHandleOnLine(var WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetSource(var WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
    end;
}