Codeunit 7324 Whse.-Activity-Post

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

Procedures, 12Events, 98Obsolete, 6

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Warehouse/Activity/WhseActivityPost.Codeunit.al1993 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.Finance.GeneralLedger.Preview;
using Microsoft.Foundation.AuditCodes;
using Microsoft.Inventory.Item;
#if not CLEAN27
using Microsoft.Inventory.Journal;
#endif
using Microsoft.Inventory.Location;
using Microsoft.Inventory.Tracking;
using Microsoft.Inventory.Transfer;
using Microsoft.Projects.Project.Job;
using Microsoft.Projects.Project.Journal;
using Microsoft.Projects.Project.Planning;
using Microsoft.Projects.Project.Posting;
using Microsoft.Purchases.Document;
using Microsoft.Purchases.History;
using Microsoft.Purchases.Posting;
using Microsoft.Purchases.Setup;
using Microsoft.Sales.Document;
using Microsoft.Sales.History;
using Microsoft.Sales.Posting;
using Microsoft.Sales.Setup;
using Microsoft.Utilities;
using Microsoft.Warehouse.Comment;
using Microsoft.Warehouse.InventoryDocument;
using Microsoft.Warehouse.Journal;
using Microsoft.Warehouse.Request;
using Microsoft.Warehouse.Setup;
using Microsoft.Warehouse.Structure;
using System.Telemetry;
using System.Utilities;

