Last modified on 23 June 2026, at 13:42

Difference between revisions of "MRO Material Management"

(Created page with "{{UnderConstructionStart}} == MRO Material Management == <div style="border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;"> '''Summary:...")
 
 
(19 intermediate revisions by the same user not shown)
Line 1: Line 1:
{{UnderConstructionStart}}
 
 
== MRO Material Management ==
 
== MRO Material Management ==
  
 
<div style="border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;">
 
<div style="border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;">
'''Summary:''' The MRO material management concept describes how materials are defined, requested, reserved, and used in maintenance workflows. It explains the relationship between material-related objects such as <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Material</span>, <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Material Master</span>, and <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Reservation</span>, and how these objects are connected to tasks or work packages.
+
'''Summary:''' The MRO material management features provide the foundation for handling materials, material master data, reservations, storage locations, and goods movements in MRO workflows. The central objects are <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Material</span>, <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">MaterialMaster</span>, and <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Reservation</span>. Materials are linked to master data and storage locations. Reservations are created manually by users and link materials to tasks.
 
</div>
 
</div>
  
MRO material management is used to support maintenance work with the required spare parts, consumables, tools, or other material items.
+
MRO material management is used to support maintenance work with required spare parts, consumables, tools, or other material items.
  
In a maintenance workflow, users may need to know:
+
Users can see which material is required for a task, where the material is stored, how much material is available, how much material is reserved, and which reservation status applies.
 
+
* which material is required for a task or work package
+
* whether the required material is available
+
* how much material is required
+
* how much material has already been reserved
+
* whether the material can be used
+
* whether a reservation is still open, fulfilled, or no longer relevant
+
 
+
The material management concept separates the general definition of a material from its actual usage in maintenance work.
+
 
+
A material can be defined centrally as master data and then used in different tasks, work packages, or reservations.
+
  
 
== Basic concept ==
 
== Basic concept ==
 
The material management feature is built around the following main concepts:
 
  
 
{| class="wikitable"
 
{| class="wikitable"
! Concept
+
! Object
 +
! Type
 
! Purpose
 
! Purpose
! Typical usage
 
 
|-
 
|-
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Material Master</span>
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">MaterialMaster</span>
| Defines the master data of a material.
+
| Master data
| Used as the central reference for material identity, description, unit, and related master data.
+
| Defines the catalogue entry for a material, including item number, unit, packaging, manufacturer data, and material type.
 
|-
 
|-
 
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Material</span>
 
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Material</span>
| Represents a material item used in the MRO context.
+
| Quantity-bearing MRO object
| Used to describe material that can be assigned, requested, or consumed in maintenance workflows.
+
| Represents a material instance or stock entry in MRO. It links to a material master and a storage location and exposes quantity, reserved quantity, and available quantity logic.
 
|-
 
|-
 
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Reservation</span>
 
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Reservation</span>
| Represents a request or reservation for a certain quantity of material.
+
| Workflow object
| Used to reserve material for a task, operation, or work package.
+
| Represents a manually created material reservation for a task. It links a material to a task and stores planned and actual quantities.
 
|-
 
|-
| Task or Work Package
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">GoodsMovement</span>
| Represents the maintenance work that requires material.
+
| Technical base class
| Material requirements and reservations are linked to the maintenance execution object.
+
| Provides the common <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">QUANTITY</span> property used by both materials and reservations.
 +
|-
 +
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">StorageLocation</span>
 +
| Related storage object
 +
| Represents a physical storage location for materials.
 
|}
 
|}
  
<div style="border-left: 4px solid #f0ad4e; background-color: #fff8e5; padding: 10px 12px; margin: 12px 0;">
+
<div style="border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;">
'''Note:''' The exact object names, relation names, and property names may differ depending on the MRO configuration. This page describes the concept and should be aligned with the actual implementation before it is published as final technical documentation.
+
'''Core idea:''' <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">MaterialMaster</span> defines what the material is. <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Material</span> represents the material in stock or material context. <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Reservation</span> links a material to a task and reserves a planned quantity for maintenance execution.
 
</div>
 
</div>
  
== Object overview ==
 
  
The following simplified overview shows how the material-related objects are typically connected.
 
  
{| class="wikitable"
 
! Object
 
! Related to
 
! Description
 
|-
 
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Material Master</span>
 
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Material</span>
 
| Provides the master data for a material.
 
|-
 
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Material</span>
 
| Task or Work Package
 
| Describes which material is needed or used for the maintenance activity.
 
|-
 
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Reservation</span>
 
| Material and Task or Work Package
 
| Reserves a specific quantity of material for a specific maintenance activity.
 
|}
 
  
== Material Master ==
+
== MaterialMaster ==
  
 
=== Purpose ===
 
=== Purpose ===
  
The Material Master represents the central master data record for a material.
+
<span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">MaterialMaster</span> represents the material master or catalogue entry.
  
It describes the material independently from a specific maintenance task or work package.
+
It stores item-level master data that can be referenced by material instances in MRO.
  
The Material Master is used to provide consistent information about materials across the MRO system.
+
=== Important properties ===
 
+
This can include, for example:
+
 
+
* material number
+
* material name
+
* material description
+
* base unit of measure
+
* material group
+
* manufacturer information
+
* external ERP or SAP reference
+
* default storage or warehouse information
+
* default status information
+
 
+
<div style="border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;">
+
'''Concept:''' The Material Master should be understood as the reusable definition of a material. It does not by itself describe that material is required for a specific task. The concrete usage is handled by material assignments, requirements, or reservations.
+
</div>
+
 
+
=== Typical responsibilities ===
+
 
+
The Material Master is typically responsible for:
+
 
+
* identifying a material uniquely
+
* providing the default description of the material
+
* defining the base unit in which the material is handled
+
* providing references to external systems
+
* allowing users to select the correct material when planning maintenance work
+
 
+
=== Example ===
+
 
+
A maintenance team regularly needs a specific oil filter.
+
 
