Codeunit 945 Asm. Carry Out Action

App
Base Application
Namespace
Microsoft.Inventory.Requisition
Versions
27-28

Procedures, 5Events, 9

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Assembly/Inventory/Requisition/AsmCarryOutAction.Codeunit.al349 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.Inventory.Requisition;

using Microsoft.Assembly.Document;
using Microsoft.Foundation.Navigate;
using Microsoft.Inventory.BOM;
using Microsoft.Inventory.Item;
using Microsoft.Inventory.Planning;
using Microsoft.Inventory.Tracking;

codeunit 945 "Asm. Carry Out Action"
{
    var
        AssemblyHeaderReserve: Codeunit "Assembly Header-Reserve";
        PlngComponentReserve: Codeunit "Plng. Component-Reserve";
        ReqLineReserve: Codeunit "Req. Line-Reserve";
        ReservationManagement: Codeunit "Reservation Management";
        AsmReservCheckDateConfl: Codeunit "Asm. ReservCheckDateConfl";
#if not CLEAN27
        CarryOutAction: Codeunit "Carry Out Action";
#endif
        PrintOrder: Boolean;
        CouldNotChangeSupplyTxt: Label 'The supply type could not be changed in order %1, order line %2.', Comment = '%1 - Production Order No. or Assembly Header No. or Purchase Header No., %2 - Production Order Line or Assembly Line No. or Purchase Line No.';

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Carry Out Action", 'OnTrySourceTypeForAssembly', '', false, false)]
    local procedure OnTrySourceType(var RequisitionLine: Record "Requisition Line"; TryChoice: Option; var AssemblyExist: Boolean; var TempDocumentEntry: Record "Document Entry" temporary)
    begin
        AssemblyExist := CarryOutActionsFromAssemblyOrder(RequisitionLine, Enum::"Planning Create Assembly Order".FromInteger(TryChoice), TempDocumentEntry);
    end;

    internal procedure CarryOutActionsFromAssemblyOrder(RequisitionLine: Record "Requisition Line"; AsmOrderChoice: Enum "Planning Create Assembly Order"; var TempDocumentEntry: Record "Document Entry" temporary): Boolean
    var
        AssemblyHeader: Record Microsoft.Assembly.Document."Assembly Header";
    begin
        PrintOrder := AsmOrderChoice = AsmOrderChoice::"Make Assembly Orders & Print";
        OnCarryOutActionsFromAssemblyOrderOnAfterCalcPrintOrder(PrintOrder, AsmOrderChoice);
#if not CLEAN27
        CarryOutAction.RunOnCarryOutActionsFromAssemblyOrderOnAfterCalcPrintOrder(PrintOrder, AsmOrderChoice);
#endif
        case RequisitionLine."Action Message" of
            RequisitionLine."Action Message"::New:
                InsertAsmHeader(RequisitionLine, AssemblyHeader, TempDocumentEntry);
            RequisitionLine."Action Message"::"Change Qty.",
          RequisitionLine."Action Message"::Reschedule,
          RequisitionLine."Action Message"::"Resched. & Chg. Qty.":
                exit(AsmOrderChgAndReshedule(RequisitionLine));
            RequisitionLine."Action Message"::Cancel:
                DeleteAssemblyOrderLines(RequisitionLine);
        end;
        exit(true);
    end;

    internal procedure InsertAsmHeader(RequisitionLine: Record "Requisition Line"; var AssemblyHeader: Record "Assembly Header"; var TempDocumentEntry: Record "Document Entry" temporary)
    var
        Item: Record Item;
    begin
        Item.Get(RequisitionLine."No.");
        AssemblyHeader.Init();
        AssemblyHeader."Document Type" := AssemblyHeader."Document Type"::Order;
        OnInsertAsmHeaderOnBeforeAsmHeaderInsert(AssemblyHeader, RequisitionLine);
#if not CLEAN27
        CarryOutAction.RunOnInsertAsmHeaderOnBeforeAsmHeaderInsert(AssemblyHeader, RequisitionLine);
#endif        
        AssemblyHeader.Insert(true);
        OnInsertAsmHeaderOnAfterAsmHeaderInsert(AssemblyHeader, RequisitionLine);
#if not CLEAN27
        CarryOutAction.RunOnInsertAsmHeaderOnAfterAsmHeaderInsert(AssemblyHeader, RequisitionLine);
#endif
        AssemblyHeader.SetWarningsOff();
        AssemblyHeader.Validate("Item No.", RequisitionLine."No.");
        AssemblyHeader.Validate("Unit of Measure Code", RequisitionLine."Unit of Measure Code");
        AssemblyHeader.Description := RequisitionLine.Description;
        AssemblyHeader."Description 2" := RequisitionLine."Description 2";
        AssemblyHeader."Variant Code" := RequisitionLine."Variant Code";
        AssemblyHeader."Location Code" := RequisitionLine."Location Code";
        AssemblyHeader."Inventory Posting Group" := Item."Inventory Posting Group";
        AssemblyHeader."Due Date" := RequisitionLine."Due Date";
        AssemblyHeader."Starting Date" := RequisitionLine."Starting Date";
        AssemblyHeader."Ending Date" := RequisitionLine."Ending Date";

        AssemblyHeader.Quantity := RequisitionLine.Quantity;
        AssemblyHeader."Quantity (Base)" := RequisitionLine."Quantity (Base)";
        AssemblyHeader.InitRemainingQty();
        AssemblyHeader.InitQtyToAssemble();
        AssemblyHeader.Validate("Unit Cost", RequisitionLine."Unit Cost");
        if RequisitionLine."Bin Code" <> '' then
            AssemblyHeader."Bin Code" := RequisitionLine."Bin Code"
        else
            AssemblyHeader.GetDefaultBin();

        AssemblyHeader."Planning Flexibility" := RequisitionLine."Planning Flexibility";
        AssemblyHeader."Shortcut Dimension 1 Code" := RequisitionLine."Shortcut Dimension 1 Code";
        AssemblyHeader."Shortcut Dimension 2 Code" := RequisitionLine."Shortcut Dimension 2 Code";
        AssemblyHeader."Dimension Set ID" := RequisitionLine."Dimension Set ID";
        AssemblyHeaderReserve.TransferPlanningLineToAsmHdr(RequisitionLine, AssemblyHeader, RequisitionLine."Net Quantity (Base)", false);
        if RequisitionLine.Reserve then
            ReserveBindingOrderToAsm(AssemblyHeader, RequisitionLine);
        AssemblyHeader.Modify();

        TransferAsmPlanningComp(RequisitionLine, AssemblyHeader);

        AddResourceComponents(RequisitionLine, AssemblyHeader);

        OnAfterInsertAsmHeader(RequisitionLine, AssemblyHeader);
#if not CLEAN27
        CarryOutAction.RunOnAfterInsertAsmHeader(RequisitionLine, AssemblyHeader);
#endif
        if PrintOrder then
            CollectAsmOrderForPrinting(AssemblyHeader);

        TempDocumentEntry.Init();
        TempDocumentEntry."Table ID" := Database::Microsoft.Assembly.Document."Assembly Header";
        TempDocumentEntry."Document Type" := AssemblyHeader."Document Type"::Order;
        TempDocumentEntry."Document No." := AssemblyHeader."No.";
        TempDocumentEntry."Entry No." := TempDocumentEntry.Count + 1;
        TempDocumentEntry.Insert();
    end;

    internal procedure AsmOrderChgAndReshedule(RequisitionLine: Record "Requisition Line"): Boolean
    var
        AssemblyHeader: Record Microsoft.Assembly.Document."Assembly Header";
        PlanningComponent: Record "Planning Component";
        AssemblyLine: Record Microsoft.Assembly.Document."Assembly Line";
        AssemblyLineReserve: Codeunit Microsoft.Assembly.Document."Assembly Line-Reserve";
    begin
        RequisitionLine.TestField("Ref. Order Type", RequisitionLine."Ref. Order Type"::Assembly);
        AssemblyHeader.LockTable();
        if AssemblyHeader.Get(AssemblyHeader."Document Type"::Order, RequisitionLine."Ref. Order No.") then begin
            AssemblyHeader.SetWarningsOff();
            AssemblyHeader.Validate(Quantity, RequisitionLine.Quantity);
            AssemblyHeader.Validate("Planning Flexibility", RequisitionLine."Planning Flexibility");
            AssemblyHeader.Validate("Due Date", RequisitionLine."Due Date");
            OnAsmOrderChgAndResheduleOnBeforeAsmHeaderModify(RequisitionLine, AssemblyHeader);
#if not CLEAN27
            CarryOutAction.RunOnAsmOrderChgAndResheduleOnBeforeAsmHeaderModify(RequisitionLine, AssemblyHeader);
#endif
            AssemblyHeader.Modify(true);
            AssemblyHeaderReserve.TransferPlanningLineToAsmHdr(RequisitionLine, AssemblyHeader, 0, true);
            ReqLineReserve.UpdateDerivedTracking(RequisitionLine);
            ReservationManagement.SetReservSource(AssemblyHeader);
            ReservationManagement.DeleteReservEntries(false, AssemblyHeader."Remaining Quantity (Base)");
            ReservationManagement.ClearSurplus();
            ReservationManagement.AutoTrack(AssemblyHeader."Remaining Quantity (Base)");

            PlanningComponent.SetRange("Worksheet Template Name", RequisitionLine."Worksheet Template Name");
            PlanningComponent.SetRange("Worksheet Batch Name", RequisitionLine."Journal Batch Name");
            PlanningComponent.SetRange("Worksheet Line No.", RequisitionLine."Line No.");
            if PlanningComponent.Find('-') then
                repeat
                    if AssemblyLine.Get(AssemblyHeader."Document Type", AssemblyHeader."No.", PlanningComponent."Line No.") then begin
                        AssemblyLineReserve.TransferPlanningCompToAsmLine(PlanningComponent, AssemblyLine, 0, true);
                        PlngComponentReserve.UpdateDerivedTracking(PlanningComponent);
                        ReservationManagement.SetReservSource(AssemblyLine);
                        ReservationManagement.DeleteReservEntries(false, AssemblyLine."Remaining Quantity (Base)");
                        ReservationManagement.ClearSurplus();
                        ReservationManagement.AutoTrack(AssemblyLine."Remaining Quantity (Base)");
                        AsmReservCheckDateConfl.AssemblyLineCheck(AssemblyLine, false);
                    end else
                        PlanningComponent.Delete(true);
                until PlanningComponent.Next() = 0;

            if PrintOrder then
                CollectAsmOrderForPrinting(AssemblyHeader);
        end else begin
            Message(StrSubstNo(CouldNotChangeSupplyTxt, RequisitionLine."Ref. Order No.", RequisitionLine."Ref. Line No."));
            exit(false);
        end;
        exit(true);
    end;

    local procedure CollectAsmOrderForPrinting(var AssemblyHeader: Record Microsoft.Assembly.Document."Assembly Header")
    begin
        OnCollectAsmOrderForPrinting(AssemblyHeader);
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCollectAsmOrderForPrinting(var AssemblyHeader: Record Microsoft.Assembly.Document."Assembly Header")
    begin
    end;

    internal procedure TransferAsmPlanningComp(RequisitionLine: Record "Requisition Line"; AssemblyHeader: Record Microsoft.Assembly.Document."Assembly Header")
    var
        AssemblyLine: Record "Assembly Line";
        PlanningComponent: Record "Planning Component";
        AssemblyLineReserve: Codeunit "Assembly Line-Reserve";
    begin
        PlanningComponent.SetRange("Worksheet Template Name", RequisitionLine."Worksheet Template Name");
        PlanningComponent.SetRange("Worksheet Batch Name", RequisitionLine."Journal Batch Name");
        PlanningComponent.SetRange("Worksheet Line No.", RequisitionLine."Line No.");
        if PlanningComponent.Find('-') then
            repeat
                AssemblyLine.Init();
                AssemblyLine."Document Type" := AssemblyHeader."Document Type";
                AssemblyLine."Document No." := AssemblyHeader."No.";
                AssemblyLine."Line No." := PlanningComponent."Line No.";
                AssemblyLine.Type := AssemblyLine.Type::Item;
                AssemblyLine."Dimension Set ID" := PlanningComponent."Dimension Set ID";
                AssemblyLine.Validate("No.", PlanningComponent."Item No.");
                AssemblyLine.Description := PlanningComponent.Description;
                AssemblyLine."Unit of Measure Code" := PlanningComponent."Unit of Measure Code";
                AssemblyLine."Qty. Rounding Precision" := PlanningComponent."Qty. Rounding Precision";
                AssemblyLine."Qty. Rounding Precision (Base)" := PlanningComponent."Qty. Rounding Precision (Base)";
                AssemblyLine."Lead-Time Offset" := PlanningComponent."Lead-Time Offset";
                AssemblyLine.Position := PlanningComponent.Position;
                AssemblyLine."Position 2" := PlanningComponent."Position 2";
                AssemblyLine."Position 3" := PlanningComponent."Position 3";
                AssemblyLine."Variant Code" := PlanningComponent."Variant Code";
                AssemblyLine."Location Code" := PlanningComponent."Location Code";

                AssemblyLine."Quantity per" := PlanningComponent."Quantity per";
                AssemblyLine."Qty. per Unit of Measure" := PlanningComponent."Qty. per Unit of Measure";
                AssemblyLine.Quantity := PlanningComponent."Expected Quantity";
                AssemblyLine."Quantity (Base)" := PlanningComponent."Expected Quantity (Base)";
                AssemblyLine.InitRemainingQty();
                AssemblyLine.InitQtyToConsume();
                if PlanningComponent."Bin Code" <> '' then
                    AssemblyLine."Bin Code" := PlanningComponent."Bin Code"
                else
                    AssemblyLine.GetDefaultBin();

                AssemblyLine."Due Date" := PlanningComponent."Due Date";
                AssemblyLine."Unit Cost" := PlanningComponent."Unit Cost";
                AssemblyLine."Variant Code" := PlanningComponent."Variant Code";
                AssemblyLine."Cost Amount" := PlanningComponent."Cost Amount";

                AssemblyLine."Shortcut Dimension 1 Code" := PlanningComponent."Shortcut Dimension 1 Code";
                AssemblyLine."Shortcut Dimension 2 Code" := PlanningComponent."Shortcut Dimension 2 Code";

                OnAfterTransferAsmPlanningComp(PlanningComponent, AssemblyLine);
#if not CLEAN27
                CarryOutAction.RunOnAfterTransferAsmPlanningComp(PlanningComponent, AssemblyLine);
#endif
                AssemblyLine.Insert();

                AssemblyLineReserve.TransferPlanningCompToAsmLine(PlanningComponent, AssemblyLine, 0, true);
                AssemblyLine.AutoReserve();
                ReservationManagement.SetReservSource(AssemblyLine);
                ReservationManagement.AutoTrack(AssemblyLine."Remaining Quantity (Base)");
            until PlanningComponent.Next() = 0;
    end;

    internal procedure ReserveBindingOrderToAsm(var AssemblyHeader: Record "Assembly Header"; var RequisitionLine: Record "Requisition Line")
    var
        TrackingSpecification: Record "Tracking Specification";
        ReservQty: Decimal;
        ReservQtyBase: Decimal;
    begin
        AssemblyHeader.CalcFields("Reserved Quantity", "Reserved Qty. (Base)");
        if AssemblyHeader."Remaining Quantity (Base)" - AssemblyHeader."Reserved Qty. (Base)" >
           RequisitionLine."Demand Quantity (Base)"
        then begin
            ReservQty := RequisitionLine."Demand Quantity";
            ReservQtyBase := RequisitionLine."Demand Quantity (Base)";
        end else begin
            ReservQty := AssemblyHeader."Remaining Quantity" - AssemblyHeader."Reserved Quantity";
            ReservQtyBase := AssemblyHeader."Remaining Quantity (Base)" - AssemblyHeader."Reserved Qty. (Base)";
        end;

        TrackingSpecification.InitTrackingSpecification(
            Database::Microsoft.Assembly.Document."Assembly Header", AssemblyHeader."Document Type".AsInteger(), AssemblyHeader."No.", '', 0, 0,
            AssemblyHeader."Variant Code", AssemblyHeader."Location Code", AssemblyHeader."Qty. per Unit of Measure");

        RequisitionLine.ReserveBindingOrder(
            TrackingSpecification, AssemblyHeader.Description, AssemblyHeader."Due Date", ReservQty, ReservQtyBase, true);

        AssemblyHeader.Modify();
    end;

    local procedure AddResourceComponents(RequisitionLine: Record "Requisition Line"; var AssemblyHeader: Record Microsoft.Assembly.Document."Assembly Header")
    var
        BOMComponent: Record "BOM Component";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeAddResourceComponents(RequisitionLine, AssemblyHeader, IsHandled);
#if not CLEAN27
        CarryOutAction.RunOnBeforeAddResourceComponents(RequisitionLine, AssemblyHeader, IsHandled);
#endif
        if IsHandled then
            exit;

        BOMComponent.SetRange("Parent Item No.", RequisitionLine."No.");
        BOMComponent.SetRange(Type, BOMComponent.Type::Resource);
        if BOMComponent.Find('-') then
            repeat
                AssemblyHeader.AddBOMLine(BOMComponent);
            until BOMComponent.Next() = 0;
    end;

    local procedure DeleteAssemblyOrderLines(RequisitionLine: Record "Requisition Line")
    var
        AssemblyHeader: Record Microsoft.Assembly.Document."Assembly Header";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeDeleteAssemblyLines(RequisitionLine, IsHandled);
#if not CLEAN27
        CarryOutAction.RunOnBeforeDeleteAssemblyLines(RequisitionLine, IsHandled);
#endif
        if IsHandled then
            exit;

        AssemblyHeader.Get(AssemblyHeader."Document Type"::Order, RequisitionLine."Ref. Order No.");
        AssemblyHeader.Delete(true);
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCarryOutActionsFromAssemblyOrderOnAfterCalcPrintOrder(var PrintOrder: Boolean; AsmOrderChoice: Enum "Planning Create Assembly Order")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeDeleteAssemblyLines(RequisitionLine: Record "Requisition Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnInsertAsmHeaderOnBeforeAsmHeaderInsert(var AsmHeader: Record Microsoft.Assembly.Document."Assembly Header"; ReqLine: Record "Requisition Line");
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnInsertAsmHeaderOnAfterAsmHeaderInsert(var AsmHeader: Record Microsoft.Assembly.Document."Assembly Header"; ReqLine: Record "Requisition Line");
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterInsertAsmHeader(var ReqLine: Record "Requisition Line"; var AsmHeader: Record Microsoft.Assembly.Document."Assembly Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAsmOrderChgAndResheduleOnBeforeAsmHeaderModify(var ReqLine: Record "Requisition Line"; var AssemblyHeader: Record Microsoft.Assembly.Document."Assembly Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterTransferAsmPlanningComp(var PlanningComponent: Record "Planning Component"; var AssemblyLine: Record Microsoft.Assembly.Document."Assembly Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeAddResourceComponents(RequisitionLine: Record "Requisition Line"; var AssemblyHeader: Record Microsoft.Assembly.Document."Assembly Header"; var IsHandled: Boolean)
    begin
    end;
}