Codeunit 99000855 Planning-Get Parameters
- App
- Base Application
- Namespace
- Microsoft.Inventory.Planning
- Versions
- 17-28
Procedures, 9Events, 10Obsolete, 2
Versions171819202122232425262728
Source29
Source in 29
src/Layers/W1/BaseApp/Inventory/Planning/PlanningGetParameters.Codeunit.al395 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.Planning;
using Microsoft.Inventory.Item;
using Microsoft.Inventory.Location;
using Microsoft.Inventory.Setup;
codeunit 99000855 "Planning-Get Parameters"
{
trigger OnRun()
begin
end;
var
GlobalSKU: Record "Stockkeeping Unit";
Item: Record Item;
InventorySetup: Record "Inventory Setup";
HasGotInventorySetUp: Boolean;
LotForLot: Boolean;
ManualScheduling: Boolean;
procedure AtSKU(var SKU: Record "Stockkeeping Unit"; ItemNo: Code[20]; VariantCode: Code[10]; LocationCode: Code[10])
var
IsHandled: Boolean;
begin
GetInventorySetUp();
if (ItemNo <> GlobalSKU."Item No.") or
(VariantCode <> GlobalSKU."Variant Code") or
(LocationCode <> GlobalSKU."Location Code")
then begin
Clear(GlobalSKU);
GlobalSKU.SetRange("Item No.", ItemNo);
GlobalSKU.SetRange("Variant Code", VariantCode);
GlobalSKU.SetRange("Location Code", LocationCode);
if not GlobalSKU.FindFirst() then begin
GetItem(ItemNo);
GlobalSKU."Item No." := ItemNo;
GlobalSKU."Variant Code" := VariantCode;
GlobalSKU."Location Code" := LocationCode;
GlobalSKU.CopyFromItem(Item);
OnAtSKUOnAfterCopyFromItem(GlobalSKU, Item, ItemNo, VariantCode, LocationCode);
if LotForLot then begin
GlobalSKU."Reorder Point" := 0;
GlobalSKU."Maximum Inventory" := 0;
GlobalSKU."Reorder Quantity" := 0;
case Item."Reordering Policy" of
GlobalSKU."Reordering Policy"::" ":
GlobalSKU."Reordering Policy" := GlobalSKU."Reordering Policy"::" ";
GlobalSKU."Reordering Policy"::Order:
GlobalSKU."Reordering Policy" := GlobalSKU."Reordering Policy"::Order;
GlobalSKU."Reordering Policy"::"Lot-for-Lot":
GlobalSKU."Reordering Policy" := GlobalSKU."Reordering Policy"::"Lot-for-Lot";
else begin
GlobalSKU."Reordering Policy" := GlobalSKU."Reordering Policy"::"Lot-for-Lot";
GlobalSKU."Plan Minimal Supply" := true;
end;
end;
if GlobalSKU."Reordering Policy" = GlobalSKU."Reordering Policy"::"Lot-for-Lot" then
GlobalSKU."Include Inventory" := true
else
GlobalSKU."Include Inventory" := Item."Include Inventory";
GlobalSKU."Maximum Order Quantity" := 0;
GlobalSKU."Safety Stock Quantity" := 0;
GlobalSKU."Order Multiple" := 0;
GlobalSKU."Overflow Level" := 0;
end;
end;
SetComponentsAtLocation(LocationCode);
end;
OnAtSKUOnBeforeSetSafetyLeadTime(GlobalSKU, ManualScheduling);
IsHandled := false;
OnAtSKUOnBeforeAssignDefaultSafetyLeadTime(GlobalSKU, ManualScheduling, IsHandled);
if not IsHandled then
if not ManualScheduling then
if Format(GlobalSKU."Safety Lead Time") = '' then
if Format(InventorySetup."Default Safety Lead Time") <> '' then
GlobalSKU."Safety Lead Time" := InventorySetup."Default Safety Lead Time"
else
Evaluate(GlobalSKU."Safety Lead Time", '<0D>');
AdjustInvalidSettings(GlobalSKU);
SKU := GlobalSKU;
OnAfterAtSKU(SKU, GlobalSKU);
end;
procedure SetManualScheduling(NewManualScheduling: Boolean)
begin
ManualScheduling := NewManualScheduling;
end;
local procedure GetItem(ItemNo: Code[20])
begin
if Item."No." <> ItemNo then
Item.Get(ItemNo);
end;
local procedure GetInventorySetUp()
begin
if not HasGotInventorySetUp then
HasGotInventorySetUp := InventorySetup.Get();
end;
local procedure SetComponentsAtLocation(LocationCode: Code[10])
begin
if GlobalSKU."Components at Location" = '' then
if InventorySetup.GetComponentsAtLocation() <> '' then
GlobalSKU."Components at Location" := InventorySetup.GetComponentsAtLocation()
else
GlobalSKU."Components at Location" := LocationCode;
OnAfterSetComponentsAtLocation(GlobalSKU, Item);
end;
procedure SetLotForLot()
begin
LotForLot := true;
end;
procedure SetPlanningParameters(var PlanningParameters: Record "Planning Parameters")
var
xPlanningParameters: Record "Planning Parameters";
begin
xPlanningParameters := PlanningParameters;
Clear(PlanningParameters);
PlanningParameters."Reordering Policy" := xPlanningParameters."Reordering Policy";
PlanningParameters."Include Inventory" := xPlanningParameters."Include Inventory";
case PlanningParameters."Reordering Policy" of
PlanningParameters."Reordering Policy"::" ":
PlanningParameters."Safety Lead Time Enabled" := true;
PlanningParameters."Reordering Policy"::"Fixed Reorder Qty.":
begin
PlanningParameters."Time Bucket Enabled" := true;
PlanningParameters."Safety Lead Time Enabled" := true;
PlanningParameters."Safety Stock Qty Enabled" := true;
PlanningParameters."Reorder Point Enabled" := true;
PlanningParameters."Reorder Quantity Enabled" := true;
PlanningParameters."Maximum Inventory Enabled" := false;
PlanningParameters."Minimum Order Qty Enabled" := true;
PlanningParameters."Maximum Order Qty Enabled" := true;
PlanningParameters."Order Multiple Enabled" := true;
PlanningParameters."Include Inventory Enabled" := false;
PlanningParameters."Rescheduling Period Enabled" := false;
PlanningParameters."Lot Accum. Period Enabled" := false;
PlanningParameters."Dampener Period Enabled" := false;
PlanningParameters."Dampener Quantity Enabled" := true;
PlanningParameters."Overflow Level Enabled" := true;
end;
PlanningParameters."Reordering Policy"::"Maximum Qty.":
begin
PlanningParameters."Time Bucket Enabled" := true;
PlanningParameters."Safety Lead Time Enabled" := true;
PlanningParameters."Safety Stock Qty Enabled" := true;
PlanningParameters."Reorder Point Enabled" := true;
PlanningParameters."Reorder Quantity Enabled" := false;
PlanningParameters."Maximum Inventory Enabled" := true;
PlanningParameters."Minimum Order Qty Enabled" := true;
PlanningParameters."Maximum Order Qty Enabled" := true;
PlanningParameters."Order Multiple Enabled" := true;
PlanningParameters."Include Inventory Enabled" := false;
PlanningParameters."Rescheduling Period Enabled" := false;
PlanningParameters."Lot Accum. Period Enabled" := false;
PlanningParameters."Dampener Period Enabled" := false;
PlanningParameters."Dampener Quantity Enabled" := true;
PlanningParameters."Overflow Level Enabled" := true;
end;
PlanningParameters."Reordering Policy"::Order:
begin
PlanningParameters."Time Bucket Enabled" := false;
PlanningParameters."Safety Lead Time Enabled" := true;
PlanningParameters."Safety Stock Qty Enabled" := false;
PlanningParameters."Reorder Point Enabled" := false;
PlanningParameters."Reorder Quantity Enabled" := false;
PlanningParameters."Maximum Inventory Enabled" := false;
PlanningParameters."Minimum Order Qty Enabled" := false;
PlanningParameters."Maximum Order Qty Enabled" := false;
PlanningParameters."Order Multiple Enabled" := false;
PlanningParameters."Include Inventory Enabled" := false;
PlanningParameters."Rescheduling Period Enabled" := false;
PlanningParameters."Lot Accum. Period Enabled" := false;
PlanningParameters."Dampener Period Enabled" := true;
PlanningParameters."Dampener Quantity Enabled" := false;
PlanningParameters."Overflow Level Enabled" := false;
end;
PlanningParameters."Reordering Policy"::"Lot-for-Lot":
begin
PlanningParameters."Time Bucket Enabled" := false;
PlanningParameters."Safety Lead Time Enabled" := true;
PlanningParameters."Safety Stock Qty Enabled" := xPlanningParameters."Include Inventory";
PlanningParameters."Reorder Point Enabled" := false;
PlanningParameters."Reorder Quantity Enabled" := false;
PlanningParameters."Maximum Inventory Enabled" := false;
PlanningParameters."Minimum Order Qty Enabled" := true;
PlanningParameters."Maximum Order Qty Enabled" := true;
PlanningParameters."Order Multiple Enabled" := true;
PlanningParameters."Include Inventory Enabled" := true;
PlanningParameters."Rescheduling Period Enabled" := true;
PlanningParameters."Lot Accum. Period Enabled" := true;
PlanningParameters."Dampener Period Enabled" := true;
PlanningParameters."Dampener Quantity Enabled" := true;
PlanningParameters."Overflow Level Enabled" := false;
end;
else
OnSetPlanningParametersOnReorderingPolicyElseCase(PlanningParameters);
end;
OnAfterSetPlanningParameters(PlanningParameters, xPlanningParameters);
end;
procedure AdjustInvalidSettings(var SKU: Record "Stockkeeping Unit")
var
PlanningParameters: Record "Planning Parameters";
begin
PlanningParameters."Reordering Policy" := SKU."Reordering Policy";
PlanningParameters."Include Inventory" := SKU."Include Inventory";
SetPlanningParameters(PlanningParameters);
if not PlanningParameters."Time Bucket Enabled" then
Evaluate(SKU."Time Bucket", '<0D>');
if not PlanningParameters."Safety Lead Time Enabled" then
Evaluate(SKU."Safety Lead Time", '<0D>');
if not PlanningParameters."Safety Stock Qty Enabled" then
SKU."Safety Stock Quantity" := 0;
if not PlanningParameters."Reorder Point Enabled" then
SKU."Reorder Point" := 0;
if not PlanningParameters."Reorder Quantity Enabled" then
SKU."Reorder Quantity" := 0;
if not PlanningParameters."Maximum Inventory Enabled" then
SKU."Maximum Inventory" := 0;
if not PlanningParameters."Minimum Order Qty Enabled" then
SKU."Minimum Order Quantity" := 0;
if not PlanningParameters."Maximum Order Qty Enabled" then
SKU."Maximum Order Quantity" := 0;
if not PlanningParameters."Order Multiple Enabled" then
SKU."Order Multiple" := 0;
if not PlanningParameters."Rescheduling Period Enabled" then
Evaluate(SKU."Rescheduling Period", '<0D>');
if not PlanningParameters."Lot Accum. Period Enabled" then
Evaluate(SKU."Lot Accumulation Period", '<0D>');
if not PlanningParameters."Dampener Period Enabled" then
Evaluate(SKU."Dampener Period", '<0D>');
if not PlanningParameters."Dampener Quantity Enabled" then
SKU."Dampener Quantity" := 0;
if not PlanningParameters."Overflow Level Enabled" then
SKU."Overflow Level" := 0;
AdjustInvalidValues(SKU, PlanningParameters."Reorder Point Enabled");
OnAfterAdjustInvalidSettings(SKU, PlanningParameters);
end;
local procedure AdjustInvalidValues(var SKU: Record "Stockkeeping Unit"; ReorderPointEnabled: Boolean)
begin
if SKU."Reorder Point" < 0 then
SKU."Reorder Point" := 0;
if SKU."Safety Stock Quantity" < 0 then
SKU."Safety Stock Quantity" := 0;
if (SKU."Reorder Point" < SKU."Safety Stock Quantity") and
ReorderPointEnabled
then
SKU."Reorder Point" := SKU."Safety Stock Quantity";
if SKU."Maximum Order Quantity" < 0 then
SKU."Maximum Order Quantity" := 0;
if SKU."Minimum Order Quantity" < 0 then
SKU."Minimum Order Quantity" := 0;
if SKU."Maximum Order Quantity" <> 0 then
if SKU."Maximum Order Quantity" < SKU."Minimum Order Quantity" then
SKU."Maximum Order Quantity" := SKU."Minimum Order Quantity";
if (SKU."Maximum Inventory" < SKU."Safety Stock Quantity") or
(SKU."Maximum Inventory" < SKU."Reorder Point")
then
SKU."Maximum Inventory" := 0;
if SKU."Overflow Level" <> 0 then
case SKU."Reordering Policy" of
SKU."Reordering Policy"::"Fixed Reorder Qty.":
if SKU."Overflow Level" < (SKU."Reorder Point" + SKU."Reorder Quantity") then
SKU."Overflow Level" := SKU."Reorder Point" + SKU."Reorder Quantity";
SKU."Reordering Policy"::"Maximum Qty.":
if SKU."Overflow Level" < SKU."Maximum Inventory" then
SKU."Overflow Level" := SKU."Maximum Inventory";
end;
end;
procedure CalcDampenerDays(SKU: Record "Stockkeeping Unit") DampenerDays: Integer
begin
if Format(SKU."Dampener Period") = '' then begin
GetInventorySetUp();
DampenerDays := CalcDate(InventorySetup."Default Dampener Period") - Today;
end else
DampenerDays := CalcDate(SKU."Dampener Period") - Today;
// The Dampener Period must not be less than the Lot Accumulation Period unless
// the Reordering Policy is order
if SKU."Reordering Policy" <> SKU."Reordering Policy"::Order then
if DampenerDays > CalcDate(SKU."Lot Accumulation Period") - Today then
DampenerDays := CalcDate(SKU."Lot Accumulation Period") - Today;
end;
procedure CalcDampenerQty(SKU: Record "Stockkeeping Unit") DampenerQty: Decimal
begin
if SKU."Reordering Policy" <> SKU."Reordering Policy"::Order then
if SKU."Dampener Quantity" = 0 then begin
GetInventorySetup();
DampenerQty := SKU."Lot Size" * InventorySetup."Default Dampener %" / 100;
end else
DampenerQty := SKU."Dampener Quantity"
else
DampenerQty := 0;
end;
procedure CalcOverflowLevel(SKU: Record "Stockkeeping Unit") WarningLevel: Decimal
begin
if SKU."Overflow Level" <> 0 then
WarningLevel := SKU."Overflow Level"
else begin
GetInventorySetup();
if InventorySetup."Blank Overflow Level" = InventorySetup."Blank Overflow Level"::"Allow Default Calculation" then begin
case SKU."Reordering Policy" of
SKU."Reordering Policy"::"Maximum Qty.":
WarningLevel := SKU."Maximum Inventory" + SKU."Minimum Order Quantity";
SKU."Reordering Policy"::"Fixed Reorder Qty.":
begin
if SKU."Minimum Order Quantity" > SKU."Reorder Quantity" then
WarningLevel := SKU."Minimum Order Quantity"
else
WarningLevel := SKU."Reorder Quantity";
WarningLevel += SKU."Reorder Point";
end
else
WarningLevel := 0;
end;
if SKU."Order Multiple" > 0 then
WarningLevel := Round(WarningLevel, SKU."Order Multiple", '>');
end else
WarningLevel := 0;
end;
end;
[IntegrationEvent(false, false)]
local procedure OnAfterAdjustInvalidSettings(var StockkeepingUnit: Record "Stockkeeping Unit"; var PlanningParameters: Record "Planning Parameters")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterAtSKU(var SKU: Record "Stockkeeping Unit"; var GlobalSKU: Record "Stockkeeping Unit");
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAtSKUOnAfterCopyFromItem(var GlobalSKU: Record "Stockkeeping Unit"; var Item: Record Item; ItemNo: Code[20]; VariantCode: Code[10]; LocationCode: Code[10])
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterSetPlanningParameters(var PlanningParameters: Record "Planning Parameters"; xPlanningParameters: Record "Planning Parameters");
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterSetComponentsAtLocation(var GlobalStockkeepingUnit: Record "Stockkeeping Unit"; Item: Record Item)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnSetPlanningParametersOnReorderingPolicyElseCase(var PlanningParameters: Record "Planning Parameters")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAtSKUOnBeforeSetSafetyLeadTime(var GlobalSKU: Record "Stockkeeping Unit"; ManualScheduling: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAtSKUOnBeforeAssignDefaultSafetyLeadTime(var GlobalStockkeepingUnit: Record "Stockkeeping Unit"; var ManualScheduling: Boolean; var IsHandled: Boolean)
begin
end;
}