+
The oil filter is defined once as a Material Master.
+
  
 
{| class="wikitable"
 
{| class="wikitable"
! Field
+
! Property
! Example value
+
! Type
 +
! Meaning
 
|-
 
|-
| Material number
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">ITEM_NUMBER</span>
| OF-10045
+
| string
 +
| Item number or material number.
 
|-
 
|-
| Name
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">PACKAGING_UNIT</span>
| Oil Filter Type A
+
| string
 +
| Packaging unit.
 
|-
 
|-
| Description
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">PACKAGING_SIZE</span>
| Standard oil filter for Pump Series A
+
| double
 +
| Packaging size.
 
|-
 
|-
| Base unit
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">ACTIVE</span>
| Piece
+
| bool
 +
| Defines whether the material master is active.
 
|-
 
|-
| Material group
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">UNIT_OF_MEASURE</span>
| Spare Parts
+
| string
 +
| Unit of measure.
 +
|-
 +
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">MATERIAL_TYPE</span> / <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">MaterialType</span>
 +
| int / enum
 +
| Material type.
 +
|-
 +
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">MANUFACTURER_COMPANY_NAME</span>
 +
| string
 +
| Manufacturer company name.
 +
|-
 +
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">MANUFACTURER_PRODUCT_TAG</span>
 +
| string
 +
| Manufacturer product tag or product identifier.
 
|}
 
|}
  
When a task or work package requires this oil filter, the task does not define the oil filter again from scratch. Instead, it references the existing Material Master or a material object based on it.
+
=== Material type ===
  
== Material ==
+
Values of <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">MaterialType</span> are:
  
=== Purpose ===
+
* <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">SpareParts</span>
 +
* <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Consumables</span>
 +
* <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Tools</span>
  
A Material represents a material item used in MRO workflows.
 
  
Depending on the implementation, the Material object may either represent:
+
== Material ==
  
* a concrete material based on a Material Master
+
=== Purpose ===
* a material requirement assigned to a task or work package
+
* a material item available for planning, reservation, or consumption
+
  
The Material object is used to bring material information into the maintenance workflow.
+
<span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Material</span> represents a material instance or stock entry in MRO.
  
=== Relationship to Material Master ===
+
It inherits from <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">GoodsMovement</span> and therefore uses the inherited <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">QUANTITY</span> property as its material quantity.
  
A Material is typically based on or linked to a Material Master.
+
A material links to:
  
The Material Master provides the general definition.
+
* a material master via <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">LK_MATERIAL_MASTER</span>
 +
* a storage location via <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">LK_STORAGE_LOCATION</span>
  
The Material object provides the MRO-specific usage context.
+
=== Important properties ===
  
 
{| class="wikitable"
 
{| class="wikitable"
! Aspect
+
! Property
! Material Master
+
! Type
! Material
+
! Meaning
 +
! Stored or calculated
 
|-
 
|-
| Main purpose
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">LK_MATERIAL_MASTER</span>
| Defines the material as master data.
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">MaterialMaster</span>
| Uses the material in an MRO context.
+
| Link to the material master data.
 +
| Stored link
 
|-
 
|-
| Scope
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">LK_STORAGE_LOCATION</span>
| General and reusable.
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">StorageLocation</span>
| Workflow-specific or MRO-specific.
+
| Link to the storage location where the material is located.
 +
| Stored link
 
|-
 
|-
| Example
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">QUANTITY</span>
| Oil Filter Type A.
+
| double
| Oil Filter Type A required for Work Package 4711.
+
| Material quantity. Inherited from <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">GoodsMovement</span>.
 +
| Stored property
 +
|-
 +
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">RESERVED_QUANTITY</span>
 +
| double
 +
| Sum of planned quantities of confirmed reservations for this material.
 +
| Calculated property
 +
|-
 +
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">MATERIAL_STATUS</span> / <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">MaterialStatus</span>
 +
| int / enum
 +
| Material status.
 +
| User/admin managed property
 
|}
 
|}
  
=== Typical material information ===
+
=== Material status ===
  
A Material object may contain or reference information such as:
+
The material status is stored in <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">MATERIAL_STATUS</span> and exposed through <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">MaterialStatus</span>.
  
* material master reference
+
The property is managed by the user or administrator. The system does not change it automatically.
* material number
+
* name or description
+
* required quantity
+
* available quantity
+
* reserved quantity
+
* unit of measure
+
* material status
+
* storage location or warehouse
+
* reference to a task or work package
+
  
<div style="border-left: 4px solid #f0ad4e; background-color: #fff8e5; padding: 10px 12px; margin: 12px 0;">
+
{| class="wikitable"
'''Implementation check required:''' This page should be aligned with the actual MRO data model to clarify whether quantity fields are stored directly on the Material object, calculated from related Reservation objects, or received from an external system.
+
! Value
</div>
+
! Numeric value
 +
! Meaning
 +
|-
 +
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Undefined</span>
 +
| 0
 +
| No specific material status is defined.
 +
|-
 +
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Inactive</span>
 +
| 10
 +
| Material is inactive and should not be used for new reservations.
 +
|-
 +
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Active</span>
 +
| 20
 +
| Material is active and can be used for reservations.
 +
|}
  
== Reservation ==
+
=== Reserved quantity ===
  
=== Purpose ===
+
<span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">RESERVED_QUANTITY</span> is calculated at read time.
  
A Reservation represents a request to reserve a specific quantity of material for maintenance work.
+
The calculation uses reservations where:
  
It connects material demand with a task, operation, or work package.
+
* <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">LK_MATERIAL</span> points to the current material
 +
* <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">STATUS</span> is <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">ReservationStatus.Confirmed</span>
  
A reservation is used when material should be set aside or requested before the maintenance work is executed.
+
The calculated value is the sum of <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">QTY_PLANNED</span> of these confirmed reservations.
  
=== Typical reservation information ===
+
=== Available quantity ===
  
A Reservation usually contains:
+
The available material quantity is calculated by <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">AvailableQuantity()</span>.
  