codeunit 7324 "Whse.-Activity-Post"
{
    Permissions = TableData "Warehouse Setup" = rm,
                  TableData "Warehouse Journal Batch" = rimd,
                  TableData "Posted Invt. Put-away Header" = ri,
                  TableData "Posted Invt. Put-away Line" = ri,
                  TableData "Posted Invt. Pick Header" = ri,
                  TableData "Posted Invt. Pick Line" = ri;
    TableNo = "Warehouse Activity Line";

    trigger OnRun()
    begin
        WhseActivLine.Copy(Rec);
        Code();
        Rec := WhseActivLine;

        OnAfterOnRun(Rec);
    end;

    var
        Location: Record Location;
        WhseActivHeader: Record "Warehouse Activity Header";
        WhseActivLine: Record "Warehouse Activity Line";
        TempWhseActivLine: Record "Warehouse Activity Line" temporary;
        TempWarehouseActivityLineForItemTrackingChecking: Record "Warehouse Activity Line" temporary;
        WhseSetup: Record "Warehouse Setup";
        WhseRequest: Record "Warehouse Request";
        PurchHeader: Record "Purchase Header";
        PurchLine: Record "Purchase Line";
        SalesHeader: Record "Sales Header";
        TransHeader: Record "Transfer Header";
        TransLine: Record "Transfer Line";
        SourceCodeSetup: Record "Source Code Setup";
        ItemTrackingMgt: Codeunit "Item Tracking Management";
        DocumentErrorsMgt: Codeunit "Document Errors Mgt.";
        WhseJnlRegisterLine: Codeunit "Whse. Jnl.-Register Line";
        PurchPostPrint: Codeunit "Purch.-Post + Print";
        SalesPostPrint: Codeunit "Sales-Post + Print";
        Window: Dialog;
        PostedSourceNo: Code[20];
        PostedSourceType: Integer;
        PostedSourceSubType: Integer;
        NoOfRecords: Integer;
        LineCount: Integer;
        PostingReference: Integer;
        HideDialog: Boolean;
        InvoiceSourceDoc: Boolean;
        PrintDoc: Boolean;
        SuppressCommit: Boolean;
        IsPreview: Boolean;
        PostingDateErr: Label 'is before the posting date';
        InventoryNotAvailableErr: Label '%1 %2 is not available on inventory or it has already been reserved for another document.', Comment = '%1 = Item Tracking ID, %2 = Item Tracking No."';
#pragma warning disable AA0074, AA0470
        Text005: Label 'The source document %1 %2 is not released.';
        Text000: Label 'Warehouse Activity    #1##########\\';
        Text001: Label 'Checking lines        #2######\';
        Text002: Label 'Posting lines         #3###### @4@@@@@@@@@@@@@';
#pragma warning restore AA0074, AA0470

    local procedure "Code"()
    var
        TransferOrderPostPrint: Codeunit "TransferOrder-Post + Print";
        GenJnlPostPreview: Codeunit "Gen. Jnl.-Post Preview";
        ItemTrackingRequired: Boolean;
        Selection: Option " ",Shipment,Receipt;
        ForceDelete: Boolean;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCode(WhseActivLine, SuppressCommit, IsHandled);
        if IsHandled then
            exit;

        GetPostingReference();

        WhseActivLine.SetRange("Activity Type", WhseActivLine."Activity Type");
        WhseActivLine.SetRange("No.", WhseActivLine."No.");
        WhseActivLine.SetFilter("Qty. to Handle", '<>0');
        if not WhseActivLine.Find('-') then
            Error(DocumentErrorsMgt.GetNothingToPostErrorMsg());

        WhseActivHeader.Get(WhseActivLine."Activity Type", WhseActivLine."No.");
        GetLocation(WhseActivHeader."Location Code");

        SuppressCommit := WhseActivHeader.PostInboundTransferInOneStep();

        if WhseActivHeader.Type = WhseActivHeader.Type::"Invt. Put-away" then
            WhseRequest.Get(
              WhseRequest.Type::Inbound, WhseActivHeader."Location Code",
              WhseActivHeader."Source Type", WhseActivHeader."Source Subtype", WhseActivHeader."Source No.")
        else
            WhseRequest.Get(
              WhseRequest.Type::Outbound, WhseActivHeader."Location Code",
              WhseActivHeader."Source Type", WhseActivHeader."Source Subtype", WhseActivHeader."Source No.");
        if WhseRequest."Document Status" <> WhseRequest."Document Status"::Released then
            Error(Text005, WhseActivHeader."Source Document", WhseActivHeader."Source No.");

        if not HideDialog then begin
            Window.Open(
              Text000 +
              Text001 +
              Text002);
            Window.Update(1, WhseActivHeader."No.");
        end;
        // Check Lines
        OnBeforeCheckLines(WhseActivHeader);

        CheckQuantityInBinContentForTracking(WhseActivLine);

        LineCount := 0;
        if WhseActivLine.Find('-') then begin
            TempWhseActivLine.SetCurrentKey("Source Type", "Source Subtype", "Source No.", "Source Line No.", "Source Subline No.");
            repeat
                LineCount := LineCount + 1;
                if not HideDialog then
                    Window.Update(2, LineCount);

                CheckWarehouseActivityLine(WhseActivLine, WhseActivHeader, Location);

                ItemTrackingRequired := CheckItemTracking(WhseActivLine);
                if ItemTrackingRequired then
                    CheckAvailability(WhseActivLine);
                InsertTempWhseActivLine(WhseActivLine, ItemTrackingRequired);
                InsertTempWhseActivLineForChecking(WhseActivLine, ItemTrackingRequired);
            until WhseActivLine.Next() = 0;
            CheckWhseItemTrackingAgainstSource();
            TempWarehouseActivityLineForItemTrackingChecking.DeleteAll();
        end;
        NoOfRecords := LineCount;
        // Posting lines
        SourceCodeSetup.Get();
        LineCount := 0;
        WhseActivLine.LockTable();
        if WhseActivLine.Find('-') then begin
            LockPostedTables(WhseActivHeader);

            PostWhseActivityLine(WhseActivHeader, WhseActivLine);

            OnCodeOnAfterCreatePostedWhseActivDocument(WhseActivHeader);
        end;

        if IsPreview then begin
            if WhseActivHeader.PostInboundTransferInOneStep() then
                if TransHeader.Find() then
                    TransHeader.PostRelatedInboundTransfer(true);
            GenJnlPostPreview.ThrowError();
        end;
        // Modify/delete activity header and activity lines
        TempWhseActivLine.DeleteAll();

        WhseActivLine.SetCurrentKey(
          "Activity Type", "No.", "Whse. Document Type", "Whse. Document No.");
        if WhseActivLine.Find('-') then
            repeat
                ForceDelete := false;
                OnBeforeWhseActivLineDelete(WhseActivLine, ForceDelete, HideDialog);
                if (WhseActivLine."Qty. Outstanding" = WhseActivLine."Qty. to Handle") or ForceDelete then
                    WhseActivLine.Delete()
                else begin
                    WhseActivLine.Validate(
                      "Qty. Outstanding", WhseActivLine."Qty. Outstanding" - WhseActivLine."Qty. to Handle");
                    if HideDialog then
                        WhseActivLine.Validate("Qty. to Handle", 0);
                    WhseActivLine.Validate(
                      "Qty. Handled", WhseActivLine.Quantity - WhseActivLine."Qty. Outstanding");
                    WhseActivLine.Modify();
                    OnAfterWhseActivLineModify(WhseActivLine);
                end;
            until WhseActivLine.Next() = 0;

        WhseActivLine.Reset();
        WhseActivLine.SetRange("Activity Type", WhseActivHeader.Type);
        WhseActivLine.SetRange("No.", WhseActivHeader."No.");
        WhseActivLine.SetFilter("Qty. Outstanding", '<>%1', 0);
        IsHandled := false;
        OnCodeOnAfterWhseActivLineSetFilters(WhseActivHeader, WhseActivLine, IsHandled);
        if not IsHandled then
            if not WhseActivLine.Find('-') then
                WhseActivHeader.Delete(true);

        if not HideDialog then
            Window.Close();

        if PrintDoc then
            case WhseActivHeader."Source Document" of
                WhseActivHeader."Source Document"::"Purchase Order",
              WhseActivHeader."Source Document"::"Purchase Return Order":
                    PurchPostPrint.GetReport(PurchHeader);
                WhseActivHeader."Source Document"::"Sales Order",
              WhseActivHeader."Source Document"::"Sales Return Order":
                    SalesPostPrint.GetReport(SalesHeader);
                WhseActivHeader."Source Document"::"Inbound Transfer":
                    if PostedSourceType <> Database::"Direct Trans. Header" then
                        TransferOrderPostPrint.PrintReport(TransHeader, Selection::Receipt)
                    else
                        if PostedSourceNo <> '' then
                            TransferOrderPostPrint.PrintDirectTransfer(PostedSourceNo);
                WhseActivHeader."Source Document"::"Outbound Transfer":
                    if PostedSourceType <> Database::"Direct Trans. Header" then
                        TransferOrderPostPrint.PrintReport(TransHeader, Selection::Shipment)
                    else
                        if PostedSourceNo <> '' then
                            TransferOrderPostPrint.PrintDirectTransfer(PostedSourceNo);
            end;

        OnAfterCode(WhseActivLine, SuppressCommit, PrintDoc);
        if not SuppressCommit then
            Commit();
#if not CLEAN29
        OnAfterPostWhseActivHeader(WhseActivHeader, PurchHeader, SalesHeader, TransHeader);
#endif

        if WhseActivHeader.PostInboundTransferInOneStep() then
            if TransHeader.Find() then
                TransHeader.PostRelatedInboundTransfer(false);

        Clear(WhseJnlRegisterLine);
        OnAfterPostWhseActivityCompleted(WhseActivHeader, PurchHeader, SalesHeader, TransHeader, SuppressCommit, IsPreview);
    end;

    local procedure CheckQuantityInBinContentForTracking(var WarehouseActivityLine: Record "Warehouse Activity Line")
    var
        Item: Record Item;
        WarehouseActivityLine2: Record "Warehouse Activity Line";
        TempWhseJnlLine: Record "Warehouse Journal Line" temporary;
        WMSMgt: Codeunit "WMS Management";
    begin
        if not (Location."Require Pick" and Location."Require Receive") then
            exit;

        WarehouseActivityLine2.CopyFilters(WarehouseActivityLine);
        WarehouseActivityLine2.SetFilter("Activity Type", '%1|%2', WarehouseActivityLine2."Activity Type"::"Invt. Pick", WarehouseActivityLine2."Activity Type"::"Invt. Put-away");
        WarehouseActivityLine2.SetRange("Assemble to Order", false);
        Item.SetLoadFields("Order Tracking Policy");
        if WarehouseActivityLine2.FindSet() then
            repeat
                Item.Get(WarehouseActivityLine2."Item No.");
                if Item."Order Tracking Policy" <> Item."Order Tracking Policy"::None then
                    if CheckItemTracking(WarehouseActivityLine2) then begin
                        CreateWhseJnlLine(TempWhseJnlLine, WarehouseActivityLine2);
                        if TempWhseJnlLine."Entry Type" = TempWhseJnlLine."Entry Type"::"Negative Adjmt." then
                            WMSMgt.CheckWhseJnlLine(TempWhseJnlLine, 4, TempWhseJnlLine."Qty. (Base)", false); // 4 = Whse. Journal
                    end;
            until WarehouseActivityLine2.Next() = 0;
    end;

    local procedure CheckWarehouseActivityLine(var WarehouseActivityLine: Record "Warehouse Activity Line"; WarehouseActivityHeader: Record "Warehouse Activity Header"; Location: Record Location)
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCheckWarehouseActivityLine(WarehouseActivityLine, WarehouseActivityHeader, Location, IsHandled);
        if IsHandled then
            exit;

        WarehouseActivityLine.TestField("Item No.");
        if Location."Bin Mandatory" then begin
            WarehouseActivityLine.TestField("Unit of Measure Code");
            WarehouseActivityLine.TestField("Bin Code");
            if WarehouseActivityLine."Activity Type" in [WarehouseActivityLine."Activity Type"::"Invt. Movement", WarehouseActivityLine."Activity Type"::"Invt. Put-away", WarehouseActivityLine."Activity Type"::Movement, WarehouseActivityLine."Activity Type"::"Put-away"] then
                WarehouseActivityLine.CheckIncreaseCapacity(false, true);
        end;

        OnAfterCheckWarehouseActivityLine(WarehouseActivityLine, WarehouseActivityHeader, Location);
    end;

    local procedure InsertTempWhseActivLine(WhseActivLine: Record "Warehouse Activity Line"; ItemTrackingRequired: Boolean)
    begin
        OnBeforeInsertTempWhseActivLine(WhseActivLine, ItemTrackingRequired);

        TempWhseActivLine.SetSourceFilter(
            WhseActivLine."Source Type", WhseActivLine."Source Subtype", WhseActivLine."Source No.", WhseActivLine."Source Line No.", WhseActivLine."Source Subline No.", false);
        if WhseActivLine."Source Document" = WhseActivLine."Source Document"::"Job Usage" then
            TempWhseActivLine.SetRange("Bin Code", WhseActivLine."Bin Code");
        // Split the lines based on bin for jobs.
        if TempWhseActivLine.Find('-') then begin
            TempWhseActivLine."Qty. to Handle" += WhseActivLine."Qty. to Handle";
            TempWhseActivLine."Qty. to Handle (Base)" += WhseActivLine."Qty. to Handle (Base)";
            OnBeforeTempWhseActivLineModify(TempWhseActivLine, WhseActivLine);
            TempWhseActivLine.Modify();
        end else begin
            TempWhseActivLine.Init();
            TempWhseActivLine := WhseActivLine;
            OnBeforeTempWhseActivLineInsert(TempWhseActivLine, WhseActivLine);
            TempWhseActivLine.Insert();
            if ItemTrackingRequired and
               (WhseActivLine."Activity Type" in [WhseActivLine."Activity Type"::"Invt. Pick", WhseActivLine."Activity Type"::"Invt. Put-away"])
            then
                ItemTrackingMgt.SynchronizeWhseActivItemTrkg(WhseActivLine, IsPreview);
        end;
    end;

    local procedure InsertTempWhseActivLineForChecking(WhseActivLine: Record "Warehouse Activity Line"; ItemTrackingRequired: Boolean)
    begin
        TempWarehouseActivityLineForItemTrackingChecking.SetSourceFilter(
            WhseActivLine."Source Type", WhseActivLine."Source Subtype", WhseActivLine."Source No.", WhseActivLine."Source Line No.", WhseActivLine."Source Subline No.", false);

        if TempWarehouseActivityLineForItemTrackingChecking.Find('-') then begin
            TempWarehouseActivityLineForItemTrackingChecking."Qty. to Handle" += WhseActivLine."Qty. to Handle";
            TempWarehouseActivityLineForItemTrackingChecking."Qty. to Handle (Base)" += WhseActivLine."Qty. to Handle (Base)";
            TempWarehouseActivityLineForItemTrackingChecking.Modify();
        end else begin
            TempWarehouseActivityLineForItemTrackingChecking.Init();
            TempWarehouseActivityLineForItemTrackingChecking := WhseActivLine;

            TempWarehouseActivityLineForItemTrackingChecking.Insert();
            if ItemTrackingRequired and
               (WhseActivLine."Activity Type" in [WhseActivLine."Activity Type"::"Invt. Pick", WhseActivLine."Activity Type"::"Invt. Put-away"])
            then
                ItemTrackingMgt.SynchronizeWhseActivItemTrkg(WhseActivLine, IsPreview);
        end;
    end;

    local procedure GetPostingReference()
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeGetPostingReference(PostingReference, IsHandled);
        if IsHandled then
            exit;

        PostingReference := WhseSetup.GetNextReference();
    end;

    local procedure InitSourceDocument()
    var
        SalesLine: Record "Sales Line";
        ModifyHeader: Boolean;
        IsHandled: Boolean;
    begin
        OnBeforeInitSourceDocument(WhseActivHeader);

        case WhseActivHeader."Source Type" of
            Database::"Purchase Line":
                begin
                    PurchHeader.Get(WhseActivHeader."Source Subtype", WhseActivHeader."Source No.");
                    PurchLine.SetRange("Document Type", WhseActivHeader."Source Subtype");
                    PurchLine.SetRange("Document No.", WhseActivHeader."Source No.");
                    OnInitSourceDocumentOnAfterSetPurchaseLineFilters(PurchLine, PurchHeader, WhseActivHeader);
                    if PurchLine.Find('-') then
                        repeat
                            IsHandled := false;
                            OnInitSourceDocumentOnBeforePurchLineLoopIteration(PurchHeader, PurchLine, WhseActivHeader, IsHandled);
                            if not IsHandled then begin
                                if WhseActivHeader."Source Document" = WhseActivHeader."Source Document"::"Purchase Order" then
                                    PurchLine.Validate("Qty. to Receive", 0)
                                else
                                    PurchLine.Validate("Return Qty. to Ship", 0);
                                PurchLine.Validate("Qty. to Invoice", 0);
                                ModifyPurchaseLine(PurchLine);
                                OnAfterPurchLineModify(PurchLine);
                            end;
                        until PurchLine.Next() = 0;

                    ReleasePurchDocument(ModifyHeader);

                    if WhseActivHeader."External Document No." <> '' then begin
                        PurchHeader."Vendor Shipment No." := WhseActivHeader."External Document No.";
                        ModifyHeader := true;
                    end;
                    if WhseActivHeader."External Document No.2" <> '' then begin
                        if WhseActivHeader."Source Document" = WhseActivHeader."Source Document"::"Purchase Order" then
                            PurchHeader."Vendor Invoice No." := WhseActivHeader."External Document No.2"
                        else
                            PurchHeader."Vendor Cr. Memo No." := WhseActivHeader."External Document No.2";
                        ModifyHeader := true;
                    end;
                    ModifyPurchaseHeader(PurchHeader, WhseActivHeader, ModifyHeader);
                end;
            Database::"Sales Line":
                begin
                    SalesHeader.Get(WhseActivHeader."Source Subtype", WhseActivHeader."Source No.");
                    SalesLine.SetRange("Document Type", WhseActivHeader."Source Subtype");
                    SalesLine.SetRange("Document No.", WhseActivHeader."Source No.");
                    if SalesHeader."Shipping Advice" = SalesHeader."Shipping Advice"::Complete then
                        SalesLine.SetRange(Type, SalesLine.Type::Item);
                    OnInitSourceDocumentOnAfterSetSalesLineFilters(SalesLine, SalesHeader, WhseActivHeader);
                    if SalesLine.Find('-') then
                        repeat
                            IsHandled := false;
                            OnInitSourceDocumentOnBeforeSalesLineLoopIteration(SalesHeader, SalesLine, WhseActivHeader, IsHandled);
                            if not IsHandled then begin
                                if WhseActivHeader."Source Document" = WhseActivHeader."Source Document"::"Sales Order" then
                                    SalesLine.Validate("Qty. to Ship", 0)
                                else
                                    SalesLine.Validate("Return Qty. to Receive", 0);
                                SalesLine.Validate("Qty. to Invoice", 0);
                                ModifySalesLine(SalesLine);
                                OnAfterSalesLineModify(SalesLine);
                            end;
                        until SalesLine.Next() = 0;

                    ReleaseSalesDocument(ModifyHeader);

                    if WhseActivHeader."External Document No." <> '' then begin
                        SalesHeader."External Document No." := WhseActivHeader."External Document No.";
                        ModifyHeader := true;
                    end;
                    ModifySalesHeader(SalesHeader, WhseActivHeader, ModifyHeader);
                end;
            Database::"Transfer Line":
                begin
                    TransHeader.Get(WhseActivHeader."Source No.");
                    TransLine.SetRange("Document No.", TransHeader."No.");
                    TransLine.SetRange("Derived From Line No.", 0);
                    TransLine.SetFilter("Item No.", '<>%1', '');
                    OnInitSourceDocumentOnAfterTransLineSetFilters(TransLine, TransHeader, WhseActivHeader);
                    if TransLine.Find('-') then
                        repeat
                            IsHandled := false;
                            OnInitSourceDocumentOnBeforeTransLineLoopIteration(TransHeader, TransLine, WhseActivHeader, IsHandled);
                            if not IsHandled then begin
                                TransLine.Validate("Qty. to Ship", 0);
                                TransLine.Validate("Qty. to Receive", 0);
                                ModifyTransferLine(TransLine);
                                OnAfterTransLineModify(TransLine);
                            end;
                        until TransLine.Next() = 0;

                    OnInitSourceDocumentOnAfterTransferLineLoopIteration(TransLine, TransHeader, WhseActivHeader, ModifyHeader);

                    if (TransHeader."Posting Date" <> WhseActivHeader."Posting Date") and (WhseActivHeader."Posting Date" <> 0D) then begin
                        TransHeader.CalledFromWarehouse(true);
                        TransHeader.Validate("Posting Date", WhseActivHeader."Posting Date");
                        ModifyHeader := true;
                    end;
                    if WhseActivHeader."External Document No." <> '' then begin
                        TransHeader."External Document No." := WhseActivHeader."External Document No.";
                        ModifyHeader := true;
                    end;
                    ModifyTransferHeader(TransHeader, WhseActivHeader, ModifyHeader);
                end;
        end;

        OnAfterInitSourceDocument(WhseActivHeader);
    end;

    local procedure ReleasePurchDocument(var ModifyHeader: Boolean)
    var
        PurchRelease: Codeunit "Release Purchase Document";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeReleasePurchDocument(PurchHeader, WhseActivHeader, ModifyHeader, IsHandled);
        if IsHandled then
            exit;

        if (PurchHeader."Posting Date" <> WhseActivHeader."Posting Date") and (WhseActivHeader."Posting Date" <> 0D) then begin
            PurchRelease.SetSkipWhseRequestOperations(true);
            PurchRelease.Reopen(PurchHeader);
            PurchRelease.SetSkipCheckReleaseRestrictions();
            PurchHeader.SetHideValidationDialog(true);
            PurchHeader.Validate("Posting Date", WhseActivHeader."Posting Date");
            OnReleasePurchDocumentOnBeforePurchReleaseRun(PurchHeader, WhseActivHeader);
            PurchRelease.Run(PurchHeader);
            OnReleasePurchDocumentOnAfterPurchReleaseRun(PurchHeader, WhseActivHeader);
            ModifyHeader := true;
        end;
    end;

    local procedure ReleaseSalesDocument(var ModifyHeader: Boolean)
    var
        SalesRelease: Codeunit "Release Sales Document";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeReleaseSalesDocument(SalesHeader, WhseActivHeader, ModifyHeader, IsHandled);
        if not IsHandled then
            if (SalesHeader."Posting Date" <> WhseActivHeader."Posting Date") and (WhseActivHeader."Posting Date" <> 0D) then begin
                SalesRelease.SetSkipWhseRequestOperations(true);
                SalesRelease.Reopen(SalesHeader);
                SalesRelease.SetSkipCheckReleaseRestrictions();
                SalesHeader.SetHideValidationDialog(true);
                SalesHeader.Validate("Posting Date", WhseActivHeader."Posting Date");
                OnReleaseSalesDocumentOnBeforeSalesReleaseRun(SalesHeader, WhseActivHeader);
                SalesRelease.Run(SalesHeader);
                OnReleaseSalesDocumentOnAfterSalesReleaseRun(SalesHeader, WhseActivHeader);
                ModifyHeader := true;
            end;
        OnAfterReleaseSalesDocument(SalesHeader, WhseActivHeader, ModifyHeader);
    end;

    local procedure ModifyPurchaseHeader(var PurchaseHeader: Record "Purchase Header"; WarehouseActivityHeader: Record "Warehouse Activity Header"; ModifyHeader: Boolean)
    begin
        OnBeforeModifyPurchaseHeader(PurchaseHeader, WarehouseActivityHeader, ModifyHeader);
        if ModifyHeader then
            PurchaseHeader.Modify();
    end;

    local procedure ModifyPurchaseLine(var PurchaseLine: Record "Purchase Line")
    begin
        OnBeforeModifyPurchaseLine(PurchaseLine);
        PurchaseLine.Modify();
    end;

    local procedure ModifySalesHeader(var SalesHeader: Record "Sales Header"; WarehouseActivityHeader: Record "Warehouse Activity Header"; ModifyHeader: Boolean)
    begin
        OnBeforeModifySalesHeader(SalesHeader, WarehouseActivityHeader, ModifyHeader);
        if ModifyHeader then
            SalesHeader.Modify();
    end;

    local procedure ModifySalesLine(var SalesLine: Record "Sales Line")
    begin
        OnBeforeModifySalesLine(SalesLine);
        SalesLine.Modify();
    end;

    local procedure ModifyTransferHeader(var TransferHeader: Record "Transfer Header"; WarehouseActivityHeader: Record "Warehouse Activity Header"; ModifyHeader: Boolean)
    begin
        OnBeforeModifyTransferHeader(TransferHeader, WarehouseActivityHeader, ModifyHeader);
        if ModifyHeader then
            TransferHeader.Modify();
    end;

    local procedure ModifyTransferLine(var TransferLine: Record "Transfer Line")
    begin
        OnBeforeModifyTransferLine(TransferLine);
        TransferLine.Modify();
    end;

    local procedure UpdateSourceDocument()
    var
        SalesLine: Record "Sales Line";
    begin
        OnBeforeUpdateSourceDocument(TempWhseActivLine);

        case TempWhseActivLine."Source Type" of
            Database::"Purchase Line":
                begin
                    if TempWhseActivLine."Activity Type" = TempWhseActivLine."Activity Type"::"Invt. Pick" then begin
                        TempWhseActivLine."Qty. to Handle" := -TempWhseActivLine."Qty. to Handle";
                        TempWhseActivLine."Qty. to Handle (Base)" := -TempWhseActivLine."Qty. to Handle (Base)";
                    end;
                    PurchLine.Get(TempWhseActivLine."Source Subtype", TempWhseActivLine."Source No.", TempWhseActivLine."Source Line No.");
                    OnUpdateSourceDocumentOnAfterGetPurchLine(PurchLine, TempWhseActivLine);
                    if TempWhseActivLine."Source Document" = TempWhseActivLine."Source Document"::"Purchase Order" then begin
                        OnUpdateSourceDocumentOnSourceDocumentIsPurchaseOrder(PurchLine, TempWhseActivLine);
                        if (PurchLine."Outstanding Quantity" <> 0) and (Abs(TempWhseActivLine."Qty. to Handle") > Abs(PurchLine."Outstanding Quantity")) then
                            TempWhseActivLine."Qty. to Handle" := PurchLine."Outstanding Quantity";
                        PurchLine.Validate("Qty. to Receive", TempWhseActivLine."Qty. to Handle");
                        PurchLine."Qty. to Receive (Base)" := TempWhseActivLine."Qty. to Handle (Base)";
                        if InvoiceSourceDoc then
                            PurchLine.Validate("Qty. to Invoice", TempWhseActivLine."Qty. to Handle");
                    end else begin
                        if (PurchLine."Outstanding Quantity" <> 0) and (-TempWhseActivLine."Qty. to Handle" = PurchLine."Outstanding Quantity") then
                            TempWhseActivLine."Qty. to Handle" := -PurchLine."Outstanding Quantity";
                        PurchLine.Validate("Return Qty. to Ship", -TempWhseActivLine."Qty. to Handle");
                        PurchLine."Return Qty. to Ship (Base)" := -TempWhseActivLine."Qty. to Handle (Base)";
                        if InvoiceSourceDoc then
                            PurchLine.Validate("Qty. to Invoice", -TempWhseActivLine."Qty. to Handle");
                    end;
                    PurchLine."Bin Code" := TempWhseActivLine."Bin Code";
                    OnUpdateSourceDocumentOnBeforePurchLineModify(PurchLine, TempWhseActivLine);
                    PurchLine.Modify();
                    OnAfterPurchLineModify(PurchLine);
                    OnUpdateSourceDocumentOnAfterPurchLineModify(PurchLine, TempWhseActivLine);
                    UpdateAttachedLines(PurchLine);
                end;
            Database::"Sales Line":
                begin
                    if TempWhseActivLine."Activity Type" = TempWhseActivLine."Activity Type"::"Invt. Pick" then begin
                        TempWhseActivLine."Qty. to Handle" := -TempWhseActivLine."Qty. to Handle";
                        TempWhseActivLine."Qty. to Handle (Base)" := -TempWhseActivLine."Qty. to Handle (Base)";
                    end;
                    SalesLine.Get(TempWhseActivLine."Source Subtype", TempWhseActivLine."Source No.", TempWhseActivLine."Source Line No.");
                    OnUpdateSourceDocumentOnAfterGetSalesLine(SalesLine, TempWhseActivLine);
                    if TempWhseActivLine."Source Document" = TempWhseActivLine."Source Document"::"Sales Order" then begin
                        SalesLine.Validate("Qty. to Ship", -TempWhseActivLine."Qty. to Handle");
                        SalesLine."Qty. to Ship (Base)" := -TempWhseActivLine."Qty. to Handle (Base)";
                        if InvoiceSourceDoc then
                            SalesLine.Validate("Qty. to Invoice", -TempWhseActivLine."Qty. to Handle");
                    end else begin
                        SalesLine.Validate("Return Qty. to Receive", TempWhseActivLine."Qty. to Handle");
                        SalesLine."Return Qty. to Receive (Base)" := TempWhseActivLine."Qty. to Handle (Base)";
                        if InvoiceSourceDoc then
                            SalesLine.Validate("Qty. to Invoice", TempWhseActivLine."Qty. to Handle");
                    end;
                    SalesLine."Bin Code" := TempWhseActivLine."Bin Code";
                    OnUpdateSourceDocumentOnBeforeModifySalesLine(SalesLine, TempWhseActivLine, WhseActivHeader);
                    SalesLine.Modify();
                    OnUpdateSourceDocumentOnBeforeSalesLineModify(SalesLine, TempWhseActivLine);
                    OnAfterSalesLineModify(SalesLine);
                    OnUpdateSourceDocumentOnAfterSalesLineModify(SalesLine, TempWhseActivLine);
                    UpdateAttachedLines(SalesLine);
                end;
            Database::"Transfer Line":
                begin
                    TransHeader.Get(TempWhseActivLine."Source No.");
                    TransLine.Get(TempWhseActivLine."Source No.", TempWhseActivLine."Source Line No.");
                    OnUpdateSourceDocumentOnAfterGetTransLine(TransLine, TempWhseActivLine);
                    case TempWhseActivLine."Activity Type" of
                        TempWhseActivLine."Activity Type"::"Invt. Put-away":
                            begin
                                if TransHeader."Direct Transfer" then begin
                                    TransLine.Validate("Qty. to Ship", TempWhseActivLine."Qty. to Handle");
                                    TransLine."Qty. to Ship (Base)" := TempWhseActivLine."Qty. to Handle (Base)";
                                end;
                                TransLine."Transfer-To Bin Code" := TempWhseActivLine."Bin Code";
                                TransLine.Validate("Qty. to Receive", TempWhseActivLine."Qty. to Handle");
                                TransLine."Qty. to Receive (Base)" := TempWhseActivLine."Qty. to Handle (Base)";
                            end;
                        else begin
                            TransLine."Transfer-from Bin Code" := TempWhseActivLine."Bin Code";
                            TransLine.Validate("Qty. to Ship", TempWhseActivLine."Qty. to Handle");
                            TransLine."Qty. to Ship (Base)" := TempWhseActivLine."Qty. to Handle (Base)";
                            if TransHeader."Direct Transfer" then begin
                                TransLine.Validate("Qty. to Receive", TempWhseActivLine."Qty. to Handle");
                                TransLine."Qty. to Receive (Base)" := TempWhseActivLine."Qty. to Handle (Base)";
                            end;
                        end;
                    end;
                    OnUpdateSourceDocumentOnBeforeTransLineModify(TransLine, TempWhseActivLine);
                    TransLine.Modify();
                    OnUpdateSourceDocumentOnAfterTransLineModify(TransLine, TempWhseActivLine);
                end;
        end;
    end;

    local procedure UpdateUnhandledTransLine(TransHeaderNo: Code[20])
    var
        LocalTransHeader: Record "Transfer Header";
        TransLine: Record "Transfer Line";
    begin
        TransLine.SetRange("Document No.", TransHeaderNo);
        TransLine.SetRange("Derived From Line No.", 0);
        TransLine.SetRange("Qty. to Ship", 0);
        TransLine.SetRange("Qty. to Receive", 0);
        if TransLine.FindSet() then begin
            LocalTransHeader.Get(TransHeaderNo);
            repeat
                if TransLine."Qty. in Transit" <> 0 then
                    TransLine.Validate(TransLine."Qty. to Receive", TransLine."Qty. in Transit");
                if TransLine."Outstanding Quantity" <> 0 then begin
                    TransLine.Validate(TransLine."Qty. to Ship", TransLine."Outstanding Quantity");
                    if LocalTransHeader."Direct Transfer" then begin
                        TransLine."Qty. to Receive" := 0;
                        TransLine."Qty. to Receive (Base)" := 0;
                    end;
                end;
                OnBeforeUnhandledTransLineModify(TransLine);
                TransLine.Modify();
            until TransLine.Next() = 0;
        end;
    end;

    local procedure PostSourceDocument(WhseActivHeader: Record "Warehouse Activity Header")
    var
        PurchPost: Codeunit "Purch.-Post";
        SalesPost: Codeunit "Sales-Post";
        TransferPostReceipt: Codeunit "TransferOrder-Post Receipt";
        TransferPostShip: Codeunit "TransferOrder-Post Shipment";
        TransferPostTransfer: Codeunit "TransferOrder-Post Transfer";
    begin
        OnBeforePostSourceDocument(WhseActivHeader, PostedSourceType, PostedSourceNo, PostedSourceSubType, HideDialog, SuppressCommit);

        case WhseActivHeader."Source Type" of
            Database::"Purchase Line":
                begin
                    Clear(PurchPost);
                    if not (SuppressCommit or IsPreview) then
                        Commit();
                    if WhseActivHeader."Source Document" = WhseActivHeader."Source Document"::"Purchase Order" then
                        PurchHeader.Receive := true
                    else
                        PurchHeader.Ship := true;
                    PurchHeader.Invoice := InvoiceSourceDoc;
                    PurchHeader."Posting from Whse. Ref." := PostingReference;
                    OnPostSourceDocumentOnBeforePurchPostRun(WhseActivHeader, PurchHeader);
                    PurchPost.SetSuppressCommit(IsPreview or SuppressCommit);
                    PurchPost.Run(PurchHeader);
                    if WhseActivHeader."Source Document" = WhseActivHeader."Source Document"::"Purchase Order" then begin
                        PostedSourceType := Database::"Purch. Rcpt. Header";
                        PostedSourceNo := PurchHeader."Last Receiving No.";
                    end else begin
                        PostedSourceType := Database::"Return Shipment Header";
                        PostedSourceNo := PurchHeader."Last Return Shipment No.";
                    end;
                    PostedSourceSubType := 0;
                end;
            Database::"Sales Line":
                begin
                    Clear(SalesPost);
                    if not (SuppressCommit or IsPreview) then
                        Commit();
                    if WhseActivHeader."Source Document" = WhseActivHeader."Source Document"::"Sales Order" then
                        SalesHeader.Ship := true
                    else
                        SalesHeader.Receive := true;
                    SalesHeader.Invoice := InvoiceSourceDoc;
                    SalesHeader."Posting from Whse. Ref." := PostingReference;
                    SalesPost.SetWhseJnlRegisterCU(WhseJnlRegisterLine);
                    OnPostSourceDocumentOnBeforeSalesPostRun(WhseActivHeader, SalesHeader);
                    SalesPost.SetSuppressCommit(SuppressCommit or IsPreview);
                    SalesPost.Run(SalesHeader);
                    if WhseActivHeader."Source Document" = WhseActivHeader."Source Document"::"Sales Order" then begin
                        PostedSourceType := Database::"Sales Shipment Header";
                        PostedSourceNo := SalesHeader."Last Shipping No.";
                    end else begin
                        PostedSourceType := Database::"Return Receipt Header";
                        PostedSourceNo := SalesHeader."Last Return Receipt No.";
                    end;
                    PostedSourceSubType := 0;
                end;
            Database::"Transfer Line":
                begin
                    Clear(TransferPostReceipt);
                    if not (SuppressCommit or IsPreview) then
                        Commit();
                    case WhseActivHeader.Type of
                        WhseActivHeader.Type::"Invt. Put-away":
                            begin
                                TransHeader."Posting from Whse. Ref." := PostingReference;
                                OnPostSourceDocumentOnBeforeTransferPostReceiptRun(TransHeader, WhseActivHeader);
                                if not TransHeader."Direct Transfer" then begin
                                    if HideDialog then
                                        TransferPostReceipt.SetHideValidationDialog(HideDialog);
                                    TransferPostReceipt.SetPreviewMode(IsPreview);
                                    TransferPostReceipt.Run(TransHeader);
                                    PostedSourceType := Database::"Transfer Receipt Header";
                                    PostedSourceNo := TransHeader."Last Receipt No.";
                                end else begin
                                    TransHeader.TestField("Direct Transfer Posting", TransHeader."Direct Transfer Posting"::"Direct Transfer");
                                    if HideDialog then
                                        TransferPostTransfer.SetHideValidationDialog(HideDialog);
                                    TransferPostTransfer.SetPreviewMode(IsPreview);
                                    TransferPostTransfer.Run(TransHeader);
                                    PostedSourceType := Database::"Direct Trans. Header";
                                    PostedSourceNo := TransHeader."Last Receipt No.";
                                end;
                            end
                        else begin
                            TransHeader."Posting from Whse. Ref." := PostingReference;
                            if not TransHeader."Direct Transfer" then begin
                                if HideDialog then
                                    TransferPostShip.SetHideValidationDialog(HideDialog);
                                TransferPostShip.SetPreviewMode(IsPreview);
                                TransferPostShip.Run(TransHeader);
                                PostedSourceType := Database::"Transfer Shipment Header";
                                PostedSourceNo := TransHeader."Last Shipment No.";
                            end else
                                if TransHeader."Direct Transfer Posting" = TransHeader."Direct Transfer Posting"::"Direct Transfer" then begin
                                    if HideDialog then
                                        TransferPostTransfer.SetHideValidationDialog(HideDialog);
                                    TransferPostTransfer.SetPreviewMode(IsPreview);
                                    TransferPostTransfer.Run(TransHeader);
                                    PostedSourceType := Database::"Direct Trans. Header";
                                    PostedSourceNo := TransHeader."Last Shipment No.";
                                end else begin
                                    if HideDialog then
                                        TransferPostShip.SetHideValidationDialog(HideDialog);
                                    TransferPostShip.SetPreviewMode(IsPreview);
                                    TransferPostShip.Run(TransHeader);
                                    PostedSourceType := Database::"Transfer Shipment Header";
                                    PostedSourceNo := TransHeader."Last Shipment No.";
                                end;
                        end;
                    end;

                    OnPostSourceDocumentOnBeforeUpdateUnhandledTransLine(TransHeader, WhseActivHeader, PostingReference, HideDialog);
                    UpdateUnhandledTransLine(TransHeader."No.");
                    PostedSourceSubType := 0;
                end;
        end;

        OnAfterPostSourceDocument(WhseActivHeader, PurchHeader, SalesHeader, TransHeader, PostingReference, HideDialog);
    end;

    local procedure PostJobUsage(PostingDate: Date)
    var
        JobPlanningLine: Record "Job Planning Line";
        JobJnlLine: Record "Job Journal Line";
        JobJnlLineReservationEntry: Record "Reservation Entry";
        JobTransferLine: Codeunit "Job Transfer Line";
        JobJnlPostLine: Codeunit "Job Jnl.-Post Line";
        FeatureTelemetry: Codeunit "Feature Telemetry";
    begin
        FeatureTelemetry.LogUsage('0000GQT', 'Picks on jobs', 'post picks');
        TempWhseActivLine.Reset();
        if TempWhseActivLine.FindSet() then begin
            repeat
                JobPlanningLine.SetRange("Job Contract Entry No.", TempWhseActivLine."Source Line No.");
                JobPlanningLine.SetFilter(Type, '<>%1', JobPlanningLine.Type::Text);

                if JobPlanningLine.FindFirst() then begin
                    JobPlanningLine.Validate("Qty. to Transfer to Journal", TempWhseActivLine."Qty. to Handle");

                    JobTransferLine.FromWarehouseActivityLineToJnlLine(TempWhseActivLine, PostingDate, '', '', JobJnlLine);
                end;

                JobJnlPostLine.SetCalledFromInvtPutawayPick(true);
                JobJnlPostLine.RunWithCheck(JobJnlLine);

                //Delete the temporary job journal line and the linked item tracking after posting.
                JobJnlLineReservationEntry.SetSourceFilter(Database::"Job Journal Line", JobJnlLine."Entry Type".AsInteger(), JobJnlLine."Journal Template Name", JobJnlLine."Line No.", true);
                JobJnlLineReservationEntry.SetRange("Source Batch Name", JobJnlLine."Journal Batch Name");
                JobJnlLineReservationEntry.DeleteAll();
                JobJnlLine.Delete();
            until TempWhseActivLine.Next() = 0;

            PostedSourceType := TempWhseActivLine."Source Type";
            PostedSourceSubType := TempWhseActivLine."Source Subtype";
            PostedSourceNo := TempWhseActivLine."Source No.";
        end;
    end;

    local procedure PostWhseActivityLine(WhseActivHeader: Record "Warehouse Activity Header"; var WhseActivLine: Record "Warehouse Activity Line")
    var
        PostedInvtPutAwayHeader: Record "Posted Invt. Put-away Header";
        PostedInvtPickHeader: Record "Posted Invt. Pick Header";
        PurchaseForJob: Boolean;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforePostWhseActivLine(WhseActivHeader, WhseActivLine, PostedSourceNo, PostedSourceType, PostedSourceSubType, IsHandled);
        if IsHandled then
            exit;

        IsHandled := false;
        OnPostWhseActivityLineOnBeforePosting(WhseActivHeader, WhseActivLine, PostedSourceNo, PostedSourceType, PostedSourceSubType, IsHandled);
        if not IsHandled then
            if WhseActivHeader."Source Document" = WhseActivHeader."Source Document"::"Prod. Consumption" then
                PostProdConsumption(WhseActivHeader)
            else
                if (WhseActivHeader.Type = WhseActivHeader.Type::"Invt. Put-away") and (WhseActivHeader."Source Document" = WhseActivHeader."Source Document"::"Prod. Output") then
                    PostProdOutput(WhseActivHeader)
                else
                    if (WhseActivHeader.Type = WhseActivHeader.Type::"Invt. Pick") and (WhseActivHeader."Source Document" = WhseActivHeader."Source Document"::"Job Usage") then
                        PostJobUsage(WhseActivHeader."Posting Date")
                    else begin
                        PurchaseForJob := IsActivityForJobPurchase(WhseActivLine);
                        IsHandled := false;
                        OnPostWhseActivityLineOnBeforePostDoc(TempWhseActivLine, WhseActivHeader, PostedSourceType, PostedSourceSubType, PostedSourceNo, IsHandled);
                        if not IsHandled then
                            PostSourceDoc();
                    end;

        OnPostWhseActivityLineOnBeforeCreatePostedActivHeader(WhseActivHeader);
        CreatePostedActivHeader(WhseActivHeader, PostedInvtPutAwayHeader, PostedInvtPickHeader);

        repeat
            LineCount := LineCount + 1;
            if not HideDialog then begin
                Window.Update(3, LineCount);
                Window.Update(4, Round(LineCount / NoOfRecords * 10000, 1));
            end;

            UpdateWhseActivityLine(WhseActivLine);

            if Location."Bin Mandatory" and (WhseActivHeader."Source Document" <> WhseActivHeader."Source Document"::"Job Usage") then
                PostWhseJnlLine(WhseActivLine, PurchaseForJob);

            CreatePostedActivLine(WhseActivLine, PostedInvtPutAwayHeader, PostedInvtPickHeader);
        until WhseActivLine.Next() = 0;

        OnAfterPostWhseActivityLine(WhseActivHeader, WhseActivLine, PostedSourceNo, PostedSourceType, PostedSourceSubType);
    end;

    local procedure UpdateWhseActivityLine(var WhseActivLine: Record "Warehouse Activity Line")
    var
        EntriesExist: Boolean;
    begin
        if CheckItemTracking(WhseActivLine) and (WhseActivLine."Activity Type" = WhseActivLine."Activity Type"::"Invt. Put-away") then
            WhseActivLine."Expiration Date" := ItemTrackingMgt.ExistingExpirationDate(WhseActivLine, false, EntriesExist);
    end;

    local procedure PostWhseJnlLine(WhseActivLine: Record "Warehouse Activity Line"; PurchaseForJob: Boolean)
    var
        TempWhseJnlLine: Record "Warehouse Journal Line" temporary;
        WMSMgt: Codeunit "WMS Management";
        IsHandled: Boolean;
    begin
        OnBeforePostWhseJnlLine(WhseActivLine, IsHandled);
        if IsHandled then
            exit;

        CreateWhseJnlLine(TempWhseJnlLine, WhseActivLine);
        if TempWhseJnlLine."Entry Type" = TempWhseJnlLine."Entry Type"::"Negative Adjmt." then
            WMSMgt.CheckWhseJnlLine(TempWhseJnlLine, 4, TempWhseJnlLine."Qty. (Base)", false); // 4 = Whse. Journal
        WhseJnlRegisterLine.Run(TempWhseJnlLine);
        if PurchaseForJob then
            if ConsumeWarehouseEntryForJobPurchase(TempWhseJnlLine, WhseActivLine) then
                WhseJnlRegisterLine.Run(TempWhseJnlLine);
    end;

    procedure CreateWhseJnlLine(var WhseJnlLine: Record "Warehouse Journal Line"; WhseActivLine: Record "Warehouse Activity Line")
    var
        WMSMgt: Codeunit "WMS Management";
    begin
        WhseJnlLine.Init();
        WhseJnlLine."Location Code" := WhseActivLine."Location Code";
        WhseJnlLine."Item No." := WhseActivLine."Item No.";
        WhseJnlLine."Registering Date" := WhseActivHeader."Posting Date";
        WhseJnlLine."User ID" := CopyStr(UserId(), 1, MaxStrLen(WhseJnlLine."User ID"));
        WhseJnlLine."Variant Code" := WhseActivLine."Variant Code";
        if WhseActivLine."Action Type" = WhseActivLine."Action Type"::Take then begin
            WhseJnlLine."Entry Type" := WhseJnlLine."Entry Type"::"Negative Adjmt.";
            WhseJnlLine."From Bin Code" := WhseActivLine."Bin Code";
            WhseJnlLine."From Zone Code" := WhseActivLine."Zone Code";
            WhseJnlLine.Quantity := WhseActivLine."Qty. to Handle (Base)";
            WhseJnlLine."Qty. (Base)" := WhseActivLine."Qty. to Handle (Base)";
        end else begin
            WhseJnlLine."Entry Type" := WhseJnlLine."Entry Type"::"Positive Adjmt.";
            WhseJnlLine."To Bin Code" := WhseActivLine."Bin Code";
            WhseJnlLine."To Zone Code" := WhseActivLine."Zone Code";
            WhseJnlLine.Quantity := -WhseActivLine."Qty. to Handle (Base)";
            WhseJnlLine."Qty. (Base)" := -WhseActivLine."Qty. to Handle (Base)";
        end;
        WhseJnlLine."Qty. (Absolute)" := WhseActivLine."Qty. to Handle (Base)";
        WhseJnlLine."Qty. (Absolute, Base)" := WhseActivLine."Qty. to Handle (Base)";
        WhseJnlLine."Unit of Measure Code" := WMSMgt.GetBaseUOM(WhseActivLine."Item No.");
        WhseJnlLine."Qty. per Unit of Measure" := 1;
        WhseJnlLine."Source Type" := PostedSourceType;
        WhseJnlLine."Source Subtype" := PostedSourceSubType;
        WhseJnlLine."Source No." := PostedSourceNo;
        WhseJnlLine."Reference No." := PostedSourceNo;
        case WhseActivLine."Source Document" of
            WhseActivLine."Source Document"::"Purchase Order":
                begin
                    WhseJnlLine."Source Code" := SourceCodeSetup.Purchases;
                    WhseJnlLine."Reference Document" := WhseJnlLine."Reference Document"::"Posted Rcpt.";
                end;
            WhseActivLine."Source Document"::"Sales Order":
                begin
                    WhseJnlLine."Source Code" := SourceCodeSetup.Sales;
                    WhseJnlLine."Reference Document" := WhseJnlLine."Reference Document"::"Posted Shipment";
                end;
            WhseActivLine."Source Document"::"Purchase Return Order":
                begin
                    WhseJnlLine."Source Code" := SourceCodeSetup.Purchases;
                    WhseJnlLine."Reference Document" := WhseJnlLine."Reference Document"::"Posted Rtrn. Shipment";
                end;
            WhseActivLine."Source Document"::"Sales Return Order":
                begin
                    WhseJnlLine."Source Code" := SourceCodeSetup.Sales;
                    WhseJnlLine."Reference Document" := WhseJnlLine."Reference Document"::"Posted Rtrn. Rcpt.";
                end;
            WhseActivLine."Source Document"::"Outbound Transfer":
                begin
                    WhseJnlLine."Source Code" := SourceCodeSetup.Transfer;
                    WhseJnlLine."Reference Document" := WhseJnlLine."Reference Document"::"Posted T. Shipment";
                end;
            WhseActivLine."Source Document"::"Inbound Transfer":
                begin
                    WhseJnlLine."Source Code" := SourceCodeSetup.Transfer;
                    WhseJnlLine."Reference Document" := WhseJnlLine."Reference Document"::"Posted T. Receipt";
                end;
            else
                OnCreateWhseJnlLineOnSetReferenceDocument(WhseActivLine, WhseJnlLine, SourceCodeSetup);
        end;

        if WhseActivLine."Activity Type" in [WhseActivLine."Activity Type"::"Invt. Put-away", WhseActivLine."Activity Type"::"Invt. Pick",
                               WhseActivLine."Activity Type"::"Invt. Movement"]
        then
            WhseJnlLine."Whse. Document Type" := WhseJnlLine."Whse. Document Type"::" ";

        WhseJnlLine.CopyTrackingFromWhseActivityLine(WhseActivLine);
        WhseJnlLine."Warranty Date" := WhseActivLine."Warranty Date";
        WhseJnlLine."Expiration Date" := WhseActivLine."Expiration Date";

        OnAfterCreateWhseJnlLine(WhseJnlLine, WhseActivLine, SourceCodeSetup);
    end;

    local procedure ConsumeWarehouseEntryForJobPurchase(var TempWarehouseJournalLine: Record "Warehouse Journal Line" temporary; WarehouseActivityLine: Record "Warehouse Activity Line") Result: Boolean
    var
        Bin: Record Bin;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeConsumeWarehouseEntryForJobPurchase(TempWarehouseJournalLine, WarehouseActivityLine, Result, IsHandled);
        if IsHandled then
            exit(Result);

        if WarehouseActivityLine."Source Document" <> WarehouseActivityLine."Source Document"::"Purchase Order" then
            exit(false);

        if WarehouseActivityLine."Activity Type" <> WarehouseActivityLine."Activity Type"::"Invt. Put-away" then
            exit(false);

        case TempWarehouseJournalLine."Entry Type" of
            TempWarehouseJournalLine."Entry Type"::"Positive Adjmt.":
                begin
                    TempWarehouseJournalLine."Entry Type" := TempWarehouseJournalLine."Entry Type"::"Negative Adjmt.";
                    TempWarehouseJournalLine."From Bin Code" := TempWarehouseJournalLine."To Bin Code";
                    Bin.SetLoadFields("Zone Code", "Bin Type Code");
                    Bin.Get(TempWarehouseJournalLine."Location Code", TempWarehouseJournalLine."From Bin Code");
                    TempWarehouseJournalLine."From Zone Code" := Bin."Zone Code";
                    TempWarehouseJournalLine."From Bin Type Code" := Bin."Bin Type Code";

                    TempWarehouseJournalLine."To Bin Code" := '';
                    TempWarehouseJournalLine."To Zone Code" := '';
                end;
            TempWarehouseJournalLine."Entry Type"::"Negative Adjmt.":
                begin
                    TempWarehouseJournalLine."Entry Type" := TempWarehouseJournalLine."Entry Type"::"Positive Adjmt.";
                    TempWarehouseJournalLine."To Bin Code" := TempWarehouseJournalLine."From Bin Code";
                    Bin.SetLoadFields("Zone Code");
                    Bin.Get(TempWarehouseJournalLine."Location Code", TempWarehouseJournalLine."From Bin Code");
                    TempWarehouseJournalLine."To Zone Code" := Bin."Zone Code";

                    TempWarehouseJournalLine."From Bin Code" := '';
                    TempWarehouseJournalLine."From Zone Code" := '';
                    TempWarehouseJournalLine."From Bin Type Code" := '';
                end;
        end;
        TempWarehouseJournalLine.Quantity := -TempWarehouseJournalLine.Quantity;
        TempWarehouseJournalLine."Qty. (Base)" := -TempWarehouseJournalLine."Qty. (Base)";

        exit(true);
    end;

    local procedure IsActivityForJobPurchase(WarehouseActivityLine: Record "Warehouse Activity Line"): Boolean
    var
        PurchaseLine: Record "Purchase Line";
    begin
        if WarehouseActivityLine."Source Document" <> WarehouseActivityLine."Source Document"::"Purchase Order" then
            exit(false);

        if WarehouseActivityLine."Activity Type" <> WarehouseActivityLine."Activity Type"::"Invt. Put-away" then
            exit(false);

        PurchaseLine.SetLoadFields("Job No.");
        case WarehouseActivityLine."Source Document" of
            WarehouseActivityLine."Source Document"::"Purchase Order":
                if not PurchaseLine.Get(PurchaseLine."Document Type"::Order, WarehouseActivityLine."Source No.", WarehouseActivityLine."Source Line No.") then
                    exit(false);
        end;

        exit(PurchaseLine."Job No." <> '');
    end;

    local procedure CreatePostedActivHeader(WhseActivHeader: Record "Warehouse Activity Header"; var PostedInvtPutAwayHeader: Record "Posted Invt. Put-away Header"; var PostedInvtPickHeader: Record "Posted Invt. Pick Header")
    var
        WhseComment: Record "Warehouse Comment Line";
        WhseComment2: Record "Warehouse Comment Line";
        RecordLinkManagement: Codeunit "Record Link Management";
    begin
        if WhseActivHeader.Type = WhseActivHeader.Type::"Invt. Put-away" then begin
            PostedInvtPutAwayHeader.Init();
            PostedInvtPutAwayHeader.TransferFields(WhseActivHeader);
            PostedInvtPutAwayHeader."No." := '';
            PostedInvtPutAwayHeader."Invt. Put-away No." := WhseActivHeader."No.";
            PostedInvtPutAwayHeader."Source No." := PostedSourceNo;
            PostedInvtPutAwayHeader."Source Type" := PostedSourceType;
            OnBeforePostedInvtPutAwayHeaderInsert(PostedInvtPutAwayHeader, WhseActivHeader);
            PostedInvtPutAwayHeader.Insert(true);
            RecordLinkManagement.CopyLinks(WhseActivHeader, PostedInvtPutAwayHeader);
            OnAfterPostedInvtPutAwayHeaderInsert(PostedInvtPutAwayHeader, WhseActivHeader);
        end else begin
            PostedInvtPickHeader.Init();
            PostedInvtPickHeader.TransferFields(WhseActivHeader);
            PostedInvtPickHeader."No." := '';
            PostedInvtPickHeader."Invt Pick No." := WhseActivHeader."No.";
            PostedInvtPickHeader."Source No." := PostedSourceNo;
            PostedInvtPickHeader."Source Type" := PostedSourceType;
            OnBeforePostedInvtPickHeaderInsert(PostedInvtPickHeader, WhseActivHeader);
            PostedInvtPickHeader.Insert(true);
            RecordLinkManagement.CopyLinks(WhseActivHeader, PostedInvtPickHeader);
            OnAfterPostedInvtPickHeaderInsert(PostedInvtPickHeader, WhseActivHeader);
        end;

        WhseComment.SetRange("Table Name", WhseComment."Table Name"::"Whse. Activity Header");
        WhseComment.SetRange(Type, WhseActivHeader.Type);
        WhseComment.SetRange("No.", WhseActivHeader."No.");
        WhseComment.LockTable();
        if WhseComment.Find('-') then
            repeat
                WhseComment2.Init();
                WhseComment2 := WhseComment;
                if WhseActivHeader.Type = WhseActivHeader.Type::"Invt. Put-away" then begin
                    WhseComment2."Table Name" := WhseComment2."Table Name"::"Posted Invt. Put-Away";
                    WhseComment2."No." := PostedInvtPutAwayHeader."No.";
                end else begin
                    WhseComment2."Table Name" := WhseComment2."Table Name"::"Posted Invt. Pick";
                    WhseComment2."No." := PostedInvtPickHeader."No.";
                end;
                WhseComment2.Type := WhseComment2.Type::" ";
                WhseComment2.Insert();
            until WhseComment.Next() = 0;
    end;

    local procedure CreatePostedActivLine(WhseActivLine: Record "Warehouse Activity Line"; PostedInvtPutAwayHdr: Record "Posted Invt. Put-away Header"; PostedInvtPickHeader: Record "Posted Invt. Pick Header")
    var
        PostedInvtPutAwayLine: Record "Posted Invt. Put-away Line";
        PostedInvtPickLine: Record "Posted Invt. Pick Line";
        IsHandled: Boolean;
    begin
        if WhseActivHeader.Type = WhseActivHeader.Type::"Invt. Put-away" then begin
            PostedInvtPutAwayLine.Init();
            PostedInvtPutAwayLine.TransferFields(WhseActivLine);
            PostedInvtPutAwayLine."No." := PostedInvtPutAwayHdr."No.";
            PostedInvtPutAwayLine.Validate(Quantity, WhseActivLine."Qty. to Handle");
            OnBeforePostedInvtPutAwayLineInsert(PostedInvtPutAwayLine, WhseActivLine);
            PostedInvtPutAwayLine.Insert();
        end else begin
            PostedInvtPickLine.Init();
            PostedInvtPickLine.TransferFields(WhseActivLine);
            PostedInvtPickLine."No." := PostedInvtPickHeader."No.";
            IsHandled := false;
            OnBeforePostedInvtPickLineValidateQuantity(PostedInvtPickLine, WhseActivLine, IsHandled);
            if not IsHandled then
                PostedInvtPickLine.Validate(Quantity, WhseActivLine."Qty. to Handle");
            OnBeforePostedInvtPickLineInsert(PostedInvtPickLine, WhseActivLine);
            PostedInvtPickLine.Insert();
        end;
    end;

    local procedure PostSourceDoc()
    begin
        OnBeforePostSourceDoc(WhseActivHeader, HideDialog, SuppressCommit);

        TempWhseActivLine.Reset();
        TempWhseActivLine.Find('-');
        InitSourceDocument();
        repeat
            UpdateSourceDocument();
        until TempWhseActivLine.Next() = 0;
        UpdateItemChargeLines();
        UpdateNonInventoryLines();

        PostSourceDocument(WhseActivHeader);
    end;

    local procedure PostProdConsumption(WhseActivityHeader: Record "Warehouse Activity Header")
    begin
        OnPostProdConsumption(WhseActivityHeader, TempWhseActivLine, PostedSourceType, PostedSourceSubType, PostedSourceNo);
    end;

    local procedure PostProdOutput(WhseActivityHeader: Record "Warehouse Activity Header")
    begin
        OnPostProdOutput(WhseActivityHeader, TempWhseActivLine, PostedSourceType, PostedSourceSubType, PostedSourceNo);
    end;

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

    local procedure LockPostedTables(WarehouseActivityHeader: Record "Warehouse Activity Header")
    var
        PostedInvtPutAwayHeader: Record "Posted Invt. Put-away Header";
        PostedInvtPutAwayLine: Record "Posted Invt. Put-away Line";
        PostedInvtPickHeader: Record "Posted Invt. Pick Header";
        PostedInvtPickLine: Record "Posted Invt. Pick Line";
    begin
        if WarehouseActivityHeader.Type = WarehouseActivityHeader.Type::"Invt. Put-away" then begin
            PostedInvtPutAwayHeader.LockTable();
            PostedInvtPutAwayLine.LockTable();
        end else begin
            PostedInvtPickHeader.LockTable();
            PostedInvtPickLine.LockTable();
        end;
    end;

    procedure ShowHideDialog(HideDialog2: Boolean)
    begin
        HideDialog := HideDialog2;
    end;

    procedure SetInvoiceSourceDoc(Invoice: Boolean)
    begin
        InvoiceSourceDoc := Invoice;
        OnAfterSetInvoiceSourceDoc(InvoiceSourceDoc);
    end;

    procedure PrintDocument(SetPrint: Boolean)
    begin
        PrintDoc := SetPrint;
    end;

    local procedure CheckItemTracking(WhseActivLine2: Record "Warehouse Activity Line"): Boolean
    var
        WhseItemTrackingSetup: Record "Item Tracking Setup";
        Result: Boolean;
        IsHandled: Boolean;
    begin
        OnBeforeCheckItemTracking(WhseActivLine2, Result, IsHandled, WhseActivHeader);
        if IsHandled then
            exit(Result);

        ItemTrackingMgt.GetWhseItemTrkgSetup(WhseActivLine2."Item No.", WhseItemTrackingSetup);
        WhseActivLine2.TestTrackingIfRequired(WhseItemTrackingSetup);
        if (WhseActivLine2."Expiration Date" <> 0D) and ItemTrackingMgt.StrictExpirationPosting(WhseActivLine2."Item No.") then
            if WhseActivHeader."Posting Date" > WhseActivLine2."Expiration Date" then
                WhseActivLine2.FieldError(WhseActivLine2."Expiration Date", PostingDateErr);

        exit(WhseItemTrackingSetup.TrackingRequired());
    end;

    procedure SetSuppressCommit(NewSuppressCommit: Boolean)
    begin
        SuppressCommit := NewSuppressCommit;
    end;

    procedure SetIsPreview(NewIsPreview: Boolean)
    begin
        IsPreview := NewIsPreview;
    end;

    local procedure CheckWhseItemTrackingAgainstSource()
    var
        TrackingSpecification: Record "Tracking Specification";
        JobPlanningLine: Record "Job Planning Line";
    begin
        TempWarehouseActivityLineForItemTrackingChecking.Reset();
        if TempWarehouseActivityLineForItemTrackingChecking.FindSet() then
            repeat
                case TempWarehouseActivityLineForItemTrackingChecking."Source Type" of
                    5407: // Database::"Prod. Order Component"
                        TrackingSpecification.CheckItemTrackingQuantity(
                            TempWarehouseActivityLineForItemTrackingChecking."Source Type",
                            TempWarehouseActivityLineForItemTrackingChecking."Source Subtype",
                            TempWarehouseActivityLineForItemTrackingChecking."Source No.",
                            TempWarehouseActivityLineForItemTrackingChecking."Source Subline No.",
                            TempWarehouseActivityLineForItemTrackingChecking."Source Line No.",
                            TempWarehouseActivityLineForItemTrackingChecking."Qty. to Handle (Base)",
                            TempWarehouseActivityLineForItemTrackingChecking."Qty. to Handle (Base)", true, InvoiceSourceDoc);
                    Database::Job:
                        begin
                            // Checking tracking specification for Job by mapping Temporary warehouse activity line to Job planning line item tracking.
                            JobPlanningLine.SetLoadFields(Status);
                            JobPlanningLine.SetCurrentKey("Job Contract Entry No.");
                            JobPlanningLine.SetRange("Job Contract Entry No.", TempWarehouseActivityLineForItemTrackingChecking."Source Line No.");
                            JobPlanningLine.FindFirst();
                            TrackingSpecification.CheckItemTrackingQuantity(
                                Database::"Job Planning Line", JobPlanningLine.Status.AsInteger(),
                                TempWarehouseActivityLineForItemTrackingChecking."Source No.",
                                TempWarehouseActivityLineForItemTrackingChecking."Source Line No.",
                                TempWarehouseActivityLineForItemTrackingChecking."Qty. to Handle (Base)",
                                TempWarehouseActivityLineForItemTrackingChecking."Qty. to Handle (Base)", true, InvoiceSourceDoc);
                        end;
                    Database::"Job Planning Line":
                        // New format: Warehouse activity line already uses Job Planning Line source type
                        TrackingSpecification.CheckItemTrackingQuantity(
                            TempWarehouseActivityLineForItemTrackingChecking."Source Type",
                            TempWarehouseActivityLineForItemTrackingChecking."Source Subtype",
                            TempWarehouseActivityLineForItemTrackingChecking."Source No.",
                            TempWarehouseActivityLineForItemTrackingChecking."Source Line No.",
                            TempWarehouseActivityLineForItemTrackingChecking."Qty. to Handle (Base)",
                            TempWarehouseActivityLineForItemTrackingChecking."Qty. to Handle (Base)", true, InvoiceSourceDoc);
                    else
                        TrackingSpecification.CheckItemTrackingQuantity(TempWarehouseActivityLineForItemTrackingChecking."Source Type", TempWarehouseActivityLineForItemTrackingChecking."Source Subtype", TempWarehouseActivityLineForItemTrackingChecking."Source No.", TempWarehouseActivityLineForItemTrackingChecking."Source Line No.", TempWarehouseActivityLineForItemTrackingChecking."Qty. to Handle (Base)", TempWarehouseActivityLineForItemTrackingChecking."Qty. to Handle (Base)", true, InvoiceSourceDoc);
                end;
            until TempWarehouseActivityLineForItemTrackingChecking.Next() = 0;
    end;

    local procedure CheckAvailability(WhseActivLine: Record "Warehouse Activity Line")
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCheckAvailability(WhseActivLine, IsHandled);
        if IsHandled then
            exit;

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

        if WhseActivLine."Assemble to Order" and not WhseActivLine."ATO Component" then
            exit;

        if not WhseActivLine.CheckItemTrackingAvailability() then
            AvailabilityError(WhseActivLine);
    end;

    local procedure AvailabilityError(WhseActivLine: Record "Warehouse Activity Line")
    begin
        if WhseActivLine."Serial No." <> '' then
            Error(InventoryNotAvailableErr, WhseActivLine.FieldCaption("Serial No."), WhseActivLine."Serial No.");
        if WhseActivLine."Lot No." <> '' then
            Error(InventoryNotAvailableErr, WhseActivLine.FieldCaption("Lot No."), WhseActivLine."Lot No.");

        OnAfterAvailabilityError(WhseActivLine);
    end;

    local procedure UpdateAttachedLines(PurchaseLine: Record "Purchase Line")
    var
        PurchasesPayablesSetup: Record "Purchases & Payables Setup";
        AttachedPurchLine: Record "Purchase Line";
    begin
        PurchasesPayablesSetup.Get();
        if PurchasesPayablesSetup."Auto Post Non-Invt. via Whse." <> PurchasesPayablesSetup."Auto Post Non-Invt. via Whse."::"Attached/Assigned" then
            exit;

        AttachedPurchLine.SetRange("Document Type", PurchaseLine."Document Type");
        AttachedPurchLine.SetRange("Document No.", PurchaseLine."Document No.");
        AttachedPurchLine.SetRange("Attached to Line No.", PurchaseLine."Line No.");
        AttachedPurchLine.SetFilter(Type, '<>%1', AttachedPurchLine.Type::"Charge (Item)");
        if AttachedPurchLine.FindSet() then
            repeat
                UpdateQtyToHandleOnPurchaseLine(AttachedPurchLine, AttachedPurchLine."Outstanding Quantity");
            until AttachedPurchLine.Next() = 0;
    end;

    local procedure UpdateAttachedLines(SalesLine: Record "Sales Line")
    var
        SalesReceivablesSetup: Record "Sales & Receivables Setup";
        AttachedSalesLine: Record "Sales Line";
    begin
        SalesReceivablesSetup.Get();
        if SalesReceivablesSetup."Auto Post Non-Invt. via Whse." <> SalesReceivablesSetup."Auto Post Non-Invt. via Whse."::"Attached/Assigned" then
            exit;

        AttachedSalesLine.SetRange("Document Type", SalesLine."Document Type");
        AttachedSalesLine.SetRange("Document No.", SalesLine."Document No.");
        AttachedSalesLine.SetRange("Attached to Line No.", SalesLine."Line No.");
        AttachedSalesLine.SetFilter(Type, '<>%1', AttachedSalesLine.Type::"Charge (Item)");
        if AttachedSalesLine.FindSet() then
            repeat
                UpdateQtyToHandleOnSalesLine(AttachedSalesLine, AttachedSalesLine."Outstanding Quantity");
            until AttachedSalesLine.Next() = 0;
    end;

    local procedure UpdateItemChargeLines()
    var
        PurchasesPayablesSetup: Record "Purchases & Payables Setup";
        SalesReceivablesSetup: Record "Sales & Receivables Setup";
        ItemChargePurchLine: Record "Purchase Line";
        ItemChargeSalesLine: Record "Sales Line";
        ItemChargeAssignmentPurch: Record "Item Charge Assignment (Purch)";
        ItemChargeAssignmentSales: Record "Item Charge Assignment (Sales)";
        QtyToHandle: Decimal;
    begin
        case WhseActivHeader."Source Type" of
            Database::"Purchase Line":
                begin
                    PurchasesPayablesSetup.Get();
                    if PurchasesPayablesSetup."Auto Post Non-Invt. via Whse." <> PurchasesPayablesSetup."Auto Post Non-Invt. via Whse."::"Attached/Assigned" then
                        exit;
                    ItemChargePurchLine.SetRange("Document Type", WhseActivHeader."Source Subtype");
                    ItemChargePurchLine.SetRange("Document No.", WhseActivHeader."Source No.");
                    ItemChargePurchLine.SetRange(Type, ItemChargePurchLine.Type::"Charge (Item)");
                    if not ItemChargePurchLine.FindSet() then
                        exit;
                    repeat
                        QtyToHandle := 0;
                        ItemChargeAssignmentPurch.SetRange("Document Type", ItemChargePurchLine."Document Type");
                        ItemChargeAssignmentPurch.SetRange("Document No.", ItemChargePurchLine."Document No.");
                        ItemChargeAssignmentPurch.SetRange("Document Line No.", ItemChargePurchLine."Line No.");
                        ItemChargeAssignmentPurch.SetRange("Applies-to Doc. Type", ItemChargePurchLine."Document Type");
                        ItemChargeAssignmentPurch.SetRange("Applies-to Doc. No.", ItemChargePurchLine."Document No.");
                        ItemChargeAssignmentPurch.SetFilter("Qty. to Handle", '<>0');
                        if ItemChargeAssignmentPurch.FindSet() then
                            repeat
                                TempWhseActivLine.SetRange("Source Line No.", ItemChargeAssignmentPurch."Applies-to Doc. Line No.");
                                if not TempWhseActivLine.IsEmpty() then
                                    QtyToHandle += ItemChargeAssignmentPurch."Qty. to Handle";
                            until ItemChargeAssignmentPurch.Next() = 0;

                        UpdateQtyToHandleOnPurchaseLine(ItemChargePurchLine, QtyToHandle);
                    until ItemChargePurchLine.Next() = 0;
                end;
            Database::"Sales Line":
                begin
                    SalesReceivablesSetup.Get();
                    if SalesReceivablesSetup."Auto Post Non-Invt. via Whse." <> SalesReceivablesSetup."Auto Post Non-Invt. via Whse."::"Attached/Assigned" then
                        exit;
                    ItemChargeSalesLine.SetRange("Document Type", WhseActivHeader."Source Subtype");
                    ItemChargeSalesLine.SetRange("Document No.", WhseActivHeader."Source No.");
                    ItemChargeSalesLine.SetRange(Type, ItemChargeSalesLine.Type::"Charge (Item)");
                    if not ItemChargeSalesLine.FindSet() then
                        exit;
                    repeat
                        QtyToHandle := 0;
                        ItemChargeAssignmentSales.SetRange("Document Type", ItemChargeSalesLine."Document Type");
                        ItemChargeAssignmentSales.SetRange("Document No.", ItemChargeSalesLine."Document No.");
                        ItemChargeAssignmentSales.SetRange("Document Line No.", ItemChargeSalesLine."Line No.");
                        ItemChargeAssignmentSales.SetRange("Applies-to Doc. Type", ItemChargeSalesLine."Document Type");
                        ItemChargeAssignmentSales.SetRange("Applies-to Doc. No.", ItemChargeSalesLine."Document No.");
                        ItemChargeAssignmentSales.SetFilter("Qty. to Handle", '<>0');
                        if ItemChargeAssignmentSales.FindSet() then
                            repeat
                                TempWhseActivLine.SetRange("Source Line No.", ItemChargeAssignmentSales."Applies-to Doc. Line No.");
                                if not TempWhseActivLine.IsEmpty() then
                                    QtyToHandle += ItemChargeAssignmentSales."Qty. to Handle";
                            until ItemChargeAssignmentSales.Next() = 0;

                        UpdateQtyToHandleOnSalesLine(ItemChargeSalesLine, QtyToHandle);
                    until ItemChargeSalesLine.Next() = 0;
                end;
        end;
    end;

    local procedure UpdateNonInventoryLines()
    var
        PurchasesPayablesSetup: Record "Purchases & Payables Setup";
        SalesReceivablesSetup: Record "Sales & Receivables Setup";
        PurchaseLine: Record "Purchase Line";
        SalesLine: Record "Sales Line";
    begin
        case WhseActivHeader."Source Type" of
            Database::"Purchase Line":
                begin
                    PurchasesPayablesSetup.Get();
                    if PurchasesPayablesSetup."Auto Post Non-Invt. via Whse." <> PurchasesPayablesSetup."Auto Post Non-Invt. via Whse."::All then
                        exit;

                    PurchaseLine.SetRange("Document Type", WhseActivHeader."Source Subtype");
                    PurchaseLine.SetRange("Document No.", WhseActivHeader."Source No.");
                    if PurchaseLine.FindSet() then
                        repeat
                            if not PurchaseLine.IsInventoriableItem() then
                                UpdateQtyToHandleOnPurchaseLine(PurchaseLine, PurchaseLine."Outstanding Quantity");
                        until PurchaseLine.Next() = 0;
                end;
            Database::"Sales Line":
                begin
                    SalesReceivablesSetup.Get();
                    if SalesReceivablesSetup."Auto Post Non-Invt. via Whse." <> PurchasesPayablesSetup."Auto Post Non-Invt. via Whse."::All then
                        exit;

                    SalesLine.SetRange("Document Type", WhseActivHeader."Source Subtype");
                    SalesLine.SetRange("Document No.", WhseActivHeader."Source No.");
                    if SalesLine.FindSet() then
                        repeat
                            if not SalesLine.IsInventoriableItem() then
                                UpdateQtyToHandleOnSalesLine(SalesLine, SalesLine."Outstanding Quantity");
                        until SalesLine.Next() = 0;
                end;
        end;
    end;

    local procedure UpdateQtyToHandleOnPurchaseLine(var PurchaseLine: Record "Purchase Line"; QtyToHandle: Decimal)
    var
        ModifyLine: Boolean;
    begin
        if PurchaseLine."Document Type" = PurchaseLine."Document Type"::Order then begin
            ModifyLine := PurchaseLine."Qty. to Receive" <> QtyToHandle;
            if ModifyLine then
                PurchaseLine.Validate("Qty. to Receive", QtyToHandle);
        end else begin
            ModifyLine := PurchaseLine."Return Qty. to Ship" <> QtyToHandle;
            if ModifyLine then
                PurchaseLine.Validate("Return Qty. to Ship", QtyToHandle);
        end;
        OnUpdateQtyToHandleOnPurchaseLineOnBeforePurchLineModify(PurchaseLine, ModifyLine);
        if ModifyLine then
            ModifyPurchaseLine(PurchaseLine);
    end;

    local procedure UpdateQtyToHandleOnSalesLine(var SalesLine: Record "Sales Line"; QtyToHandle: Decimal)
    var
        ModifyLine: Boolean;
    begin
        if SalesLine."Document Type" = SalesLine."Document Type"::Order then begin
            ModifyLine := SalesLine."Qty. to Ship" <> QtyToHandle;
            if ModifyLine then
                SalesLine.Validate("Qty. to Ship", QtyToHandle);
        end else begin
            ModifyLine := SalesLine."Return Qty. to Receive" <> QtyToHandle;
            if ModifyLine then
                SalesLine.Validate("Return Qty. to Receive", QtyToHandle);
        end;
        OnUpdateQtyToHandleOnSalesLineOnBeforeSalesLineModify(SalesLine, ModifyLine);
        if ModifyLine then
            ModifySalesLine(SalesLine);
    end;

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

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

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

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

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

    [IntegrationEvent(false, false)]
    local procedure OnAfterCreateWhseJnlLine(var WarehouseJournalLine: Record "Warehouse Journal Line"; WarehouseActivityLine: Record "Warehouse Activity Line"; SourceCodeSetup: Record "Source Code Setup")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterReleaseSalesDocument(var SalesHeader: Record "Sales Header"; WarehouseActivityHeader: Record "Warehouse Activity Header"; var ModifyHeader: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSalesLineModify(var SalesLine: Record "Sales Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetInvoiceSourceDoc(var InvoiceSourceDocument: Boolean)
    begin
    end;

#if not CLEAN29
    [IntegrationEvent(false, false)]
    [Obsolete('Use OnAfterPostWhseActivityCompleted instead. This event fires before PostRelatedInboundTransfer completes.', '29.0')]
    local procedure OnAfterPostWhseActivHeader(WhseActivHeader: Record "Warehouse Activity Header"; var PurchaseHeader: Record "Purchase Header"; var SalesHeader: Record "Sales Header"; var TransferHeader: Record "Transfer Header")
    begin
    end;
#endif

    [IntegrationEvent(false, false)]
    local procedure OnAfterPostWhseActivityCompleted(WhseActivHeader: Record "Warehouse Activity Header"; var PurchaseHeader: Record "Purchase Header"; var SalesHeader: Record "Sales Header"; var TransferHeader: Record "Transfer Header"; SuppressCommit: Boolean; IsPreview: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterPostSourceDocument(WarehouseActivityHeader: Record "Warehouse Activity Header"; var PurchaseHeader: Record "Purchase Header"; var SalesHeader: Record "Sales Header"; var TransferHeader: Record "Transfer Header"; PostingReference: Integer; HideDialog: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterPostedInvtPickHeaderInsert(var PostedInvtPickHeader: Record "Posted Invt. Pick Header"; WarehouseActivityHeader: Record "Warehouse Activity Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterPostedInvtPutAwayHeaderInsert(var PostedInvtPutAwayHeader: Record "Posted Invt. Put-Away Header"; WarehouseActivityHeader: Record "Warehouse Activity Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterPostWhseActivityLine(WhseActivHeader: Record "Warehouse Activity Header"; var WhseActivLine: Record "Warehouse Activity Line"; PostedSourceNo: Code[20]; PostedSourceType: Integer; PostedSourceSubType: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforePostedInvtPickLineValidateQuantity(var PostedInvtPickLine: Record "Posted Invt. Pick Line"; WarehouseActivityLine: Record "Warehouse Activity Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterPurchLineModify(var PurchaseLine: Record "Purchase Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterTransLineModify(var TransferLine: Record "Transfer Line")
    begin
    end;

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

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

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

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

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

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

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

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

    [IntegrationEvent(false, false)]
    local procedure OnBeforeGetPostingReference(var PostReference: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeModifyPurchaseHeader(var PurchaseHeader: Record "Purchase Header"; WarehouseActivityHeader: Record "Warehouse Activity Header"; var ModifyHeader: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeModifyPurchaseLine(var PurchaseLine: Record "Purchase Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeModifySalesHeader(var SalesHeader: Record "Sales Header"; WarehouseActivityHeader: Record "Warehouse Activity Header"; var ModifyHeader: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeModifySalesLine(var SalesLine: Record "Sales Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeModifyTransferHeader(var TransferHeader: Record "Transfer Header"; WarehouseActivityHeader: Record "Warehouse Activity Header"; var ModifyHeader: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeModifyTransferLine(var TransferLine: Record "Transfer Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforePostedInvtPickHeaderInsert(var PostedInvtPickHeader: Record "Posted Invt. Pick Header"; WarehouseActivityHeader: Record "Warehouse Activity Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforePostedInvtPickLineInsert(var PostedInvtPickLine: Record "Posted Invt. Pick Line"; WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforePostedInvtPutAwayHeaderInsert(var PostedInvtPutAwayHeader: Record "Posted Invt. Put-away Header"; WarehouseActivityHeader: Record "Warehouse Activity Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforePostedInvtPutAwayLineInsert(var PostedInvtPutAwayLine: Record "Posted Invt. Put-away Line"; WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforePostSourceDocument(var WarehouseActivityHeader: Record "Warehouse Activity Header"; var PostedSourceType: Integer; var PostedSourceNo: Code[20]; var PostedSourceSubType: Integer; HideDialog: Boolean; SuppressCommit: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforePostWhseActivLine(WarehouseActivityHeader: Record "Warehouse Activity Header"; var WarehouseActivityLine: Record "Warehouse Activity Line"; var PostedSourceNo: Code[20]; var PostedSourceType: Integer; var PostedSourceSubType: Integer; var IsHandled: Boolean)
    begin
    end;

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

    [IntegrationEvent(false, false)]
    local procedure OnBeforePostSourceDoc(WhseActivHeader: Record "Warehouse Activity Header"; HideDialog: Boolean; SuppressCommit: Boolean)
    begin
    end;

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

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

    [IntegrationEvent(false, false)]
    local procedure OnBeforeUpdateSourceDocument(var TempWhseActivLine: Record "Warehouse Activity Line" temporary)
    begin
    end;

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

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

    [IntegrationEvent(false, false)]
    local procedure OnBeforeUnhandledTransLineModify(var TransferLine: Record "Transfer Line")
    begin
    end;

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

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

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

    [IntegrationEvent(false, false)]
    local procedure OnInitSourceDocumentOnBeforePurchLineLoopIteration(PurchHeader: Record "Purchase Header"; var PurchLine: Record "Purchase Line"; WhseActivHeader: Record "Warehouse Activity Header"; var IsHandled: Boolean)
    begin
    end;

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

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

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

#if not CLEAN27
    internal procedure RunOnPostConsumptionLineOnAfterCreateItemJnlLine(var ItemJournalLine: Record "Item Journal Line"; ProdOrderLine: Record Microsoft.Manufacturing.Document."Prod. Order Line"; WarehouseActivityLine: Record "Warehouse Activity Line"; SourceCodeSetup: Record "Source Code Setup")
    begin
        OnPostConsumptionLineOnAfterCreateItemJnlLine(ItemJournalLine, ProdOrderLine, WarehouseActivityLine, SourceCodeSetup);
    end;

    [Obsolete('Moved to codeunit MfgWhseActivityPost', '27.0')]
    [IntegrationEvent(false, false)]
    local procedure OnPostConsumptionLineOnAfterCreateItemJnlLine(var ItemJournalLine: Record "Item Journal Line"; ProdOrderLine: Record Microsoft.Manufacturing.Document."Prod. Order Line"; WarehouseActivityLine: Record "Warehouse Activity Line"; SourceCodeSetup: Record "Source Code Setup")
    begin
    end;
#endif

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

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

    [IntegrationEvent(false, false)]
    local procedure OnInitSourceDocumentOnAfterTransferLineLoopIteration(var TransLine: Record "Transfer Line"; TransHeader: Record "Transfer Header"; WhseActivHeader: Record "Warehouse Activity Header"; var ModifyHeader: Boolean)
    begin
    end;

#if not CLEAN27
    internal procedure RunOnPostConsumptionLineOnAfterInitItemJournalLine(var ItemJournalLine: Record "Item Journal Line"; SourceCodeSetup: Record "Source Code Setup")
    begin
        OnPostConsumptionLineOnAfterInitItemJournalLine(ItemJournalLine, SourceCodeSetup);
    end;

    [Obsolete('Moved to codeunit MfgWhseActivityPost', '27.0')]
    [IntegrationEvent(false, false)]
    local procedure OnPostConsumptionLineOnAfterInitItemJournalLine(var ItemJournalLine: Record "Item Journal Line"; SourceCodeSetup: Record "Source Code Setup")
    begin
    end;
#endif

#if not CLEAN27
    internal procedure RunOnPostOutputLineOnAfterCreateItemJnlLine(var ItemJournalLine: Record "Item Journal Line"; ProdOrderLine: Record Microsoft.Manufacturing.Document."Prod. Order Line"; WarehouseActivityLine: Record "Warehouse Activity Line"; SourceCodeSetup: Record "Source Code Setup")
    begin
        OnPostOutputLineOnAfterCreateItemJnlLine(ItemJournalLine, ProdOrderLine, WarehouseActivityLine, SourceCodeSetup);
    end;

    [Obsolete('Moved to codeunit MfgWhseActivityPost', '27.0')]
    [IntegrationEvent(false, false)]
    local procedure OnPostOutputLineOnAfterCreateItemJnlLine(var ItemJournalLine: Record "Item Journal Line"; ProdOrderLine: Record Microsoft.Manufacturing.Document."Prod. Order Line"; WarehouseActivityLine: Record "Warehouse Activity Line"; SourceCodeSetup: Record "Source Code Setup")
    begin
    end;
#endif

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

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

    [IntegrationEvent(false, false)]
    local procedure OnPostSourceDocumentOnBeforeUpdateUnhandledTransLine(var TransHeader: Record "Transfer Header"; WhseActivHeader: Record "Warehouse Activity Header"; PostingReference: Integer; HideDialog: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPostWhseActivityLineOnBeforePosting(var WhseActivityHeader: Record "Warehouse Activity Header"; var WhseActivityLine: Record "Warehouse Activity Line"; var PostedSourceNo: Code[20]; var PostedSourceType: Integer; var PostedSourceSubType: Integer; var IsHandled: Boolean)
    begin
    end;

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

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

    [IntegrationEvent(false, false)]
    local procedure OnReleaseSalesDocumentOnAfterSalesReleaseRun(SalesHeader: Record "Sales Header"; WarehouseActivityHeader: Record "Warehouse Activity Header")
    begin
    end;

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

    [IntegrationEvent(false, false)]
    local procedure OnUpdateSourceDocumentOnAfterGetPurchLine(var PurchaseLine: Record "Purchase Line"; TempWhseActivLine: Record "Warehouse Activity Line" temporary)
    begin
    end;

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

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

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

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

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

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

    [IntegrationEvent(false, false)]
    local procedure OnUpdateSourceDocumentOnAfterGetSalesLine(var SalesLine: Record "Sales Line"; TempWhseActivLine: Record "Warehouse Activity Line" temporary)
    begin
    end;

#if not CLEAN27
    internal procedure RunOnPostOutputLineOnAfterItemJournalLineInit(var ItemJournalLine: Record "Item Journal Line"; SourceCodeSetup2: Record "Source Code Setup")
    begin
        OnPostOutputLineOnAfterItemJournalLineInit(ItemJournalLine, SourceCodeSetup2);
    end;

    [Obsolete('Moved to codeunit MfgWhseActivityPost', '27.0')]
    [IntegrationEvent(false, false)]
    local procedure OnPostOutputLineOnAfterItemJournalLineInit(var ItemJournalLine: Record "Item Journal Line"; SourceCodeSetup: Record "Source Code Setup")
    begin
    end;
#endif

    [IntegrationEvent(false, false)]
    local procedure OnUpdateQtyToHandleOnPurchaseLineOnBeforePurchLineModify(var PurchaseLine: Record "Purchase Line"; var ModifyLine: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnUpdateQtyToHandleOnSalesLineOnBeforeSalesLineModify(var SalesLine: Record "Sales Line"; var ModifyLine: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnUpdateSourceDocumentOnAfterGetTransLine(var TransferLine: Record "Transfer Line"; TempWarehouseActivityLine: Record "Warehouse Activity Line" temporary)
    begin
    end;

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

    [IntegrationEvent(false, false)]
    local procedure OnUpdateSourceDocumentOnSourceDocumentIsPurchaseOrder(var PurchaseLine: Record "Purchase Line"; TempWarehouseActivityLine: Record "Warehouse Activity Line" temporary)
    begin
    end;

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

    [IntegrationEvent(false, false)]
    local procedure OnPostWhseActivityLineOnBeforePostDoc(var TempWarehouseActivityLine: Record "Warehouse Activity Line" temporary; WhseActivHeader: Record "Warehouse Activity Header"; var PostedSourceType: Integer; var PostedSourceSubType: Integer; var PostedSourceNo: Code[20]; var IsHandled: Boolean)
    begin
    end;

#if not CLEAN27
    internal procedure RunOnBeforeCheckProdOrderLine(var ProdOrderLine: Record Microsoft.Manufacturing.Document."Prod. Order Line"; var IsHandled: Boolean)
    begin
        OnBeforeCheckProdOrderLine(ProdOrderLine, IsHandled);
    end;

    [Obsolete('Moved to codeunit MfgWhseActivityPost', '27.0')]
    [IntegrationEvent(false, false)]
    local procedure OnBeforeCheckProdOrderLine(var ProdOrderLine: Record Microsoft.Manufacturing.Document."Prod. Order Line"; var IsHandled: Boolean)
    begin
    end;
#endif

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

    [IntegrationEvent(false, false)]
    local procedure OnPostProdConsumption(var WarehouseActivityHeader: Record "Warehouse Activity Header"; var TempWhseActivLine: Record "Warehouse Activity Line" temporary; var PostedSourceType: Integer; var PostedSourceSubType: Integer; var PostedSourceNo: Code[20])
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPostProdOutput(var WarehouseActivityHeader: Record "Warehouse Activity Header"; var TempWhseActivLine: Record "Warehouse Activity Line" temporary; var PostedSourceType: Integer; var PostedSourceSubType: Integer; var PostedSourceNo: Code[20])
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCreateWhseJnlLineOnSetReferenceDocument(WarehouseActivityLine: Record "Warehouse Activity Line"; var WhseJnlLine: Record "Warehouse Journal Line"; SourceCodeSetup: Record "Source Code Setup")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeConsumeWarehouseEntryForJobPurchase(var TempWarehouseJournalLine: Record "Warehouse Journal Line" temporary; WarehouseActivityLine: Record "Warehouse Activity Line"; var Result: Boolean; var IsHandled: Boolean)
    begin
    end;
}