Codeunit 99000866 Mfg. Requisition Line
- App
- Base Application
- Namespace
- Microsoft.Inventory.Requisition
- Versions
- 26-28
Versions171819202122232425262728
Source29
Source in 29
src/Layers/W1/BaseApp/Manufacturing/Inventory/Requisition/MfgRequisitionLine.Codeunit.al351 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.Inventory.Item;
using Microsoft.Inventory.Location;
using Microsoft.Inventory.Tracking;
using Microsoft.Manufacturing.Document;
using Microsoft.Manufacturing.Routing;
using Microsoft.Manufacturing.Setup;
using Microsoft.Purchases.Document;
codeunit 99000866 "Mfg. Requisition Line"
{
var
NoProductionOrderErr: Label 'There is no Production. Order for this line.';
[EventSubscriber(ObjectType::Table, Database::"Requisition Line", 'OnGetDimFromRefOrderLineElseCase', '', true, false)]
local procedure OnGetDimFromRefOrderLineElseCase(var RequisitionLine: Record "Requisition Line"; var DimSetIDArr: array[10] of Integer; i: Integer)
var
ProdOrderLine: Record "Prod. Order Line";
begin
case RequisitionLine."Ref. Order Type" of
RequisitionLine."Ref. Order Type"::"Prod. Order":
if ProdOrderLine.Get(RequisitionLine."Ref. Order Status", RequisitionLine."Ref. Order No.", RequisitionLine."Ref. Line No.") then
DimSetIDArr[i] := ProdOrderLine."Dimension Set ID";
end;
end;
[EventSubscriber(ObjectType::Table, Database::"Requisition Line", 'OnLookupRefOrderNoElseCase', '', true, false)]
local procedure OnLookupRefOrderNoElseCase(var RequisitionLine: Record "Requisition Line"; var IsHandled: Boolean)
var
ProdOrder: Record "Production Order";
begin
case RequisitionLine."Ref. Order Type" of
RequisitionLine."Ref. Order Type"::"Prod. Order":
begin
if ProdOrder.Get(RequisitionLine."Ref. Order Status", RequisitionLine."Ref. Order No.") then
case ProdOrder.Status of
ProdOrder.Status::Planned:
PAGE.Run(PAGE::"Planned Production Order", ProdOrder);
ProdOrder.Status::"Firm Planned":
PAGE.Run(PAGE::"Firm Planned Prod. Order", ProdOrder);
ProdOrder.Status::Released:
PAGE.Run(PAGE::"Released Production Order", ProdOrder);
end
else
Message(NoProductionOrderErr);
IsHandled := true;
end;
end;
end;
[EventSubscriber(ObjectType::Table, Database::"Requisition Line", 'OnCleanProdBOMNo', '', true, false)]
local procedure OnCleanProdBOMNo(var RequisitionLine: Record "Requisition Line")
begin
RequisitionLine.Validate("Production BOM No.", '');
RequisitionLine.Validate("Routing No.", '');
end;
[EventSubscriber(ObjectType::Table, Database::"Requisition Line", 'OnCleanProdOrderNo', '', true, false)]
local procedure OnCleanProdOrderNo(var RequisitionLine: Record "Requisition Line")
begin
RequisitionLine."Prod. Order No." := '';
end;
[EventSubscriber(ObjectType::Table, Database::"Requisition Line", 'OnIsProdOrder', '', true, false)]
local procedure OnIsProdOrder(var RequisitionLine: Record "Requisition Line"; var Result: Boolean)
begin
Result := RequisitionLine."Prod. Order No." <> '';
end;
[EventSubscriber(ObjectType::Table, Database::"Requisition Line", 'OnIsProductionBOM', '', true, false)]
local procedure OnIsProductionBOM(var RequisitionLine: Record "Requisition Line"; var Result: Boolean)
begin
Result := RequisitionLine."Production BOM No." <> '';
end;
[EventSubscriber(ObjectType::Table, Database::"Requisition Line", 'OnIsProdDemand', '', true, false)]
local procedure OnIsProdDemand(var RequisitionLine: Record "Requisition Line"; var Result: Boolean)
begin
Result :=
(RequisitionLine."Demand Type" = Database::"Prod. Order Component") and
(RequisitionLine."Demand Subtype" = "Production Order Status"::Planned.AsInteger());
end;
[EventSubscriber(ObjectType::Table, Database::"Requisition Line", 'OnTestProdOrderNo', '', true, false)]
local procedure OnTestProdOrderNo(var RequisitionLine: Record "Requisition Line")
begin
RequisitionLine.TestField("Prod. Order No.", '');
end;
[EventSubscriber(ObjectType::Table, Database::"Requisition Line", 'OnAfterCopyFromItem', '', true, false)]
local procedure OnAfterCopyFromItem(var RequisitionLine: Record "Requisition Line"; Item: Record Item; CurrentFieldNo: Integer)
begin
RequisitionLine."Scrap %" := Item."Scrap %";
end;
[EventSubscriber(ObjectType::Table, Database::"Requisition Line", 'OnAfterTransferFromPurchaseLine', '', true, false)]
local procedure OnAfterTransferFromPurchaseLine(var ReqLine: Record "Requisition Line"; PurchLine: Record "Purchase Line")
begin
ReqLine."Routing No." := PurchLine."Routing No.";
end;
[InherentPermissions(PermissionObjectType::TableData, Database::"Prod. Order Capacity Need", 'rimd')]
[EventSubscriber(ObjectType::Table, Database::"Requisition Line", 'OnAfterDeleteRelations', '', true, false)]
local procedure OnAfterDeleteRelations(var RequisitionLine: Record "Requisition Line"; DeleteAllLines: Boolean)
var
PlanningRtngLine: Record "Planning Routing Line";
ProdOrderCapNeed: Record "Prod. Order Capacity Need";
begin
if not DeleteAllLines then begin
PlanningRtngLine.SetRange("Worksheet Line No.", RequisitionLine."Line No.");
ProdOrderCapNeed.SetRange("Worksheet Line No.", RequisitionLine."Line No.");
end;
PlanningRtngLine.SetRange("Worksheet Template Name", RequisitionLine."Worksheet Template Name");
PlanningRtngLine.SetRange("Worksheet Batch Name", RequisitionLine."Journal Batch Name");
if not PlanningRtngLine.IsEmpty() then
PlanningRtngLine.DeleteAll();
ProdOrderCapNeed.SetCurrentKey("Worksheet Template Name", "Worksheet Batch Name", "Worksheet Line No.");
ProdOrderCapNeed.SetRange("Worksheet Template Name", RequisitionLine."Worksheet Template Name");
ProdOrderCapNeed.SetRange("Worksheet Batch Name", RequisitionLine."Journal Batch Name");
if not ProdOrderCapNeed.IsEmpty() then
ProdOrderCapNeed.DeleteAll();
if not DeleteAllLines then
ReactivateProdOrderCapacityNeed(RequisitionLine);
end;
[EventSubscriber(ObjectType::Table, Database::"Requisition Line", 'OnClearPlanningWorksheetOnBeforeRequisitionLineDelete', '', true, false)]
local procedure OnClearPlanningWorksheetOnBeforeRequisitionLineDelete(var RequisitionLine: Record "Requisition Line")
begin
ReactivateProdOrderCapacityNeed(RequisitionLine);
end;
local procedure ReactivateProdOrderCapacityNeed(RequisitionLine: Record "Requisition Line")
var
ProdOrderCapNeed: Record "Prod. Order Capacity Need";
begin
ProdOrderCapNeed.SetCurrentKey(Status, "Prod. Order No.", Active);
ProdOrderCapNeed.SetRange(Status, RequisitionLine."Ref. Order Status");
ProdOrderCapNeed.SetRange("Prod. Order No.", RequisitionLine."Ref. Order No.");
ProdOrderCapNeed.SetRange(Active, false);
if not ProdOrderCapNeed.IsEmpty() then
ProdOrderCapNeed.ModifyAll(Active, true);
end;
[EventSubscriber(ObjectType::Table, Database::"Requisition Line", 'OnRoutingLineExists', '', true, false)]
local procedure OnRoutingLineExists(var RequisitionLine: Record "Requisition Line"; var RoutingExists: Boolean)
begin
RoutingExists := RequisitionLine.RoutingLineExists();
end;
[EventSubscriber(ObjectType::Table, Database::"Requisition Line", 'OnValidateStartingDate', '', true, false)]
local procedure OnValidateStartingDate(var RequisitionLine: Record "Requisition Line")
begin
RequisitionLine.GetWorkCenter();
if not RequisitionLine.IsSubcontracting() then begin
RequisitionLine.Validate("Production BOM No.");
RequisitionLine.Validate("Routing No.");
end;
end;
[EventSubscriber(ObjectType::Table, Database::"Requisition Line", 'OnValidateEndingDate', '', true, false)]
local procedure OnValidateEndingDate(var RequisitionLine: Record "Requisition Line")
begin
RequisitionLine.GetWorkCenter();
if not RequisitionLine.IsSubcontracting() then begin
RequisitionLine.Validate("Production BOM No.");
RequisitionLine.Validate("Routing No.");
end;
end;
[EventSubscriber(ObjectType::Table, Database::"Requisition Line", 'OnValidateStartingTimeOnBeforeUpdateDateTime', '', true, false)]
local procedure OnValidateStartingTimeOnBeforeUpdateDateTime(var RequisitionLine: Record "Requisition Line")
var
ManufacturingSetup: Record "Manufacturing Setup";
begin
if RequisitionLine."Starting Time" = 0T then begin
ManufacturingSetup.Get();
RequisitionLine."Starting Time" := ManufacturingSetup."Normal Starting Time";
end;
end;
[EventSubscriber(ObjectType::Table, Database::"Requisition Line", 'OnValidateEndingTimeOnBeforeUpdateDateTime', '', true, false)]
local procedure OnValidateEndingTimeOnBeforeUpdateDateTime(var RequisitionLine: Record "Requisition Line")
var
ManufacturingSetup: Record "Manufacturing Setup";
begin
if RequisitionLine."Ending Time" = 0T then begin
ManufacturingSetup.Get();
RequisitionLine."Ending Time" := ManufacturingSetup."Normal Ending Time";
end;
end;
[EventSubscriber(ObjectType::Table, Database::"Requisition Line", 'OnBeforeGetDirectCost', '', true, false)]
local procedure OnBeforeGetDirectCost(var ReqLine: Record "Requisition Line")
begin
ReqLine.GetWorkCenter();
end;
[EventSubscriber(ObjectType::Table, Database::"Requisition Line", 'OnSetFromBinCodeOnSetBinCode', '', true, false)]
local procedure OnSetFromBinCodeOnSetBinCode(var RequisitionLine: Record "Requisition Line"; Location: Record Location)
var
ProdOrderWarehouseMgt: Codeunit "Prod. Order Warehouse Mgt.";
begin
case RequisitionLine."Ref. Order Type" of
RequisitionLine."Ref. Order Type"::"Prod. Order":
begin
if RequisitionLine."Bin Code" = '' then
RequisitionLine."Bin Code" :=
ProdOrderWarehouseMgt.GetLastOperationFromBinCode(
RequisitionLine."Routing No.", RequisitionLine."Routing Version Code", RequisitionLine."Location Code", false, "Flushing Method"::Manual);
if RequisitionLine."Bin Code" = '' then
RequisitionLine."Bin Code" := Location."From-Production Bin Code";
end;
end;
end;
[EventSubscriber(ObjectType::Table, Database::"Requisition Line", 'OnAfterShouldCheckNewActionMessage', '', true, false)]
local procedure OnAfterShouldCheckNewActionMessage(var RequisitionLine: Record "Requisition Line"; CurrentFieldNo: Integer; var ShouldCheck: Boolean)
begin
ShouldCheck := ShouldCheck or
CurrentFieldNo in [RequisitionLine.FieldNo("Production BOM Version Code"),
RequisitionLine.FieldNo("Routing Version Code"),
RequisitionLine.FieldNo("Production BOM No."),
RequisitionLine.FieldNo("Routing No.")];
end;
[EventSubscriber(ObjectType::Table, Database::"Requisition Line", 'OnUpdateWorkCenterDescription', '', true, false)]
local procedure OnUpdateWorkCenterDescription(var RequisitionLine: Record "Requisition Line"; var IsHandled: Boolean)
begin
IsHandled := RequisitionLine.UpdateWorkCenterDescription();
end;
[EventSubscriber(ObjectType::Table, Database::"Requisition Line", 'OnValidateReplenishmentSystemCaseElse', '', true, false)]
local procedure OnValidateReplenishmentSystemCaseElse(var RequisitionLine: Record "Requisition Line"; var StockkeepingUnit: Record "Stockkeeping Unit")
begin
case RequisitionLine."Replenishment System" of
"Replenishment System"::"Prod. Order":
RequisitionLine.SetReplenishmentSystemFromProdOrder(StockkeepingUnit);
end;
end;
[EventSubscriber(ObjectType::Table, Database::"Requisition Line", 'OnValidateReplenishmentSystemOnAfterSetStockkeepingUnit', '', true, false)]
local procedure OnValidateReplenishmentSystemOnAfterSetStockkeepingUnit(var RequisitionLine: Record "Requisition Line"; var StockkeepingUnit: Record "Stockkeeping Unit")
begin
if RequisitionLine.IsSubcontracting() then
StockkeepingUnit."Replenishment System" := StockkeepingUnit."Replenishment System"::"Prod. Order";
end;
[EventSubscriber(ObjectType::Table, Database::"Requisition Line", 'OnAfterShouldUpdateEndingDateForSourceType', '', true, false)]
local procedure OnAfterShouldUpdateEndingDateForSourceType(SourceType: Integer; var ShouldUpdate: Boolean)
begin
ShouldUpdate := ShouldUpdate or (SourceType = Database::"Prod. Order Line");
end;
[EventSubscriber(ObjectType::Table, Database::"Requisition Line", 'OnSetSupplyDatesOnAfterValidateEndingDate', '', true, false)]
local procedure OnSetSupplyDatesOnAfterValidateEndingDate(var RequisitionLine: Record "Requisition Line")
var
ManufacturingSetup: Record "Manufacturing Setup";
begin
if (RequisitionLine."Replenishment System" = "Replenishment System"::"Prod. Order") and (RequisitionLine."Starting Time" = 0T) then begin
ManufacturingSetup.Get();
RequisitionLine."Starting Time" := ManufacturingSetup."Normal Starting Time";
end;
end;
#if not CLEAN29
[EventSubscriber(ObjectType::Table, Database::"Req. Wksh. Template", 'OnAfterValidateEvent', 'Recurring', true, false)]
local procedure ReqWkshTemplateOnAfterValidateRecurring(var Rec: Record "Req. Wksh. Template")
begin
if not Rec.Recurring then
case Rec.Type of
#pragma warning disable AL0432
Rec.Type::"For. Labor":
Rec."Page ID" := Page::Microsoft.Manufacturing.Journal."Subcontracting Worksheet";
#pragma warning restore AL0432
end;
end;
#endif
[EventSubscriber(ObjectType::Codeunit, Codeunit::PlanningWkshManagement, 'OnGetRoutingDescription', '', true, false)]
local procedure OnGetRoutingDescription(var ReqLine: Record "Requisition Line"; var RoutingDescription: Text[100])
var
RoutingHeader: Record "Routing Header";
begin
if ReqLine."Routing No." = '' then
RoutingDescription := ''
else
if RoutingHeader.Get(ReqLine."Routing No.") then
RoutingDescription := RoutingHeader.Description
else
RoutingDescription := '';
end;
[EventSubscriber(ObjectType::Report, Report::"Get Action Messages", 'OnInitReqFromSourceBySource', '', true, false)]
local procedure OnInitReqFromSourceBySource(var ReqLine: Record "Requisition Line"; ActionMessageEntry: Record "Action Message Entry"; var IsHandled: Boolean; var ShouldExit: Boolean)
var
ProdOrderLine: Record "Prod. Order Line";
begin
case ActionMessageEntry."Source Type" of
Database::"Prod. Order Line":
begin
if ProdOrderLine.Get(ActionMessageEntry."Source Subtype", ActionMessageEntry."Source ID", ActionMessageEntry."Source Prod. Order Line") then begin
ReqLine.GetProdOrderLine(ProdOrderLine);
ShouldExit := true;
end;
IsHandled := true;
end;
end;
end;
[EventSubscriber(ObjectType::Table, Database::"Requisition Line", 'OnResetReqLineFields', '', true, false)]
local procedure OnResetReqLineFields(var RequisitionLine: Record "Requisition Line")
begin
ResetReqLineFields(RequisitionLine);
end;
procedure ResetReqLineFields(var RequisitionLine: Record "Requisition Line")
begin
RequisitionLine."Prod. Order Line No." := 0;
RequisitionLine."Routing No." := '';
RequisitionLine."Routing Reference No." := 0;
RequisitionLine."Operation No." := '';
RequisitionLine."Work Center No." := '';
OnAfterResetReqLineFields(RequisitionLine);
end;
[IntegrationEvent(false, false)]
local procedure OnAfterResetReqLineFields(var ReqLine: Record "Requisition Line")
begin
end;
[EventSubscriber(ObjectType::Table, Database::"Requisition Line", 'OnResetReqLineFields', '', true, false)]
local procedure OnSetOperationNoFilterToBlank(var RequisitionLine: Record "Requisition Line")
begin
RequisitionLine.SetRange("Operation No.", '');
end;
[EventSubscriber(ObjectType::Codeunit, Codeunit::"Req. Wksh.-Make Order", 'OnTransferFromReqLineToPurchLine', '', true, false)]
local procedure OnTransferFromReqLineToPurchLine(var PurchOrderLine: Record "Purchase Line"; RequisitionLine: Record "Requisition Line")
begin
PurchOrderLine.TransferFromReqLineToPurchLine(PurchOrderLine, RequisitionLine);
end;
}