* reference to the material
+
<div style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 8px 10px; margin: 10px 0;">
* reference to the task or work package
+
AvailableQuantity = QUANTITY - RESERVED_QUANTITY
* requested quantity
+
</div>
* reserved quantity
+
* open quantity
+
* unit of measure
+
* reservation status
+
* requested date or required date
+
* storage location or warehouse
+
* external reservation number, if synchronized with an external system
+
  
=== Relationship to tasks or work packages ===
+
=== Delete behavior ===
  
Reservations are created for maintenance work.
+
<span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Material.InternalDeleteAllowed()</span> prevents deleting a material if it still has quantity or active reservations.
  
Depending on the workflow, a reservation may be linked to:
+
<div style="border-left: 4px solid #d33; background-color: #fff5f5; padding: 10px 12px; margin: 12px 0;">
 +
'''Restriction:''' A <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Material</span> cannot be deleted while it has a quantity greater than 0 or active reservations.
 +
</div>
  
* a task
 
* an operation
 
* a work package
 
* a work order
 
* a work package template, if material requirements are predefined
 
  
The reservation allows users to see which material has been requested or reserved for the maintenance activity.
+
== Reservation ==
  
<div style="border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;">
+
=== Purpose ===
'''Example:''' A work package for pump maintenance requires two oil filters. A reservation is created for quantity 2 of the oil filter material. The maintenance team can then see that the material is required and should be available for the work package.
+
 
</div>
+
<span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Reservation</span> represents a manually created material reservation for a task.
  
== Material quantity concepts ==
+
It links:
  
=== Material quantity ===
+
* a task via <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">LK_TASK</span>
 +
* a material via <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">LK_MATERIAL</span>
  
Material quantity describes how much of a material is required, available, reserved, or consumed.
+
It stores the planned reservation quantity in <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">QTY_PLANNED</span> and the actually issued or consumed quantity in <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">QUANTITY</span>.
  
The meaning of a quantity depends on the context in which it is used.
+
=== Important properties ===
  
 
{| class="wikitable"
 
{| class="wikitable"
! Quantity concept
+
! Property
 +
! Type
 
! Meaning
 
! Meaning
! Example
+
! Important behavior
 
|-
 
|-
| Required quantity
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">LK_TASK</span>
| Quantity needed to execute the task or work package.
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Task</span>
| 2 oil filters are needed for pump maintenance.
+
| Link to the task for which the material is reserved.
 +
| Setter is blocked when status is <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Issued</span> or <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Confirmed</span>.
 
|-
 
|-
| Reserved quantity
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">LK_MATERIAL</span>
| Quantity that has already been reserved for the task or work package.
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Material</span>
| 2 oil filters are reserved for the work package.
+
| Link to the material being reserved.
 +
| Setter is blocked when status is <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Issued</span> or <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Confirmed</span>.
 
|-
 
|-
| Available quantity
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">STATUS</span> / <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Status</span>
| Quantity currently available for use or reservation.
+
| int / enum
| 15 oil filters are available in the warehouse.
+
| Reservation status.
 +
| Changes are validated by <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">AllowStatusChange(int newStatus)</span>.
 
|-
 
|-
| Consumed quantity
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">QTY_PLANNED</span>
| Quantity actually used during execution.
+
| double
| 1 oil filter was used during the maintenance work.
+
| Planned quantity for the reservation.
 +
| Setter validates through <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">AllowQuantityPlanned(double)</span>.
 
|-
 
|-
| Open quantity
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">QUANTITY</span>
| Quantity still missing or not yet reserved.
+
| double
| Required quantity 5, reserved quantity 3, open quantity 2.
+
| Actually issued or consumed quantity. Overrides <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">GoodsMovement.QUANTITY</span>.
 +
| Setter validates through <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">AllowQuantity(double)</span>.
 
|}
 
|}
  
=== Reserved quantity ===
+
=== Reservation status ===
  
Reserved quantity describes the amount of material that has been reserved for a task, operation, or work package.
+
Values of <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">ReservationStatus</span> are:
 
+
It answers the question:
+
 
+
<div style="border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;">
+
'''Question:''' How much of the required material has already been reserved for this maintenance work?
+
</div>
+
 
+
Example:
+
  
 
{| class="wikitable"
 
{| class="wikitable"
! Required quantity
+
! Status
! Reserved quantity
+
! Numeric value
! Result
+
! Meaning
 
|-
 
|-
| 5
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Planned</span>
 
| 0
 
| 0
| No material has been reserved yet.
+
| Reservation is planned.
 
|-
 
|-
| 5
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Confirmed</span>
| 3
+
| 10
| The reservation is partially fulfilled.
+
| Reservation is confirmed and contributes to the material's reserved quantity.
 
|-
 
|-
| 5
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Issued</span>
| 5
+
| 20
| The required material quantity is fully reserved.
+
| Material has been physically issued.
 
|-
 
|-
| 5
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Cancelled</span>
| 7
+
| 30
| More material is reserved than required. This may require review, depending on the business rules.
+
| Reservation was cancelled.
 +
|-
 +
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Expired</span>
 +
| 50
 +
| Reservation has expired.
 
|}
 
|}
  
<div style="border-left: 4px solid #d33; background-color: #fff5f5; padding: 10px 12px; margin: 12px 0;">
 
'''Potential issue:''' If the reserved quantity is greater than the required quantity, the case should be checked against the business rules. It may be valid in some workflows, but it can also indicate an incorrect reservation quantity.
 
</div>
 
  
== Material status ==
+
=== Status change rules ===
  
=== Purpose ===
+
Status changes are controlled by <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">AllowStatusChange(int newStatus)</span>.
  
Material status describes whether a material can currently be used in the maintenance workflow.
+
The following rules are applied:
  
The material status can help users understand if a material is available, blocked, obsolete, or otherwise restricted.
+
* no status change is allowed when the current status is <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Issued</span>
 +
* changing from <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Confirmed</span> back to <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Planned</span> is not allowed
 +
* other status changes are allowed by this method
  
