Codeunit 939 Asm. Whse.-Activity-Register, source in 29

Source29

src/Layers/W1/BaseApp/Assembly/Warehouse/Activity/AsmWhseActivityRegister.Codeunit.al226 lines, Copyright (c) Microsoft Corporation. MIT

// ------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
// ------------------------------------------------------------------------------------------------
namespace Microsoft.Warehouse.Activity;

using Microsoft.Assembly.Document;
using Microsoft.Inventory.Tracking;
using Microsoft.Warehouse.Request;

codeunit 939 "Asm. Whse.-Activity-Register"
{
#if not CLEAN27
    var
        WhseActivityRegister: Codeunit "Whse.-Activity-Register";
#endif

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Whse.-Activity-Register", 'OnUpdateWhseDocHeaderByWhseDocumentType', '', false, false)]
    local procedure OnUpdateWhseDocHeaderByWhseDocumentType(var WarehouseActivityLine: Record "Warehouse Activity Line")
    var
        AssemblyHeader: Record "Assembly Header";
        WhsePickRequest: Record "Whse. Pick Request";
        ItemTrackingMgt: Codeunit "Item Tracking Management";
    begin
        case WarehouseActivityLine."Whse. Document Type" of
            WarehouseActivityLine."Whse. Document Type"::Assembly:
                if WarehouseActivityLine."Action Type" <> WarehouseActivityLine."Action Type"::Take then begin
                    AssemblyHeader.Get(WarehouseActivityLine."Source Subtype", WarehouseActivityLine."Source No.");
                    if AssemblyHeader.CompletelyPicked() then begin
                        WhsePickRequest.SetRange("Document Type", WhsePickRequest."Document Type"::Assembly);
                        WhsePickRequest.SetRange("Document No.", AssemblyHeader."No.");
                        WhsePickRequest.ModifyAll("Completely Picked", true);
                        ItemTrackingMgt.DeleteWhseItemTrkgLines(
                          Database::"Assembly Line", WarehouseActivityLine."Source Subtype", WarehouseActivityLine."Source No.", '', 0, 0, '', false);
                    end;
                end;
        end;
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Whse.-Activity-Register", 'OnUpdateWhseSourceDocLineByDocumentType', '', false, false)]
    local procedure OnUpdateWhseSourceDocLineByDocumentType(var WarehouseActivityLine: Record "Warehouse Activity Line"; WhseDocType: Enum "Warehouse Activity Document Type")
    begin
        case WhseDocType of
            WarehouseActivityLine."Whse. Document Type"::Assembly:
                if (WarehouseActivityLine."Action Type" <> WarehouseActivityLine."Action Type"::Take) and (WarehouseActivityLine."Breakbulk No." = 0) then
                    UpdateAssemblyLine(WarehouseActivityLine);
        end;
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Whse.-Activity-Register", 'OnAfterUpdateSourceDocumentForInvtMovement', '', false, false)]
    local procedure OnAfterUpdateSourceDocumentForInvtMovement(var WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
        case WarehouseActivityLine."Source Document" of
            WarehouseActivityLine."Source Document"::"Assembly Consumption":
                UpdateAssemblyLine(WarehouseActivityLine);
        end;
    end;

    local procedure UpdateAssemblyLine(WhseActivityLine: Record "Warehouse Activity Line")
    var
        AssemblyLine: Record "Assembly Line";
    begin
        AssemblyLine.Get(WhseActivityLine."Source Subtype", WhseActivityLine."Source No.", WhseActivityLine."Source Line No.");
        AssemblyLine."Qty. Picked (Base)" :=
          AssemblyLine."Qty. Picked (Base)" + WhseActivityLine."Qty. to Handle (Base)";
        if WhseActivityLine."Qty. per Unit of Measure" = AssemblyLine."Qty. per Unit of Measure" then
            AssemblyLine."Qty. Picked" := AssemblyLine."Qty. Picked" + WhseActivityLine."Qty. to Handle"
        else
            AssemblyLine."Qty. Picked" :=
              Round(AssemblyLine."Qty. Picked" + WhseActivityLine."Qty. to Handle (Base)" / WhseActivityLine."Qty. per Unit of Measure");
        OnBeforeAssemblyLineModify(AssemblyLine, WhseActivityLine);
#if not CLEAN27
        WhseActivityRegister.RunOnBeforeAssemblyLineModify(AssemblyLine, WhseActivityLine);
#endif
        AssemblyLine.Modify();
        OnAfterAssemblyLineModify(AssemblyLine);
#if not CLEAN27
        WhseActivityRegister.RunOnAfterAssemblyLineModify(AssemblyLine);
#endif
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterAssemblyLineModify(var AssemblyLine: Record "Assembly Line")
    begin
    end;

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

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Whse.-Activity-Register", 'OnAfterSyncItemTrackingAndReserveSourceDocument', '', false, false)]
    local procedure OnAfterSyncItemTrackingAndReserveSourceDocument(var TempWhseActivLineToReserve: Record "Warehouse Activity Line" temporary; var sender: Codeunit "Whse.-Activity-Register")
    var
        TempReservEntryBeforeSync: Record "Reservation Entry" temporary;
        TempReservEntryAfterSync: Record "Reservation Entry" temporary;
    begin
        case TempWhseActivLineToReserve."Source Document" of
            "Warehouse Activity Source Document"::"Assembly Consumption":
                begin
                    sender.CollectReservEntries(TempReservEntryBeforeSync, TempWhseActivLineToReserve);
                    sender.SyncItemTracking();
                    sender.CollectReservEntries(TempReservEntryAfterSync, TempWhseActivLineToReserve);
                    AutoReserveForAssemblyLine(TempWhseActivLineToReserve, TempReservEntryBeforeSync, TempReservEntryAfterSync);
                end;
        end;
    end;

    local procedure AutoReserveForAssemblyLine(var TempWhseActivLineToReserve: Record "Warehouse Activity Line" temporary; var TempReservEntryBefore: Record "Reservation Entry" temporary; var TempReservEntryAfter: Record "Reservation Entry" temporary)
    var
        AssemblyLine: Record "Assembly Line";
        WhseItemTrackingSetup: Record "Item Tracking Setup";
        ItemTrackingMgt: Codeunit "Item Tracking Management";
        ReservMgt: Codeunit "Reservation Management";
        FullAutoReservation: Boolean;
        IsHandled: Boolean;
        QtyToReserve: Decimal;
        QtyToReserveBase: Decimal;
    begin
        IsHandled := false;
        OnBeforeAutoReserveForAssemblyLine(TempWhseActivLineToReserve, IsHandled);
#if not CLEAN27
        WhseActivityRegister.RunOnBeforeAutoReserveForAssemblyLine(TempWhseActivLineToReserve, IsHandled);
#endif
        if IsHandled then
            exit;

        if TempWhseActivLineToReserve.FindSet() then
            repeat
                ItemTrackingMgt.GetWhseItemTrkgSetup(TempWhseActivLineToReserve."Item No.", WhseItemTrackingSetup);
                if TempWhseActivLineToReserve.HasRequiredTracking(WhseItemTrackingSetup) then begin
                    AssemblyLine.Get(
                      TempWhseActivLineToReserve."Source Subtype", TempWhseActivLineToReserve."Source No.", TempWhseActivLineToReserve."Source Line No.");

                    TempReservEntryBefore.SetSourceFilter(
                      TempWhseActivLineToReserve."Source Type", TempWhseActivLineToReserve."Source Subtype",
                      TempWhseActivLineToReserve."Source No.", TempWhseActivLineToReserve."Source Line No.", true);
                    TempReservEntryBefore.SetTrackingFilterFromWhseActivityLine(TempWhseActivLineToReserve);
                    TempReservEntryBefore.CalcSums(Quantity, "Quantity (Base)");

                    TempReservEntryAfter.CopyFilters(TempReservEntryBefore);
                    TempReservEntryAfter.CalcSums(Quantity, "Quantity (Base)");

                    QtyToReserve :=
                        TempWhseActivLineToReserve."Qty. to Handle" + (TempReservEntryAfter.Quantity - TempReservEntryBefore.Quantity);
                    QtyToReserveBase :=
                        TempWhseActivLineToReserve."Qty. to Handle (Base)" + (TempReservEntryAfter."Quantity (Base)" - TempReservEntryBefore."Quantity (Base)");

                    if not IsAssemblyLineCompletelyReserved(AssemblyLine) and (QtyToReserve > 0) then begin
                        ReservMgt.SetReservSource(AssemblyLine);
                        ReservMgt.SetTrackingFromWhseActivityLine(TempWhseActivLineToReserve);
                        ReservMgt.AutoReserve(FullAutoReservation, '', AssemblyLine."Due Date", QtyToReserve, QtyToReserveBase);
                    end;
                end;
            until TempWhseActivLineToReserve.Next() = 0;
    end;

    local procedure IsAssemblyLineCompletelyReserved(AssemblyLine: Record "Assembly Line"): Boolean
    begin
        AssemblyLine.CalcFields("Reserved Quantity");
        exit(AssemblyLine.Quantity = AssemblyLine."Reserved Quantity");
    end;

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

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Whse.-Activity-Register", 'OnRegisterWhseItemTrkgLineOnSetDueDate', '', false, false)]
    local procedure OnRegisterWhseItemTrkgLineOnSetDueDate(WarehouseActivityLine: Record "Warehouse Activity Line"; var DueDate: Date; var QtyToRegisterBase: Decimal; WhseDocType: Enum "Warehouse Activity Document Type")
    var
        AssemblyLine: Record "Assembly Line";
    begin
        case WhseDocType of
            WarehouseActivityLine."Whse. Document Type"::Assembly:
                begin
                    AssemblyLine.SetLoadFields("Due Date");
                    AssemblyLine.Get(WarehouseActivityLine."Source Subtype", WarehouseActivityLine."Source No.", WarehouseActivityLine."Source Line No.");
                    DueDate := AssemblyLine."Due Date";
                end;
        end;
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Whse.-Activity-Register", 'OnRegisterWhseItemTrkgLineOnAfterSetDueDateForInvtMovement', '', false, false)]
    local procedure OnRegisterWhseItemTrkgLineOnAfterSetDueDateForInvtMovement(WarehouseActivityLine: Record "Warehouse Activity Line"; var DueDate: Date)
    var
        AssemblyLine: Record "Assembly Line";
    begin
        case WarehouseActivityLine."Source Type" of
            Database::"Assembly Line":
                begin
                    AssemblyLine.SetLoadFields("Due Date");
                    AssemblyLine.Get(WarehouseActivityLine."Source Subtype", WarehouseActivityLine."Source No.", WarehouseActivityLine."Source Line No.");
                    DueDate := AssemblyLine."Due Date";
                end;
        end;
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Whse.-Activity-Register", 'OnGetSourceLineBaseQtyByWhseActivityDocumentType', '', false, false)]
    local procedure OnGetSourceLineBaseQtyByWhseActivityDocumentType(var WarehouseActivityLine: Record "Warehouse Activity Line"; var QtyBase: Decimal; WhseDocType: Enum "Warehouse Activity Document Type")
    begin
        case WhseDocType of
            WarehouseActivityLine."Whse. Document Type"::Assembly:
                QtyBase := GetSourceLineBaseQty(WarehouseActivityLine);
        end;
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Whse.-Activity-Register", 'OnGetSourceLineBaseQtyByWhseActivitySourceType', '', false, false)]
    local procedure OnGetSourceLineBaseQtyByWhseActivitySourceType(var WarehouseActivityLine: Record "Warehouse Activity Line"; var QtyBase: Decimal)
    begin
        case WarehouseActivityLine."Source Document" of
            WarehouseActivityLine."Source Document"::"Assembly Consumption":
                QtyBase := GetSourceLineBaseQty(WarehouseActivityLine);
        end;
    end;

    local procedure GetSourceLineBaseQty(var WarehouseActivityLine: Record "Warehouse Activity Line"): Decimal
    var
        AssemblyLine: Record "Assembly Line";
    begin
        if AssemblyLine.Get(WarehouseActivityLine."Source Subtype", WarehouseActivityLine."Source No.", WarehouseActivityLine."Source Line No.") then
            exit(AssemblyLine."Quantity (Base)");

    end;
}