KVSKBAProductionLib
Procedures
OnValidateProdOrderLineItemNo(Record Prod. Order Line, Record Prod. Order Line, Record Item) :
Summary: Called when the Item No. field on a Prod. Order Line is validated, to check whether the item is blocked for manufacturing.
procedure OnValidateProdOrderLineItemNo(var ProdOrderLine: Record "Prod. Order Line"; xProdOrderLine: Record "Prod. Order Line"; Item: Record "Item"):
Parameters:
ProdOrderLine: The production order line being validated.xProdOrderLine: The previous state of the production order line.Item: The item record resolved from the new item number.
Remarks: Exits immediately if Item No. is empty. Calls KVSKBAIsBlockedManufacturing to raise an error if the item is blocked.
OnValidateProdOrderCompItemNo(Record Prod. Order Component, Record Prod. Order Component, Record Item) :
Summary: Called when the Item No. field on a Prod. Order Component is validated, to check whether the component item is blocked for manufacturing consumption.
procedure OnValidateProdOrderCompItemNo(var ProdOrderComponent: Record "Prod. Order Component"; xProdOrderComponent: Record "Prod. Order Component"; Item: Record "Item"):
Parameters:
ProdOrderComponent: The production order component being validated.xProdOrderComponent: The previous state of the production order component.Item: The item record resolved from the new item number.
Remarks: Always calls KVSKBAIsBlockedManufConsumption; the caller is responsible for ensuring the item record is already fetched.
CalculateStatusSignalsComplete(Record Production Order) :
Summary: Recalculates production status signals for all non-finished production orders in the company.
procedure CalculateStatusSignalsComplete(var ProductionOrder: Record "Production Order"):
Parameters:
ProductionOrder: The production order record used as a working variable; its original filter/position is restored after processing.
Remarks: Temporarily resets and re-filters the ProductionOrder record to iterate over all orders with Status <> Finished. The original record state is restored via Copy after the loop completes.
CalculateStatusSignals(Record Production Order, Boolean) :
Summary: Recalculates all production status signals (material consumption, labor/output, external orders) and their percentage values for a single released production order, then persists the result via Modify.
procedure CalculateStatusSignals(var ProductionOrder: Record "Production Order"; ShowError: Boolean):
Parameters:
ProductionOrder: The released production order whose signal fields are updated.ShowError: If true, blocking checks on the item will raise an error; if false, errors are suppressed.
Remarks: Calls CalculateStatusMaterial, CalculateStatusCapacity, and CalculateStatusExternalOrders. Signal colors (red/yellow/green) are sourced from Company Information blob fields. Exits without modifying if the item is blocked or if KVSKBAProdNotReady is true.
Events
OnAfterCalculateStatusCapacity(Enum Production Order Status, Code[20], Integer, Option, Decimal, Option, Decimal) :
[IntegrationEvent(false, false)]
local procedure OnAfterCalculateStatusCapacity(ProdOrderStatus: Enum "Production Order Status"; ProdOrderNo: Code[20]; ProdOrderLineNo: Integer; var SignalLaborConsum: Option; var LaborConsumInPercent: Decimal; var SignalLaborOutput: Option; var LaborOutputInPercent: Decimal):
OnAfterCalculateStatusMaterial(Enum Production Order Status, Code[20], Integer, Option, Decimal) :
[IntegrationEvent(false, false)]
local procedure OnAfterCalculateStatusMaterial(ProdOrderStatus: Enum "Production Order Status"; ProdOrderNo: Code[20]; ProdOrderLineNo: Integer; var SignalMaterialConsum: Option; var MaterialConsumInPercent: Decimal):
OnAfterCalculateStatusExternalOrders(Code[20], Integer, Option, Decimal, Option, Decimal) :
Summary: Fired after all external order signal and percentage values have been calculated for a production order.
[IntegrationEvent(false, false)]
local procedure OnAfterCalculateStatusExternalOrders(ProdOrderNo: Code[20]; ProdOrderLineNo: Integer; var SignalExternalOrders: Option; var ExternalOrdersInPercent: Decimal; var SignalExternalReply: Option; var ExternalReplyInPercentr: Decimal):
Parameters:
ProdOrderNo: The production order number.ProdOrderLineNo: The production order line number (0 = all lines).SignalExternalOrders: The calculated external order creation signal (Not Started / At Work / Completed). Can be overridden.ExternalOrdersInPercent: The external order creation percentage. Can be overridden.SignalExternalReply: The calculated external output reply signal (Not Started / At Work / Completed). Can be overridden.ExternalReplyInPercentr: The external reply percentage. Can be overridden.
Remarks: Raised by CalculateStatusExternalOrders after purchase orders and capacity entries have been evaluated for all subcontracting routing lines. Use a subscriber to apply custom override logic for external order signals without re-implementing the full calculation.
OnBeforeCalculateStatusCapacity(Enum Production Order Status, Code[20], Integer, Option, Decimal, Option, Decimal, Boolean) :
[IntegrationEvent(false, false)]
local procedure OnBeforeCalculateStatusCapacity(ProdOrderStatus: Enum "Production Order Status"; ProdOrderNo: Code[20]; ProdOrderLineNo: Integer; var SignalLaborConsum: Option; var LaborConsumInPercent: Decimal; var SignalLaborOutput: Option; var LaborOutputInPercent: Decimal; var IsHandled: Boolean):
OnBeforeCalculateStatusMaterial(Enum Production Order Status, Code[20], Integer, Option, Decimal, Boolean) :
[IntegrationEvent(false, false)]
local procedure OnBeforeCalculateStatusMaterial(ProdOrderStatus: Enum "Production Order Status"; ProdOrderNo: Code[20]; ProdOrderLineNo: Integer; var SignalMaterialConsum: Option; var MaterialConsumInPercent: Decimal; var IsHandled: Boolean):
OnBeforeCalculateStatusExternalOrders(Code[20], Integer, Option, Decimal, Option, Decimal, Boolean) :
Summary: Fired before the external order signal calculation starts, allowing subscribers to skip the standard CalculateStatusExternalOrders logic entirely.
[IntegrationEvent(false, false)]
local procedure OnBeforeCalculateStatusExternalOrders(ProdOrderNo: Code[20]; ProdOrderLineNo: Integer; var SignalExternalOrders: Option; var ExternalOrdersInPercent: Decimal; var SignalExternalReply: Option; var ExternalReplyInPercentr: Decimal; var IsHandled: Boolean):
Parameters:
ProdOrderNo: The production order number.ProdOrderLineNo: The production order line number (0 = all lines).SignalExternalOrders: Output: the external order creation signal to use if IsHandled = true.ExternalOrdersInPercent: Output: the external order creation percentage to use if IsHandled = true.SignalExternalReply: Output: the external reply signal to use if IsHandled = true.ExternalReplyInPercentr: Output: the external reply percentage to use if IsHandled = true.IsHandled: Set to true to skip the standard calculation code.
Remarks: Implements the IsHandled pattern: if a subscriber sets IsHandled = true, the standard subcontracting routing line loop and purchase/capacity evaluation are skipped entirely. All output parameters (signals and percentages) must then be populated by the subscriber.
OnBeforeCheckItemIsBlockedOnBeforeInsertProdOrderComponent(Record Prod. Order Component, Boolean) :
Summary: Fired before the blocked-item check in the Prod. Order Component OnBeforeInsert event, allowing subscribers to skip the standard KVSKBAIsBlockedManufConsumption check.
[IntegrationEvent(false, false)]
local procedure OnBeforeCheckItemIsBlockedOnBeforeInsertProdOrderComponent(var Rec: Record "Prod. Order Component"; var Handled: Boolean):
Parameters:
Rec: The production order component being inserted.Handled: Set to true to skip the standard item and item variant blocking checks.
Remarks: Raised inside the event subscriber for Prod. Order Component.OnBeforeInsert, before the item and item variant blocking checks are executed. If Handled = true, neither KVSKBAIsBlockedManufConsumption nor KVSKBAIsProdConsumpBlocked is called for the inserted component.
OnBeforeCheckItemIsBlockedOnValidateItemNoProdOrderComponent(Record Prod. Order Component, Record Prod. Order Component, Boolean) :
Summary: Fired before the blocked-item check when Item No. is validated on a Prod. Order Component, allowing subscribers to skip the standard KVSKBAIsBlockedManufConsumption check.
[IntegrationEvent(false, false)]
local procedure OnBeforeCheckItemIsBlockedOnValidateItemNoProdOrderComponent(var Rec: Record "Prod. Order Component"; var xRec: Record "Prod. Order Component"; var IsHandled: Boolean):
Parameters:
Rec: The production order component being validated.xRec: The previous state of the production order component.IsHandled: Set to true to skip the standard item blocking check.
Remarks: Raised inside the event subscriber for Prod. Order Component.OnValidateItemNo, before the item blocking check is executed. If IsHandled = true, KVSKBAIsBlockedManufConsumption is not called for the validated component.
OnBeforeCheckItemIsBlockedOnValidateQuantityProdOrderComponent(Record Prod. Order Component, Record Prod. Order Component, Boolean) :
Summary: Fired before the blocked-item check when Quantity is validated on a Prod. Order Component, allowing subscribers to skip the standard KVSKBAIsBlockedManufConsumption check.
[IntegrationEvent(false, false)]
local procedure OnBeforeCheckItemIsBlockedOnValidateQuantityProdOrderComponent(var Rec: Record "Prod. Order Component"; var xRec: Record "Prod. Order Component"; var IsHandled: Boolean):
Parameters:
Rec: The production order component being validated.xRec: The previous state of the production order component.IsHandled: Set to true to skip the standard item and item variant blocking checks.
Remarks: Raised inside the event subscriber for Prod. Order Component.OnValidateQuantity, before the item and item variant blocking checks are executed. If IsHandled = true, neither KVSKBAIsBlockedManufConsumption nor KVSKBAIsProdConsumpBlocked is called.
OnBeforeCheckItemIsBlockedOnValidateQuantityperProdOrderComponent(Record Prod. Order Component, Record Prod. Order Component, Boolean) :
Summary: Fired before the blocked-item check when Quantity per is validated on a Prod. Order Component, allowing subscribers to skip the standard KVSKBAIsBlockedManufConsumption check.
[IntegrationEvent(false, false)]
local procedure OnBeforeCheckItemIsBlockedOnValidateQuantityperProdOrderComponent(var Rec: Record "Prod. Order Component"; var xRec: Record "Prod. Order Component"; var IsHandled: Boolean):
Parameters:
Rec: The production order component being validated.xRec: The previous state of the production order component.IsHandled: Set to true to skip the standard item and item variant blocking checks.
Remarks: Raised inside the event subscriber for Prod. Order Component.OnValidateQuantityPer, before the item and item variant blocking checks are executed. If IsHandled = true, neither KVSKBAIsBlockedManufConsumption nor KVSKBAIsProdConsumpBlocked is called.
OnCalculateStatusCapacityOnBeforeModifyCalcProdOrderRoutingLineOnIfTypeWorkCenter(Enum Production Order Status, Code[20], Integer, Record Prod. Order Routing Line, Record KVSKBACalcProdOrderRoutingLine) :
[IntegrationEvent(false, false)]
local procedure OnCalculateStatusCapacityOnBeforeModifyCalcProdOrderRoutingLineOnIfTypeWorkCenter(ProdOrderStatus: Enum "Production Order Status"; ProdOrderNo: Code[20]; ProdOrderLineNo: Integer; ProdOrderRoutingLine: Record "Prod. Order Routing Line"; var TempCalcProdOrderRoutingLine: Record "KVSKBACalcProdOrderRoutingLine" temporary):
OnCalculateStatusCapacityOnBeforeInsertTempCalcProdOrderRoutingLineOnIfTypeWorkCenter(Enum Production Order Status, Code[20], Integer, Record Prod. Order Routing Line, Record KVSKBACalcProdOrderRoutingLine) :
[IntegrationEvent(false, false)]
local procedure OnCalculateStatusCapacityOnBeforeInsertTempCalcProdOrderRoutingLineOnIfTypeWorkCenter(ProdOrderStatus: Enum "Production Order Status"; ProdOrderNo: Code[20]; ProdOrderLineNo: Integer; ProdOrderRoutingLine: Record "Prod. Order Routing Line"; var TempCalcProdOrderRoutingLine: Record "KVSKBACalcProdOrderRoutingLine" temporary):
OnCalculateStatusCapacityOnBeforeModifyTempCalcProdOrderRoutingLineOnIfTypeMachineCenter(Enum Production Order Status, Code[20], Integer, Record Prod. Order Routing Line, Record KVSKBACalcProdOrderRoutingLine) :
[IntegrationEvent(false, false)]
local procedure OnCalculateStatusCapacityOnBeforeModifyTempCalcProdOrderRoutingLineOnIfTypeMachineCenter(ProdOrderStatus: Enum "Production Order Status"; ProdOrderNo: Code[20]; ProdOrderLineNo: Integer; ProdOrderRoutingLine: Record "Prod. Order Routing Line"; var TempCalcProdOrderRoutingLine: Record "KVSKBACalcProdOrderRoutingLine" temporary):
OnCalculateStatusCapacityOnBeforeInsertTempCalcProdOrderRoutingLineOnIfTypeMachineCenter(Enum Production Order Status, Code[20], Integer, Record Prod. Order Routing Line, Record KVSKBACalcProdOrderRoutingLine) :
[IntegrationEvent(false, false)]
local procedure OnCalculateStatusCapacityOnBeforeInsertTempCalcProdOrderRoutingLineOnIfTypeMachineCenter(ProdOrderStatus: Enum "Production Order Status"; ProdOrderNo: Code[20]; ProdOrderLineNo: Integer; ProdOrderRoutingLine: Record "Prod. Order Routing Line"; var TempCalcProdOrderRoutingLine: Record "KVSKBACalcProdOrderRoutingLine" temporary):
OnCalculateStatusCapacityOnBeforeModifyTempCalcProdOrderRoutingLineOnCapacityEntry(Record KVSKBACalcProdOrderRoutingLine, Record Capacity Ledger Entry) :
Summary: Fired before the temporary calc routing line record is modified after summing capacity ledger entries for a work/machine center in CalculateStatusCapacity.
[IntegrationEvent(false, false)]
local procedure OnCalculateStatusCapacityOnBeforeModifyTempCalcProdOrderRoutingLineOnCapacityEntry(var TempCalcProdOrderRoutingLine: Record "KVSKBACalcProdOrderRoutingLine" temporary; CapacityLedgerEntry: Record "Capacity Ledger Entry"):
Parameters:
TempCalcProdOrderRoutingLine: The temporary routing line record accumulating posted time and output for the current work/machine center. Modify fields here before the standard Modify call.CapacityLedgerEntry: The capacity ledger entry record filtered to the current routing line (sums already calculated via CalcSums).
Remarks: Fired after CalcSums has been called on the CapacityLedgerEntry for the current work/machine center, immediately before TempCalcProdOrderRoutingLine is updated with the summed actual time and output values. Use a subscriber to override the calculated sums or add corrections before the Modify call.
OnCalculateStatusCapacityOnAfterSetSignalLabour(Record KVSKBACalcProdOrderRoutingLine, Decimal, Decimal, Decimal, Decimal, Option, Decimal, Option, Decimal) :
Summary: Fired after the labor consumption and output reply signals and percentages have been determined from the accumulated routing line data in CalculateStatusCapacity, allowing subscribers to override the final signal values.
[IntegrationEvent(false, false)]
local procedure OnCalculateStatusCapacityOnAfterSetSignalLabour(var TempCalcProdOrderRoutingLine: Record "KVSKBACalcProdOrderRoutingLine" temporary; CalculatedLaborQty: Decimal; ConsumedLaborQty: Decimal; CalculatedOutputQty: Decimal; PostedOutputQty: Decimal; var SignalLaborConsum: Option; var LaborConsumInPercent: Decimal; var SignalLaborOutput: Option; var LaborOutputInPercent: Decimal):
Parameters:
TempCalcProdOrderRoutingLine: The last-processed temporary routing line record (positioned at the end of the loop).CalculatedLaborQty: The total planned labor time (sum of Total Calc. Time Per Work across all routing lines).ConsumedLaborQty: The total actual time used (sum of Total Used Time Per Work across all routing lines).CalculatedOutputQty: The total planned output quantity (sum of Total Qty. Per Work across all routing lines).PostedOutputQty: The total posted output quantity (sum of Total Output Qty. Per Work across all routing lines).SignalLaborConsum: The labor consumption signal. Can be overridden.LaborConsumInPercent: The labor consumption percentage. Can be overridden.SignalLaborOutput: The output reply signal. Can be overridden.LaborOutputInPercent: The output reply percentage. Can be overridden.
Remarks: Fired after CalculateStatusCapacity has compared planned vs. actual totals and assigned the signal color thresholds. All four quantity parameters are passed by value (read-only); signal and percentage parameters are passed by reference and can be freely overridden.
OnAfterClearCalcProdOrderRoutingLine(Record KVSKBACalcProdOrderRoutingLine) :
Summary: Fired after the accumulation fields of a temporary calc routing line record have been cleared (reset to 0) in preparation for a new work/machine center entry.
[IntegrationEvent(false, false)]
local procedure OnAfterClearCalcProdOrderRoutingLine(var TempCalcProdOrderRoutingLine: Record "KVSKBACalcProdOrderRoutingLine" temporary):
Parameters:
TempCalcProdOrderRoutingLine: The temporary routing line record whose accumulation fields were just reset. Set additional fields to zero or default here if needed.
Remarks: Fired in the local procedure ClearCalcProdOrderRoutingLine, which is called each time the accumulation pointer moves to a new work/machine center group. Use a subscriber to reset any custom fields added to the KVSKBACalcProdOrderRoutingLine table.