=== Typical material statuses ===
+
<div style="border-left: 4px solid #d33; background-color: #fff5f5; padding: 10px 12px; margin: 12px 0;">
 
+
'''Restriction:''' Once a reservation has status <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Issued</span>, its status can no longer be changed by the normal status setter logic.
The following statuses are examples and must be aligned with the actual MRO implementation.
+
 
+
{| class="wikitable"
+
! Status
+
! Meaning
+
! Effect
+
|-
+
| Available
+
| The material can be used or reserved.
+
| Users can select and use the material in maintenance workflows.
+
|-
+
| Reserved
+
| The material or part of its quantity is reserved.
+
| The material is already assigned to one or more maintenance activities.
+
|-
+
| Blocked
+
| The material must not be used.
+
| Users should not use the material for new reservations or work packages.
+
|-
+
| Obsolete
+
| The material is no longer intended for use.
+
| The material should be replaced by another material or removed from active workflows.
+
|-
+
| Out of stock
+
| No available quantity exists.
+
| The material cannot be fulfilled until stock is replenished.
+
|}
+
 
+
<div style="border-left: 4px solid #f0ad4e; background-color: #fff8e5; padding: 10px 12px; margin: 12px 0;">
+
'''Note:''' The exact status values must be taken from the actual MRO status model. This section should not introduce status values that do not exist in the implementation.
+
 
</div>
 
</div>
  
== Reservation status ==
+
=== Planned quantity validation ===
  
=== Purpose ===
+
The setter of <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">QTY_PLANNED</span> validates changes through <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">AllowQuantityPlanned(double)</span>.
  
Reservation status describes the current state of a material reservation.
+
A new planned quantity is only allowed if:
  
It helps users understand whether a reservation is still open, partially fulfilled, fulfilled, cancelled, or completed.
+
* <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Status</span> is <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">ReservationStatus.Planned</span>
 +
* <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">LK_MATERIAL</span> is assigned
 +
* the new quantity is greater than 0
 +
* the new quantity is lower than or equal to <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">LK_MATERIAL.AvailableQuantity()</span>
  
=== Typical reservation statuses ===
+
<div style="border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;">
 +
'''Quantity rule:''' A planned reservation quantity can only be set while the reservation is still <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Planned</span> and only if the selected material has enough available quantity.
 +
</div>
  
The following statuses are examples and must be aligned with the actual MRO implementation.
+
=== Actual quantity validation ===
  
{| class="wikitable"
+
The overridden <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">QUANTITY</span> setter validates changes through <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">AllowQuantity(double)</span>.
! Status
+
! Meaning
+
! Typical situation
+
|-
+
| Open
+
| The reservation has been created but not yet fulfilled.
+
| Material has been requested, but no quantity has been reserved yet.
+
|-
+
| Partially Reserved
+
| Only part of the required quantity has been reserved.
+
| Required quantity is 5, reserved quantity is 3.
+
|-
+
| Reserved
+
| The full required quantity has been reserved.
+
| Required quantity is 5, reserved quantity is 5.
+
|-
+
| Issued
+
| The material has been handed out or issued for execution.
+
| The maintenance team has received the material.
+
|-
+
| Consumed
+
| The material has been used during execution.
+
| The material usage has been confirmed.
+
|-
+
| Cancelled
+
| The reservation is no longer required.
+
| The work package was cancelled or the material is no longer needed.
+
|}
+
  
=== Status calculation ===
+
A new actual quantity is only allowed if:
  
Depending on the implementation, the reservation status may be:
+
* the new quantity is greater than 0
 +
* the status is either <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Planned</span> or <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Confirmed</span>
  
* set manually by the user
+
=== Link editing rules ===
* calculated from quantity values
+
* updated by the system during workflow transitions
+
* synchronized from an external ERP or warehouse system
+
  
Example status calculation:
+
The setters of <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">LK_TASK</span> and <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">LK_MATERIAL</span> are guarded by reservation status.
  
{| class="wikitable"
+
The links cannot be changed when the reservation is:
! Condition
+
! Possible reservation status
+
|-
+
| Reserved quantity is 0
+
| Open
+
|-
+
| Reserved quantity is greater than 0 and lower than required quantity
+
| Partially Reserved
+
|-
+
| Reserved quantity is equal to required quantity
+
| Reserved
+
|-
+
| Reservation was cancelled
+
| Cancelled
+
|}
+
  
<div style="border-left: 4px solid #f0ad4e; background-color: #fff8e5; padding: 10px 12px; margin: 12px 0;">
+
* <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Issued</span>
'''Implementation check required:''' The final wiki page should document whether reservation status is calculated in MRO, entered manually, or imported from an external system.
+
* <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Confirmed</span>
</div>
+
  
== Usage in tasks or work packages ==
+
== StorageLocation ==
  
 
=== Purpose ===
 
=== Purpose ===
  
Tasks and work packages represent maintenance work.
+
<span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">StorageLocation</span> is a related object used to represent a physical storage location.
  
Material management is used to define and track which materials are required for this maintenance work.
+
A material can reference a storage location via <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">LK_STORAGE_LOCATION</span>.
  
Material usage can occur during different phases of the maintenance process.
+
=== Important properties and values ===
  
 
{| class="wikitable"
 
{| class="wikitable"
! Phase
+
! Property
! Material handling
+
! Type
! Example
+
! Values / meaning
 
|-
 
|-
| Planning
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">STORAGE_TYPE</span> / <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">StorageType</span>
| Required materials are selected and planned.
+
| int / enum
| The planner adds two oil filters to the pump maintenance work package.
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Floor</span>, <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Shelf</span>, <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Rack</span>, <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Bin</span>, <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Pallet</span>, <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Container</span>
 
|-
 
|-
| Preparation
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">ACCESS_TYPE</span> / <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">AccessType</span>
| Required materials are reserved or requested.
+
| int / enum
| A reservation is created for two oil filters.
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Manual</span>, <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Forklift</span>, <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Crane</span>, <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Automated</span>
 
|-
 
|-
| Execution
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">OCCUPANCY_STATUS</span> / <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">OccupancyStatus</span>
| The maintenance team uses the material.
+
| int / enum
| One oil filter is installed during the task.
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Empty</span>, <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Partial</span>, <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Full</span>, <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Reserved</span>, <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Blocked</span>, <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">OutOfService</span>
 
|-
 
|-
| Completion
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">STORAGE_LABEL</span>
| Actual material usage is confirmed.
+
| string
| The consumed quantity is recorded.
+
| Label of the storage location.
 +
|-
 +
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">LEVEL</span>
 +
| int
 +
| Level of the storage location.
 +
|-
 +
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">POSITION</span>
 +
| string
 +
| Position identifier.
 
|}
 
|}
  
