Codeunit 99000766 Mfg. Whse. Activity Post

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

Events, 7

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Manufacturing/Warehouse/Activity/MfgWhseActivityPost.Codeunit.al265 lines, Copyright (c) Microsoft Corporation. MIT

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

using Microsoft.Foundation.AuditCodes;
using Microsoft.Inventory.Item;
using Microsoft.Inventory.Journal;
using Microsoft.Inventory.Posting;
using Microsoft.Manufacturing.Document;
using Microsoft.Warehouse.Journal;

codeunit 99000766 "Mfg. Whse. Activity Post"
{
#if not CLEAN27
    var
        WhseActivityPost: Codeunit "Whse.-Activity-Post";
#endif

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Whse.-Activity-Post", 'OnPostProdConsumption', '', true, 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])
    var
        ProdOrder: Record "Production Order";
        WhseProductionRelease: Codeunit "Whse.-Production Release";
    begin
        PostConsumption(ProdOrder, WarehouseActivityHeader, TempWhseActivLine, PostedSourceType, PostedSourceSubType, PostedSourceNo);
        WhseProductionRelease.Release(ProdOrder);
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Whse.-Activity-Post", 'OnPostProdOutput', '', true, 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])
    var
        ProdOrder: Record "Production Order";
        WhseOutputProdRelease: Codeunit "Whse.-Output Prod. Release";
    begin
        PostOutput(ProdOrder, WarehouseActivityHeader, TempWhseActivLine, PostedSourceType, PostedSourceSubType, PostedSourceNo);
        WhseOutputProdRelease.Release(ProdOrder);
    end;

    local procedure PostConsumption(var ProdOrder: Record "Production Order"; var WarehouseActivityHeader: Record "Warehouse Activity Header"; var TempWhseActivLine: Record "Warehouse Activity Line" temporary; var PostedSourceType: Integer; var PostedSourceSubType: Integer; var PostedSourceNo: Code[20])
    var
        ProdOrderComp: Record "Prod. Order Component";
    begin
        TempWhseActivLine.Reset();
        TempWhseActivLine.Find('-');
        ProdOrder.Get(TempWhseActivLine."Source Subtype", TempWhseActivLine."Source No.");
        repeat
            ProdOrderComp.Get(TempWhseActivLine."Source Subtype", TempWhseActivLine."Source No.", TempWhseActivLine."Source Line No.", TempWhseActivLine."Source Subline No.");
            PostConsumptionLine(ProdOrder, ProdOrderComp, TempWhseActivLine, WarehouseActivityHeader);
        until TempWhseActivLine.Next() = 0;

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

        OnAfterPostConsumption(ProdOrder, WarehouseActivityHeader, TempWhseActivLine, PostedSourceType, PostedSourceSubType, PostedSourceNo);
    end;

    local procedure PostConsumptionLine(ProdOrder: Record "Production Order"; ProdOrderComp: Record "Prod. Order Component"; var WarehouseActivityLine: Record "Warehouse Activity Line" temporary; var WarehouseActivityHeader: Record "Warehouse Activity Header")
    var
        Item: Record Item;
        ItemJnlLine: Record "Item Journal Line";
        ProdOrderLine: Record "Prod. Order Line";
        SourceCodeSetup: Record "Source Code Setup";
        ItemJnlPostLine: Codeunit "Item Jnl.-Post Line";
        ProdOrderCompReserve: Codeunit "Prod. Order Comp.-Reserve";
    begin
        ProdOrderLine.Get(WarehouseActivityLine."Source Subtype", WarehouseActivityLine."Source No.", WarehouseActivityLine."Source Line No.");
        ItemJnlLine.Init();
        SourceCodeSetup.Get();
        OnPostConsumptionLineOnAfterInitItemJournalLine(ItemJnlLine, SourceCodeSetup);
#if not CLEAN27
        WhseActivityPost.RunOnPostConsumptionLineOnAfterInitItemJournalLine(ItemJnlLine, SourceCodeSetup);
#endif
        ItemJnlLine.Validate("Entry Type", ItemJnlLine."Entry Type"::Consumption);
        ItemJnlLine.Validate("Posting Date", WarehouseActivityHeader."Posting Date");
        ItemJnlLine."Source No." := ProdOrderLine."Item No.";
        ItemJnlLine."Source Type" := ItemJnlLine."Source Type"::Item;
        ItemJnlLine."Document No." := ProdOrder."No.";
        ItemJnlLine.Validate("Order Type", ItemJnlLine."Order Type"::Production);
        ItemJnlLine.Validate("Order No.", ProdOrder."No.");
        ItemJnlLine.Validate("Order Line No.", ProdOrderLine."Line No.");
        ItemJnlLine.Validate("Item No.", WarehouseActivityLine."Item No.");
        if ItemJnlLine."Unit of Measure Code" <> WarehouseActivityLine."Unit of Measure Code" then
            ItemJnlLine.Validate("Unit of Measure Code", WarehouseActivityLine."Unit of Measure Code");
        ItemJnlLine.Validate("Prod. Order Comp. Line No.", ProdOrderComp."Line No.");
        ItemJnlLine."Qty. per Unit of Measure" := WarehouseActivityLine."Qty. per Unit of Measure";
        ItemJnlLine."Qty. Rounding Precision" := WarehouseActivityLine."Qty. Rounding Precision";
        ItemJnlLine."Qty. Rounding Precision (Base)" := WarehouseActivityLine."Qty. Rounding Precision (Base)";
        ItemJnlLine.Description := WarehouseActivityLine.Description;
        if WarehouseActivityLine."Activity Type" = WarehouseActivityLine."Activity Type"::"Invt. Pick" then
            ItemJnlLine.Validate(Quantity, WarehouseActivityLine."Qty. to Handle")
        else
            ItemJnlLine.Validate(Quantity, -WarehouseActivityLine."Qty. to Handle");
        ItemJnlLine.Validate("Unit Cost", ProdOrderComp."Unit Cost");
        ItemJnlLine."Location Code" := WarehouseActivityLine."Location Code";
        ItemJnlLine."Bin Code" := WarehouseActivityLine."Bin Code";
        ItemJnlLine."Variant Code" := WarehouseActivityLine."Variant Code";
        ItemJnlLine."Source Code" := SourceCodeSetup."Consumption Journal";
        ItemJnlLine."Gen. Bus. Posting Group" := ProdOrder."Gen. Bus. Posting Group";
        Item.Get(WarehouseActivityLine."Item No.");
        ItemJnlLine."Gen. Prod. Posting Group" := Item."Gen. Prod. Posting Group";
        OnPostConsumptionLineOnAfterCreateItemJnlLine(ItemJnlLine, ProdOrderLine, WarehouseActivityLine, SourceCodeSetup);
#if not CLEAN27
        WhseActivityPost.RunOnPostConsumptionLineOnAfterCreateItemJnlLine(ItemJnlLine, ProdOrderLine, WarehouseActivityLine, SourceCodeSetup);
#endif
        ProdOrderCompReserve.TransferPOCompToItemJnlLineCheckILE(ProdOrderComp, ItemJnlLine, ItemJnlLine."Quantity (Base)", true);
        ItemJnlPostLine.SetCalledFromInvtPutawayPick(true);
        ItemJnlPostLine.RunWithCheck(ItemJnlLine);
        ProdOrderCompReserve.UpdateItemTrackingAfterPosting(ProdOrderComp);
    end;

    local procedure PostOutput(var ProdOrder: Record "Production Order"; var WarehouseActivityHeader: Record "Warehouse Activity Header"; var TempWhseActivLine: Record "Warehouse Activity Line" temporary; var PostedSourceType: Integer; var PostedSourceSubType: Integer; var PostedSourceNo: Code[20])
    var
        ProdOrderLine: Record "Prod. Order Line";
    begin
        TempWhseActivLine.Reset();
        TempWhseActivLine.Find('-');
        ProdOrder.Get(TempWhseActivLine."Source Subtype", TempWhseActivLine."Source No.");
        repeat
            ProdOrderLine.Get(TempWhseActivLine."Source Subtype", TempWhseActivLine."Source No.", TempWhseActivLine."Source Line No.");
            PostOutputLine(ProdOrder, ProdOrderLine, WarehouseActivityHeader, TempWhseActivLine);
        until TempWhseActivLine.Next() = 0;

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

        OnAfterPostOutput(ProdOrder, WarehouseActivityHeader, TempWhseActivLine, PostedSourceType, PostedSourceSubType, PostedSourceNo);
    end;

    local procedure PostOutputLine(ProdOrder: Record "Production Order"; ProdOrderLine: Record "Prod. Order Line"; var WarehouseActivityHeader: Record "Warehouse Activity Header"; var WarehouseActivityLine: Record "Warehouse Activity Line")
    var
        ItemJnlLine: Record "Item Journal Line";
        SourceCodeSetup: Record "Source Code Setup";
        ItemJnlPostLine: Codeunit "Item Jnl.-Post Line";
        ReservProdOrderLine: Codeunit "Prod. Order Line-Reserve";
    begin
        ItemJnlLine.Init();
        OnPostOutputLineOnAfterItemJournalLineInit(ItemJnlLine, SourceCodeSetup);
#if not CLEAN27
        WhseActivityPost.RunOnPostOutputLineOnAfterItemJournalLineInit(ItemJnlLine, SourceCodeSetup);
#endif
        ItemJnlLine.Validate("Entry Type", ItemJnlLine."Entry Type"::Output);
        ItemJnlLine.Validate("Posting Date", WarehouseActivityHeader."Posting Date");
        ItemJnlLine."Document No." := ProdOrder."No.";
        ItemJnlLine.Validate("Order Type", ItemJnlLine."Order Type"::Production);
        ItemJnlLine.Validate("Order No.", ProdOrder."No.");
        ItemJnlLine.Validate("Order Line No.", ProdOrderLine."Line No.");
        ItemJnlLine.Validate("Routing Reference No.", ProdOrderLine."Routing Reference No.");
        ItemJnlLine.Validate("Routing No.", ProdOrderLine."Routing No.");
        ItemJnlLine.Validate("Item No.", ProdOrderLine."Item No.");
        if ItemJnlLine."Unit of Measure Code" <> WarehouseActivityLine."Unit of Measure Code" then
            ItemJnlLine.Validate("Unit of Measure Code", WarehouseActivityLine."Unit of Measure Code");
        ItemJnlLine."Qty. per Unit of Measure" := WarehouseActivityLine."Qty. per Unit of Measure";
        ItemJnlLine."Qty. Rounding Precision" := WarehouseActivityLine."Qty. Rounding Precision";
        ItemJnlLine."Qty. Rounding Precision (Base)" := WarehouseActivityLine."Qty. Rounding Precision (Base)";
        ItemJnlLine."Location Code" := WarehouseActivityLine."Location Code";
        ItemJnlLine."Bin Code" := WarehouseActivityLine."Bin Code";
        ItemJnlLine."Variant Code" := WarehouseActivityLine."Variant Code";
        ItemJnlLine.Description := WarehouseActivityLine.Description;
        if ProdOrderLine."Routing No." <> '' then
            ItemJnlLine.Validate("Operation No.", CalcLastOperationNo(ProdOrderLine));
        ItemJnlLine.Validate("Output Quantity", WarehouseActivityLine."Qty. to Handle");
        ItemJnlLine."Source Code" := SourceCodeSetup."Output Journal";
        ItemJnlLine."Dimension Set ID" := ProdOrderLine."Dimension Set ID";
        OnPostOutputLineOnAfterCreateItemJnlLine(ItemJnlLine, ProdOrderLine, WarehouseActivityLine, SourceCodeSetup);
#if not CLEAN27
        WhseActivityPost.RunOnPostOutputLineOnAfterCreateItemJnlLine(ItemJnlLine, ProdOrderLine, WarehouseActivityLine, SourceCodeSetup);
#endif
        ReservProdOrderLine.TransferPOLineToItemJnlLine(
          ProdOrderLine, ItemJnlLine, ItemJnlLine."Quantity (Base)");
        ItemJnlPostLine.SetCalledFromInvtPutawayPick(true);
        ItemJnlPostLine.RunWithCheck(ItemJnlLine);
        ReservProdOrderLine.UpdateItemTrackingAfterPosting(ProdOrderLine);
    end;

    local procedure CalcLastOperationNo(ProdOrderLine: Record "Prod. Order Line"): Code[10]
    var
        ProdOrderRtngLine: Record "Prod. Order Routing Line";
    begin
        ProdOrderRtngLine.SetRange(Status, ProdOrderLine.Status);
        ProdOrderRtngLine.SetRange("Prod. Order No.", ProdOrderLine."Prod. Order No.");
        ProdOrderRtngLine.SetRange("Routing Reference No.", ProdOrderLine."Routing Reference No.");
        ProdOrderRtngLine.SetRange("Routing No.", ProdOrderLine."Routing No.");
        if not ProdOrderRtngLine.IsEmpty() then begin
            CheckProdOrderLine(ProdOrderLine);
            ProdOrderRtngLine.SetRange("Next Operation No.", '');
            ProdOrderRtngLine.FindLast();
            exit(ProdOrderRtngLine."Operation No.");
        end;

        exit('');
    end;

    local procedure CheckProdOrderLine(var ProdOrderLine: Record "Prod. Order Line")
    var
        ProdOrderRouteManagement: Codeunit "Prod. Order Route Management";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCheckProdOrderLine(ProdOrderLine, IsHandled);
#if not CLEAN27
        WhseActivityPost.RunOnBeforeCheckProdOrderLine(ProdOrderLine, IsHandled);
#endif
        if IsHandled then
            exit;

        ProdOrderRouteManagement.Check(ProdOrderLine);
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Whse.-Activity-Post", 'OnCreateWhseJnlLineOnSetReferenceDocument', '', true, false)]
    local procedure OnCreateWhseJnlLineOnSetReferenceDocument(WarehouseActivityLine: Record "Warehouse Activity Line"; var WhseJnlLine: Record "Warehouse Journal Line"; SourceCodeSetup: Record "Source Code Setup")
    begin
        case WarehouseActivityLine."Source Document" of
            WarehouseActivityLine."Source Document"::"Prod. Consumption":
                begin
                    WhseJnlLine."Source Code" := SourceCodeSetup."Consumption Journal";
                    WhseJnlLine."Reference Document" := WhseJnlLine."Reference Document"::"Prod.";
                end;
            WarehouseActivityLine."Source Document"::"Prod. Output":
                begin
                    WhseJnlLine."Source Code" := SourceCodeSetup."Output Journal";
                    WhseJnlLine."Reference Document" := WhseJnlLine."Reference Document"::"Prod.";
                end;
        end;
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPostConsumptionLineOnAfterInitItemJournalLine(var ItemJournalLine: Record "Item Journal Line"; SourceCodeSetup: Record "Source Code Setup")
    begin
    end;

    [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;

    [IntegrationEvent(false, false)]
    local procedure OnPostOutputLineOnAfterItemJournalLineInit(var ItemJournalLine: Record "Item Journal Line"; SourceCodeSetup: Record "Source Code Setup")
    begin
    end;

    [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;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCheckProdOrderLine(var ProdOrderLine: Record Microsoft.Manufacturing.Document."Prod. Order Line"; var IsHandled: Boolean)
    begin
    end;

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

    [IntegrationEvent(false, false)]
    local procedure OnAfterPostOutput(var ProductionOrder: Record "Production Order"; var WarehouseActivityHeader: Record "Warehouse Activity Header"; var TempWarehouseActivityLine: Record "Warehouse Activity Line" temporary; PostedSourceType: Integer; PostedSourceSubType: Integer; PostedSourceNo: Code[20])
    begin
    end;
}