Codeunit 927 Assembly Header Invt. Profile, source in 29

Source29

src/Layers/W1/BaseApp/Assembly/Document/AssemblyHeaderInvtProfile.Codeunit.al158 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.Assembly.Document;

using Microsoft.Inventory.Item;
using Microsoft.Inventory.Location;
using Microsoft.Inventory.Planning;
using Microsoft.Inventory.Requisition;
using Microsoft.Inventory.Tracking;

codeunit 927 "Assembly Header Invt. Profile"
{
    var
#pragma warning disable AA0470 
        AcceptMessageTxt: Label '%1: The %2 of %3 %4 is %5.';
#pragma warning restore AA0470 

    // Inventory Profile

    procedure TransferInventoryProfileFromAssemblyHeader(var InventoryProfile: Record "Inventory Profile"; var AssemblyHeader: Record "Assembly Header"; var TrackingReservationEntry: Record "Reservation Entry")
    var
        ReservationEntry: Record "Reservation Entry";
        AutoReservedQty: Decimal;
    begin
        InventoryProfile.SetSource(
            Database::"Assembly Header", AssemblyHeader."Document Type".AsInteger(), AssemblyHeader."No.", 0, '', 0);
        InventoryProfile."Item No." := AssemblyHeader."Item No.";
        InventoryProfile."Variant Code" := AssemblyHeader."Variant Code";
        InventoryProfile."Location Code" := AssemblyHeader."Location Code";
        InventoryProfile."Bin Code" := AssemblyHeader."Bin Code";
        AssemblyHeader.SetReservationFilters(ReservationEntry);
        AutoReservedQty := InventoryProfile.TransferBindings(ReservationEntry, TrackingReservationEntry);
        AssemblyHeader.CalcFields("Reserved Qty. (Base)");
        InventoryProfile."Untracked Quantity" := AssemblyHeader."Remaining Quantity (Base)" - AssemblyHeader."Reserved Qty. (Base)" + AutoReservedQty;
        InventoryProfile."Min. Quantity" := AssemblyHeader."Reserved Qty. (Base)" - AutoReservedQty;
        InventoryProfile.Quantity := AssemblyHeader.Quantity;
        InventoryProfile."Remaining Quantity" := AssemblyHeader."Remaining Quantity";
        InventoryProfile."Finished Quantity" := AssemblyHeader."Assembled Quantity";
        InventoryProfile."Quantity (Base)" := AssemblyHeader."Quantity (Base)";
        InventoryProfile."Remaining Quantity (Base)" := AssemblyHeader."Remaining Quantity (Base)";
        InventoryProfile."Unit of Measure Code" := AssemblyHeader."Unit of Measure Code";
        InventoryProfile."Qty. per Unit of Measure" := AssemblyHeader."Qty. per Unit of Measure";
        InventoryProfile."Planning Flexibility" := AssemblyHeader."Planning Flexibility";
        InventoryProfile.IsSupply := InventoryProfile."Untracked Quantity" >= 0;
        InventoryProfile."Due Date" := AssemblyHeader."Due Date";

        OnAfterTransferInventoryProfileFromAssemblyHeader(InventoryProfile, AssemblyHeader);
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterTransferInventoryProfileFromAssemblyHeader(var InventoryProfile: Record "Inventory Profile"; AssemblyHeader: Record "Assembly Header")
    begin
    end;

    [EventSubscriber(ObjectType::Table, Database::"Inventory Profile", 'OnTransferToTrackingEntrySourceTypeElseCase', '', false, false)]
    local procedure OnTransferToTrackingEntrySourceTypeElseCase(var InventoryProfile: Record "Inventory Profile"; var ReservationEntry: Record "Reservation Entry"; var IsHandled: Boolean)
    begin
        if InventoryProfile."Source Type" = Database::"Assembly Header" then begin
            ReservationEntry.SetSource(
                Database::"Assembly Header", InventoryProfile."Source Order Status", InventoryProfile."Source ID", InventoryProfile."Source Ref. No.", '', 0);
            IsHandled := true;
        end;
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Inventory Profile Offsetting", 'OnAfterSetSupplyPriority', '', false, false)]
    local procedure OnAfterSetSupplyPriority(var InventoryProfile: Record "Inventory Profile")
    begin
        if InventoryProfile."Source Type" = Database::"Assembly Header" then
            InventoryProfile."Order Priority" := 320;
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Inventory Profile Offsetting", 'OnAfterSupplyToInvProfile', '', false, false)]
    local procedure OnAfterSupplyToInvProfile(var InventoryProfile: Record "Inventory Profile"; var Item: Record Item; var ReservEntry: Record "Reservation Entry"; var NextLineNo: Integer; var ToDate: Date)
    begin
        TransAssemblyHeaderToProfile(InventoryProfile, Item, ToDate, ReservEntry, NextLineNo);
    end;

    local procedure TransAssemblyHeaderToProfile(var InventoryProfile: Record "Inventory Profile"; var Item: Record Item; ToDate: Date; var TempReservationEntry: Record "Reservation Entry"; var NextLineNo: Integer)
    var
        AssemblyHeader: Record "Assembly Header";
    begin
        if AssemblyHeader.FindItemToPlanLines(Item, AssemblyHeader."Document Type"::Order) then
            repeat
                if AssemblyHeader."Due Date" <> 0D then begin
                    InventoryProfile.Init();
                    NextLineNo += 1;
                    InventoryProfile."Line No." := NextLineNo;
                    TransferInventoryProfileFromAssemblyHeader(InventoryProfile, AssemblyHeader, TempReservationEntry);
                    if InventoryProfile."Finished Quantity" > 0 then
                        InventoryProfile."Planning Flexibility" := InventoryProfile."Planning Flexibility"::None;
                    InventoryProfile.InsertSupplyInvtProfile(ToDate);
                end;
            until AssemblyHeader.Next() = 0;
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Inventory Profile Offsetting", 'OnSetAcceptActionOnBeforeAcceptActionMsg', '', false, false)]
    local procedure OnSetAcceptActionOnBeforeAcceptActionMsg(var RequisitionLine: Record "Requisition Line"; var AcceptActionMsg: Boolean; var PlanningTransparency: Codeunit "Planning Transparency")
    var
        AssemblyHeader: Record "Assembly Header";
        DummyInventoryProfileTrackBuffer: Record "Inventory Profile Track Buffer";
    begin
        if RequisitionLine."Action Message" <> RequisitionLine."Action Message"::New then
            case RequisitionLine."Ref. Order Type" of
                RequisitionLine."Ref. Order Type"::Assembly:
                    if AssemblyHeader.Get(RequisitionLine."Ref. Order Status", RequisitionLine."Ref. Order No.") and
                        (AssemblyHeader.Status = AssemblyHeader.Status::Released)
                    then begin
                        AcceptActionMsg := false;
                        PlanningTransparency.LogWarning(
                            0, RequisitionLine, DummyInventoryProfileTrackBuffer."Warning Level",
                            StrSubstNo(
                                AcceptMessageTxt, DummyInventoryProfileTrackBuffer."Warning Level", AssemblyHeader.FieldCaption(Status),
                                RequisitionLine."Ref. Order Type", RequisitionLine."Ref. Order No.", AssemblyHeader.Status));
                    end;
            end;
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Inventory Profile Offsetting", 'OnAfterInitSupply', '', false, false)]
    local procedure OnAfterInitSupply(var InventoryProfile: Record "Inventory Profile"; var StockkeepingUnit: Record "Stockkeeping Unit")
    begin
        case StockkeepingUnit."Replenishment System" of
            StockkeepingUnit."Replenishment System"::Assembly:
                InventoryProfile."Source Type" := Database::"Assembly Header";
        end;
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Inventory Profile Offsetting", 'OnMaintainPlanningLineOnBeforeValidateNo', '', false, false)]
    local procedure OnMaintainPlanningLineOnBeforeValidateNo(var RequisitionLine: Record "Requisition Line"; StockkeepingUnit: Record "Stockkeeping Unit")
    begin
        case StockkeepingUnit."Replenishment System" of
            StockkeepingUnit."Replenishment System"::Assembly:
                RequisitionLine."Ref. Order Type" := RequisitionLine."Ref. Order Type"::Assembly;
        end;
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Inventory Profile Offsetting", 'OnMaintainPlanningLineOnAfterSetSourceForNotNewReqLine', '', false, false)]
    local procedure OnMaintainPlanningLineOnAfterSetSourceForNotNewReqLine(var RequisitionLine: Record "Requisition Line"; var InventoryProfile: Record "Inventory Profile")
    begin
        case InventoryProfile."Source Type" of
            Database::"Assembly Header":
                SetAssembly(RequisitionLine, InventoryProfile);
        end;
    end;

    local procedure SetAssembly(var RequisitionLine: Record "Requisition Line"; var InventoryProfile: Record "Inventory Profile")
    var
        AssemblyHeader: Record "Assembly Header";
    begin
        RequisitionLine."Ref. Order Type" := RequisitionLine."Ref. Order Type"::Assembly;
        RequisitionLine."Ref. Order No." := InventoryProfile."Source ID";
        RequisitionLine."Ref. Line No." := 0;
        AssemblyHeader.Get("Assembly Document Type"::Order, RequisitionLine."Ref. Order No.");
        RequisitionLine.TransferFromAsmHeader(AssemblyHeader);
    end;

}