=== Material requirements on work packages ===
+
== GoodsMovement ==
  
A work package may contain one or more material requirements.
+
<span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">GoodsMovement</span> is a technical base class.
  
Each material requirement describes which material is needed and in which quantity.
+
It provides the common <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">QUANTITY</span> property for material-related objects such as <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Material</span> and <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Reservation</span>.
  
Example:
 
  
{| class="wikitable"
 
! Work package
 
! Material
 
! Required quantity
 
! Unit
 
|-
 
| Pump Maintenance WP-4711
 
| Oil Filter Type A
 
| 2
 
| Piece
 
|-
 
| Pump Maintenance WP-4711
 
| Lubricating Oil
 
| 5
 
| Liter
 
|}
 
  
=== Material requirements on tasks ===
 
  
If material is linked to individual tasks, the material requirement can be more precise.
+
== Quantity concepts ==
 
+
Example:
+
  
 
{| class="wikitable"
 
{| class="wikitable"
! Task
+
! Quantity
! Material
+
! Property / method
! Required quantity
+
! Object
! Unit
+
! Stored or calculated
 +
! Notes
 
|-
 
|-
| Replace oil filter
+
| Material quantity
| Oil Filter Type A
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">QUANTITY</span>
| 1
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Material</span>
| Piece
+
| Stored
 +
| Inherited from <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">GoodsMovement</span>.
 
|-
 
|-
| Refill oil
+
| Reserved quantity
| Lubricating Oil
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">RESERVED_QUANTITY</span>
| 5
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Material</span>
| Liter
+
| Calculated
 +
| Sum of <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">QTY_PLANNED</span> of confirmed reservations for the material.
 +
|-
 +
| Available quantity
 +
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">AvailableQuantity()</span>
 +
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Material</span>
 +
| Calculated
 +
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">QUANTITY</span> minus <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">RESERVED_QUANTITY</span>.
 +
|-
 +
| Planned reservation quantity
 +
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">QTY_PLANNED</span>
 +
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Reservation</span>
 +
| Stored
 +
| Validated by <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">AllowQuantityPlanned(double)</span>.
 +
|-
 +
| Actually issued or consumed quantity
 +
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">QUANTITY</span>
 +
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Reservation</span>
 +
| Stored
 +
| Overrides <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">GoodsMovement.QUANTITY</span> and is validated by <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">AllowQuantity(double)</span>.
 
|}
 
|}
  
This allows the system and users to understand exactly which material is required for each task.
+
== Reservation workflow ==
  
=== Reservations for work packages ===
+
=== Creating or editing a reservation ===
  
A reservation may be created for a complete work package.
+
Reservations are created manually by the user.
  
This is useful when the material should be prepared for the whole maintenance activity.
+
A reservation links a material to a task.
  
Example:
+
For a reservation to define its planned quantity correctly:
  
A work package contains three tasks.
+
# <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">LK_MATERIAL</span> must be set.
 +
# <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">LK_TASK</span> must point to the task requiring the material.
 +
# <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Status</span> must still be <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Planned</span>.
 +
# <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">QTY_PLANNED</span> must be greater than 0.
 +
# <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">QTY_PLANNED</span> must not exceed <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">LK_MATERIAL.AvailableQuantity()</span>.
  
The planner creates one material reservation for all required material of the work package.
+
=== Confirmed reservations ===
  
The warehouse prepares the material before the work package starts.
+
When a reservation is confirmed, it contributes to the material's reserved quantity.
  
=== Reservations for tasks ===
+
This affects the available quantity of the material.
  
A reservation may also be created for a specific task.
+
<div style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 8px 10px; margin: 10px 0;">
 +
AvailableQuantity = QUANTITY - sum(QTY_PLANNED of confirmed reservations)
 +
</div>
  
This is useful when material usage should be tracked at task level.
+
=== Finishing a task ===
  
Example:
+
When a task is finished, the task logic calls <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">CloseReservations()</span>.
  
Task: Replace oil filter
+
<div style="border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;">
 +
'''Workflow effect:''' Finishing a task closes its reservations. Confirmed reservations become <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Issued</span>; other active reservations become <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Cancelled</span>.
 +
</div>
  
Required material: Oil Filter Type A
 
  
Required quantity: 1
+
== Usage in tasks ==
  
Reservation: 1 Oil Filter Type A
+
Reservations are the central link between material handling and task execution.
  
== Example workflow ==
+
A reservation connects:
  
=== Scenario ===
+
* the required material through <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">LK_MATERIAL</span>
 +
* the task through <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">LK_TASK</span>
 +
* the planned quantity through <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">QTY_PLANNED</span>
 +
* the actually issued or consumed quantity through <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">QUANTITY</span>
 +
* the reservation state through <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Status</span>
  
A pump requires planned maintenance.
+
This means that material usage is tracked at task level.
  
The work package contains one task for replacing an oil filter.
+
== Example workflow ==
  
=== Step 1: Material Master exists ===
+
=== Step 1: Material master exists ===
  
