Codeunit 7322 Create Inventory Pick/Movement

App
Base Application
Namespace
Microsoft.Warehouse.Activity
Versions
17-28

Procedures, 39Events, 130Obsolete, 7

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Warehouse/Activity/CreateInventoryPickMovement.Codeunit.al2958 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.Foundation.UOM;
using Microsoft.Inventory.Item;
using Microsoft.Inventory.Location;
using Microsoft.Inventory.Tracking;
using Microsoft.Inventory.Transfer;
using Microsoft.Projects.Project.Job;
using Microsoft.Projects.Project.Planning;
using Microsoft.Purchases.Document;
using Microsoft.Sales.Document;
using Microsoft.Warehouse.Availability;
using Microsoft.Warehouse.Comment;
using Microsoft.Warehouse.InternalDocument;
using Microsoft.Warehouse.Journal;
using Microsoft.Warehouse.Request;
using Microsoft.Warehouse.Structure;
using Microsoft.Warehouse.Tracking;
using Microsoft.Warehouse.Worksheet;
using System.Telemetry;

codeunit 7322 "Create Inventory Pick/Movement"
{
    Permissions = TableData "Whse. Item Tracking Line" = rimd;
    TableNo = "Warehouse Activity Header";

    trigger OnRun()
    begin
        OnBeforeOnRun(Rec);
        CurrWarehouseActivityHeader := Rec;
        Code();
        Rec := CurrWarehouseActivityHeader;
    end;

    var
        CurrWarehouseRequest: Record "Warehouse Request";
        CurrWarehouseActivityHeader: Record "Warehouse Activity Header";
        CurrLocation: Record Location;
        CurrItem: Record Item;
        CurrBin: Record Bin;
        CurrStockKeepingUnit: Record "Stockkeeping Unit";
        TempTrackingSpecification: Record "Tracking Specification" temporary;
        TempInternalMovementLine: Record "Internal Movement Line" temporary;
        TempReservationEntry: Record "Reservation Entry" temporary;
        WarehouseSourceFilter: Record "Warehouse Source Filter";
        WMSManagement: Codeunit "WMS Management";
        ItemTrackingManagement: Codeunit "Item Tracking Management";
        FeatureTelemetry: Codeunit "Feature Telemetry";
        SourceDocRecordRef: RecordRef;
        SourceDocRecordVar: Variant;
        ReservedFromStock: Enum "Reservation From Stock";
        VendorDocNo: Code[35];
        FromBinCode: Code[20];
        ExpiredItemMessageText: Text[100];
        PostingDate: Date;
        NextLineNo: Integer;
        LastTempHandlingSpecNo: Integer;
        ATOInvtMovementsCreated: Integer;
        TotalATOInvtMovementsToBeCreated: Integer;
        HideDialog: Boolean;
        CheckLineExist: Boolean;
        AutoCreation: Boolean;
        LineCreated: Boolean;
        CompleteShipment: Boolean;
        PrintDocument: Boolean;
        ShowError: Boolean;
        IsInvtMovement: Boolean;
        IsBlankInvtMovement: Boolean;
        ApplySourceFilters: Boolean;
        HasExpiredItems: Boolean;
        SuppressCommit: Boolean;
        HideDialogForTracking: Boolean;
        NothingToHandleMsg: Label 'There is nothing to handle.';
        QtyNotSufficientOnSalesErr: Label 'Quantity available to pick is not sufficient to fulfill shipping advise %1 for sales line with Document Type %2, Document No. %3, Line No. %4.', Comment = '%1=Shipping advise no., %2=Document Type, %3=Document No., %4=Line No.';
        QtyNotSufficientOnTransferErr: Label 'Quantity available to pick is not sufficient to fulfill shipping advise %1 for transfer line with Document No. %2, Line No. %3.', Comment = '%1=Shipping advise no., %2=Document No., %3=Line No.';
        ActivityCreatedMsg: Label '%1 activity number %2 has been created.', Comment = '%1=Warehouse Activity Type,%2=Warehouse Activity number';
        TrackingNotFullyAppliedMsg: Label '%1 activity number %2 has been created.\\Item tracking lines cannot be fully applied.', Comment = '%1=Warehouse Activity Type,%2=Warehouse Activity No.';
        CreateInvtMvmtQst: Label 'Do you want to create Inventory Movement?';
        BinPolicyTelemetryCategoryTok: Label 'Bin Policy', Locked = true;
        DefaultBinPickPolicyTelemetryTok: Label 'Default Bin Pick Policy in used for inventory pick.', Locked = true;
        RankingBinPickPolicyTelemetryTok: Label 'Bin Ranking Bin Pick Policy in used for inventory pick.', Locked = true;
        ProdAsmJobWhseHandlingTelemetryCategoryTok: Label 'Prod/Asm/Project Whse. Handling', Locked = true;
        ProdAsmJobWhseHandlingTelemetryTok: Label 'Prod/Asm/Project Whse. Handling in used for warehouse pick.', Locked = true;

    local procedure "Code"()
    var
        IsHandled: Boolean;
        SuppressMessage: Boolean;
    begin
        CurrWarehouseActivityHeader.TestField("No.");
        CurrWarehouseActivityHeader.TestField("Location Code");

        if not HideDialog then
            if not GetWhseRequest(CurrWarehouseRequest) then
                exit;

        IsHandled := false;
        OnBeforeCreatePickOrMoveLines(CurrWarehouseRequest, CurrWarehouseActivityHeader, LineCreated, IsHandled, HideDialog, IsInvtMovement, IsBlankInvtMovement, CompleteShipment);
        if IsHandled then
            exit;

        if not GetSourceDocHeader() then
            exit;

        UpdateWhseActivHeader(CurrWarehouseRequest);

        case CurrWarehouseRequest."Source Document" of
            CurrWarehouseRequest."Source Document"::"Purchase Order":
                CreatePickOrMoveFromPurchase(SourceDocRecordVar);
            CurrWarehouseRequest."Source Document"::"Purchase Return Order":
                CreatePickOrMoveFromPurchase(SourceDocRecordVar);
            CurrWarehouseRequest."Source Document"::"Sales Order":
                CreatePickOrMoveFromSales(SourceDocRecordVar);
            CurrWarehouseRequest."Source Document"::"Sales Return Order":
                CreatePickOrMoveFromSales(SourceDocRecordVar);
            CurrWarehouseRequest."Source Document"::"Outbound Transfer":
                CreatePickOrMoveFromTransfer(SourceDocRecordVar);
            CurrWarehouseRequest."Source Document"::"Job Usage":
                CreatePickOrMoveFromJobPlanning(SourceDocRecordVar);
            else
                OnCreatePickOrMoveFromWhseRequest(
                    CurrWarehouseRequest, SourceDocRecordRef, LineCreated, CurrWarehouseActivityHeader, CurrLocation, HideDialog,
                    CompleteShipment, CheckLineExist, IsInvtMovement, WarehouseSourceFilter, ApplySourceFilters, ReservedFromStock, SourceDocRecordVar);
        end;

        SuppressMessage := false;
        IsHandled := false;
        OnCodeOnAfterCreatePickOrMoveLines(CurrWarehouseRequest, CurrWarehouseActivityHeader, LineCreated, AutoCreation, SuppressMessage, IsHandled);
        if IsHandled then
            exit;

        if LineCreated then
            ModifyWarehouseActivityHeader(CurrWarehouseActivityHeader, CurrWarehouseRequest)
        else
            if not AutoCreation then
                if not SuppressMessage then
                    Message(NothingToHandleMsg + ExpiredItemMessageText);

        OnAfterCreateInventoryPickMovement(CurrWarehouseRequest, LineCreated, CurrWarehouseActivityHeader);
    end;

    local procedure ModifyWarehouseActivityHeader(var WarehouseActivityHeader: Record "Warehouse Activity Header"; WarehouseRequest: Record "Warehouse Request")
    begin
        OnBeforeModifyWarehouseActivityHeader(WarehouseActivityHeader, WarehouseRequest, CurrLocation);
        WarehouseActivityHeader.Modify();
    end;

    local procedure GetWhseRequest(var WarehouseRequest: Record "Warehouse Request") Result: Boolean
    var
        IsHandled: Boolean;
    begin
        WarehouseRequest.FilterGroup := 2;
        WarehouseRequest.SetRange(Type, WarehouseRequest.Type::Outbound);
        WarehouseRequest.SetRange("Location Code", CurrWarehouseActivityHeader."Location Code");
        WarehouseRequest.SetRange("Document Status", WarehouseRequest."Document Status"::Released);
        if CurrWarehouseActivityHeader."Source Document" <> CurrWarehouseActivityHeader."Source Document"::" " then
            WarehouseRequest.SetRange("Source Document", CurrWarehouseActivityHeader."Source Document")
        else
            if CurrWarehouseActivityHeader.Type = CurrWarehouseActivityHeader.Type::"Invt. Movement" then
                WarehouseRequest.SetFilter("Source Document", '%1|%2|%3|%4',
                  CurrWarehouseActivityHeader."Source Document"::"Prod. Consumption",
                  CurrWarehouseActivityHeader."Source Document"::"Prod. Output",
                  CurrWarehouseActivityHeader."Source Document"::"Assembly Consumption",
                  CurrWarehouseActivityHeader."Source Document"::"Job Usage");
        if CurrWarehouseActivityHeader."Source No." <> '' then
            WarehouseRequest.SetRange("Source No.", CurrWarehouseActivityHeader."Source No.");
        WarehouseRequest.SetRange("Completely Handled", false);
        WarehouseRequest.FilterGroup := 0;

        IsHandled := false;
        OnGetWhseRequestOnBeforeSourceDocumentsRun(WarehouseRequest, CurrWarehouseActivityHeader, Result, IsHandled);
        if IsHandled then
            exit(Result);

        if PAGE.RunModal(PAGE::"Source Documents", WarehouseRequest, WarehouseRequest."Source No.") = ACTION::LookupOK then
            exit(true);
    end;

    local procedure GetSourceDocHeader(): Boolean
    var
        Job: Record Job;
        PurchaseHeader: Record "Purchase Header";
        SalesHeader: Record "Sales Header";
        TransferHeader: Record "Transfer Header";
        IsHandled: Boolean;
        RecordExists: Boolean;
    begin
        IsHandled := false;
        RecordExists := true;
        OnBeforeGetSourceDocHeader(CurrWarehouseRequest, IsHandled, RecordExists);
        if IsHandled then
            exit(RecordExists);

        case CurrWarehouseRequest."Source Document" of
            CurrWarehouseRequest."Source Document"::"Purchase Order":
                begin
                    RecordExists := PurchaseHeader.Get(PurchaseHeader."Document Type"::Order, CurrWarehouseRequest."Source No.");
                    PostingDate := PurchaseHeader."Posting Date";
                    VendorDocNo := PurchaseHeader."Vendor Invoice No.";
                    SourceDocRecordVar := PurchaseHeader;
                end;
            CurrWarehouseRequest."Source Document"::"Purchase Return Order":
                begin
                    RecordExists := PurchaseHeader.Get(PurchaseHeader."Document Type"::"Return Order", CurrWarehouseRequest."Source No.");
                    PostingDate := PurchaseHeader."Posting Date";
                    VendorDocNo := PurchaseHeader."Vendor Cr. Memo No.";
                    SourceDocRecordVar := PurchaseHeader;
                end;
            CurrWarehouseRequest."Source Document"::"Sales Order":
                begin
                    RecordExists := SalesHeader.Get(SalesHeader."Document Type"::Order, CurrWarehouseRequest."Source No.");
                    PostingDate := SalesHeader."Posting Date";
                    SourceDocRecordVar := SalesHeader;
                end;
            CurrWarehouseRequest."Source Document"::"Sales Return Order":
                begin
                    RecordExists := SalesHeader.Get(SalesHeader."Document Type"::"Return Order", CurrWarehouseRequest."Source No.");
                    PostingDate := SalesHeader."Posting Date";
                    SourceDocRecordVar := SalesHeader;
                end;
            CurrWarehouseRequest."Source Document"::"Outbound Transfer":
                begin
                    RecordExists := TransferHeader.Get(CurrWarehouseRequest."Source No.");
                    PostingDate := TransferHeader."Posting Date";
                    SourceDocRecordVar := TransferHeader;
                end;
            CurrWarehouseRequest."Source Document"::"Job Usage":
                begin
                    RecordExists := Job.Get(CurrWarehouseRequest."Source No.");
                    SourceDocRecordVar := Job;
                end;
            else
                OnGetSourceDocHeaderFromWhseRequest(
                    CurrWarehouseRequest, SourceDocRecordRef, PostingDate, VendorDocNo, RecordExists, SourceDocRecordVar);
        end;
        OnAfterGetSourceDocHeader(CurrWarehouseRequest, PostingDate, VendorDocNo);

        exit(RecordExists);
    end;

    local procedure UpdateWhseActivHeader(WarehouseRequest: Record "Warehouse Request")
    begin
        if CurrWarehouseActivityHeader."Source Document" = CurrWarehouseActivityHeader."Source Document"::" " then begin
            CurrWarehouseActivityHeader."Source Document" := WarehouseRequest."Source Document";
            CurrWarehouseActivityHeader."Source Type" := WarehouseRequest."Source Type";
            CurrWarehouseActivityHeader."Source Subtype" := WarehouseRequest."Source Subtype";
        end else
            CurrWarehouseActivityHeader.TestField("Source Document", WarehouseRequest."Source Document");
        if CurrWarehouseActivityHeader."Source No." = '' then
            CurrWarehouseActivityHeader."Source No." := WarehouseRequest."Source No."
        else
            CurrWarehouseActivityHeader.TestField("Source No.", WarehouseRequest."Source No.");

        CurrWarehouseActivityHeader."Destination Type" := WarehouseRequest."Destination Type";
        CurrWarehouseActivityHeader."Destination No." := WarehouseRequest."Destination No.";
        CurrWarehouseActivityHeader."External Document No." := WarehouseRequest."External Document No.";
        CurrWarehouseActivityHeader."Shipment Date" := WarehouseRequest."Shipment Date";
        CurrWarehouseActivityHeader."Posting Date" := PostingDate;
        CurrWarehouseActivityHeader."External Document No.2" := VendorDocNo;
        GetLocation(WarehouseRequest."Location Code");

        OnAfterUpdateWhseActivHeader(CurrWarehouseActivityHeader, WarehouseRequest, CurrLocation);
    end;

    procedure SetSourceDocDetailsFilter(var WarehouseSourceFilter2: Record "Warehouse Source Filter")
    begin
        if WarehouseSourceFilter2.GetFilters() <> '' then begin
            ApplySourceFilters := true;
            WarehouseSourceFilter.Reset();
            WarehouseSourceFilter.CopyFilters(WarehouseSourceFilter2);
        end;
    end;

    local procedure CreatePickOrMoveFromPurchase(PurchaseHeaderVar: Variant)
    var
        PurchaseHeader: Record "Purchase Header";
        PurchaseLine: Record "Purchase Line";
        NewWarehouseActivityLine: Record "Warehouse Activity Line";
        RemQtyToPickBase: Decimal;
        IsHandled: Boolean;
    begin
        PurchaseHeader := PurchaseHeaderVar;

        if not SetFilterPurchLine(PurchaseLine, PurchaseHeader) then begin
            RaiseNothingToHandleMessage();
            exit;
        end;

        FindNextLineNo();

        repeat
            IsHandled := false;
            OnBeforeCreatePickOrMoveLineFromPurchaseLoop(CurrWarehouseActivityHeader, PurchaseHeader, IsHandled, PurchaseLine);

            if not IsHandled and PurchaseLine.IsInventoriableItem() and CanPickPurchaseLine(PurchaseLine) then
                if not NewWarehouseActivityLine.ActivityExists(Database::"Purchase Line", PurchaseLine."Document Type".AsInteger(), PurchaseLine."Document No.", PurchaseLine."Line No.", 0, 0) then begin
                    NewWarehouseActivityLine.Init();
                    NewWarehouseActivityLine."Activity Type" := CurrWarehouseActivityHeader.Type;
                    NewWarehouseActivityLine."No." := CurrWarehouseActivityHeader."No.";
                    if CurrLocation."Bin Mandatory" then
                        NewWarehouseActivityLine."Action Type" := NewWarehouseActivityLine."Action Type"::Take;
                    NewWarehouseActivityLine.SetSource(Database::"Purchase Line", PurchaseLine."Document Type".AsInteger(), PurchaseLine."Document No.", PurchaseLine."Line No.", 0);
                    NewWarehouseActivityLine."Location Code" := PurchaseLine."Location Code";
                    NewWarehouseActivityLine."Bin Code" := PurchaseLine."Bin Code";
                    NewWarehouseActivityLine."Item No." := PurchaseLine."No.";
                    NewWarehouseActivityLine."Variant Code" := PurchaseLine."Variant Code";
                    NewWarehouseActivityLine."Unit of Measure Code" := PurchaseLine."Unit of Measure Code";
                    NewWarehouseActivityLine."Qty. per Unit of Measure" := PurchaseLine."Qty. per Unit of Measure";
                    NewWarehouseActivityLine."Qty. Rounding Precision" := PurchaseLine."Qty. Rounding Precision";
                    NewWarehouseActivityLine."Qty. Rounding Precision (Base)" := PurchaseLine."Qty. Rounding Precision (Base)";
                    NewWarehouseActivityLine.Description := PurchaseLine.Description;
                    NewWarehouseActivityLine."Description 2" := PurchaseLine."Description 2";
                    NewWarehouseActivityLine."Due Date" := PurchaseLine."Expected Receipt Date";
                    NewWarehouseActivityLine."Destination Type" := NewWarehouseActivityLine."Destination Type"::Vendor;
                    NewWarehouseActivityLine."Destination No." := PurchaseHeader."Buy-from Vendor No.";
                    if PurchaseLine."Document Type" = PurchaseLine."Document Type"::Order then begin
                        NewWarehouseActivityLine."Source Document" := NewWarehouseActivityLine."Source Document"::"Purchase Order";
                        RemQtyToPickBase := -PurchaseLine."Qty. to Receive (Base)";
                    end else begin
                        NewWarehouseActivityLine."Source Document" :=
                          NewWarehouseActivityLine."Source Document"::"Purchase Return Order";
                        RemQtyToPickBase := PurchaseLine."Return Qty. to Ship (Base)";
                    end;
                    OnBeforeNewWhseActivLineInsertFromPurchase(NewWarehouseActivityLine, PurchaseLine, CurrWarehouseActivityHeader, RemQtyToPickBase);
                    PurchaseLine.CalcFields(PurchaseLine."Reserved Quantity");
                    CreatePickOrMoveLine(
                      NewWarehouseActivityLine, RemQtyToPickBase, PurchaseLine."Outstanding Qty. (Base)", PurchaseLine."Reserved Quantity" <> 0);
                end;
        until PurchaseLine.Next() = 0;
    end;

    local procedure SetFilterPurchLine(var PurchaseLine: Record "Purchase Line"; PurchaseHeader: Record "Purchase Header"): Boolean
    begin
        if CurrLocation.RequireShipment(CurrWarehouseRequest."Location Code") then
            exit(false);

        PurchaseLine.SetCurrentKey("Document Type", "Document No.", "Location Code");
        PurchaseLine.SetRange("Document Type", PurchaseHeader."Document Type");
        PurchaseLine.SetRange("Document No.", PurchaseHeader."No.");
        PurchaseLine.SetRange("Drop Shipment", false);
        if not CheckLineExist then
            PurchaseLine.SetRange("Location Code", CurrWarehouseActivityHeader."Location Code");
        PurchaseLine.SetRange(Type, PurchaseLine.Type::Item);
        if PurchaseHeader."Document Type" = PurchaseHeader."Document Type"::Order then
            PurchaseLine.SetFilter("Qty. to Receive", '<%1', 0)
        else
            PurchaseLine.SetFilter("Return Qty. to Ship", '>%1', 0);

        if ApplySourceFilters then begin
            PurchaseLine.SetFilter("No.", WarehouseSourceFilter.GetFilter("Item No. Filter"));
            PurchaseLine.SetFilter("Variant Code", WarehouseSourceFilter.GetFilter("Variant Code Filter"));
            PurchaseLine.SetFilter("Planned Receipt Date", WarehouseSourceFilter.GetFilter("Shipment Date Filter"));
        end;

        OnBeforeFindPurchLine(PurchaseLine, PurchaseHeader, CurrWarehouseActivityHeader);
        exit(PurchaseLine.Find('-'));
    end;

    local procedure CreatePickOrMoveFromSales(SalesHeaderVar: Variant)
    var
        SalesHeader: Record "Sales Header";
        SalesLine: Record "Sales Line";
        NewWarehouseActivityLine: Record "Warehouse Activity Line";
        RemQtyToPickBase: Decimal;
        IsHandled: Boolean;
    begin
        SalesHeader := SalesHeaderVar;

        OnBeforeCreatePickOrMoveFromSales(CurrWarehouseActivityHeader, SalesHeader, AutoCreation, HideDialog, SalesLine);
        if not SetFilterSalesLine(SalesLine, SalesHeader) then begin
            RaiseNothingToHandleMessage();
            exit;
        end;
        CompleteShipment := true;

        FindNextLineNo();

        repeat
            IsHandled := false;
            OnBeforeCreatePickOrMoveLineFromSalesLoop(CurrWarehouseActivityHeader, SalesHeader, IsHandled, SalesLine, CurrLocation, NextLineNo, LineCreated, CompleteShipment, AutoCreation, ShowError);
            if not IsHandled and CanPickSalesLine(SalesLine) then
                if not NewWarehouseActivityLine.ActivityExists(Database::"Sales Line", SalesLine."Document Type".AsInteger(), SalesLine."Document No.", SalesLine."Line No.", 0, 0) then begin
                    NewWarehouseActivityLine.Init();
                    NewWarehouseActivityLine."Activity Type" := CurrWarehouseActivityHeader.Type;
                    NewWarehouseActivityLine."No." := CurrWarehouseActivityHeader."No.";
                    if CurrLocation."Bin Mandatory" then
                        NewWarehouseActivityLine."Action Type" := NewWarehouseActivityLine."Action Type"::Take;
                    NewWarehouseActivityLine.SetSource(Database::"Sales Line", SalesLine."Document Type".AsInteger(), SalesLine."Document No.", SalesLine."Line No.", 0);
                    NewWarehouseActivityLine."Location Code" := SalesLine."Location Code";
                    NewWarehouseActivityLine."Bin Code" := SalesLine."Bin Code";
                    NewWarehouseActivityLine."Item No." := SalesLine."No.";
                    NewWarehouseActivityLine."Variant Code" := SalesLine."Variant Code";
                    NewWarehouseActivityLine."Unit of Measure Code" := SalesLine."Unit of Measure Code";
                    NewWarehouseActivityLine."Qty. per Unit of Measure" := SalesLine."Qty. per Unit of Measure";
                    NewWarehouseActivityLine."Qty. Rounding Precision" := SalesLine."Qty. Rounding Precision";
                    NewWarehouseActivityLine."Qty. Rounding Precision (Base)" := SalesLine."Qty. Rounding Precision (Base)";
                    NewWarehouseActivityLine.Description := SalesLine.Description;
                    NewWarehouseActivityLine."Description 2" := SalesLine."Description 2";
                    NewWarehouseActivityLine."Due Date" := SalesLine."Planned Shipment Date";
                    NewWarehouseActivityLine."Shipping Advice" := SalesHeader."Shipping Advice";
                    NewWarehouseActivityLine."Shipping Agent Code" := SalesLine."Shipping Agent Code";
                    NewWarehouseActivityLine."Shipping Agent Service Code" := SalesLine."Shipping Agent Service Code";
                    NewWarehouseActivityLine."Shipment Method Code" := SalesHeader."Shipment Method Code";
                    NewWarehouseActivityLine."Destination Type" := NewWarehouseActivityLine."Destination Type"::Customer;
                    NewWarehouseActivityLine."Destination No." := SalesHeader."Sell-to Customer No.";

                    if SalesLine."Document Type" = SalesLine."Document Type"::Order then begin
                        NewWarehouseActivityLine."Source Document" := NewWarehouseActivityLine."Source Document"::"Sales Order";
                        RemQtyToPickBase := SalesLine."Qty. to Ship (Base)";
                    end else begin
                        NewWarehouseActivityLine."Source Document" := NewWarehouseActivityLine."Source Document"::"Sales Return Order";
                        RemQtyToPickBase := -SalesLine."Return Qty. to Receive (Base)";
                    end;
                    OnBeforeNewWhseActivLineInsertFromSales(NewWarehouseActivityLine, SalesLine, CurrWarehouseActivityHeader, RemQtyToPickBase);
                    SalesLine.CalcFields(SalesLine."Reserved Quantity");
                    CreatePickOrMoveLine(
                      NewWarehouseActivityLine, RemQtyToPickBase, SalesLine."Outstanding Qty. (Base)", SalesLine."Reserved Quantity" <> 0);
                    OnCreatePickOrMoveFromSalesOnAfterCreatePickOrMoveLine(NewWarehouseActivityLine, SalesLine, CurrWarehouseActivityHeader, ShowError, AutoCreation, LineCreated);
                    CorrectQtyRounding(SalesLine, CurrWarehouseActivityHeader);
                    if SalesHeader."Shipping Advice" = SalesHeader."Shipping Advice"::Complete then begin
                        if RemQtyToPickBase < 0 then begin
                            if AutoCreation then begin
                                if CurrWarehouseActivityHeader.Delete(true) then
                                    LineCreated := false;
                                exit;
                            end;
                            Error(QtyNotSufficientOnSalesErr, SalesHeader."Shipping Advice", SalesLine."Document Type", SalesLine."Document No.", SalesLine."Line No.");
                        end;
                        if (RemQtyToPickBase = 0) and not CompleteShipment then begin
                            if ShowError then
                                Error(QtyNotSufficientOnSalesErr, SalesHeader."Shipping Advice", SalesLine."Document Type", SalesLine."Document No.", SalesLine."Line No.");
                            if CurrWarehouseActivityHeader.Delete(true) then;
                            LineCreated := false;
                            exit;
                        end;
                    end;
                end;
        until SalesLine.Next() = 0;
        OnAfterCreatePickOrMoveFromSales(CurrWarehouseActivityHeader, AutoCreation, HideDialog, LineCreated, IsInvtMovement, IsBlankInvtMovement);
    end;

    local procedure CanPickSalesLine(var SalesLine: Record "Sales Line"): Boolean
    begin
        exit(
          SalesLine.CheckIfSalesLineMeetsReservedFromStockSetting(Abs(SalesLine."Outstanding Qty. (Base)"), ReservedFromStock));
    end;

    local procedure CanPickPurchaseLine(var PurchaseLine: Record "Purchase Line"): Boolean
    begin
        exit(
          PurchaseLine.CheckIfPurchaseLineMeetsReservedFromStockSetting(Abs(PurchaseLine."Outstanding Qty. (Base)"), ReservedFromStock));
    end;

    local procedure CanPickTransferLine(var TransferLine: Record "Transfer Line"): Boolean
    begin
        exit(
          TransferLine.CheckIfTransferLineMeetsReservedFromStockSetting(TransferLine."Outstanding Qty. (Base)", ReservedFromStock));
    end;

    local procedure CanPickJobPlanningLine(var JobPlanningLine: Record "Job Planning Line"): Boolean
    begin
        exit(
          JobPlanningLine.CheckIfJobPlngLineMeetsReservedFromStockSetting(JobPlanningLine."Remaining Qty. (Base)", ReservedFromStock));
    end;

    local procedure SetFilterSalesLine(var SalesLine: Record "Sales Line"; SalesHeader: Record "Sales Header") Result: Boolean
    begin
        if CurrLocation.RequireShipment(CurrWarehouseRequest."Location Code") then
            exit(false);

        SalesLine.SetCurrentKey("Document Type", "Document No.", "Location Code");
        SalesLine.SetRange("Document Type", SalesHeader."Document Type");
        SalesLine.SetRange("Document No.", SalesHeader."No.");
        SalesLine.SetRange("Drop Shipment", false);

        if not CheckLineExist then
            SalesLine.SetRange("Location Code", CurrWarehouseActivityHeader."Location Code");
        SalesLine.SetRange(Type, SalesLine.Type::Item);
        if SalesHeader."Document Type" = SalesHeader."Document Type"::Order then
            SalesLine.SetFilter("Qty. to Ship", '>%1', 0)
        else
            SalesLine.SetFilter("Return Qty. to Receive", '<%1', 0);

        if ApplySourceFilters then begin
            SalesLine.SetFilter("No.", WarehouseSourceFilter.GetFilter("Item No. Filter"));
            SalesLine.SetFilter("Variant Code", WarehouseSourceFilter.GetFilter("Variant Code Filter"));
            SalesLine.SetFilter("Shipment Date", WarehouseSourceFilter.GetFilter("Shipment Date Filter"));
        end;

        OnBeforeFindSalesLine(SalesLine, SalesHeader, CurrWarehouseActivityHeader, CurrWarehouseRequest, CheckLineExist);
        Result := SalesLine.Find('-');
        OnAfterSetFilterSalesLine(SalesLine, SalesHeader, CurrWarehouseActivityHeader, CurrWarehouseRequest, ShowError, Result);
    end;

    local procedure CreatePickOrMoveFromTransfer(TransferHeaderVar: Variant)
    var
        TransferHeader: Record "Transfer Header";
        TransferLine: Record "Transfer Line";
        NewWarehouseActivityLine: Record "Warehouse Activity Line";
        RemQtyToPickBase: Decimal;
        IsHandled: Boolean;
    begin
        TransferHeader := TransferHeaderVar;

        if not SetFilterTransferLine(TransferLine, TransferHeader) then begin
            RaiseNothingToHandleMessage();
            exit;
        end;
        CompleteShipment := true;

        FindNextLineNo();

        repeat
            IsHandled := false;
            OnBeforeCreatePickOrMoveLineFromTransferLoop(CurrWarehouseActivityHeader, TransferHeader, IsHandled, TransferLine);
            if not IsHandled and CanPickTransferLine(TransferLine) then
                if not NewWarehouseActivityLine.ActivityExists(Database::"Transfer Line", 0, TransferLine."Document No.", TransferLine."Line No.", 0, 0) then begin
                    NewWarehouseActivityLine.Init();
                    NewWarehouseActivityLine."Activity Type" := CurrWarehouseActivityHeader.Type;
                    NewWarehouseActivityLine."No." := CurrWarehouseActivityHeader."No.";
                    if CurrLocation."Bin Mandatory" then
                        NewWarehouseActivityLine."Action Type" := NewWarehouseActivityLine."Action Type"::Take;
                    NewWarehouseActivityLine.SetSource(Database::"Transfer Line", 0, TransferLine."Document No.", TransferLine."Line No.", 0);
                    NewWarehouseActivityLine."Source Document" := NewWarehouseActivityLine."Source Document"::"Outbound Transfer";
                    NewWarehouseActivityLine."Location Code" := TransferLine."Transfer-from Code";
                    NewWarehouseActivityLine."Bin Code" := TransferLine."Transfer-from Bin Code";
                    NewWarehouseActivityLine."Item No." := TransferLine."Item No.";
                    NewWarehouseActivityLine."Variant Code" := TransferLine."Variant Code";
                    NewWarehouseActivityLine."Unit of Measure Code" := TransferLine."Unit of Measure Code";
                    NewWarehouseActivityLine."Qty. per Unit of Measure" := TransferLine."Qty. per Unit of Measure";
                    NewWarehouseActivityLine."Qty. Rounding Precision" := TransferLine."Qty. Rounding Precision";
                    NewWarehouseActivityLine."Qty. Rounding Precision (Base)" := TransferLine."Qty. Rounding Precision (Base)";
                    NewWarehouseActivityLine.Description := TransferLine.Description;
                    NewWarehouseActivityLine."Description 2" := TransferLine."Description 2";
                    NewWarehouseActivityLine."Due Date" := TransferLine."Shipment Date";
                    NewWarehouseActivityLine."Shipping Advice" := TransferHeader."Shipping Advice";
                    NewWarehouseActivityLine."Shipping Agent Code" := TransferLine."Shipping Agent Code";
                    NewWarehouseActivityLine."Shipping Agent Service Code" := TransferLine."Shipping Agent Service Code";
                    NewWarehouseActivityLine."Shipment Method Code" := TransferHeader."Shipment Method Code";
                    NewWarehouseActivityLine."Destination Type" := NewWarehouseActivityLine."Destination Type"::Location;
                    NewWarehouseActivityLine."Destination No." := TransferHeader."Transfer-to Code";
                    RemQtyToPickBase := TransferLine."Qty. to Ship (Base)";
                    OnBeforeNewWhseActivLineInsertFromTransfer(NewWarehouseActivityLine, TransferLine, CurrWarehouseActivityHeader, RemQtyToPickBase);
                    TransferLine.CalcFields(TransferLine."Reserved Quantity Outbnd.");
                    CreatePickOrMoveLine(
                      NewWarehouseActivityLine, RemQtyToPickBase, TransferLine."Outstanding Qty. (Base)", TransferLine."Reserved Quantity Outbnd." <> 0);
                    OnCreatePickOrMoveFromTransferOnAfterCreatePickOrMoveLine(NewWarehouseActivityLine, TransferLine, CurrWarehouseActivityHeader, ShowError, AutoCreation, LineCreated);

                    if TransferHeader."Shipping Advice" = TransferHeader."Shipping Advice"::Complete then begin
                        if RemQtyToPickBase > 0 then begin
                            if AutoCreation then begin
                                CurrWarehouseActivityHeader.Delete(true);
                                LineCreated := false;
                                exit;
                            end;
                            Error(QtyNotSufficientOnTransferErr, TransferHeader."Shipping Advice", TransferLine."Document No.", TransferLine."Line No.");
                        end;
                        if (RemQtyToPickBase = 0) and not CompleteShipment then begin
                            if ShowError then
                                Error(QtyNotSufficientOnTransferErr, TransferHeader."Shipping Advice", TransferLine."Document No.", TransferLine."Line No.");
                            if CurrWarehouseActivityHeader.Delete(true) then;
                            LineCreated := false;
                            exit;
                        end;
                    end;
                end;
        until TransferLine.Next() = 0;
        OnAfterCreatePickOrMoveFromTransfer(CurrWarehouseActivityHeader, TransferHeader, TransferLine);
    end;

    local procedure SetFilterTransferLine(var TransferLine: Record "Transfer Line"; TransferHeader: Record "Transfer Header"): Boolean
    begin
        if CurrLocation.RequireShipment(CurrWarehouseRequest."Location Code") then
            exit(false);

        TransferLine.SetRange("Document No.", TransferHeader."No.");
        TransferLine.SetRange("Derived From Line No.", 0);
        if not CheckLineExist then
            TransferLine.SetRange("Transfer-from Code", CurrWarehouseActivityHeader."Location Code");
        TransferLine.SetFilter("Qty. to Ship", '>%1', 0);

        if ApplySourceFilters then begin
            TransferLine.SetFilter("Item No.", WarehouseSourceFilter.GetFilter("Item No. Filter"));
            TransferLine.SetFilter("Variant Code", WarehouseSourceFilter.GetFilter("Variant Code Filter"));
            TransferLine.SetFilter("Shipment Date", WarehouseSourceFilter.GetFilter("Shipment Date Filter"));
        end;

        OnBeforeFindTransLine(TransferLine, TransferHeader, CurrWarehouseActivityHeader);
        exit(TransferLine.Find('-'));
    end;

    local procedure CreatePickOrMoveFromJobPlanning(JobVar: Variant)
    var
        Job: Record Job;
        JobPlanningLine: Record "Job Planning Line";
        NewWarehouseActivityLine: Record "Warehouse Activity Line";
        PickItem: Record Item;
        RemQtyToPickBase: Decimal;
    begin
        Job := JobVar;

        if not SetFilterJobPlanningLine(JobPlanningLine, Job) then begin
            RaiseNothingToHandleMessage();
            exit;
        end;

        FindNextLineNo();

        repeat
            if (JobPlanningLine."Location Code" = '') or (CurrLocation."Job Consump. Whse. Handling" = CurrLocation."Job Consump. Whse. Handling"::"Inventory Pick") then begin
                if CurrLocation."Job Consump. Whse. Handling" = CurrLocation."Job Consump. Whse. Handling"::"Inventory Pick" then
                    FeatureTelemetry.LogUsage('0000KT4', ProdAsmJobWhseHandlingTelemetryCategoryTok, ProdAsmJobWhseHandlingTelemetryTok);
                if PickItem.Get(JobPlanningLine."No.") then
                    if PickItem.IsInventoriableType() and CanPickJobPlanningLine(JobPlanningLine) then
                        if not
                           NewWarehouseActivityLine.ActivityExists(Database::"Job Planning Line", "Job Planning Line Status"::Order.AsInteger(), JobPlanningLine."Job No.", JobPlanningLine."Job Contract Entry No.", JobPlanningLine."Line No.", 0)
                        then begin
                            NewWarehouseActivityLine.Init();
                            NewWarehouseActivityLine."Activity Type" := CurrWarehouseActivityHeader.Type;
                            NewWarehouseActivityLine."No." := CurrWarehouseActivityHeader."No.";
                            if CurrLocation."Bin Mandatory" then
                                NewWarehouseActivityLine."Action Type" := NewWarehouseActivityLine."Action Type"::Take;
                            NewWarehouseActivityLine.SetSource(Database::"Job Planning Line", "Job Planning Line Status"::Order.AsInteger(), JobPlanningLine."Job No.", JobPlanningLine."Job Contract Entry No.", JobPlanningLine."Line No.");
                            NewWarehouseActivityLine."Location Code" := JobPlanningLine."Location Code";
                            NewWarehouseActivityLine."Bin Code" := JobPlanningLine."Bin Code";
                            NewWarehouseActivityLine."Item No." := JobPlanningLine."No.";
                            NewWarehouseActivityLine."Variant Code" := JobPlanningLine."Variant Code";
                            NewWarehouseActivityLine."Unit of Measure Code" := JobPlanningLine."Unit of Measure Code";
                            NewWarehouseActivityLine."Qty. per Unit of Measure" := JobPlanningLine."Qty. per Unit of Measure";
                            NewWarehouseActivityLine."Qty. Rounding Precision" := JobPlanningLine."Qty. Rounding Precision";
                            NewWarehouseActivityLine."Qty. Rounding Precision (Base)" := JobPlanningLine."Qty. Rounding Precision (Base)";
                            NewWarehouseActivityLine.Description := JobPlanningLine.Description;
                            NewWarehouseActivityLine."Description 2" := JobPlanningLine."Description 2";
                            NewWarehouseActivityLine."Source Document" := NewWarehouseActivityLine."Source Document"::"Job Usage";
                            NewWarehouseActivityLine."Due Date" := JobPlanningLine."Planning Due Date";
                            NewWarehouseActivityLine."Destination Type" := NewWarehouseActivityLine."Destination Type"::Customer;
                            Job.Get(JobPlanningLine."Job No.");
                            NewWarehouseActivityLine."Destination No." := Job."Sell-to Customer No.";
                            JobPlanningLine.CalcFields("Reserved Quantity");
                            RemQtyToPickBase := JobPlanningLine."Remaining Qty. (Base)";
                            OnBeforeNewWhseActivLineInsertFromJobPlanning(NewWarehouseActivityLine, JobPlanningLine, CurrWarehouseActivityHeader, RemQtyToPickBase);
                            CreatePickOrMoveLine(NewWarehouseActivityLine, RemQtyToPickBase, JobPlanningLine."Remaining Qty. (Base)", JobPlanningLine."Reserved Quantity" <> 0);
                        end;
            end;
        until JobPlanningLine.Next() = 0;
    end;

    local procedure SetFilterJobPlanningLine(var JobPlanningLine: Record "Job Planning Line"; Job: Record Job): Boolean
    begin
        JobPlanningLine.SetLoadFields(
            "Job No.",
            "Job Contract Entry No.",
            "Line No.",
            "Document No.",
            "Location Code",
             Status,
            "Bin Code",
            "No.",
            "Variant Code",
            "Unit of Measure Code",
            "Qty. per Unit of Measure",
            "Qty. Rounding Precision",
            "Qty. Rounding Precision (Base)",
            Description,
            "Description 2",
            "Planning Due Date",
            "Job Task No.",
            "Reserved Quantity",
            "Remaining Qty. (Base)",
            "Reserved Quantity"
        );
        JobPlanningLine.SetRange("Job No.", Job."No.");
        JobPlanningLine.SetRange(Type, JobPlanningLine.Type::Item);


        if not CheckLineExist then
            JobPlanningLine.SetRange("Location Code", CurrWarehouseActivityHeader."Location Code");
        if IsInvtMovement then
            JobPlanningLine.SetFilter("Bin Code", '<>%1', '');
        JobPlanningLine.SetFilter("Remaining Qty.", '>0');

        if ApplySourceFilters then begin
            JobPlanningLine.SetFilter("Job Task No.", WarehouseSourceFilter.GetFilter("Job Task No. Filter"));
            JobPlanningLine.SetFilter("No.", WarehouseSourceFilter.GetFilter("Item No. Filter"));
            JobPlanningLine.SetFilter("Variant Code", WarehouseSourceFilter.GetFilter("Variant Code Filter"));
            JobPlanningLine.SetFilter("Planning Date", WarehouseSourceFilter.GetFilter("Shipment Date Filter"));
        end;

        OnSetFilterJobPlanningLineOnBeforeJobPlanningLineFind(JobPlanningLine, Job, CurrWarehouseActivityHeader);
        exit(JobPlanningLine.Find('-'));
    end;

    procedure FindNextLineNo()
    var
        WarehouseActivityLine: Record "Warehouse Activity Line";
    begin
        if IsInvtMovement then
            WarehouseActivityLine.SetRange("Activity Type", WarehouseActivityLine."Activity Type"::"Invt. Movement")
        else
            WarehouseActivityLine.SetRange("Activity Type", WarehouseActivityLine."Activity Type"::"Invt. Pick");
        WarehouseActivityLine.SetRange("No.", CurrWarehouseActivityHeader."No.");
        if WarehouseActivityLine.FindLast() then
            NextLineNo := WarehouseActivityLine."Line No." + 10000
        else
            NextLineNo := 10000;
    end;

    procedure SetHideDialog(NewHideDialogValue: Boolean)
    begin
        HideDialog := NewHideDialogValue;
    end;

    procedure SetWhseActivHeader(WhseActivHeader: Record "Warehouse Activity Header")
    begin
        CurrWarehouseActivityHeader := WhseActivHeader;
    end;

    procedure GetWhseActivHeader(var WhseActivHeader: Record "Warehouse Activity Header")
    begin
        WhseActivHeader := CurrWarehouseActivityHeader;
    end;

    procedure RunCreatePickOrMoveLine(NewWarehouseActivityLine: Record "Warehouse Activity Line"; var RemQtyToPickBase: Decimal; OutstandingQtyBase: Decimal; ReservationExists: Boolean)
    begin
        OnBeforeRunCreatePickOrMoveLine(CurrWarehouseActivityHeader, CurrWarehouseRequest);
        CreatePickOrMoveLine(NewWarehouseActivityLine, RemQtyToPickBase, OutstandingQtyBase, ReservationExists);
        OnAfterRunCreatePickOrMoveLine(CurrWarehouseActivityHeader, CurrWarehouseRequest);
    end;

    internal procedure CreatePickOrMoveLine(NewWarehouseActivityLine: Record "Warehouse Activity Line"; var RemQtyToPickBase: Decimal; OutstandingQtyBase: Decimal; ReservationExists: Boolean)
    var
        ReservationEntry: Record "Reservation Entry";
        ATOSalesLine: Record "Sales Line";
        WhseItemTrackingSetup: Record "Item Tracking Setup";
        ATOJobPlanningLine: Record "Job Planning Line";
        QtyAvailToPickBase: Decimal;
        OriginalRemQtyToPickBase: Decimal;
        QtyRemToPickBase: Decimal;
        ITQtyToPickBase: Decimal;
        TotalITQtyToPickBase: Decimal;
        QtyToTrackBase: Decimal;
        EntriesExist: Boolean;
        ShouldInsertPickOrMoveDefaultBin: Boolean;
        CreateLineWithZeroBaseQty: Boolean;
        IsHandled: Boolean;
    begin
        GetLocation(NewWarehouseActivityLine."Location Code");

        CreateLineWithZeroBaseQty := false;
        OnBeforeCreatePickOrMoveLineWithZeroBaseQty(NewWarehouseActivityLine, CreateLineWithZeroBaseQty);
        if CreateLineWithZeroBaseQty then begin
            MakeWarehouseActivityHeader();
            MakeWarehouseActivityLine(NewWarehouseActivityLine, '', 0, RemQtyToPickBase);
            RemQtyToPickBase := 0;
            exit;
        end;

        if ReservationExists then
            CalcRemQtyToPickOrMoveBase(NewWarehouseActivityLine, OutstandingQtyBase, RemQtyToPickBase);

        if RemQtyToPickBase <= 0 then
            exit;

        HasExpiredItems := false;
        OriginalRemQtyToPickBase := RemQtyToPickBase;

        QtyAvailToPickBase := CalcInvtAvailability(NewWarehouseActivityLine, WhseItemTrackingSetup);
        if WMSManagement.GetATOSalesLine(
             NewWarehouseActivityLine."Source Type", NewWarehouseActivityLine."Source Subtype", NewWarehouseActivityLine."Source No.",
             NewWarehouseActivityLine."Source Line No.", ATOSalesLine)
        then
            QtyAvailToPickBase += ATOSalesLine.QtyToAsmBaseOnATO();

        if WMSManagement.GetATOJobPlanningLine(
            NewWarehouseActivityLine."Source Type", NewWarehouseActivityLine."Source No.", NewWarehouseActivityLine."Source Line No.",
            NewWarehouseActivityLine."Source Subline No.", ATOJobPlanningLine)
        then
            QtyAvailToPickBase += ATOJobPlanningLine.QtyToAsmBaseOnATO();

        IsHandled := false;
        OnCreatePickOrMoveLineOnAfterCalcQtyAvailToPickBase(
            NewWarehouseActivityLine, WhseItemTrackingSetup."Serial No. Required", WhseItemTrackingSetup."Lot No. Required",
            ReservationExists, RemQtyToPickBase, QtyAvailToPickBase, IsHandled);
        if not IsHandled then
            if RemQtyToPickBase > QtyAvailToPickBase then begin
                IsHandled := false;
                OnCreatePickOrMoveLineOnAfterCheckForCompleteShipment(CurrWarehouseActivityHeader, WhseItemTrackingSetup, ReservationExists, RemQtyToPickBase, QtyAvailToPickBase, IsHandled);
                if not IsHandled then
                    RemQtyToPickBase := QtyAvailToPickBase;
                CompleteShipment := false;
            end;

        if RemQtyToPickBase > 0 then begin
            if ItemTrackingManagement.GetWhseItemTrkgSetup(NewWarehouseActivityLine."Item No.", WhseItemTrackingSetup) then begin
                OnCreatePickOrMoveLineOnAfterGetWhseItemTrkgSetup(NewWarehouseActivityLine, WhseItemTrackingSetup);
                if IsBlankInvtMovement then
                    ItemTrackingManagement.SumUpItemTrackingOnlyInventoryOrATO(TempReservationEntry, TempTrackingSpecification, true, true)
                else begin
                    SetFilterReservEntry(ReservationEntry, NewWarehouseActivityLine);
                    CopyReservEntriesToTemp(TempReservationEntry, ReservationEntry);
                    if IsInvtMovement then
                        if NewWarehouseActivityLine."Source Type" = 5407 then // Database::"Prod. Order Component"
                            PrepareItemTrackingFromWhse(
                              NewWarehouseActivityLine."Source Type", NewWarehouseActivityLine."Source Subtype", NewWarehouseActivityLine."Source No.",
                              '', NewWarehouseActivityLine."Source Line No.", NewWarehouseActivityLine."Source Subline No.", 1, false)
                        else
                            PrepareItemTrackingFromWhse(
                              NewWarehouseActivityLine."Source Type", NewWarehouseActivityLine."Source Subtype", NewWarehouseActivityLine."Source No.",
                              '', 0, NewWarehouseActivityLine."Source Line No.", 1, false);
                    ItemTrackingManagement.SumUpItemTrackingOnlyInventoryOrATO(TempReservationEntry, TempTrackingSpecification, true, true);
                end;

                if PickOrMoveAccordingToFEFO(NewWarehouseActivityLine."Location Code", WhseItemTrackingSetup) or
                   PickStrictExpirationPosting(NewWarehouseActivityLine."Item No.", WhseItemTrackingSetup)
                then begin
                    QtyToTrackBase := RemQtyToPickBase;
                    if UndefinedItemTracking(QtyToTrackBase) then
                        CreateTempHandlingSpec(NewWarehouseActivityLine, QtyToTrackBase);
                end;

                TempTrackingSpecification.Reset();
                if TempTrackingSpecification.Find('-') then
                    repeat
                        IsHandled := false;
                        OnBeforeCreatePickOrMoveLinePerTrackingSpec(
                            NewWarehouseActivityLine, TempTrackingSpecification,
                            RemQtyToPickBase, OutstandingQtyBase, ReservationExists, IsHandled);
                        if not IsHandled then begin
                            ITQtyToPickBase := Abs(TempTrackingSpecification."Qty. to Handle (Base)");
                            TotalITQtyToPickBase += ITQtyToPickBase;
                            if ITQtyToPickBase > 0 then begin
                                NewWarehouseActivityLine.CopyTrackingFromSpec(TempTrackingSpecification);
                                if NewWarehouseActivityLine.TrackingExists() then
                                    UpdateExpirationDate(NewWarehouseActivityLine, EntriesExist);

                                if IsInvtMovement and not IsBlankInvtMovement and not TempTrackingSpecification.Correction then
                                    if ShouldCheckToAssemblyBinContent() then
                                        CheckBinContentWithToAssemblyBinCode(ITQtyToPickBase, NewWarehouseActivityLine);

                                OnCreatePickOrMoveLineFromHandlingSpec(NewWarehouseActivityLine, TempTrackingSpecification, EntriesExist);

                                if CurrLocation."Bin Mandatory" then begin
                                    // find Take qty. for bin code of source line
                                    if (NewWarehouseActivityLine."Bin Code" <> '') and (not IsInvtMovement or IsBlankInvtMovement) then
                                        InsertPickOrMoveBinWhseActLine(
                                          NewWarehouseActivityLine, NewWarehouseActivityLine."Bin Code", false, ITQtyToPickBase, WhseItemTrackingSetup);

                                    OnCreatePickOrMoveLineOnAfterFindTakeQtyForBinCodeOfSourceLineHandlingSpec(NewWarehouseActivityLine, TempTrackingSpecification, WhseItemTrackingSetup, ITQtyToPickBase, CurrWarehouseActivityHeader);

                                    // Invt. movement without document has to be created
                                    if IsBlankInvtMovement then
                                        ITQtyToPickBase := 0;

                                    // find Take qty. for default bin
                                    ShouldInsertPickOrMoveDefaultBin := ITQtyToPickBase > 0;
                                    OnCreatePickOrMoveLineOnAfterCalcShouldInsertPickOrMoveDefaultBin(NewWarehouseActivityLine, RemQtyToPickBase, OutstandingQtyBase, ReservationExists, ShouldInsertPickOrMoveDefaultBin);

                                    case CurrLocation."Pick Bin Policy" of
                                        CurrLocation."Pick Bin Policy"::"Default Bin":
                                            begin
                                                FeatureTelemetry.LogUsage('0000KP7', BinPolicyTelemetryCategoryTok, DefaultBinPickPolicyTelemetryTok);

                                                if ShouldInsertPickOrMoveDefaultBin then
                                                    InsertPickOrMoveBinWhseActLine(NewWarehouseActivityLine, '', true, ITQtyToPickBase, WhseItemTrackingSetup);

                                                // find Take qty. for other bins
                                                if ITQtyToPickBase > 0 then
                                                    InsertPickOrMoveBinWhseActLine(NewWarehouseActivityLine, '', false, ITQtyToPickBase, WhseItemTrackingSetup);
                                            end;
                                        CurrLocation."Pick Bin Policy"::"Bin Ranking":
                                            begin
                                                FeatureTelemetry.LogUsage('0000KP8', BinPolicyTelemetryCategoryTok, RankingBinPickPolicyTelemetryTok);

                                                // find Take qty. for other bins
                                                if ITQtyToPickBase > 0 then
                                                    InsertPickOrMoveBinWhseActLine(NewWarehouseActivityLine, '', false, ITQtyToPickBase, WhseItemTrackingSetup);
                                            end;
                                        else
                                            OnInsertPickOrMoveBinWhseActivityLine(NewWarehouseActivityLine, ITQtyToPickBase);
                                    end;

                                    if (ITQtyToPickBase = 0) and IsInvtMovement and not IsBlankInvtMovement and
                                       not TempTrackingSpecification.Correction
                                    then
                                        SynchronizeWhseItemTracking(TempTrackingSpecification);
                                end else
                                    if ITQtyToPickBase > 0 then
                                        InsertShelfWhseActivLine(NewWarehouseActivityLine, ITQtyToPickBase, WhseItemTrackingSetup);

                                RemQtyToPickBase :=
                                  RemQtyToPickBase + ITQtyToPickBase +
                                  TempTrackingSpecification."Qty. to Handle (Base)";
                            end;
                        end;
                        NewWarehouseActivityLine.ClearTracking();
                    until (TempTrackingSpecification.Next() = 0) or (RemQtyToPickBase <= 0);

                RemQtyToPickBase := Minimum(RemQtyToPickBase, OriginalRemQtyToPickBase - TotalITQtyToPickBase);
            end;

            if CurrLocation."Bin Mandatory" then begin
                // find Take qty. for bin code of source line
                OnCreatePickOrMoveLineOnBeforeCheckIfInsertPickOrMoveBinWhseActLine(NewWarehouseActivityLine, RemQtyToPickBase);
                if (RemQtyToPickBase > 0) and
                   (NewWarehouseActivityLine."Bin Code" <> '') and
                   (not IsInvtMovement or IsBlankInvtMovement) and
                   (not HasExpiredItems)
                then
                    InsertPickOrMoveBinWhseActLine(
                      NewWarehouseActivityLine, NewWarehouseActivityLine."Bin Code", false, RemQtyToPickBase, WhseItemTrackingSetup);

                OnCreatePickOrMoveLineOnAfterFindTakeQtyForBinCodeSourceLine(NewWarehouseActivityLine, WhseItemTrackingSetup, RemQtyToPickBase, CurrWarehouseActivityHeader);
                // Invt. movement without document has to be created
                if IsBlankInvtMovement then
                    RemQtyToPickBase := 0;

                // find Take qty. for default bin
                if (RemQtyToPickBase > 0) and (not HasExpiredItems) and (CurrLocation."Pick Bin Policy" = CurrLocation."Pick Bin Policy"::"Default Bin") then
                    InsertPickOrMoveBinWhseActLine(NewWarehouseActivityLine, '', true, RemQtyToPickBase, WhseItemTrackingSetup);

                // find Take qty. for other bins
                if (RemQtyToPickBase > 0) and (not HasExpiredItems) then
                    InsertPickOrMoveBinWhseActLine(NewWarehouseActivityLine, '', false, RemQtyToPickBase, WhseItemTrackingSetup)
            end else
                if (RemQtyToPickBase > 0) and (not HasExpiredItems) then
                    InsertShelfWhseActivLine(NewWarehouseActivityLine, RemQtyToPickBase, WhseItemTrackingSetup);
        end;

        // if there are expired items, we will create pick line for the whole remaining quantity to make sure the expired items will be picked     
        if HasExpiredItems then
            QtyRemToPickBase := RemQtyToPickBase
        else
            // Cap availability at the originally requested quantity so surplus stock reserved for other demand
            // does not cancel out the blank-bin shortage line when "Always Create Pick Line" is enabled.
            QtyRemToPickBase := OriginalRemQtyToPickBase - Minimum(QtyAvailToPickBase, OriginalRemQtyToPickBase) + RemQtyToPickBase;
        if CurrLocation."Always Create Pick Line" and (QtyRemToPickBase > 0) then begin
            MakeWarehouseActivityHeader();
            MakeWarehouseActivityLine(NewWarehouseActivityLine, '', QtyRemToPickBase, QtyRemToPickBase);
        end;

        OnAfterInsertWhseActivLine(
            NewWarehouseActivityLine, WhseItemTrackingSetup."Serial No. Required", WhseItemTrackingSetup."Lot No. Required",
            RemQtyToPickBase, CompleteShipment, ReservationExists, WhseItemTrackingSetup);
    end;

    local procedure CalcRemQtyToPickOrMoveBase(NewWarehouseActivityLine: Record "Warehouse Activity Line"; OutstandingQtyBase: Decimal; var RemQtyToPickBase: Decimal)
    var
        ATOSalesLine: Record "Sales Line";
        ATOJobPlanningLine: Record "Job Planning Line";
        MaxQtyToPickBase: Decimal;
    begin
        MaxQtyToPickBase :=
            OutstandingQtyBase -
            WMSManagement.CalcLineReservedQtyNotonInvt(
                NewWarehouseActivityLine."Source Type", NewWarehouseActivityLine."Source Subtype", NewWarehouseActivityLine."Source No.",
                NewWarehouseActivityLine."Source Line No.", NewWarehouseActivityLine."Source Subline No.");

        if WMSManagement.GetATOSalesLine(NewWarehouseActivityLine."Source Type", NewWarehouseActivityLine."Source Subtype", NewWarehouseActivityLine."Source No.", NewWarehouseActivityLine."Source Line No.", ATOSalesLine) then
            MaxQtyToPickBase += ATOSalesLine.QtyAsmRemainingBaseOnATO();

        if WMSManagement.GetATOJobPlanningLine(NewWarehouseActivityLine."Source Type", NewWarehouseActivityLine."Source No.", NewWarehouseActivityLine."Source Line No.", NewWarehouseActivityLine."Source Subline No.", ATOJobPlanningLine) then
            MaxQtyToPickBase += ATOJobPlanningLine.QtyToAsmBaseOnATO();

        if RemQtyToPickBase > MaxQtyToPickBase then begin
            RemQtyToPickBase := MaxQtyToPickBase;
            if NewWarehouseActivityLine."Shipping Advice" = NewWarehouseActivityLine."Shipping Advice"::Complete then
                CompleteShipment := false;
        end;
    end;

    procedure InsertPickOrMoveBinWhseActLine(NewWarehouseActivityLine: Record "Warehouse Activity Line"; BinCode: Code[20]; DefaultBin: Boolean; var RemQtyToPickBase: Decimal; WhseItemTrackingSetup: Record "Item Tracking Setup")
    var
        FromBinContent: Record "Bin Content";
        QtyToPickBase: Decimal;
        QtyAvailToPickBase: Decimal;
        IsHandled: Boolean;
        RemQtyToPick: Decimal;
    begin
        IsHandled := false;
        OnBeforeInsertPickOrMoveBinWhseActLine(
            NewWarehouseActivityLine, BinCode, DefaultBin, RemQtyToPickBase, IsHandled, CurrWarehouseRequest, CurrWarehouseActivityHeader,
            IsInvtMovement, AutoCreation, PostingDate, VendorDocNo, LineCreated, NextLineNo);
        if IsHandled then
            exit;

        CreateATOPickLine(NewWarehouseActivityLine, BinCode, RemQtyToPickBase);
        if RemQtyToPickBase = 0 then
            exit;

        if DefaultBin then begin
            FromBinContent.SetCurrentKey(Default, "Bin Ranking", "Location Code", "Item No.", "Variant Code", "Bin Code");
            FromBinContent.SetRange(Default, DefaultBin)
        end else begin
            FromBinContent.SetCurrentKey("Bin Ranking");
            FromBinContent.SetAscending("Bin Ranking", false);
        end;

        FromBinContent.SetRange("Location Code", NewWarehouseActivityLine."Location Code");
        FromBinContent.SetRange("Item No.", NewWarehouseActivityLine."Item No.");
        FromBinContent.SetRange("Variant Code", NewWarehouseActivityLine."Variant Code");

        if (BinCode <> '') and not IsInvtMovement then
            FromBinContent.SetRange("Bin Code", BinCode);

        if (NewWarehouseActivityLine."Bin Code" <> '') and IsInvtMovement then
            // not movement within the same bin
            FromBinContent.SetFilter("Bin Code", '<>%1', NewWarehouseActivityLine."Bin Code");

        if IsBlankInvtMovement then begin
            // inventory movement without source document, created from Internal Movement
            if not CurrLocation."Pick According to FEFO" then
                FromBinContent.SetRange("Bin Code", FromBinCode)
            else
                if ShouldSetBinCodeForBlankInvtMovement(NewWarehouseActivityLine) then
                    FromBinContent.SetRange("Bin Code", FromBinCode);
            FromBinContent.SetRange(Default);
        end;

        FromBinContent.SetTrackingFilterFromWhseActivityLineIfNotBlank(NewWarehouseActivityLine);

        OnBeforeFindFromBinContent(FromBinContent, NewWarehouseActivityLine, FromBinCode, BinCode, IsInvtMovement, IsBlankInvtMovement, DefaultBin, WhseItemTrackingSetup, CurrWarehouseActivityHeader, CurrWarehouseRequest);
        if FromBinContent.Find('-') then
            repeat
                IsHandled := false;
                OnInsertPickOrMoveBinWhseActLineOnBeforeLoopIteration(FromBinContent, NewWarehouseActivityLine, BinCode, DefaultBin, RemQtyToPickBase, IsHandled, QtyAvailToPickBase);
                if not IsHandled then begin
                    if NewWarehouseActivityLine."Activity Type" = NewWarehouseActivityLine."Activity Type"::"Invt. Movement" then
                        QtyAvailToPickBase := FromBinContent.CalcQtyAvailToPickIncludingDedicated(0)
                    else
                        QtyAvailToPickBase := FromBinContent.CalcQtyAvailToPick(0);
                    OnInsertPickOrMoveBinWhseActLineOnAfterCalcQtyAvailToPick(QtyAvailToPickBase, FromBinContent);
                    if RemQtyToPickBase < QtyAvailToPickBase then
                        QtyAvailToPickBase := RemQtyToPickBase;

                    OnInsertPickOrMoveBinWhseActLineOnBeforeMakeHeader(RemQtyToPickBase, QtyAvailToPickBase, DefaultBin, FromBinContent);
                    if QtyAvailToPickBase > 0 then begin
                        MakeWarehouseActivityHeader();
                        if WhseItemTrackingSetup."Serial No. Required" then begin
                            QtyAvailToPickBase := Round(QtyAvailToPickBase, 1, '<');
                            QtyToPickBase := 1;
                            OnInsertPickOrMoveBinWhseActLineOnBeforeLoopMakeLine(CurrWarehouseActivityHeader, CurrWarehouseRequest, NewWarehouseActivityLine, FromBinContent, AutoCreation, QtyToPickBase);
                            RemQtyToPick := NewWarehouseActivityLine.CalcQty(RemQtyToPickBase);
                            IsHandled := false;
                            OnInsertPickOrMoveBinWhseActLineOnBeforeMakeLineWhenSNoReq(NewWarehouseActivityLine, WhseItemTrackingSetup, FromBinContent."Bin Code", QtyToPickBase, RemQtyToPickBase, QtyAvailToPickBase, IsHandled);
                            if not IsHandled then
                                repeat
                                    MakeLineWhenSNoReq(NewWarehouseActivityLine, FromBinContent."Bin Code", QtyToPickBase, RemQtyToPickBase, RemQtyToPick);
                                    QtyAvailToPickBase := QtyAvailToPickBase - QtyToPickBase;
                                until QtyAvailToPickBase <= 0;
                        end else begin
                            QtyToPickBase := QtyAvailToPickBase;
                            OnInsertPickOrMoveBinWhseActLineOnBeforeLoopMakeLine(CurrWarehouseActivityHeader, CurrWarehouseRequest, NewWarehouseActivityLine, FromBinContent, AutoCreation, QtyToPickBase);
                            repeat
                                MakeWarehouseActivityLine(NewWarehouseActivityLine, FromBinContent."Bin Code", QtyToPickBase, RemQtyToPickBase);
                                OnInsertPickOrMoveBinWhseActLineOnAfterMakeLine(QtyToPickBase, DefaultBin);
                                QtyAvailToPickBase := QtyAvailToPickBase - QtyToPickBase;
                            until QtyAvailToPickBase <= 0;
                        end;
                    end;
                end;
            until (FromBinContent.Next() = 0) or (RemQtyToPickBase = 0);
        OnAfterInsertPickOrMoveBinWhseActLine(NewWarehouseActivityLine, CurrWarehouseActivityHeader, RemQtyToPickBase)
    end;

    procedure CheckBinContentWithToAssemblyBinCode(var ITQtyToPickBase: Decimal; NewWarehouseActivityLine: Record "Warehouse Activity Line")
    var
        Location: Record Location;
        FromBinContent: Record "Bin Content";
    begin
        if ITQtyToPickBase <= 0 then
            exit;

        if not Location.Get(NewWarehouseActivityLine."Location Code") then
            exit;

        FromBinContent.SetLoadFields("Location Code", "Bin Code", "Item No.", "Variant Code", "Unit of Measure Code", "Quantity (Base)");
        FromBinContent.SetRange("Location Code", NewWarehouseActivityLine."Location Code");
        FromBinContent.SetRange("Bin Code", Location."To-Assembly Bin Code");
        FromBinContent.SetRange("Item No.", NewWarehouseActivityLine."Item No.");
        FromBinContent.SetRange("Variant Code", NewWarehouseActivityLine."Variant Code");
        FromBinContent.SetRange("Unit of Measure Code", NewWarehouseActivityLine."Unit of Measure Code");
        if FromBinContent.FindSet() then
            repeat
                FromBinContent.CalcFields("Quantity (Base)");
                if FromBinContent."Quantity (Base)" <= ITQtyToPickBase then
                    ITQtyToPickBase -= FromBinContent."Quantity (Base)";
            until FromBinContent.Next() = 0;
    end;

    procedure InsertShelfWhseActivLine(NewWarehouseActivityLine: Record "Warehouse Activity Line"; var RemQtyToPickBase: Decimal; WhseItemTrackingSetup: Record "Item Tracking Setup")
    var
        QtyToPickBase: Decimal;
        RemQtyToPick: Decimal;
        IsHandled: Boolean;
    begin
        CreateATOPickLine(NewWarehouseActivityLine, '', RemQtyToPickBase);
        if RemQtyToPickBase <= 0 then
            exit;

        MakeWarehouseActivityHeader();
        OnInsertShelfWhseActivLineOnAfterMakeHeader(NewWarehouseActivityLine);

        if WhseItemTrackingSetup."Serial No. Required" then begin
            IsHandled := false;
            QtyToPickBase := 0;
            OnInsertShelfWhseActivLineOnBeforeMakeShelfLineWhenSNoReq(NewWarehouseActivityLine, WhseItemTrackingSetup, QtyToPickBase, RemQtyToPickBase, IsHandled);
            if IsHandled then
                exit;

            RemQtyToPickBase := Round(RemQtyToPickBase, 1, '<');
            QtyToPickBase := 1;
            RemQtyToPick := NewWarehouseActivityLine.CalcQty(RemQtyToPickBase);
            repeat
                MakeLineWhenSNoReq(NewWarehouseActivityLine, '', QtyToPickBase, RemQtyToPickBase, RemQtyToPick);
            until RemQtyToPickBase = 0;
        end else begin
            QtyToPickBase := RemQtyToPickBase;
            repeat
                MakeWarehouseActivityLine(NewWarehouseActivityLine, '', QtyToPickBase, RemQtyToPickBase);
                OnInsertShelfWhseActivLineOnAfterMakeWarehouseActivityLine(NewWarehouseActivityLine);
            until RemQtyToPickBase = 0;
        end;
    end;

    procedure CalcInvtAvailability(WarehouseActivityLine: Record "Warehouse Activity Line"; WhseItemTrackingSetup: Record "Item Tracking Setup") Result: Decimal
    var
        Item2: Record Item;
        TempWarehouseActivityLine2: Record "Warehouse Activity Line" temporary;
        WhseActivLineItemTrackingSetup: Record "Item Tracking Setup";
        WarehouseAvailabilityMgt: Codeunit "Warehouse Availability Mgt.";
        QtyAssgndtoPick: Decimal;
        LineReservedQty: Decimal;
        QtyReservedOnPickShip: Decimal;
        QtyOnDedicatedBins: Decimal;
        QtyBlocked: Decimal;
        SourceLineNo: Integer;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCalcInvtAvailability(WarehouseActivityLine, CurrLocation, Result, IsHandled, WhseItemTrackingSetup, IsBlankInvtMovement);
        if IsHandled then
            exit(Result);

        GetItem(WarehouseActivityLine."Item No.");
        Item2 := CurrItem;
        Item2.SetRange("Location Filter", WarehouseActivityLine."Location Code");
        Item2.SetRange("Variant Filter", WarehouseActivityLine."Variant Code");
        WhseItemTrackingSetup.SetTrackingFilterForItem(Item2);
        Item2.CalcFields(Inventory);
        if not IsBlankInvtMovement then
            Item2.CalcFields("Reserved Qty. on Inventory");

        QtyAssgndtoPick := WarehouseAvailabilityMgt.CalcQtyAssgndtoPick(CurrLocation, WarehouseActivityLine."Item No.", WarehouseActivityLine."Variant Code", '');

        if WarehouseActivityLine."Activity Type" <> WarehouseActivityLine."Activity Type"::"Invt. Movement" then begin // Invt. Movement from Dedicated Bin is allowed
            WhseActivLineItemTrackingSetup.CopyTrackingFromWhseActivityLine(WarehouseActivityLine);
            QtyOnDedicatedBins :=
                WarehouseAvailabilityMgt.CalcQtyOnDedicatedBins(
                    WarehouseActivityLine."Location Code", WarehouseActivityLine."Item No.", WarehouseActivityLine."Variant Code", WhseActivLineItemTrackingSetup);
        end;

        SourceLineNo := GetSourceLineNo(WarehouseActivityLine);

        LineReservedQty :=
            WarehouseAvailabilityMgt.CalcLineReservedQtyOnInvt(
                WarehouseActivityLine."Source Type", WarehouseActivityLine."Source Subtype", WarehouseActivityLine."Source No.",
                SourceLineNo, WarehouseActivityLine."Source Subline No.", true, WhseItemTrackingSetup, TempWarehouseActivityLine2);

        QtyReservedOnPickShip :=
            WarehouseAvailabilityMgt.CalcReservQtyOnPicksShips(
                WarehouseActivityLine."Location Code", WarehouseActivityLine."Item No.", WarehouseActivityLine."Variant Code", TempWarehouseActivityLine2);

        if CurrLocation."Bin Mandatory" then
            QtyBlocked :=
                WarehouseAvailabilityMgt.CalcQtyOnBlockedITOrOnBlockedOutbndBins(
                    WarehouseActivityLine."Location Code", WarehouseActivityLine."Item No.", WarehouseActivityLine."Variant Code", WhseItemTrackingSetup)
        else
            QtyBlocked :=
                WarehouseAvailabilityMgt.CalcQtyOnBlockedItemTracking(
                    WarehouseActivityLine."Location Code", WarehouseActivityLine."Item No.", WarehouseActivityLine."Variant Code", WhseItemTrackingSetup);
        OnCalcInvtAvailabilityOnAfterCalcQtyBlocked(WarehouseActivityLine, WhseItemTrackingSetup, QtyBlocked);
        exit(
          Item2.Inventory - Abs(Item2."Reserved Qty. on Inventory") - QtyAssgndtoPick - QtyOnDedicatedBins - QtyBlocked +
          LineReservedQty + QtyReservedOnPickShip);
    end;

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

    local procedure GetBin(LocationCode: Code[10]; BinCode: Code[20])
    begin
        if (CurrBin."Location Code" <> LocationCode) or
           (CurrBin.Code <> BinCode)
        then
            CurrBin.Get(LocationCode, BinCode)
    end;

    local procedure GetShelfNo(ItemNo: Code[20]; VariantCode: Code[10]; LocationCode: Code[10]): Code[10]
    var
        StockkeepingUnit: Record "Stockkeeping Unit";
    begin
        GetItem(ItemNo);
        StockkeepingUnit.SetLoadFields("Shelf No.");
        if StockkeepingUnit.Get(LocationCode, ItemNo, VariantCode) then
            exit(StockkeepingUnit."Shelf No.");
        exit(CurrItem."Shelf No.");
    end;

    local procedure GetItem(ItemNo: Code[20])
    begin
        if ItemNo <> CurrItem."No." then
            CurrItem.Get(ItemNo);
    end;

    local procedure GetItemAndSKU(ItemNo: Code[20]; LocationCode: Code[10]; VariantCode: Code[10])
    begin
        if CurrItem."No." <> ItemNo then
            CurrItem.Get(ItemNo);

        if (ItemNo <> CurrStockKeepingUnit."Item No.") or
           (LocationCode <> CurrStockKeepingUnit."Location Code") or
           (VariantCode <> CurrStockKeepingUnit."Variant Code")
        then
            if not CurrStockKeepingUnit.Get(LocationCode, ItemNo, VariantCode) then
                Clear(CurrStockKeepingUnit);
    end;

    procedure SetWhseRequest(NewWarehouseRequest: Record "Warehouse Request"; NewSetHideDialog: Boolean)
    begin
        CurrWarehouseRequest := NewWarehouseRequest;
        HideDialog := NewSetHideDialog;
        LineCreated := false;
    end;

    procedure CheckSourceDoc(NewWarehouseRequest: Record "Warehouse Request"): Boolean
    var
        PurchaseLine: Record "Purchase Line";
        SalesLine: Record "Sales Line";
        TransferLine: Record "Transfer Line";
        JobPlanningLine: Record "Job Planning Line";
        IsHandled: Boolean;
        Result: Boolean;
    begin
        CurrWarehouseRequest := NewWarehouseRequest;

        IsHandled := false;
        OnBeforeCheckSourceDoc(NewWarehouseRequest, Result, IsHandled);
        if IsHandled then
            exit(Result);

        if not GetSourceDocHeader() then
            exit(false);

        CheckLineExist := true;
        case CurrWarehouseRequest."Source Document" of
            CurrWarehouseRequest."Source Document"::"Purchase Order":
                exit(SetFilterPurchLine(PurchaseLine, SourceDocRecordVar));
            CurrWarehouseRequest."Source Document"::"Purchase Return Order":
                exit(SetFilterPurchLine(PurchaseLine, SourceDocRecordVar));
            CurrWarehouseRequest."Source Document"::"Sales Order":
                exit(SetFilterSalesLine(SalesLine, SourceDocRecordVar));
            CurrWarehouseRequest."Source Document"::"Sales Return Order":
                exit(SetFilterSalesLine(SalesLine, SourceDocRecordVar));
            CurrWarehouseRequest."Source Document"::"Outbound Transfer":
                exit(SetFilterTransferLine(TransferLine, SourceDocRecordVar));
            CurrWarehouseRequest."Source Document"::"Job Usage":
                exit(SetFilterJobPlanningLine(JobPlanningLine, SourceDocRecordVar));
            else begin
                IsHandled := false;
                OnCheckSourceDocForWhseRequest(
                    CurrWarehouseRequest, SourceDocRecordRef, CurrWarehouseActivityHeader, CheckLineExist, Result, IsHandled,
                    IsInvtMovement, WarehouseSourceFilter, ApplySourceFilters, SourceDocRecordVar);
                if IsHandled then
                    exit(Result);
            end;
        end;
    end;

    procedure AutoCreatePickOrMove(var NewWarehouseActivityHeader: Record "Warehouse Activity Header")
    var
        IsHandled: Boolean;
    begin
        CurrWarehouseActivityHeader := NewWarehouseActivityHeader;
        CheckLineExist := false;
        AutoCreation := true;
        GetLocation(CurrWarehouseRequest."Location Code");

        IsHandled := false;
        OnBeforeAutoCreatePickOrMove(CurrWarehouseRequest, CurrWarehouseActivityHeader, LineCreated, IsHandled, HideDialog, IsInvtMovement, IsBlankInvtMovement, CompleteShipment);
        if IsHandled then
            exit;

        case CurrWarehouseRequest."Source Document" of
            CurrWarehouseRequest."Source Document"::"Purchase Order":
                CreatePickOrMoveFromPurchase(SourceDocRecordVar);
            CurrWarehouseRequest."Source Document"::"Purchase Return Order":
                CreatePickOrMoveFromPurchase(SourceDocRecordVar);
            CurrWarehouseRequest."Source Document"::"Sales Order":
                CreatePickOrMoveFromSales(SourceDocRecordVar);
            CurrWarehouseRequest."Source Document"::"Sales Return Order":
                CreatePickOrMoveFromSales(SourceDocRecordVar);
            CurrWarehouseRequest."Source Document"::"Outbound Transfer":
                CreatePickOrMoveFromTransfer(SourceDocRecordVar);
            CurrWarehouseRequest."Source Document"::"Job Usage":
                CreatePickOrMoveFromJobPlanning(SourceDocRecordVar);
            else
                OnAutoCreatePickOrMoveFromWhseRequest(
                    CurrWarehouseRequest, SourceDocRecordRef, LineCreated, CurrWarehouseActivityHeader, CurrLocation,
                    HideDialog, CompleteShipment, CheckLineExist, IsInvtMovement, WarehouseSourceFilter, ApplySourceFilters,
                    ReservedFromStock, SourceDocRecordVar);
        end;

        if LineCreated then begin
            OnAutoCreatePickOrMoveOnBeforeWarehouseActivityHeaderModify(CurrWarehouseActivityHeader, CurrWarehouseRequest, CurrLocation);
            CurrWarehouseActivityHeader.Modify();
            NewWarehouseActivityHeader := CurrWarehouseActivityHeader;
        end;

        OnAfterAutoCreatePickOrMove(CurrWarehouseRequest, LineCreated, NewWarehouseActivityHeader, CurrLocation, HideDialog);
    end;

    procedure SetReportGlobals(PrintDocument2: Boolean; ShowError2: Boolean)
    begin
        PrintDocument := PrintDocument2;
        ShowError := ShowError2;
    end;

    procedure SetReportGlobals(PrintDocument2: Boolean; ShowError2: Boolean; ReservedFromStock2: Enum "Reservation From Stock")
    begin
        PrintDocument := PrintDocument2;
        ShowError := ShowError2;
        ReservedFromStock := ReservedFromStock2;
    end;

    local procedure SetFilterReservEntry(var ReservationEntry: Record "Reservation Entry"; WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
        ReservationEntry.Reset();
        ReservationEntry.SetCurrentKey("Source ID", "Source Ref. No.", "Source Type", "Source Subtype", "Source Batch Name", "Source Prod. Order Line");
        ReservationEntry.SetRange("Source ID", WarehouseActivityLine."Source No.");
        if WarehouseActivityLine."Source Type" = 5407 then // Database::"Prod. Order Component"
            ReservationEntry.SetRange("Source Ref. No.", WarehouseActivityLine."Source Subline No.")
        else
            ReservationEntry.SetRange("Source Ref. No.", WarehouseActivityLine."Source Line No.");

        if WarehouseActivityLine."Source Type" in [Database::Job, Database::"Job Planning Line"] then begin
            ReservationEntry.SetRange("Source Type", Database::"Job Planning Line");
            ReservationEntry.SetRange("Source Subtype", "Job Planning Line Status"::Order.AsInteger());
        end else begin
            ReservationEntry.SetRange("Source Type", WarehouseActivityLine."Source Type");
            ReservationEntry.SetRange("Source Subtype", WarehouseActivityLine."Source Subtype");
        end;

        if WarehouseActivityLine."Source Type" = 5407 then // Database::"Prod. Order Component"
            ReservationEntry.SetRange("Source Prod. Order Line", WarehouseActivityLine."Source Line No.");
        ReservationEntry.SetRange(Positive, false);
    end;

    /// <summary>
    /// Sets the global option for inventory movement status.
    /// </summary>
    /// <param name="InvtMovement">Indicates whether the operation involves inventory movement.</param>
    procedure SetInvtMovement(InvtMovement: Boolean)
    begin
        IsInvtMovement := InvtMovement;
    end;

    local procedure PickOrMoveAccordingToFEFO(LocationCode: Code[10]; WhseItemTrackingSetup: Record "Item Tracking Setup"): Boolean
    begin
        GetLocation(LocationCode);

        exit(CurrLocation."Pick According to FEFO" and WhseItemTrackingSetup.TrackingRequired());
    end;

    /// <summary>
    /// Determines and updates quantity to track.
    /// </summary>
    /// <param name="QtyToTrackBase">Quantity to track in base unit.</param>
    /// <returns>Returns 'true' if there is quantity to track, otherwise 'false'.</returns>
    procedure UndefinedItemTracking(var QtyToTrackBase: Decimal): Boolean
    var
        DummyItemTrackingSetup: Record "Item Tracking Setup";
    begin
        QtyToTrackBase := QtyToTrackBase + ItemTrackedQuantity(DummyItemTrackingSetup);

        exit(QtyToTrackBase > 0);
    end;

    local procedure ItemTrackedQuantity(WhseItemTrackingSetup: Record "Item Tracking Setup"): Decimal
    var
        IsTrackingEmpty: Boolean;
    begin
        TempTrackingSpecification.Reset();
        if not WhseItemTrackingSetup.TrackingExists() then
            if TempTrackingSpecification.IsEmpty() then
                exit(0);

        if WhseItemTrackingSetup."Serial No." <> '' then begin
            TempTrackingSpecification.SetTrackingKey();
            TempTrackingSpecification.SetRange("Serial No.", WhseItemTrackingSetup."Serial No.");
            if TempTrackingSpecification.IsEmpty() then
                exit(0);

            exit(1);
        end;

        if WhseItemTrackingSetup."Lot No." <> '' then begin
            TempTrackingSpecification.SetTrackingKey();
            TempTrackingSpecification.SetRange("Lot No.", WhseItemTrackingSetup."Lot No.");
            if TempTrackingSpecification.IsEmpty() then
                exit(0);
        end;

        IsTrackingEmpty := false;
        OnItemTrackedQuantityOnAfterCheckTracking(TempTrackingSpecification, WhseItemTrackingSetup, IsTrackingEmpty);
        if IsTrackingEmpty then
            exit(0);

        TempTrackingSpecification.SetCurrentKey(
          TempTrackingSpecification."Source ID", TempTrackingSpecification."Source Type", TempTrackingSpecification."Source Subtype", TempTrackingSpecification."Source Batch Name",
          TempTrackingSpecification."Source Prod. Order Line", TempTrackingSpecification."Source Ref. No.");
        if WhseItemTrackingSetup."Lot No." <> '' then
            TempTrackingSpecification.SetRange("Lot No.", WhseItemTrackingSetup."Lot No.");
        TempTrackingSpecification.CalcSums(TempTrackingSpecification."Qty. to Handle (Base)");
        exit(TempTrackingSpecification."Qty. to Handle (Base)");
    end;

    /// <summary>
    /// Creates a temporary handling specification for a warehouse activity line.
    /// </summary>
    /// <param name="WarehouseActivityLine">Warehouse activity line for which the specification is created.</param>
    /// <param name="TotalQtyToPickBase">Total quantity to pick in base unit.</param>
    procedure CreateTempHandlingSpec(WarehouseActivityLine: Record "Warehouse Activity Line"; TotalQtyToPickBase: Decimal)
    var
        EntrySummary: Record "Entry Summary";
        WhseItemTrackingSetup: Record "Item Tracking Setup";
        WhseItemTrackingFEFO: Codeunit "Whse. Item Tracking FEFO";
        TotalAvailQtyToPickBase: Decimal;
        RemQtyToPickBase: Decimal;
        QtyToPickBase: Decimal;
        QtyTracked: Decimal;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCreateTempHandlingSpec(WarehouseActivityLine, TotalQtyToPickBase, IsHandled);
        if IsHandled then
            exit;

        if CurrLocation."Bin Mandatory" then
            if not IsItemOnBins(WarehouseActivityLine) then
                exit;

        WhseItemTrackingFEFO.SetSource(
          WarehouseActivityLine."Source Type", WarehouseActivityLine."Source Subtype", WarehouseActivityLine."Source No.",
          WarehouseActivityLine."Source Line No.", WarehouseActivityLine."Source Subline No.");
        OnCreateTempHandlingSpecOnAfterWhseItemTrackingFEFOSetSource(WhseItemTrackingFEFO, WarehouseActivityLine, CurrWarehouseRequest);
        WhseItemTrackingFEFO.CreateEntrySummaryFEFO(CurrLocation, WarehouseActivityLine."Item No.", WarehouseActivityLine."Variant Code", true);
        if WhseItemTrackingFEFO.FindFirstEntrySummaryFEFO(EntrySummary) then begin
            InitTempHandlingSpec();
            RemQtyToPickBase := TotalQtyToPickBase;
            repeat
                WhseItemTrackingSetup.CopyTrackingFromEntrySummary(EntrySummary);
                if EntrySummary."Expiration Date" <> 0D then begin
                    QtyTracked := ItemTrackedQuantity(WhseItemTrackingSetup);
                    OnCreateTempHandlingSpecOnAfterCalcQtyTracked(EntrySummary, QtyTracked, TempTrackingSpecification);
                    if not ((EntrySummary."Serial No." <> '') and (QtyTracked > 0)) then begin
                        if CurrLocation."Bin Mandatory" then
                            TotalAvailQtyToPickBase :=
                              CalcQtyAvailToPickOnBins(WarehouseActivityLine, WhseItemTrackingSetup, RemQtyToPickBase)
                        else
                            TotalAvailQtyToPickBase := CalcInvtAvailability(WarehouseActivityLine, WhseItemTrackingSetup);
                        OnCreateTempHandlingSpecOnAfterCalcTotalAvailQtyToPickBase(WarehouseActivityLine, EntrySummary, TotalAvailQtyToPickBase);

                        TotalAvailQtyToPickBase := TotalAvailQtyToPickBase - QtyTracked;
                        QtyToPickBase := 0;

                        OnAfterCalcTotalAvailQtyToPickBase(
                          WarehouseActivityLine."Item No.", WarehouseActivityLine."Variant Code", EntrySummary."Serial No.", EntrySummary."Lot No.",
                          CurrLocation.Code, '', WarehouseActivityLine."Source Type", WarehouseActivityLine."Source Subtype", WarehouseActivityLine."Source No.",
                          WarehouseActivityLine."Source Line No.", WarehouseActivityLine."Source Subline No.", RemQtyToPickBase, TotalAvailQtyToPickBase);

                        if TotalAvailQtyToPickBase > 0 then
                            if TotalAvailQtyToPickBase >= RemQtyToPickBase then begin
                                QtyToPickBase := RemQtyToPickBase;
                                RemQtyToPickBase := 0
                            end else begin
                                QtyToPickBase := TotalAvailQtyToPickBase;
                                RemQtyToPickBase := RemQtyToPickBase - QtyToPickBase;
                            end;

                        if QtyToPickBase > 0 then
                            InsertTempHandlingSpec(
                              EntrySummary, WarehouseActivityLine, QtyToPickBase);
                    end;
                end;
            until not WhseItemTrackingFEFO.FindNextEntrySummaryFEFO(EntrySummary) or (RemQtyToPickBase = 0);
        end;
        HasExpiredItems := WhseItemTrackingFEFO.GetHasExpiredItems();
        ExpiredItemMessageText := WhseItemTrackingFEFO.GetResultMessageForExpiredItem();
    end;

    local procedure InitTempHandlingSpec()
    begin
        TempTrackingSpecification.Reset();
        if TempTrackingSpecification.FindLast() then
            LastTempHandlingSpecNo := TempTrackingSpecification."Entry No."
        else
            LastTempHandlingSpecNo := 0;
    end;

    local procedure InsertTempHandlingSpec(EntrySummary: Record "Entry Summary"; WarehouseActivityLine: Record "Warehouse Activity Line"; QuantityBase: Decimal)
    begin
        TempTrackingSpecification.Init();
        TempTrackingSpecification."Entry No." := LastTempHandlingSpecNo + 1;
        if WarehouseActivityLine."Source Type" = 5407 then // Database::"Prod. Order Component"
            TempTrackingSpecification.SetSource(
              WarehouseActivityLine."Source Type", WarehouseActivityLine."Source Subtype", WarehouseActivityLine."Source No.",
              WarehouseActivityLine."Source Subline No.", '', WarehouseActivityLine."Source Line No.")
        else
            TempTrackingSpecification.SetSource(
              WarehouseActivityLine."Source Type", WarehouseActivityLine."Source Subtype", WarehouseActivityLine."Source No.",
              WarehouseActivityLine."Source Line No.", '', 0);
        TempTrackingSpecification."Location Code" := WarehouseActivityLine."Location Code";
        TempTrackingSpecification."Item No." := WarehouseActivityLine."Item No.";
        TempTrackingSpecification."Variant Code" := WarehouseActivityLine."Variant Code";
        TempTrackingSpecification.CopyTrackingFromEntrySummary(EntrySummary);
        TempTrackingSpecification."Expiration Date" := EntrySummary."Expiration Date";
        TempTrackingSpecification.Correction := true;
        OnInsertTempHandlingSpecOnBeforeValidateQtyBase(TempTrackingSpecification, EntrySummary);
        TempTrackingSpecification.Validate(TempTrackingSpecification."Quantity (Base)", -QuantityBase);
        TempTrackingSpecification.Insert();
        LastTempHandlingSpecNo := TempTrackingSpecification."Entry No.";
    end;

    local procedure SetFilterInternalMovement(var InternalMovementLine: Record "Internal Movement Line"; InternalMovementHeader: Record "Internal Movement Header"): Boolean
    begin
        InternalMovementLine.SetRange("No.", InternalMovementHeader."No.");
        InternalMovementLine.SetFilter("Qty. (Base)", '>0');
        OnSetFilterInternalMomementOnAfterSetFilters(InternalMovementLine, InternalMovementHeader);
        exit(InternalMovementLine.Find('-'));
    end;

    local procedure SetFilterWhseWorksheetLine(var WhseWorksheetLine2: Record "Whse. Worksheet Line"; WhseWorksheetLine: Record "Whse. Worksheet Line"): Boolean
    begin
        Clear(WhseWorksheetLine2);
        WhseWorksheetLine2.SetRange("Worksheet Template Name", WhseWorksheetLine."Worksheet Template Name");
        WhseWorksheetLine2.SetRange(Name, WhseWorksheetLine.Name);
        WhseWorksheetLine2.SetRange("Location Code", WhseWorksheetLine."Location Code");
        WhseWorksheetLine2.SetFilter("Qty. (Base)", '>0');
        exit(WhseWorksheetLine2.FindSet());
    end;

    /// <summary>
    /// Creates an inventory movement document for internal warehouse activities, based on provided inventory movement header.
    /// </summary>
    /// <param name="InternalMovementHeader">Provided internal movement header.</param>
    procedure CreateInvtMvntWithoutSource(var InternalMovementHeader: Record "Internal Movement Header")
    var
        InternalMovementLine: Record "Internal Movement Line";
        NewWarehouseActivityLine: Record "Warehouse Activity Line";
        RemQtyToPickBase: Decimal;
        IsHandled: Boolean;
    begin
        if not HideDialog then
            if not Confirm(CreateInvtMvmtQst, false) then
                exit;

        IsInvtMovement := true;
        IsBlankInvtMovement := true;

        InternalMovementHeader.TestField("Location Code");

        if not SetFilterInternalMovement(InternalMovementLine, InternalMovementHeader) then begin
            RaiseNothingToHandleMessage();
            exit;
        end;
        // creating Inventory Movement Header
        Clear(CurrWarehouseActivityHeader);
        CurrWarehouseActivityHeader.Type := CurrWarehouseActivityHeader.Type::"Invt. Movement";
        CurrWarehouseActivityHeader.Insert(true);
        CurrWarehouseActivityHeader.Validate("Location Code", InternalMovementHeader."Location Code");
        CurrWarehouseActivityHeader.Validate("Posting Date", InternalMovementHeader."Due Date");
        CurrWarehouseActivityHeader.Validate("Assigned User ID", InternalMovementHeader."Assigned User ID");
        CurrWarehouseActivityHeader.Validate("Assignment Date", InternalMovementHeader."Assignment Date");
        CurrWarehouseActivityHeader.Validate("Assignment Time", InternalMovementHeader."Assignment Time");
        OnInvtMvntWithoutSourceOnBeforeWhseActivHeaderModify(CurrWarehouseActivityHeader, InternalMovementHeader);
        CurrWarehouseActivityHeader.Modify();

        FindNextLineNo();

        repeat
            NewWarehouseActivityLine.Init();
            NewWarehouseActivityLine."Activity Type" := CurrWarehouseActivityHeader.Type;
            NewWarehouseActivityLine."No." := CurrWarehouseActivityHeader."No.";
            InternalMovementLine.TestField("Location Code");
            GetLocation(InternalMovementLine."Location Code");
            if CurrLocation."Bin Mandatory" then
                NewWarehouseActivityLine."Action Type" := NewWarehouseActivityLine."Action Type"::Take;
            NewWarehouseActivityLine."Location Code" := InternalMovementLine."Location Code";
            InternalMovementLine.TestField("From Bin Code");
            FromBinCode := InternalMovementLine."From Bin Code";
            InternalMovementLine.TestField("To Bin Code");
            InternalMovementLine.CheckBin(InternalMovementLine."Location Code", InternalMovementLine."From Bin Code", false);
            InternalMovementLine.CheckBin(InternalMovementLine."Location Code", InternalMovementLine."To Bin Code", true);

            NewWarehouseActivityLine."Bin Code" := InternalMovementLine."To Bin Code";
            NewWarehouseActivityLine."Item No." := InternalMovementLine."Item No.";
            NewWarehouseActivityLine."Variant Code" := InternalMovementLine."Variant Code";
            NewWarehouseActivityLine."Unit of Measure Code" := InternalMovementLine."Unit of Measure Code";
            NewWarehouseActivityLine."Qty. per Unit of Measure" := InternalMovementLine."Qty. per Unit of Measure";
            NewWarehouseActivityLine.Description := InternalMovementLine.Description;
            NewWarehouseActivityLine."Due Date" := InternalMovementLine."Due Date";
            RemQtyToPickBase := InternalMovementLine."Qty. (Base)";
            OnCreateInvtMvntWithoutSourceOnAfterTransferFields(NewWarehouseActivityLine, InternalMovementLine);
            PrepareItemTrackingForInternalMovement(InternalMovementLine);
            CreatePickOrMoveLine(NewWarehouseActivityLine, RemQtyToPickBase, RemQtyToPickBase, false);
        until InternalMovementLine.Next() = 0;

        if NextLineNo = 10000 then begin
            IsHandled := false;
            OnCreateInvtMvntWithoutSourceOnBeforeNothingToHandleError(CurrWarehouseActivityHeader, IsHandled);
            if not IsHandled then
                Error(NothingToHandleMsg);
        end;

        MoveWhseComments(InternalMovementHeader."No.", CurrWarehouseActivityHeader."No.");

        if DeleteHandledInternalMovementLines(InternalMovementHeader."No.") then begin
            InternalMovementHeader.Delete(true);
            if not HideDialog then
                Message(ActivityCreatedMsg, CurrWarehouseActivityHeader.Type, CurrWarehouseActivityHeader."No.");
        end else
            if not HideDialog then
                Message(TrackingNotFullyAppliedMsg, CurrWarehouseActivityHeader.Type, CurrWarehouseActivityHeader."No.");

        OnAfterCreateInvtMvntWithoutSource(CurrWarehouseActivityHeader, InternalMovementHeader);
    end;

    /// <summary>
    /// Creates an inventory movement document for internal warehouse activities, based on provided warehouse worksheet line.
    /// </summary>
    /// <param name="InternalMovementHeader">Provided warehouse worksheet line.</param>
    procedure CreateInvtMvntWithoutSource(var WhseWorksheetLine: Record "Whse. Worksheet Line")
    var
        WhseWorksheetLine2: Record "Whse. Worksheet Line";
        NewWarehouseActivityLine: Record "Warehouse Activity Line";
        RelatedBin: Record Bin;
        RemQtyToPickBase: Decimal;
    begin
        if not HideDialog then
            if not Confirm(CreateInvtMvmtQst, false) then
                exit;

        IsInvtMovement := true;
        IsBlankInvtMovement := true;

        WhseWorksheetLine.TestField("Location Code");

        if not SetFilterWhseWorksheetLine(WhseWorksheetLine2, WhseWorksheetLine) then begin
            RaiseNothingToHandleMessage();
            exit;
        end;
        // creating Inventory Movement Header
        Clear(CurrWarehouseActivityHeader);
        CurrWarehouseActivityHeader.Type := CurrWarehouseActivityHeader.Type::"Invt. Movement";
        CurrWarehouseActivityHeader.Insert(true);
        CurrWarehouseActivityHeader.Validate("Location Code", WhseWorksheetLine."Location Code");
        CurrWarehouseActivityHeader.Validate("Posting Date", WhseWorksheetLine."Due Date");
        CurrWarehouseActivityHeader.Modify();

        FindNextLineNo();

        repeat
            NewWarehouseActivityLine.Init();
            NewWarehouseActivityLine."Activity Type" := CurrWarehouseActivityHeader.Type;
            NewWarehouseActivityLine."No." := CurrWarehouseActivityHeader."No.";
            WhseWorksheetLine2.TestField(WhseWorksheetLine2."Location Code");
            GetLocation(WhseWorksheetLine2."Location Code");
            if CurrLocation."Bin Mandatory" then
                NewWarehouseActivityLine."Action Type" := NewWarehouseActivityLine."Action Type"::Take;
            NewWarehouseActivityLine."Location Code" := WhseWorksheetLine2."Location Code";
            if not CurrLocation."Pick According to FEFO" then
                WhseWorksheetLine2.TestField(WhseWorksheetLine2."From Bin Code");
            FromBinCode := WhseWorksheetLine2."From Bin Code";
            WhseWorksheetLine2.TestField(WhseWorksheetLine2."To Bin Code");
            WhseWorksheetLine2.CheckBin(WhseWorksheetLine2."Location Code", WhseWorksheetLine2."From Bin Code", false);
            WhseWorksheetLine2.CheckBin(WhseWorksheetLine2."Location Code", WhseWorksheetLine2."To Bin Code", true);

            NewWarehouseActivityLine."Bin Code" := WhseWorksheetLine2."To Bin Code";
            if WhseWorksheetLine2."To Bin Code" <> '' then begin
                RelatedBin.Get(CurrLocation.Code, WhseWorksheetLine2."To Bin Code");
                NewWarehouseActivityLine."Zone Code" := RelatedBin."Zone Code";
            end;
            NewWarehouseActivityLine."Item No." := WhseWorksheetLine2."Item No.";
            NewWarehouseActivityLine."Variant Code" := WhseWorksheetLine2."Variant Code";
            NewWarehouseActivityLine."Unit of Measure Code" := WhseWorksheetLine2."Unit of Measure Code";
            NewWarehouseActivityLine."Qty. per Unit of Measure" := WhseWorksheetLine2."Qty. per Unit of Measure";
            NewWarehouseActivityLine.Description := WhseWorksheetLine2.Description;
            NewWarehouseActivityLine."Due Date" := WhseWorksheetLine2."Due Date";
            RemQtyToPickBase := WhseWorksheetLine2."Qty. (Base)";
            PrepareItemTrackingForWhseMovement(WhseWorksheetLine2);
            OnCreateInvtMvntWithoutSourceOnBeforeCreatePickOrMoveLine(NewWarehouseActivityLine, WhseWorksheetLine2);
            CreatePickOrMoveLine(NewWarehouseActivityLine, RemQtyToPickBase, RemQtyToPickBase, false);
        until WhseWorksheetLine2.Next() = 0;

        if NextLineNo = 10000 then
            Error(NothingToHandleMsg);

        MoveWhseComments(WhseWorksheetLine."Whse. Document No.", CurrWarehouseActivityHeader."No.");

        if DeleteHandledWhseWorksheetLines(WhseWorksheetLine.Name, WhseWorksheetLine."Worksheet Template Name") then begin
            if not HideDialog then
                Message(ActivityCreatedMsg, CurrWarehouseActivityHeader.Type, CurrWarehouseActivityHeader."No.");
        end else
            if (not HideDialog) and (not HideDialogForTracking) then
                Message(TrackingNotFullyAppliedMsg, CurrWarehouseActivityHeader.Type, CurrWarehouseActivityHeader."No.");
    end;

    local procedure DeleteHandledWhseWorksheetLines(WhseWorksheetName: Code[20]; WhseWorksheetTemplateName: Code[20]): Boolean
    var
        WhseWorksheetLine: Record "Whse. Worksheet Line";
    begin
        if TempInternalMovementLine.IsEmpty() then
            exit(false);

        WhseWorksheetLine.SetRange(Name, WhseWorksheetName);
        WhseWorksheetLine.SetRange("Worksheet Template Name", WhseWorksheetTemplateName);
        WhseWorksheetLine.FindSet();
        repeat
            TempInternalMovementLine.SetRange("Item No.", WhseWorksheetLine."Item No.");
            TempInternalMovementLine.SetRange("Variant Code", WhseWorksheetLine."Variant Code");
            TempInternalMovementLine.SetRange("Location Code", WhseWorksheetLine."Location Code");
            TempInternalMovementLine.SetRange("Unit of Measure Code", WhseWorksheetLine."Unit of Measure Code");
            TempInternalMovementLine.SetRange("From Bin Code", WhseWorksheetLine."From Bin Code");
            TempInternalMovementLine.SetRange("To Bin Code", WhseWorksheetLine."To Bin Code");
            if TempInternalMovementLine.FindFirst() then
                if WhseWorksheetLine.Quantity <= TempInternalMovementLine.Quantity then begin
                    TempInternalMovementLine.Quantity -= WhseWorksheetLine.Quantity;
                    TempInternalMovementLine."Qty. (Base)" -= WhseWorksheetLine."Qty. (Base)";
                    if TempInternalMovementLine.Quantity = 0 then
                        TempInternalMovementLine.Delete()
                    else
                        TempInternalMovementLine.Modify();
                    WhseWorksheetLine.Delete(true);
                end else begin
                    WhseWorksheetLine.Quantity -= TempInternalMovementLine.Quantity;
                    WhseWorksheetLine."Qty. (Base)" -= TempInternalMovementLine."Qty. (Base)";
                    ItemTrackingManagement.DeleteWhseItemTrkgLines(
                      Database::"Whse. Worksheet Line", 0, WhseWorksheetLine.Name, WhseWorksheetLine."Worksheet Template Name", 0, WhseWorksheetLine."Line No.", WhseWorksheetLine."Location Code", true);
                    WhseWorksheetLine.Modify(true);
                    TempInternalMovementLine.Delete();
                end;
        until WhseWorksheetLine.Next() = 0;
        exit(WhseWorksheetLine.IsEmpty);
    end;

    local procedure DeleteHandledInternalMovementLines(InternalMovementHeaderNo: Code[20]): Boolean
    var
        InternalMovementLine: Record "Internal Movement Line";
    begin
        if TempInternalMovementLine.IsEmpty() then
            exit(false);

        InternalMovementLine.SetRange("No.", InternalMovementHeaderNo);
        OnDeleteHandledInternalMovementLinesOnAfterInternalMovementLineSetFilters(InternalMovementLine, InternalMovementHeaderNo);
        InternalMovementLine.FindSet();
        repeat
            TempInternalMovementLine.SetRange("Item No.", InternalMovementLine."Item No.");
            TempInternalMovementLine.SetRange("Variant Code", InternalMovementLine."Variant Code");
            TempInternalMovementLine.SetRange("Location Code", InternalMovementLine."Location Code");
            TempInternalMovementLine.SetRange("Unit of Measure Code", InternalMovementLine."Unit of Measure Code");
            TempInternalMovementLine.SetRange("From Bin Code", InternalMovementLine."From Bin Code");
            TempInternalMovementLine.SetRange("To Bin Code", InternalMovementLine."To Bin Code");
            if TempInternalMovementLine.FindFirst() then
                if InternalMovementLine.Quantity <= TempInternalMovementLine.Quantity then begin
                    TempInternalMovementLine.Quantity -= InternalMovementLine.Quantity;
                    TempInternalMovementLine."Qty. (Base)" -= InternalMovementLine."Qty. (Base)";
                    OnDeleteHandledInternalMovementLinesOnBeforeModifyTempInternalMovementLine(
                      TempInternalMovementLine, InternalMovementLine);
                    if TempInternalMovementLine.Quantity = 0 then
                        TempInternalMovementLine.Delete()
                    else
                        TempInternalMovementLine.Modify();
                    InternalMovementLine.Delete(true);
                end else begin
                    InternalMovementLine.Quantity -= TempInternalMovementLine.Quantity;
                    InternalMovementLine."Qty. (Base)" -= TempInternalMovementLine."Qty. (Base)";
                    ItemTrackingManagement.DeleteWhseItemTrkgLines(
                      Database::"Internal Movement Line", 0, InternalMovementLine."No.", '', 0, InternalMovementLine."Line No.", InternalMovementLine."Location Code", true);
                    OnDeleteHandledInternalMovementLinesOnBeforeInternalMovementLineModify(
                      InternalMovementLine, TempInternalMovementLine);
                    InternalMovementLine.Modify(true);
                    TempInternalMovementLine.Delete();
                end;
        until InternalMovementLine.Next() = 0;
        exit(InternalMovementLine.IsEmpty);
    end;

    local procedure PrepareItemTrackingForInternalMovement(InternalMovementLine: Record "Internal Movement Line")
    begin
        // function recopies warehouse item tracking into temporary item tracking table
        // when Invt. Movement is created from Internal Movement
        TempReservationEntry.Reset();
        TempReservationEntry.DeleteAll();

        PrepareItemTrackingFromWhse(
          Database::"Internal Movement Line", 0, InternalMovementLine."No.", '', 0, InternalMovementLine."Line No.", -1, false);

        OnAfterPrepareItemTrackingForInternalMovement(InternalMovementLine, TempReservationEntry);
    end;

    local procedure PrepareItemTrackingForWhseMovement(WhseWorksheetLine: Record "Whse. Worksheet Line")
    begin
        // function recopies warehouse item tracking into temporary item tracking table
        // when Invt. Movement is created from Whse. Worksheet Line
        TempReservationEntry.Reset();
        TempReservationEntry.DeleteAll();

        PrepareItemTrackingFromWhse(
          Database::"Whse. Worksheet Line", 0, WhseWorksheetLine.Name, WhseWorksheetLine."Worksheet Template Name", 0, WhseWorksheetLine."Line No.", -1, true);
    end;

    local procedure PrepareItemTrackingFromWhse(SourceType: Integer; SourceSubtype: Integer; SourceNo: Code[20]; SourceBatchName: Code[20]; SourceProdOrderLine: Integer; SourceLineNo: Integer; SignFactor: Integer; FromWhseWorksheet: Boolean)
    var
        WhseItemTrackingLine: Record "Whse. Item Tracking Line";
        EntryNo: Integer;
    begin
        if TempReservationEntry.FindLast() then
            EntryNo := TempReservationEntry."Entry No.";

        WhseItemTrackingLine.SetSourceFilter(SourceType, SourceSubtype, SourceNo, SourceLineNo, true);
        if FromWhseWorksheet then
            WhseItemTrackingLine.SetRange("Source Batch Name", SourceBatchName);
        if SourceProdOrderLine <> 0 then
            WhseItemTrackingLine.SetRange("Source Prod. Order Line", SourceProdOrderLine);
        if WhseItemTrackingLine.Find('-') then
            repeat
                TempReservationEntry.TransferFields(WhseItemTrackingLine);
                EntryNo += 1;
                TempReservationEntry."Entry No." := EntryNo;
                TempReservationEntry."Reservation Status" := TempReservationEntry."Reservation Status"::Surplus;
                TempReservationEntry.Validate("Quantity (Base)", TempReservationEntry."Quantity (Base)" * SignFactor);
                TempReservationEntry.Positive := (TempReservationEntry."Quantity (Base)" > 0);
                TempReservationEntry.UpdateItemTracking();
                OnBeforeTempReservEntryInsert(TempReservationEntry, WhseItemTrackingLine);
                TempReservationEntry.Insert();
            until WhseItemTrackingLine.Next() = 0;
        OnAfterPrepareItemTrackingFromWhseIT(TempReservationEntry, EntryNo);
    end;

    /// <summary>
    /// Synchronizes warehouse item tracking information with the tracking specification.
    /// </summary>
    /// <param name="TrackingSpecification">Provided tracking specification to synchronize.</param>
    procedure SynchronizeWhseItemTracking(var TrackingSpecification: Record "Tracking Specification")
    var
        WhseItemTrackingLine: Record "Whse. Item Tracking Line";
    begin
        // documents which have defined item tracking - table 337 will have to synchronize these records with 6550 table for invt. movement
        Clear(WhseItemTrackingLine);
        WhseItemTrackingLine.TransferFields(TrackingSpecification);
        WhseItemTrackingLine.Validate("Quantity (Base)", Abs(WhseItemTrackingLine."Quantity (Base)"));
        WhseItemTrackingLine.Validate("Qty. to Invoice (Base)", Abs(WhseItemTrackingLine."Qty. to Invoice (Base)"));
        WhseItemTrackingLine."Entry No." := WhseItemTrackingLine.GetNextEntryNo();
        OnBeforeWhseItemTrackingLineInsert(WhseItemTrackingLine, TrackingSpecification);
        WhseItemTrackingLine.Insert();
    end;

    local procedure MoveWhseComments(DocumentNo: Code[20]; InvtMovementNo: Code[20])
    var
        WarehouseCommentLine1: Record "Warehouse Comment Line";
        WarehouseCommentLine2: Record "Warehouse Comment Line";
    begin
        WarehouseCommentLine1.SetRange("Table Name", WarehouseCommentLine1."Table Name"::"Internal Movement");
        WarehouseCommentLine1.SetRange("No.", DocumentNo);
        WarehouseCommentLine1.LockTable();

        if WarehouseCommentLine1.Find('-') then begin
            repeat
                WarehouseCommentLine2.Init();
                WarehouseCommentLine2 := WarehouseCommentLine1;
                WarehouseCommentLine2."Table Name" := WarehouseCommentLine2."Table Name"::"Whse. Activity Header";
                WarehouseCommentLine2.Type := WarehouseCommentLine1.Type::"Invt. Movement";
                WarehouseCommentLine2."No." := InvtMovementNo;
                WarehouseCommentLine2.Insert();
            until WarehouseCommentLine1.Next() = 0;
            WarehouseCommentLine1.DeleteAll();
        end;
    end;

    /// <summary>
    /// Retrieves the message text for expired items.
    /// </summary>
    /// <returns>Text message for expired items.</returns>
    procedure GetExpiredItemMessage(): Text[100]
    begin
        exit(ExpiredItemMessageText);
    end;

    /// <summary>
    /// Determines whether strict expiration posting is required for an item based on the provided item tracking setup.
    /// </summary>
    /// <param name="ItemNo">Item number to check.</param>
    /// <param name="WhseItemTrackingSetup">Item tracking setup.</param>
    /// <returns>Returns 'true' if strict expiration posting is required, otherwise 'false'.</returns>
    procedure PickStrictExpirationPosting(ItemNo: Code[20]; WhseItemTrackingSetup: Record "Item Tracking Setup"): Boolean
    var
        StrictExpirationPosting: Boolean;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforePickStrictExpirationPosting(
            ItemNo, WhseItemTrackingSetup."Serial No. Required", WhseItemTrackingSetup."Lot No. Required", StrictExpirationPosting, IsHandled);
        if IsHandled then
            exit(StrictExpirationPosting);

        exit(ItemTrackingManagement.StrictExpirationPosting(ItemNo) and WhseItemTrackingSetup.TrackingRequired());
    end;

    /// <summary>
    /// Creates a warehouse activity header if auto creation is enabled and no lines have been created yet.
    /// </summary>
    procedure MakeWarehouseActivityHeader()
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeMakeHeader(CurrWarehouseActivityHeader, AutoCreation, IsHandled);
        if IsHandled then
            exit;

        if AutoCreation and not LineCreated then begin
            CurrWarehouseActivityHeader."No." := '';
            CurrWarehouseActivityHeader.Insert(true);
            UpdateWhseActivHeader(CurrWarehouseRequest);
            NextLineNo := 10000;
            if not SuppressCommit then
                Commit();
        end;
    end;

    /// <summary>
    /// Creates a warehouse activity line based on the provided parameters and updates remaining quantity.
    /// </summary>
    /// <param name="NewWarehouseActivityLine">Warehouse activity line to be created.</param>
    /// <param name="TakeBinCode">Provided bin code.</param>
    /// <param name="QtyToPickBase">Provided quantity to pick in base unit.</param>
    /// <param name="RemQtyToPickBase">Provided remaining quantity to pick in base unit.</param>
    procedure MakeWarehouseActivityLine(var NewWarehouseActivityLine: Record "Warehouse Activity Line"; TakeBinCode: Code[20]; QtyToPickBase: Decimal; var RemQtyToPickBase: Decimal)
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeMakeWarehouseActivityLine(NewWarehouseActivityLine, RemQtyToPickBase, NextLineNo, TakeBinCode, QtyToPickBase, IsInvtMovement, LineCreated, CompleteShipment, IsHandled);
        if IsHandled then
            exit;

        NewWarehouseActivityLine.Quantity := NewWarehouseActivityLine.CalcQty(QtyToPickBase);
        OnAfterCalcPickOrMoveLineQuantity(NewWarehouseActivityLine, QtyToPickBase, NewWarehouseActivityLine.Quantity);
        NewWarehouseActivityLine."Qty. (Base)" := QtyToPickBase;
        NewWarehouseActivityLine."Qty. Outstanding" := NewWarehouseActivityLine.Quantity;
        NewWarehouseActivityLine."Qty. Outstanding (Base)" := NewWarehouseActivityLine."Qty. (Base)";
        SetLineData(NewWarehouseActivityLine, TakeBinCode);
        RemQtyToPickBase := RemQtyToPickBase - QtyToPickBase;
    end;

    /// <summary>
    /// Creates a warehouse activity line when serial number is required and updates remaining quantities.
    /// </summary>
    /// <param name="NewWarehouseActivityLine">Warehouse activity line to be created.</param>
    /// <param name="TakeBinCode">Provided bin code.</param>
    /// <param name="QtyToPickBase">Provided quantity to pick in base unit.</param>
    /// <param name="RemQtyToPickBase">Provided remaining quantity to pick in base unit.</param>
    /// <param name="RemQtyToPick">Provided remaining quantity to pick.</param>
    procedure MakeLineWhenSNoReq(var NewWarehouseActivityLine: Record "Warehouse Activity Line"; TakeBinCode: Code[20]; QtyToPickBase: Decimal; var RemQtyToPickBase: Decimal; var RemQtyToPick: Decimal)
    var
        UnitOfMeasureManagement: Codeunit "Unit of Measure Management";
        CalculatedPickQty: Decimal;
    begin
        CalculatedPickQty := NewWarehouseActivityLine.CalcQty(QtyToPickBase);
        if UnitOfMeasureManagement.RoundQty(UnitOfMeasureManagement.CalcBaseQty(RemQtyToPick - CalculatedPickQty, NewWarehouseActivityLine."Qty. per Unit of Measure"), 1) = 0 then
            NewWarehouseActivityLine.Quantity := RemQtyToPick
        else
            NewWarehouseActivityLine.Quantity := CalculatedPickQty;
        NewWarehouseActivityLine."Qty. (Base)" := QtyToPickBase;
        NewWarehouseActivityLine."Qty. Outstanding" := NewWarehouseActivityLine.Quantity;
        NewWarehouseActivityLine."Qty. Outstanding (Base)" := NewWarehouseActivityLine."Qty. (Base)";
        SetLineData(NewWarehouseActivityLine, TakeBinCode);
        RemQtyToPickBase -= QtyToPickBase;
        RemQtyToPick -= NewWarehouseActivityLine.Quantity;
    end;


    local procedure SetLineData(var NewWarehouseActivityLine: Record "Warehouse Activity Line"; TakeBinCode: Code[20])
    var
        RelatedBin: Record Bin;
        PlaceBinCode: Code[20];
        AllowBlankBin: Boolean;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeSetLineData(NewWarehouseActivityLine, CurrWarehouseActivityHeader, TakeBinCode, NextLineNo, CurrLocation, LineCreated, IsHandled);
        if IsHandled then
            exit;

        PlaceBinCode := NewWarehouseActivityLine."Bin Code";
        NewWarehouseActivityLine."No." := CurrWarehouseActivityHeader."No.";
        NewWarehouseActivityLine."Line No." := NextLineNo;
        if CurrLocation."Bin Mandatory" then begin
            NewWarehouseActivityLine."Action Type" := NewWarehouseActivityLine."Action Type"::Take;
            NewWarehouseActivityLine."Bin Code" := TakeBinCode;
            if TakeBinCode <> '' then begin
                RelatedBin.SetLoadFields("Zone Code");
                RelatedBin.Get(NewWarehouseActivityLine."Location Code", NewWarehouseActivityLine."Bin Code");
                NewWarehouseActivityLine."Zone Code" := RelatedBin."Zone Code";
            end;
            OnBeforeGetSpecEquipmentCode(NewWarehouseActivityLine, TakeBinCode, AllowBlankBin);
            if AllowBlankBin and (TakeBinCode = '') then
                NewWarehouseActivityLine."Special Equipment Code" := ''
            else
                NewWarehouseActivityLine."Special Equipment Code" := GetSpecEquipmentCode(NewWarehouseActivityLine."Item No.", NewWarehouseActivityLine."Variant Code", NewWarehouseActivityLine."Location Code", TakeBinCode);
        end else
            NewWarehouseActivityLine."Shelf No." := GetShelfNo(NewWarehouseActivityLine."Item No.", NewWarehouseActivityLine."Variant Code", NewWarehouseActivityLine."Location Code");
        NewWarehouseActivityLine."Qty. to Handle" := 0;
        NewWarehouseActivityLine."Qty. to Handle (Base)" := 0;
        NewWarehouseActivityLine."Qty. Rounding Precision" := 0;
        OnBeforeNewWhseActivLineInsert(NewWarehouseActivityLine, CurrWarehouseActivityHeader, CurrLocation);
        NewWarehouseActivityLine.Insert();
        if CurrLocation."Bin Mandatory" and IsInvtMovement then begin
            // Place Action for inventory movement
            OnMakeLineOnBeforeUpdatePlaceLine(NewWarehouseActivityLine, PlaceBinCode);
            NextLineNo := NextLineNo + 10000;
            NewWarehouseActivityLine."Line No." := NextLineNo;
            NewWarehouseActivityLine."Action Type" := NewWarehouseActivityLine."Action Type"::Place;
            NewWarehouseActivityLine."Bin Code" := PlaceBinCode;
            if PlaceBinCode <> '' then begin
                RelatedBin.SetLoadFields("Zone Code");
                RelatedBin.Get(NewWarehouseActivityLine."Location Code", NewWarehouseActivityLine."Bin Code");
                NewWarehouseActivityLine."Zone Code" := RelatedBin."Zone Code";
            end;
            NewWarehouseActivityLine."Special Equipment Code" := GetSpecEquipmentCode(NewWarehouseActivityLine."Item No.", NewWarehouseActivityLine."Variant Code", NewWarehouseActivityLine."Location Code", PlaceBinCode);
            NewWarehouseActivityLine.Insert();
            UpdateHandledWhseActivityLineBuffer(NewWarehouseActivityLine, TakeBinCode);
        end;
        LineCreated := true;
        NextLineNo := NextLineNo + 10000;

        OnAfterSetLineData(CurrWarehouseActivityHeader, CurrLocation, NewWarehouseActivityLine);
    end;

    /// <summary>
    /// Retrieves the special equipment code based on the provided parameters.
    /// </summary>
    /// <param name="ItemNo">Item number for which to retrieve the special equipment code.</param>
    /// <param name="VariantCode">Variant code.</param>
    /// <param name="LocationCode">Location code.</param>
    /// <param name="BinCode">Bin code.</param>
    /// <returns>Returns special equipment code.</returns>
    procedure GetSpecEquipmentCode(ItemNo: Code[20]; VariantCode: Code[10]; LocationCode: Code[10]; BinCode: Code[20]): Code[10]
    begin
        GetLocation(LocationCode);
        case CurrLocation."Special Equipment" of
            CurrLocation."Special Equipment"::"According to Bin":
                begin
                    GetBin(CurrLocation.Code, BinCode);
                    if CurrBin."Special Equipment Code" <> '' then
                        exit(CurrBin."Special Equipment Code");

                    GetItemAndSKU(ItemNo, LocationCode, VariantCode);
                    if CurrStockKeepingUnit."Special Equipment Code" <> '' then
                        exit(CurrStockKeepingUnit."Special Equipment Code");

                    exit(CurrItem."Special Equipment Code")
                end;
            CurrLocation."Special Equipment"::"According to SKU/Item":
                begin
                    GetItemAndSKU(ItemNo, LocationCode, VariantCode);
                    if CurrStockKeepingUnit."Special Equipment Code" <> '' then
                        exit(CurrStockKeepingUnit."Special Equipment Code");

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

                    GetBin(CurrLocation.Code, BinCode);
                    exit(CurrBin."Special Equipment Code")
                end
        end
    end;

    local procedure UpdateHandledWhseActivityLineBuffer(WarehouseActivityLine: Record "Warehouse Activity Line"; TakeBinCode: Code[20])
    begin
        TempInternalMovementLine.SetRange("Item No.", WarehouseActivityLine."Item No.");
        TempInternalMovementLine.SetRange("Variant Code", WarehouseActivityLine."Variant Code");
        TempInternalMovementLine.SetRange("Location Code", WarehouseActivityLine."Location Code");
        TempInternalMovementLine.SetRange("To Bin Code", WarehouseActivityLine."Bin Code");
        TempInternalMovementLine.SetRange("From Bin Code", TakeBinCode);
        TempInternalMovementLine.SetRange("Unit of Measure Code", WarehouseActivityLine."Unit of Measure Code");
        if TempInternalMovementLine.FindFirst() then begin
            TempInternalMovementLine.Quantity += WarehouseActivityLine.Quantity;
            TempInternalMovementLine."Qty. (Base)" += WarehouseActivityLine."Qty. (Base)";
            OnUpdateHandledWhseActivityLineBufferOnBeforeTempInternalMovementLineModify(
              TempInternalMovementLine, WarehouseActivityLine);
            TempInternalMovementLine.Modify();
        end else begin
            TempInternalMovementLine."No." := WarehouseActivityLine."No.";
            TempInternalMovementLine."Line No." := WarehouseActivityLine."Line No.";
            TempInternalMovementLine."Item No." := WarehouseActivityLine."Item No.";
            TempInternalMovementLine."Variant Code" := WarehouseActivityLine."Variant Code";
            TempInternalMovementLine."Location Code" := WarehouseActivityLine."Location Code";
            TempInternalMovementLine."To Bin Code" := WarehouseActivityLine."Bin Code";
            TempInternalMovementLine."From Bin Code" := TakeBinCode;
            TempInternalMovementLine.Quantity := WarehouseActivityLine.Quantity;
            TempInternalMovementLine."Qty. (Base)" := WarehouseActivityLine."Qty. (Base)";
            TempInternalMovementLine."Unit of Measure Code" := WarehouseActivityLine."Unit of Measure Code";
            OnUpdateHandledWhseActivityLineBufferOnBeforeTempInternalMovementLineInsert(
              TempInternalMovementLine, WarehouseActivityLine);
            TempInternalMovementLine.Insert();
        end;
    end;

    /// <summary>
    /// Creates a warehouse activity line for assemble-to-order operation based on the provided parameters and updates remaining quantity to pick.
    /// </summary>
    /// <param name="NewWarehouseActivityLine">Provided warehouse activity line.</param>
    /// <param name="BinCode">Provided bin code.</param>
    /// <param name="RemQtyToPickBase">Provided remaining quantity to pick in base unit.</param>
    procedure CreateATOPickLine(NewWarehouseActivityLine: Record "Warehouse Activity Line"; BinCode: Code[20]; var RemQtyToPickBase: Decimal)
    var
        ATOSalesLine: Record "Sales Line";
        ATOJobPlanningLine: Record "Job Planning Line";
        ATOLink: Record Microsoft.Assembly.Document."Assemble-to-Order Link";
        AssemblyHeader: Record Microsoft.Assembly.Document."Assembly Header";
        AssemblySetup: Record Microsoft.Assembly.Setup."Assembly Setup";
        ReservationEntry: Record "Reservation Entry";
        TempTrackingSpecification1: Record "Tracking Specification" temporary;
        WhseItemTrackingSetup: Record "Item Tracking Setup";
        QtyToAsmBase: Decimal;
        QtyToPickBase: Decimal;
    begin
        if (not IsInvtMovement) and
           (WMSManagement.GetATOSalesLine(NewWarehouseActivityLine."Source Type",
             NewWarehouseActivityLine."Source Subtype",
             NewWarehouseActivityLine."Source No.",
             NewWarehouseActivityLine."Source Line No.",
             ATOSalesLine) or
            WMSManagement.GetATOJobPlanningLine(
             NewWarehouseActivityLine."Source Type",
             NewWarehouseActivityLine."Source No.",
             NewWarehouseActivityLine."Source Line No.",
             NewWarehouseActivityLine."Source Subline No.",
             ATOJobPlanningLine))
        then begin
            if ATOLink.AsmExistsForSalesLine(ATOSalesLine) then
                ATOSalesLine.AsmToOrderExists(AssemblyHeader)
            else
                if ATOLink.AsmExistsForJobPlanningLine(ATOJobPlanningLine) then begin
                    ATOJobPlanningLine.AsmToOrderExists(AssemblyHeader);
                    AssemblyHeader.PerformManualRelease();
                end;

            if NewWarehouseActivityLine.TrackingExists() then begin
                AssemblyHeader.SetReservationFilters(ReservationEntry);
                ReservationEntry.SetTrackingFilterFromWhseActivityLine(NewWarehouseActivityLine);
                ReservationEntry.SetRange(Positive, true);
                if ItemTrackingManagement.SumUpItemTracking(ReservationEntry, TempTrackingSpecification1, true, true) then
                    QtyToAsmBase := Abs(TempTrackingSpecification1."Qty. to Handle (Base)");
            end else
                if ATOLink.Type = ATOLink.Type::Sale then
                    QtyToAsmBase := ATOSalesLine.QtyToAsmBaseOnATO()
                else
                    if ATOLink.Type = ATOLink.Type::Job then
                        QtyToAsmBase := ATOJobPlanningLine.QtyToAsmBaseOnATO();
            WhseItemTrackingSetup.CopyTrackingFromWhseActivityLine(NewWarehouseActivityLine);
            if ATOLink.Type = ATOLink.Type::Sale then
                QtyToPickBase := QtyToAsmBase - WMSManagement.CalcQtyBaseOnATOInvtPick(ATOSalesLine, WhseItemTrackingSetup)
            else
                if ATOLink.Type = ATOLink.Type::Job then
                    QtyToPickBase := QtyToAsmBase - WMSManagement.CalcQtyBaseOnATOInvtPick(ATOJobPlanningLine, WhseItemTrackingSetup);
            OnCreateATOPickLineOnAfterCalcQtyToPickBase(RemQtyToPickBase, QtyToPickBase, ATOSalesLine);
            if QtyToPickBase > 0 then begin
                MakeWarehouseActivityHeader();
                if CurrLocation."Bin Mandatory" and (BinCode = '') then
                    if ATOLink.Type = ATOLink.Type::Sale then
                        ATOSalesLine.GetATOBin(CurrLocation, BinCode)
                    else
                        if ATOLink.Type = ATOLink.Type::Job then
                            ATOJobPlanningLine.GetATOBin(CurrLocation, BinCode);
                NewWarehouseActivityLine."Assemble to Order" := true;
                MakeWarehouseActivityLine(NewWarehouseActivityLine, BinCode, QtyToPickBase, RemQtyToPickBase);

                AssemblySetup.Get();
                if AssemblySetup."Create Movements Automatically" then
                    CreateATOInventoryMovementsAutomatically(AssemblyHeader, ATOInvtMovementsCreated, TotalATOInvtMovementsToBeCreated);
            end;
        end;
        OnAfterCreateATOPickLine(QtyToPickBase, AssemblyHeader, NewWarehouseActivityLine, CurrWarehouseActivityHeader, RemQtyToPickBase);
    end;

    local procedure CreateATOInventoryMovementsAutomatically(var AssemblyHeader: Record Microsoft.Assembly.Document."Assembly Header"; var AssemToOrdInvtMovementsCreated: Integer; var TotalAssemToOrdInvtMovementsToBeCreated: Integer)
    var
        MovementsCreated: Integer;
        TotalMovementsCreated: Integer;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCreateATOInventoryMovementsAutomatically(AssemblyHeader, PrintDocument, ShowError, IsHandled);
        if IsHandled then
            exit;

        AssemblyHeader.CreateInvtMovement(true, PrintDocument, ShowError, MovementsCreated, TotalMovementsCreated);
        AssemToOrdInvtMovementsCreated += MovementsCreated;
        TotalAssemToOrdInvtMovementsToBeCreated += TotalMovementsCreated;
    end;

    procedure GetATOMovementsCounters(var MovementsCreated: Integer; var TotalMovementsCreated: Integer)
    begin
        MovementsCreated := ATOInvtMovementsCreated;
        TotalMovementsCreated := TotalATOInvtMovementsToBeCreated;
    end;

    local procedure Minimum(a: Decimal; b: Decimal): Decimal
    begin
        if a < b then
            exit(a);

        exit(b);
    end;

    local procedure CalcQtyAvailToPickOnBins(WarehouseActivityLine: Record "Warehouse Activity Line"; WhseItemTrackingSetup: Record "Item Tracking Setup"; RemQtyToPickBase: Decimal) Result: Decimal
    var
        BinContent: Record "Bin Content";
        TotalAvailQtyToPickBase: Decimal;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCalcQtyAvailToPickOnBins(WarehouseActivityLine, WhseItemTrackingSetup."Lot No.", WhseItemTrackingSetup."Serial No.", RemQtyToPickBase, Result, IsHandled);
        if IsHandled then
            exit(Result);

        TotalAvailQtyToPickBase := 0;

        BinContent.SetRange("Location Code", WarehouseActivityLine."Location Code");
        if FromBinCode <> '' then
            BinContent.SetRange("Bin Code", FromBinCode);
        BinContent.SetRange("Item No.", WarehouseActivityLine."Item No.");
        BinContent.SetRange("Variant Code", WarehouseActivityLine."Variant Code");
        BinContent.SetTrackingFilterFromWhseItemTrackingSetup(WhseItemTrackingSetup);
        if BinContent.Find('-') then
            repeat
                TotalAvailQtyToPickBase += BinContent.CalcQtyAvailToPick(0);
            until (BinContent.Next() = 0) or (TotalAvailQtyToPickBase >= RemQtyToPickBase);

        exit(TotalAvailQtyToPickBase);
    end;

    local procedure IsItemOnBins(WarehouseActivityLine: Record "Warehouse Activity Line"): Boolean
    var
        BinContent: Record "Bin Content";
    begin
        BinContent.SetRange("Location Code", WarehouseActivityLine."Location Code");
        BinContent.SetRange("Item No.", WarehouseActivityLine."Item No.");
        BinContent.SetRange("Variant Code", WarehouseActivityLine."Variant Code");
        exit(not BinContent.IsEmpty);
    end;

    /// <summary>
    /// Sets the option to suppress committing transactions to the database.
    /// </summary>
    /// <param name="NewSuppressCommit">Boolean flag indicating whether to suppress commit.</param>
    /// <remarks>
    /// When 'SuppressCommit' is set to 'true', it indicates that transaction committed to the
    /// database should be suppressed. This can be useful in scenarios where batch processing or
    /// testing requires transactions to be rolled back rather than committed permanently.
    /// </remarks>
    procedure SetSuppressCommit(NewSuppressCommit: Boolean)
    begin
        SuppressCommit := NewSuppressCommit;
    end;

    local procedure CopyReservEntriesToTemp(var TempReservationEntry1: Record "Reservation Entry" temporary; var ReservationEntry: Record "Reservation Entry")
    begin
        TempReservationEntry1.Reset();
        TempReservationEntry1.DeleteAll();

        if ReservationEntry.FindSet() then
            repeat
                TempReservationEntry1 := ReservationEntry;
                TempReservationEntry1.Insert();
            until ReservationEntry.Next() = 0;
    end;

    local procedure UpdateExpirationDate(var WarehouseActivityLine: Record "Warehouse Activity Line"; var EntriesExist: Boolean)
    var
        ItemTrackingMgt: Codeunit "Item Tracking Management";
        ExpirationDate: Date;
    begin
        ExpirationDate := ItemTrackingMgt.ExistingExpirationDate(WarehouseActivityLine, false, EntriesExist);

        if ExpirationDate <> 0D then
            WarehouseActivityLine."Expiration Date" := ExpirationDate;
    end;

    local procedure GetSourceLineNo(WarehouseActivityLine: Record "Warehouse Activity Line"): Integer
    begin
        if WarehouseActivityLine."Source Type" in [Database::Job, Database::"Job Planning Line"] then
            exit(-1);

        exit(WarehouseActivityLine."Source Line No.");
    end;

    procedure SetHideDialogForTracking(NewHideDialogForTracking: Boolean)
    begin
        HideDialogForTracking := NewHideDialogForTracking;
    end;

    procedure RaiseNothingToHandleMessage()
    begin
        if not HideDialog then
            Message(NothingToHandleMsg);
    end;

    local procedure ShouldSetBinCodeForBlankInvtMovement(NewWarehouseActivityLine: Record "Warehouse Activity Line"): Boolean
    begin
        if CheckItemTrackingCodeUseExpirationDates(NewWarehouseActivityLine."Item No.") and (NewWarehouseActivityLine."Expiration Date" <> 0D) then
            exit(false);

        exit(true);
    end;

    local procedure CheckItemTrackingCodeUseExpirationDates(ItemNo: Code[20]): Boolean
    var
        Item2: Record Item;
    begin
        if ItemNo = '' then
            exit;

        Item2.SetLoadFields("Item Tracking Code");
        Item2.Get(ItemNo);
        if Item2.ItemTrackingCodeUseExpirationDates() then
            exit(true);
    end;

    local procedure CorrectQtyRounding(SalesLine: Record "Sales Line"; WarehouseActivityHeader: Record "Warehouse Activity Header")
    var
        WareHouseActivityLine: Record "Warehouse Activity Line";
        TotalQtyPicked: Decimal;
        TotalQtyOutstanding: Decimal;
        TotalQtyOutStandingCalculated: Decimal;
    begin
        if WarehouseActivityHeader.Type <> WarehouseActivityHeader.Type::"Invt. Pick" then
            exit;
        if SalesLine.Type <> SalesLine.Type::Item then
            exit;

        WareHouseActivityLine.SetSource(Database::"Sales Line", SalesLine."Document Type".AsInteger(), SalesLine."Document No.", SalesLine."Line No.", 0);
        WareHouseActivityLine.SetRange("No.", WarehouseActivityHeader."No.");
        WareHouseActivityLine.CalcSums(Quantity, "Qty. (Base)", "Qty. Outstanding", "Qty. Outstanding (Base)");
        TotalQtyPicked := WareHouseActivityLine.Quantity;
        TotalQtyOutstanding := WareHouseActivityLine."Qty. Outstanding";
        TotalQtyOutStandingCalculated := SalesLine.Quantity - SalesLine."Quantity Shipped";

        if (SalesLine.Quantity = TotalQtyPicked) or
           (SalesLine.Quantity <> Round(TotalQtyPicked)) or
           (WareHouseActivityLine."Qty. (Base)" <> SalesLine."Quantity (Base)") then
            exit;

        WareHouseActivityLine.FindLast();
        WareHouseActivityLine.Quantity += (SalesLine.Quantity - TotalQtyPicked);
        WareHouseActivityLine."Qty. Outstanding" += (TotalQtyOutStandingCalculated - TotalQtyOutstanding);
        WareHouseActivityLine.Modify();
    end;

    local procedure ShouldCheckToAssemblyBinContent(): Boolean
    begin
        if CurrLocation."Require Receive" and CurrLocation."Require Pick" then
            exit(false);

        exit(true);
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterAutoCreatePickOrMove(var WarehouseRequest: Record "Warehouse Request"; LineCreated: Boolean; var WarehouseActivityHeader: Record "Warehouse Activity Header"; Location: Record Location; HideDialog: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCreateATOPickLine(QtyToPickBase: Decimal; AssemblyHeader: Record Microsoft.Assembly.Document."Assembly Header"; NewWarehouseActivityLine: Record "Warehouse Activity Line"; var WarehouseActivityHeader: Record "Warehouse Activity Header"; var RemQtyToPickBase: Decimal)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCreateInventoryPickMovement(var WarehouseRequest: Record "Warehouse Request"; LineCreated: Boolean; var WarehouseActivityHeader: Record "Warehouse Activity Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCreateInvtMvntWithoutSource(WhseActivHeader: Record "Warehouse Activity Header"; var InternalMovementHeader: Record "Internal Movement Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCreatePickOrMoveFromTransfer(var WarehouseActivityHeader: Record "Warehouse Activity Header"; TransferHeader: Record "Transfer Header"; var TransferLine: Record "Transfer Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCreatePickOrMoveFromSales(var WarehouseActivityHeader: Record "Warehouse Activity Header"; AutoCreation: Boolean; HideDialog: Boolean; var LineCreated: Boolean; IsInvtMovement: Boolean; IsBlankInvtMovement: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterGetSourceDocHeader(var WarehouseRequest: Record "Warehouse Request"; var PostingDate: Date; var VendorDocNo: Code[35])
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnAfterInsertWhseActivLine(var WarehouseActivityLine: Record "Warehouse Activity Line"; SNRequired: Boolean; LNRequired: Boolean; var RemQtyToPickBase: Decimal; var CompleteShipment: Boolean; var ReservationExists: Boolean; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterInsertPickOrMoveBinWhseActLine(WarehouseActivityLine: Record "Warehouse Activity Line"; WarehouseActivityHeader: Record "Warehouse Activity Header"; var RemQtyToPickBase: Decimal)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCalcTotalAvailQtyToPickBase(ItemNo: Code[20]; VariantNo: Code[10]; SerialNo: Code[50]; LotNo: Code[50]; LocationCode: Code[10]; BinCode: Code[20]; SourceType: Integer; SourceSubtype: Integer; SourceNo: Code[20]; SourceLineNo: Integer; SourceSublineNo: Integer; RemQtyToPickBase: Decimal; var TotalAvailQtyToPickBase: Decimal)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterPrepareItemTrackingFromWhseIT(var ReservationEntry: Record "Reservation Entry"; EntryNo: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterPrepareItemTrackingForInternalMovement(InternalMovementLine: Record "Internal Movement Line"; var ReservationEntryBuffer: Record "Reservation Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetFilterSalesLine(var SalesLine: Record "Sales Line"; SalesHeader: Record "Sales Header"; WarehouseActivityHeader: Record "Warehouse Activity Header"; WarehouseRequest: Record "Warehouse Request"; ShowError: Boolean; var Result: Boolean)
    begin
    end;

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

    [IntegrationEvent(false, false)]
    local procedure OnBeforeGetSpecEquipmentCode(WarehouseActivityLine: Record "Warehouse Activity Line"; TakeBinCode: Code[20]; var AllowBlankBin: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterUpdateWhseActivHeader(var WarehouseActivityHeader: Record "Warehouse Activity Header"; var WarehouseRequest: Record "Warehouse Request"; Location: Record Location)
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnBeforeAutoCreatePickOrMove(WarehouseRequest: Record "Warehouse Request"; var WarehouseActivityHeader: Record "Warehouse Activity Header"; var LineCreated: Boolean; var IsHandled: Boolean; var HideDialog: Boolean; IsInvtMovement: Boolean; IsBlankInvtMovement: Boolean; var CompleteShipment: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCheckSourceDoc(WarehouseRequest: Record "Warehouse Request"; var Result: Boolean; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnBeforeCreatePickOrMoveLines(WarehouseRequest: Record "Warehouse Request"; var WarehouseActivityHeader: Record "Warehouse Activity Header"; var LinesCreated: Boolean; var IsHandled: Boolean; var HideDialog: Boolean; IsInvtMovement: Boolean; IsBlankInvtMovement: Boolean; var CompleteShipment: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCreatePickOrMoveFromSales(var WarehouseActivityHeader: Record "Warehouse Activity Header"; SalesHeader: Record "Sales Header"; AutoCreation: Boolean; HideDialog: Boolean; var SalesLine: Record "Sales Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCreatePickOrMoveLineFromSalesLoop(var WarehouseActivityHeader: Record "Warehouse Activity Header"; SalesHeader: Record "Sales Header"; var IsHandled: Boolean; SalesLine: Record "Sales Line"; Location: Record Location; var NextLineNo: Integer; var LineCreated: Boolean; var CompleteShipment: Boolean; AutoCreation: Boolean; ShowError: Boolean)
    begin
    end;

#if not CLEAN27
    internal procedure RunOnBeforeCreatePickOrMoveLineFromProductionLoop(var WarehouseActivityHeader: Record "Warehouse Activity Header"; ProductionOrder: Record Microsoft.Manufacturing.Document."Production Order"; var IsHandled: Boolean; ProdOrderComponent: Record Microsoft.Manufacturing.Document."Prod. Order Component")
    begin
        OnBeforeCreatePickOrMoveLineFromProductionLoop(WarehouseActivityHeader, ProductionOrder, IsHandled, ProdOrderComponent);
    end;

    [Obsolete('Moved to codeunit MfgCreateInvtPickMovement', '27.0')]
    [IntegrationEvent(false, false)]
    local procedure OnBeforeCreatePickOrMoveLineFromProductionLoop(var WarehouseActivityHeader: Record "Warehouse Activity Header"; ProductionOrder: Record Microsoft.Manufacturing.Document."Production Order"; var IsHandled: Boolean; ProdOrderComponent: Record Microsoft.Manufacturing.Document."Prod. Order Component")
    begin
    end;
#endif

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCreateATOInventoryMovementsAutomatically(AssemblyHeader: Record Microsoft.Assembly.Document."Assembly Header"; PrintDocumentForATOMvmt: Boolean; ShowErrorForATOMvmt: Boolean; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCreatePickOrMoveLineFromPurchaseLoop(var WarehouseActivityHeader: Record "Warehouse Activity Header"; PurchaseHeader: Record "Purchase Header"; var IsHandled: Boolean; PurchaseLine: Record "Purchase Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCreatePickOrMoveLineFromTransferLoop(var WarehouseActivityHeader: Record "Warehouse Activity Header"; TransferHeader: Record "Transfer Header"; var IsHandled: Boolean; TransferLine: Record "Transfer Line")
    begin
    end;

#if not CLEAN27
    internal procedure RunOnBeforeCreatePickOrMoveLineFromAssemblyLoop(var WarehouseActivityHeader: Record "Warehouse Activity Header"; AssemblyHeader: Record Microsoft.Assembly.Document."Assembly Header"; var IsHandled: Boolean; AssemblyLine: Record Microsoft.Assembly.Document."Assembly Line")
    begin
        OnBeforeCreatePickOrMoveLineFromAssemblyLoop(WarehouseActivityHeader, AssemblyHeader, IsHandled, AssemblyLine);
    end;

    [Obsolete('Moved to codeunit AsmCreateInvtPickMovement', '27.0')]
    [IntegrationEvent(false, false)]
    local procedure OnBeforeCreatePickOrMoveLineFromAssemblyLoop(var WarehouseActivityHeader: Record "Warehouse Activity Header"; AssemblyHeader: Record Microsoft.Assembly.Document."Assembly Header"; var IsHandled: Boolean; AssemblyLine: Record Microsoft.Assembly.Document."Assembly Line")
    begin
    end;
#endif

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

    [IntegrationEvent(false, false)]
    local procedure OnBeforeInsertPickOrMoveBinWhseActLine(NewWhseActivLine: Record "Warehouse Activity Line"; BinCode: Code[20]; DefaultBin: Boolean; var RemQtyToPickBase: Decimal; var IsHandled: Boolean; var WhseRequest: Record "Warehouse Request"; var WhseActivHeader: Record "Warehouse Activity Header"; IsInvtMovement: Boolean; AutoCreation: Boolean; PostingDate: Date; VendorDocNo: Code[35]; var LineCreated: Boolean; var NextLineNo: Integer)
    begin
    end;

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

    [IntegrationEvent(false, false)]
    local procedure OnBeforeNewWhseActivLineInsertFromPurchase(var WarehouseActivityLine: Record "Warehouse Activity Line"; var PurchaseLine: Record "Purchase Line"; var WarehouseActivityHeader: Record "Warehouse Activity Header"; var RemQtyToPickBase: Decimal)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeNewWhseActivLineInsertFromSales(var WarehouseActivityLine: Record "Warehouse Activity Line"; var SalesLine: Record "Sales Line"; var WarehouseActivityHeader: Record "Warehouse Activity Header"; var RemQtyToPickBase: Decimal)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeNewWhseActivLineInsertFromTransfer(var WarehouseActivityLine: Record "Warehouse Activity Line"; var TransferLine: Record "Transfer Line"; var WarehouseActivityHeader: Record "Warehouse Activity Header"; var RemQtyToPickBase: Decimal)
    begin
    end;

#if not CLEAN27
    internal procedure RunOnBeforeNewWhseActivLineInsertFromAssembly(var WarehouseActivityLine: Record "Warehouse Activity Line"; var AssemblyLine: Record Microsoft.Assembly.Document."Assembly Line"; var WarehouseActivityHeader: Record "Warehouse Activity Header"; var RemQtyToPickBase: Decimal)
    begin
        OnBeforeNewWhseActivLineInsertFromAssembly(WarehouseActivityLine, AssemblyLine, WarehouseActivityHeader, RemQtyToPickBase);
    end;

    [Obsolete('Moved to codeunit AsmCreateInvtPickMovement', '27.0')]
    [IntegrationEvent(false, false)]
    local procedure OnBeforeNewWhseActivLineInsertFromAssembly(var WarehouseActivityLine: Record "Warehouse Activity Line"; var AssemblyLine: Record Microsoft.Assembly.Document."Assembly Line"; var WarehouseActivityHeader: Record "Warehouse Activity Header"; var RemQtyToPickBase: Decimal)
    begin
    end;
#endif

#if not CLEAN27
    internal procedure RunOnBeforeNewWhseActivLineInsertFromComp(var WarehouseActivityLine: Record "Warehouse Activity Line"; var ProdOrderComp: Record Microsoft.Manufacturing.Document."Prod. Order Component"; var WarehouseActivityHeader: Record "Warehouse Activity Header"; var RemQtyToPickBase: Decimal)
    begin
        OnBeforeNewWhseActivLineInsertFromComp(WarehouseActivityLine, ProdOrderComp, WarehouseActivityHeader, RemQtyToPickBase);
    end;

    [Obsolete('Moved to codeunit MfgCreateInvtPickMovement', '27.0')]
    [IntegrationEvent(false, false)]
    local procedure OnBeforeNewWhseActivLineInsertFromComp(var WarehouseActivityLine: Record "Warehouse Activity Line"; var ProdOrderComp: Record Microsoft.Manufacturing.Document."Prod. Order Component"; var WarehouseActivityHeader: Record "Warehouse Activity Header"; var RemQtyToPickBase: Decimal)
    begin
    end;
#endif

    [IntegrationEvent(false, false)]
    local procedure OnBeforeOnRun(var WarehouseActivityHeader: Record "Warehouse Activity Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeFindPurchLine(var PurchaseLine: Record "Purchase Line"; PurchaseHeader: Record "Purchase Header"; WarehouseActivityHeader: Record "Warehouse Activity Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeFindSalesLine(var SalesLine: Record "Sales Line"; SalesHeader: Record "Sales Header"; WarehouseActivityHeader: Record "Warehouse Activity Header"; WarehouseRequest: Record "Warehouse Request"; CheckLineExist: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeFindTransLine(var TransferLine: Record "Transfer Line"; TransferHeader: Record "Transfer Header"; WarehouseActivityHeader: Record "Warehouse Activity Header")
    begin
    end;

#if not CLEAN27
    internal procedure RunOnBeforeFindAssemblyLine(var AssemblyLine: Record Microsoft.Assembly.Document."Assembly Line"; AssemblyHeader: Record Microsoft.Assembly.Document."Assembly Header"; WarehouseActivityHeader: Record "Warehouse Activity Header")
    begin
        OnBeforeFindAssemblyLine(AssemblyLine, AssemblyHeader, WarehouseActivityHeader);
    end;

    [Obsolete('Moved to codeunit AsmCreateInvtPickMovement', '27.0')]
    [IntegrationEvent(false, false)]
    local procedure OnBeforeFindAssemblyLine(var AssemblyLine: Record Microsoft.Assembly.Document."Assembly Line"; AssemblyHeader: Record Microsoft.Assembly.Document."Assembly Header"; WarehouseActivityHeader: Record "Warehouse Activity Header")
    begin
    end;
#endif

#if not CLEAN27
    internal procedure RunOnBeforeFindProdOrderComp(var ProdOrderComp: Record Microsoft.Manufacturing.Document."Prod. Order Component"; ProductionOrder: Record Microsoft.Manufacturing.Document."Production Order"; WarehouseActivityHeader: Record "Warehouse Activity Header")
    begin
        OnBeforeFindProdOrderComp(ProdOrderComp, ProductionOrder, WarehouseActivityHeader);
    end;

    [Obsolete('Moved to codeunit MfgCreateInvtPickMovement', '27.0')]
    [IntegrationEvent(false, false)]
    local procedure OnBeforeFindProdOrderComp(var ProdOrderComp: Record Microsoft.Manufacturing.Document."Prod. Order Component"; ProductionOrder: Record Microsoft.Manufacturing.Document."Production Order"; WarehouseActivityHeader: Record "Warehouse Activity Header")
    begin
    end;
#endif

    [IntegrationEvent(false, false)]
    local procedure OnBeforeGetSourceDocHeader(var WhseRequest: Record "Warehouse Request"; var IsHandled: Boolean; var RecordExists: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforePickStrictExpirationPosting(ItemNo: Code[20]; SNRequired: Boolean; LNRequired: Boolean; var StrictExpirationPosting: Boolean; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeFindFromBinContent(var FromBinContent: Record "Bin Content"; var WarehouseActivityLine: Record "Warehouse Activity Line"; FromBinCode: Code[20]; BinCode: Code[20]; IsInvtMovement: Boolean; IsBlankInvtMovement: Boolean; DefaultBin: Boolean; WhseItemTrackingSetup: Record "Item Tracking Setup"; var WarehouseActivityHeader: Record "Warehouse Activity Header"; var WarehouseRequest: Record "Warehouse Request")
    begin
    end;

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

    [IntegrationEvent(false, false)]
    local procedure OnBeforeTempReservEntryInsert(var ReservationEntry: Record "Reservation Entry"; WhseItemTrackingLine: Record "Whse. Item Tracking Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeModifyWarehouseActivityHeader(var WarehouseActivityHeader: Record "Warehouse Activity Header"; WarehouseRequest: Record "Warehouse Request"; Location: Record Location)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeWhseItemTrackingLineInsert(var WhseItemTrackingLine: Record "Whse. Item Tracking Line"; TrackingSpecification: Record "Tracking Specification")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterRunCreatePickOrMoveLine(var WhseActivHeader: Record "Warehouse Activity Header"; var WhseRequest: Record "Warehouse Request")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeRunCreatePickOrMoveLine(var WhseActivHeader: Record "Warehouse Activity Header"; var WhseRequest: Record "Warehouse Request")
    begin
    end;

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

    [IntegrationEvent(false, false)]
    local procedure OnCreateATOPickLineOnAfterCalcQtyToPickBase(var RemQtyToPickBase: Decimal; var QtyToPickBase: Decimal; ATOSalesLine: Record "Sales Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCreatePickOrMoveLineOnAfterCheckForCompleteShipment(WarehouseActivityHeader: Record "Warehouse Activity Header"; WhseItemTrackingSetup: Record "Item Tracking Setup"; ReservationExists: Boolean; var RemQtyToPickBase: Decimal; var QtyAvailToPickBase: Decimal; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnCreatePickOrMoveLineOnAfterCalcQtyAvailToPickBase(var WarehouseActivityLine: Record "Warehouse Activity Line"; SNRequired: Boolean; LNRequired: Boolean; ReservationExists: Boolean; var RemQtyToPickBase: Decimal; var QtyAvailToPickBase: Decimal; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCreatePickOrMoveLineOnAfterFindTakeQtyForBinCodeOfSourceLineHandlingSpec(var NewWarehouseActivityLine: Record "Warehouse Activity Line"; TempHandlingSpecification: Record "Tracking Specification"; WhseItemTrackingSetup: Record "Item Tracking Setup"; var ITQtyToPickBase: Decimal; WarehouseActivityHeader: Record "Warehouse Activity Header")
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnCreatePickOrMoveLineOnAfterFindTakeQtyForBinCodeSourceLine(var NewWarehouseActivityLine: Record "Warehouse Activity Line"; WhseItemTrackingSetup: Record "Item Tracking Setup"; var RemQtyToPickBase: Decimal; WarehouseActivityHeader: Record "Warehouse Activity Header")
    begin
    end;

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

    [IntegrationEvent(false, false)]
    local procedure OnCreatePickOrMoveFromSalesOnAfterCreatePickOrMoveLine(var WarehouseActivityLine: Record "Warehouse Activity Line"; var SalesLine: Record "Sales Line"; var WarehouseActivityHeader: Record "Warehouse Activity Header"; ShowError: Boolean; AutoCreation: Boolean; var LineCreated: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCheckSourceDocForWhseRequest(var WarehouseRequest: Record "Warehouse Request"; SourceDocRecRef: RecordRef; var WhseActivHeader: Record "Warehouse Activity Header"; CheckLineExist: Boolean; var Result: Boolean; var IsHandled: Boolean; IsInvtMovement: Boolean; var WarehouseSourceFilter: Record "Warehouse Source Filter"; ApplyAdditionalSourceDocFilters: Boolean; var SourceDocRecordVar: Variant)
    begin
    end;

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

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

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCreatePickOrMoveLinePerTrackingSpec(
        var NewWarehouseActivityLine: Record "Warehouse Activity Line";
        var TempTrackingSpecification: Record "Tracking Specification" temporary;
        var RemQtyToPickBase: Decimal;
        OutstandingQtyBase: Decimal;
        ReservationExists: Boolean;
        var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnAutoCreatePickOrMoveFromWhseRequest(var WarehouseRequest: Record "Warehouse Request"; SourceDocRecRef: RecordRef; var LineCreated: Boolean; var WhseActivityHeader: Record "Warehouse Activity Header"; Location: Record Location; HideDialog: Boolean; var CompleteShipment: Boolean; CheckLineExist: Boolean; IsInvtMovement: Boolean; var WarehouseSourceFilter: Record "Warehouse Source Filter"; ApplyAdditionalSourceDocFilters: Boolean; ReservedFromStock: Enum "Reservation From Stock"; var SourceDocRecVar: Variant);
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnCreatePickOrMoveFromWhseRequest(var WarehouseRequest: Record "Warehouse Request"; SourceDocRecRef: RecordRef; var LineCreated: Boolean; var WhseActivityHeader: Record "Warehouse Activity Header"; Location: Record Location; HideDialog: Boolean; var CompleteShipment: Boolean; CheckLineExist: Boolean; IsInvtMovement: Boolean; var WarehouseSourceFilter: Record "Warehouse Source Filter"; ApplySourceFilters: Boolean; ReservedFromStock: Enum "Reservation From Stock"; var SourceDocRecVar: Variant)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCreateTempHandlingSpecOnAfterCalcTotalAvailQtyToPickBase(WhseActivLine: Record "Warehouse Activity Line"; EntrySummary: Record "Entry Summary"; var TotalAvailQtyToPickBase: Decimal)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCreateTempHandlingSpecOnAfterWhseItemTrackingFEFOSetSource(var WhseItemTrackingFEFO: Codeunit "Whse. Item Tracking FEFO"; WarehouseActivityLine: Record "Warehouse Activity Line"; WarehouseRequest: Record "Warehouse Request")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCreateTempHandlingSpecOnAfterCalcQtyTracked(EntrySummary: Record "Entry Summary"; var QuantityTracked: Decimal; var TempHandlingSpecification: Record "Tracking Specification" temporary)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCodeOnAfterCreatePickOrMoveLines(WarehouseRequest: Record "Warehouse Request"; var WarehouseActivityHeader: Record "Warehouse Activity Header"; var LinesCreated: Boolean; AutoCreation: Boolean; var SuppressMessage: Boolean; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnDeleteHandledInternalMovementLinesOnAfterInternalMovementLineSetFilters(var InternalMovementLine: Record "Internal Movement Line"; InternalMovementHeaderNo: Code[20])
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnDeleteHandledInternalMovementLinesOnBeforeInternalMovementLineModify(var InternalMovementLine: Record "Internal Movement Line"; TempInternalMovementLine: Record "Internal Movement Line" temporary)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnDeleteHandledInternalMovementLinesOnBeforeModifyTempInternalMovementLine(var TempInternalMovementLine: Record "Internal Movement Line" temporary; InternalMovementLine: Record "Internal Movement Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnGetSourceDocHeaderFromWhseRequest(var WarehouseRequest: Record "Warehouse Request"; var SourceDocRecRef: RecordRef; var PostingDate: Date; VendorDocNo: Code[35]; var RecordExists: Boolean; var SourceDocRecordVar: Variant)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnGetWhseRequestOnBeforeSourceDocumentsRun(var WarehouseRequest: Record "Warehouse Request"; var WarehouseActivityHeader: Record "Warehouse Activity Header"; var Result: Boolean; var IsHandled: Boolean);
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnInsertTempHandlingSpecOnBeforeValidateQtyBase(var TempTrackingSpecification: Record "Tracking Specification" temporary; EntrySummary: Record "Entry Summary")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnInvtMvntWithoutSourceOnBeforeWhseActivHeaderModify(var WarehouseActivityHeader: Record "Warehouse Activity Header"; InternalMovementHeader: Record "Internal Movement Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnItemTrackedQuantityOnAfterCheckTracking(var TempHandlingSpecification: Record "Tracking Specification" temporary; WhseItemTrackingSetup: Record "Item Tracking Setup"; var IsTrackingEmpty: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnMakeLineOnBeforeUpdatePlaceLine(var NewWhseActivLine: Record "Warehouse Activity Line"; var PlaceBinCode: Code[20])
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnSetFilterInternalMomementOnAfterSetFilters(var InternalMovementLine: Record "Internal Movement Line"; InternalMovementHeader: Record "Internal Movement Header")
    begin
    end;

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

    [IntegrationEvent(false, false)]
    local procedure OnUpdateHandledWhseActivityLineBufferOnBeforeTempInternalMovementLineInsert(var TempInternalMovementLine: Record "Internal Movement Line" temporary; WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnUpdateHandledWhseActivityLineBufferOnBeforeTempInternalMovementLineModify(var TempInternalMovementLine: Record "Internal Movement Line" temporary; WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnInsertPickOrMoveBinWhseActLineOnBeforeLoopMakeLine(var WhseActivHeader: Record "Warehouse Activity Header"; WhseRequest: Record "Warehouse Request"; var NewWhseActivLine: Record "Warehouse Activity Line"; FromBinContent: Record "Bin Content"; AutoCreation: Boolean; var QtyToPickBase: Decimal)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnInsertPickOrMoveBinWhseActLineOnBeforeLoopIteration(var FromBinContent: Record "Bin Content"; NewWarehouseActivityLine: Record "Warehouse Activity Line"; BinCode: Code[20]; DefaultBin: Boolean; var RemQtyToPickBase: Decimal; var IsHandled: Boolean; var QtyAvailToPickBase: Decimal)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCreatePickOrMoveLineOnAfterCalcShouldInsertPickOrMoveDefaultBin(NewWarehouseActivityLine: Record "Warehouse Activity Line"; var RemQtyToPickBase: Decimal; OutstandingQtyBase: Decimal; ReservationExists: Boolean; var ShouldInsertPickOrMoveDefaultBin: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnInsertPickOrMoveBinWhseActLineOnAfterCalcQtyAvailToPick(var QtyAvailToPickBase: Decimal; var FromBinContent: Record "Bin Content")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCalcInvtAvailability(WhseActivLine: Record "Warehouse Activity Line"; Location: Record Location; var Result: Decimal; var IsHandled: Boolean; WhseItemTrackingSetup: Record "Item Tracking Setup"; IsBlankInvtMovement: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCalcQtyAvailToPickOnBins(WhseActivLine: Record "Warehouse Activity Line"; LotNo: Code[50]; SerialNo: Code[50]; RemQtyToPickBase: Decimal; var Result: Decimal; var IsHandled: Boolean)
    begin
    end;

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

    [IntegrationEvent(false, false)]
    local procedure OnCreatePickOrMoveFromTransferOnAfterCreatePickOrMoveLine(var WarehouseActivityLine: Record "Warehouse Activity Line"; var TransferLine: Record "Transfer Line"; var WarehouseActivityHeader: Record "Warehouse Activity Header"; ShowError: Boolean; AutoCreation: Boolean; var LineCreated: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAutoCreatePickOrMoveOnBeforeWarehouseActivityHeaderModify(var WarehouseActivityHeader: Record "Warehouse Activity Header"; WarehouseRequest: Record "Warehouse Request"; Location: Record Location)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnInsertPickOrMoveBinWhseActLineOnBeforeMakeHeader(var RemQtyToPickBase: Decimal; var QtyAvailToPickBase: Decimal; var DefaultBin: Boolean; var FromBinContent: Record "Bin Content")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnInsertPickOrMoveBinWhseActLineOnAfterMakeLine(var QtyToPickBase: Decimal; var DefaultBin: Boolean)
    begin
    end;

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

    [IntegrationEvent(true, false)]
    local procedure OnInsertPickOrMoveBinWhseActLineOnBeforeMakeLineWhenSNoReq(var NewWarehouseActivityLine: Record "Warehouse Activity Line"; WhseItemTrackingSetup: Record "Item Tracking Setup"; TakeBinCode: Code[20]; QtyToPickBase: Decimal; var RemQtyToPickBase: Decimal; var QtyAvailToPickBase: Decimal; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnInsertShelfWhseActivLineOnBeforeMakeShelfLineWhenSNoReq(var NewWarehouseActivityLine: Record "Warehouse Activity Line"; WhseItemTrackingSetup: Record "Item Tracking Setup"; QtyToPickBase: Decimal; var RemQtyToPickBase: Decimal; var IsHandled: Boolean)
    begin
    end;

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

    [IntegrationEvent(false, false)]
    local procedure OnBeforeMakeWarehouseActivityLine(var NewWarehouseActivityLine: Record "Warehouse Activity Line"; var RemQtyToPickBase: Decimal; var NextLineNo: Integer; TakeBinCode: Code[20]; var QtyToPickBase: Decimal; IsInvtMovement: Boolean; var LineCreated: Boolean; CompleteShipment: Boolean; var IsHandled: Boolean)
    begin
    end;

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

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

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

    [IntegrationEvent(false, false)]
    local procedure OnBeforeSetLineData(var WarehouseActivityLine: Record "Warehouse Activity Line"; WarehouseActivityHeader: Record "Warehouse Activity Header"; TakeBinCode: Code[20]; var NextLineNo: Integer; Location: Record Location; var LineCreated: Boolean; var IsHandled: Boolean)
    begin
    end;

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

    [IntegrationEvent(false, false)]
    local procedure OnBeforeNewWhseActivLineInsertFromJobPlanning(var WarehouseActivityLine: Record "Warehouse Activity Line"; var JobPlanningLine: Record "Job Planning Line"; var WarehouseActivityHeader: Record "Warehouse Activity Header"; var RemQtyToPickBase: Decimal)
    begin
    end;

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