The oil filter is defined as a Material Master.
+
A spare part is defined as a <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">MaterialMaster</span>.
  
 
{| class="wikitable"
 
{| class="wikitable"
 
! Field
 
! Field
! Value
+
! Example
 
|-
 
|-
| Material number
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">ITEM_NUMBER</span>
 
| OF-10045
 
| OF-10045
 
|-
 
|-
| Name
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">UNIT_OF_MEASURE</span>
| Oil Filter Type A
+
|-
+
| Base unit
+
 
| Piece
 
| Piece
 +
|-
 +
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">MaterialType</span>
 +
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">SpareParts</span>
 
|}
 
|}
  
=== Step 2: Material is assigned to the task ===
+
=== Step 2: Material exists in a storage location ===
  
The task requires one oil filter.
+
A <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Material</span> object references the material master and a storage location.
  
 
{| class="wikitable"
 
{| class="wikitable"
! Task
+
! Property
! Material
+
! Example
! Required quantity
+
 
|-
 
|-
| Replace oil filter
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">LK_MATERIAL_MASTER</span>
 
| Oil Filter Type A
 
| Oil Filter Type A
| 1
+
|-
 +
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">LK_STORAGE_LOCATION</span>
 +
| Storage Shelf A
 +
|-
 +
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">QUANTITY</span>
 +
| 10
 +
|-
 +
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">RESERVED_QUANTITY</span>
 +
| 0
 +
|-
 +
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">AvailableQuantity()</span>
 +
| 10
 
|}
 
|}
  
=== Step 3: Reservation is created ===
+
=== Step 3: Reservation is created for a task ===
  
A reservation is created for the required material.
+
A user manually creates a <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Reservation</span> and links the material to the task.
  
 
{| class="wikitable"
 
{| class="wikitable"
! Reservation
+
! Property
! Material
+
! Example
! Required quantity
+
|-
! Reserved quantity
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">LK_TASK</span>
! Status
+
| Replace oil filter
 
|-
 
|-
| RES-90001
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">LK_MATERIAL</span>
 
| Oil Filter Type A
 
| Oil Filter Type A
 +
|-
 +
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Status</span>
 +
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Planned</span>
 +
|-
 +
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">QTY_PLANNED</span>
 
| 1
 
| 1
| 1
 
| Reserved
 
 
|}
 
|}
  
=== Step 4: Material is used during execution ===
+
=== Step 4: Reservation is confirmed ===
  
During execution, the oil filter is installed.
+
The reservation status is changed to <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Confirmed</span>.
  
The consumed quantity is recorded, if supported by the implementation.
+
After confirmation, the material's reserved quantity includes the reservation's planned quantity.
  
 
{| class="wikitable"
 
{| class="wikitable"
! Material
+
! Quantity
! Reserved quantity
+
! Value
! Consumed quantity
+
! Result
+
 
|-
 
|-
| Oil Filter Type A
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Material.QUANTITY</span>
 +
| 10
 +
|-
 +
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Material.RESERVED_QUANTITY</span>
 
| 1
 
| 1
| 1
+
|-
| Material was fully used.
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Material.AvailableQuantity()</span>
 +
| 9
 
|}
 
|}
  
=== Step 5: Work is completed ===
+
=== Step 5: Actual quantity is entered ===
  
The task or work package is completed.
+
The actually issued or consumed quantity is stored in <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Reservation.QUANTITY</span>.
  
The material reservation can then be considered completed, consumed, or closed, depending on the workflow.
+
{| class="wikitable"
 +
! Property
 +
! Example
 +
|-
 +
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Reservation.QUANTITY</span>
 +
| 1
 +
|}
  
== Important rules and open implementation points ==
+
=== Step 6: Task is finished ===
  
<div style="border-left: 4px solid #f0ad4e; background-color: #fff8e5; padding: 10px 12px; margin: 12px 0;">
+
When the task is finished, <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">CloseReservations()</span> is called.
'''Open point:''' The final documentation should be aligned with the real object model. In particular, relation names, property names, status values, and quantity calculation rules should be verified before the page is published.
+
 
</div>
+
The confirmed reservation is changed to <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Issued</span>.
  
The following information is required to finalize this page precisely:
+
== Validation and business rules ==
  
 
{| class="wikitable"
 
{| class="wikitable"
! Topic
+
! Area
! Required information
+
! Rule
! Why it matters
+
 
|-
 
|-
| Object names
+
| Planned reservation quantity
| Exact class names for Material, Material Master, and Reservation.
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">QTY_PLANNED</span> must be greater than 0.
| Needed to document the real data model instead of generic concepts.
+
 
|-
 
|-
| Relation names
+
| Planned reservation quantity
| Exact relation names between Material, Material Master, Reservation, Task, Work Package, and Work Order.
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">QTY_PLANNED</span> can only be changed while the reservation is <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Planned</span>.
| Needed for technical accuracy.
+
 
|-
 
|-
| Quantity properties
+
| Planned reservation quantity
| Exact property names for required quantity, reserved quantity, available quantity, consumed quantity, and open quantity.
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">QTY_PLANNED</span> must not exceed <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">LK_MATERIAL.AvailableQuantity()</span>.
| Needed to explain where quantities are stored and how they are calculated.
+
 
|-
 
|-
| Status properties
+
| Actual issued or consumed quantity
| Exact property names and allowed values for Material status and Reservation status.
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">QUANTITY</span> must be greater than 0.
| Needed to avoid inventing unsupported status values.
+
 
|-
 
|-
| Status logic
+
| Actual issued or consumed quantity
| Whether statuses are manual, calculated, workflow-driven, or imported from an external system.
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">QUANTITY</span> can only be changed while the reservation is <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Planned</span> or <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Confirmed</span>.
| Needed to explain system behavior correctly.
+
 
|-
 
|-
| ERP integration
+
| Reservation status
| Whether materials and reservations are synchronized with SAP or another ERP system.
+
| Status cannot be changed once the reservation is <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Issued</span>.
| Needed to document external references, synchronization rules, and ownership of data.
+
 
|-
 
|-
| Usage level
+
| Reservation status
| Whether material is assigned to tasks, operations, work packages, work orders, or multiple levels.
+
| A reservation cannot be changed from <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Confirmed</span> back to <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Planned</span>.
| Needed to describe the actual workflow correctly.
+
 
|-
 
|-
| Reservation creation
+
| Reservation links
| Whether reservations are created manually, automatically, from templates, or by an external system.
+
| <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">LK_TASK</span> and <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">LK_MATERIAL</span> cannot be changed when status is <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Issued</span> or <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">Confirmed</span>.
| Needed to explain the user workflow and automation.
+
 
|-
 
|-
| Consumption handling
+
| Material deletion
| Whether consumed quantities are recorded in MRO.
+
| Material cannot be deleted while <span style="font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;">QUANTITY</span> is greater than 0.
| Needed to document execution and completion behavior.
+
 
|-
 
|-
| Validation rules
+
| Material deletion
| Rules such as required quantity must be greater than 0, reservation cannot exceed available stock, or blocked material cannot be reserved.
+
| Material cannot be deleted while active reservations exist.
| Needed to document important restrictions and error cases.
+
 
|}
 
|}
  
  
{{UnderConstructionEnd}}
+
== See also ==
 +
* [[MRO (Plugin)]]
 +
* [[MRO_Objects_(Client)]]
 +
* [[MRO_Implemented_Objects]]
 +
* [[MROMaintenancePlans]]

Latest revision as of 13:42, 23 June 2026

MRO Material Management

Summary: The MRO material management features provide the foundation for handling materials, material master data, reservations, storage locations, and goods movements in MRO workflows. The central objects are Material, MaterialMaster, and Reservation. Materials are linked to master data and storage locations. Reservations are created manually by users and link materials to tasks.

MRO material management is used to support maintenance work with required spare parts, consumables, tools, or other material items.

Users can see which material is required for a task, where the material is stored, how much material is available, how much material is reserved, and which reservation status applies.

Basic concept

Object Type Purpose
MaterialMaster Master data Defines the catalogue entry for a material, including item number, unit, packaging, manufacturer data, and material type.
Material Quantity-bearing MRO object Represents a material instance or stock entry in MRO. It links to a material master and a storage location and exposes quantity, reserved quantity, and available quantity logic.
Reservation Workflow object Represents a manually created material reservation for a task. It links a material to a task and stores planned and actual quantities.
GoodsMovement Technical base class Provides the common QUANTITY property used by both materials and reservations.
StorageLocation Related storage object Represents a physical storage location for materials.

Core idea: MaterialMaster defines what the material is. Material represents the material in stock or material context. Reservation links a material to a task and reserves a planned quantity for maintenance execution.



MaterialMaster

Purpose

MaterialMaster represents the material master or catalogue entry.

It stores item-level master data that can be referenced by material instances in MRO.

Important properties

Property Type Meaning
ITEM_NUMBER string Item number or material number.
PACKAGING_UNIT string Packaging unit.
PACKAGING_SIZE double Packaging size.
ACTIVE bool Defines whether the material master is active.
UNIT_OF_MEASURE string Unit of measure.
MATERIAL_TYPE / MaterialType int / enum Material type.
MANUFACTURER_COMPANY_NAME string Manufacturer company name.
MANUFACTURER_PRODUCT_TAG string Manufacturer product tag or product identifier.

Material type

Values of MaterialType are:

  • SpareParts
  • Consumables
  • Tools


Material

Purpose

Material represents a material instance or stock entry in MRO.

It inherits from GoodsMovement and therefore uses the inherited QUANTITY property as its material quantity.

A material links to:

  • a material master via LK_MATERIAL_MASTER
  • a storage location via LK_STORAGE_LOCATION

Important properties

Property Type Meaning Stored or calculated
LK_MATERIAL_MASTER MaterialMaster Link to the material master data. Stored link
LK_STORAGE_LOCATION StorageLocation Link to the storage location where the material is located. Stored link
QUANTITY double Material quantity. Inherited from GoodsMovement. Stored property
RESERVED_QUANTITY double Sum of planned quantities of confirmed reservations for this material. Calculated property
MATERIAL_STATUS / MaterialStatus int / enum Material status. User/admin managed property

Material status

The material status is stored in MATERIAL_STATUS and exposed through MaterialStatus.

The property is managed by the user or administrator. The system does not change it automatically.

Value Numeric value Meaning
Undefined 0 No specific material status is defined.
Inactive 10 Material is inactive and should not be used for new reservations.
Active 20 Material is active and can be used for reservations.

Reserved quantity

RESERVED_QUANTITY is calculated at read time.

The calculation uses reservations where:

  • LK_MATERIAL points to the current material
  • STATUS is ReservationStatus.Confirmed

The calculated value is the sum of QTY_PLANNED of these confirmed reservations.

Available quantity

The available material quantity is calculated by AvailableQuantity().

AvailableQuantity = QUANTITY - RESERVED_QUANTITY

Delete behavior

Material.InternalDeleteAllowed() prevents deleting a material if it still has quantity or active reservations.

Restriction: A Material cannot be deleted while it has a quantity greater than 0 or active reservations.


Reservation

Purpose

Reservation represents a manually created material reservation for a task.

It links:

  • a task via LK_TASK
  • a material via LK_MATERIAL

It stores the planned reservation quantity in QTY_PLANNED and the actually issued or consumed quantity in QUANTITY.

Important properties

Property Type Meaning Important behavior
LK_TASK Task Link to the task for which the material is reserved. Setter is blocked when status is Issued or Confirmed.
LK_MATERIAL Material Link to the material being reserved. Setter is blocked when status is Issued or Confirmed.
STATUS / Status int / enum Reservation status. Changes are validated by AllowStatusChange(int newStatus).
QTY_PLANNED double Planned quantity for the reservation. Setter validates through AllowQuantityPlanned(double).
QUANTITY double Actually issued or consumed quantity. Overrides GoodsMovement.QUANTITY. Setter validates through AllowQuantity(double).

Reservation status

Values of ReservationStatus are:

Status Numeric value Meaning
Planned 0 Reservation is planned.
Confirmed 10 Reservation is confirmed and contributes to the material's reserved quantity.
Issued 20 Material has been physically issued.
Cancelled 30 Reservation was cancelled.
Expired 50 Reservation has expired.


Status change rules

Status changes are controlled by AllowStatusChange(int newStatus).

The following rules are applied:

  • no status change is allowed when the current status is Issued
  • changing from Confirmed back to Planned is not allowed
  • other status changes are allowed by this method

Restriction: Once a reservation has status Issued, its status can no longer be changed by the normal status setter logic.

Planned quantity validation

The setter of QTY_PLANNED validates changes through AllowQuantityPlanned(double).

A new planned quantity is only allowed if:

  • Status is ReservationStatus.Planned
  • LK_MATERIAL is assigned
  • the new quantity is greater than 0
  • the new quantity is lower than or equal to LK_MATERIAL.AvailableQuantity()

Quantity rule: A planned reservation quantity can only be set while the reservation is still Planned and only if the selected material has enough available quantity.

Actual quantity validation

The overridden QUANTITY setter validates changes through AllowQuantity(double).

A new actual quantity is only allowed if:

  • the new quantity is greater than 0
  • the status is either Planned or Confirmed

Link editing rules

The setters of LK_TASK and LK_MATERIAL are guarded by reservation status.

The links cannot be changed when the reservation is:

  • Issued
  • Confirmed

StorageLocation

Purpose

StorageLocation is a related object used to represent a physical storage location.

A material can reference a storage location via LK_STORAGE_LOCATION.

Important properties and values

Property Type Values / meaning
STORAGE_TYPE / StorageType int / enum Floor, Shelf, Rack, Bin, Pallet, Container
ACCESS_TYPE / AccessType int / enum Manual, Forklift, Crane, Automated
OCCUPANCY_STATUS / OccupancyStatus int / enum Empty, Partial, Full, Reserved, Blocked, OutOfService
STORAGE_LABEL string Label of the storage location.
LEVEL int Level of the storage location.
POSITION string Position identifier.

GoodsMovement

GoodsMovement is a technical base class.

It provides the common QUANTITY property for material-related objects such as Material and Reservation.



Quantity concepts

Quantity Property / method Object Stored or calculated Notes
Material quantity QUANTITY Material Stored Inherited from GoodsMovement.
Reserved quantity RESERVED_QUANTITY Material Calculated Sum of QTY_PLANNED of confirmed reservations for the material.
Available quantity AvailableQuantity() Material Calculated QUANTITY minus RESERVED_QUANTITY.
Planned reservation quantity QTY_PLANNED Reservation Stored Validated by AllowQuantityPlanned(double).
Actually issued or consumed quantity QUANTITY Reservation Stored Overrides GoodsMovement.QUANTITY and is validated by AllowQuantity(double).

Reservation workflow

Creating or editing a reservation

Reservations are created manually by the user.

A reservation links a material to a task.

For a reservation to define its planned quantity correctly:

  1. LK_MATERIAL must be set.
  2. LK_TASK must point to the task requiring the material.
  3. Status must still be Planned.
  4. QTY_PLANNED must be greater than 0.
  5. QTY_PLANNED must not exceed LK_MATERIAL.AvailableQuantity().

Confirmed reservations

When a reservation is confirmed, it contributes to the material's reserved quantity.

This affects the available quantity of the material.

AvailableQuantity = QUANTITY - sum(QTY_PLANNED of confirmed reservations)

Finishing a task

When a task is finished, the task logic calls CloseReservations().

Workflow effect: Finishing a task closes its reservations. Confirmed reservations become Issued; other active reservations become Cancelled.


Usage in tasks

Reservations are the central link between material handling and task execution.

A reservation connects:

  • the required material through LK_MATERIAL
  • the task through LK_TASK
  • the planned quantity through QTY_PLANNED
  • the actually issued or consumed quantity through QUANTITY
  • the reservation state through Status

This means that material usage is tracked at task level.

Example workflow

Step 1: Material master exists

A spare part is defined as a MaterialMaster.

Field Example
ITEM_NUMBER OF-10045
UNIT_OF_MEASURE Piece
MaterialType SpareParts

Step 2: Material exists in a storage location

A Material object references the material master and a storage location.

Property Example
LK_MATERIAL_MASTER Oil Filter Type A
LK_STORAGE_LOCATION Storage Shelf A
QUANTITY 10
RESERVED_QUANTITY 0
AvailableQuantity() 10

Step 3: Reservation is created for a task

A user manually creates a Reservation and links the material to the task.

Property Example
LK_TASK Replace oil filter
LK_MATERIAL Oil Filter Type A
Status Planned
QTY_PLANNED 1

Step 4: Reservation is confirmed

The reservation status is changed to Confirmed.

After confirmation, the material's reserved quantity includes the reservation's planned quantity.

Quantity Value
Material.QUANTITY 10
Material.RESERVED_QUANTITY 1
Material.AvailableQuantity() 9

Step 5: Actual quantity is entered

The actually issued or consumed quantity is stored in Reservation.QUANTITY.

Property Example
Reservation.QUANTITY 1

Step 6: Task is finished

When the task is finished, CloseReservations() is called.

The confirmed reservation is changed to Issued.

Validation and business rules

Area Rule
Planned reservation quantity QTY_PLANNED must be greater than 0.
Planned reservation quantity QTY_PLANNED can only be changed while the reservation is Planned.
Planned reservation quantity QTY_PLANNED must not exceed LK_MATERIAL.AvailableQuantity().
Actual issued or consumed quantity QUANTITY must be greater than 0.
Actual issued or consumed quantity QUANTITY can only be changed while the reservation is Planned or Confirmed.
Reservation status Status cannot be changed once the reservation is Issued.
Reservation status A reservation cannot be changed from Confirmed back to Planned.
Reservation links LK_TASK and LK_MATERIAL cannot be changed when status is Issued or Confirmed.
Material deletion Material cannot be deleted while QUANTITY is greater than 0.
Material deletion Material cannot be deleted while active reservations exist.


See also