<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wiki.augmensys.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=LMA</id>
		<title>UBIK Wiki / Augmensys - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.augmensys.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=LMA"/>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=Special:Contributions/LMA"/>
		<updated>2026-10-08T02:23:17Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.24.2</generator>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=HowTo:Use_Change_Detection_via_Change_Notifications&amp;diff=30611</id>
		<title>HowTo:Use Change Detection via Change Notifications</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=HowTo:Use_Change_Detection_via_Change_Notifications&amp;diff=30611"/>
				<updated>2026-09-25T09:31:28Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: /* Configuration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In {{UBIK}} 4, there is a mechanism for the automatic detection of changes by other {{UBIK}} processes, which provide notifications for their changes.&lt;br /&gt;
== Configuration ==&lt;br /&gt;
The UBIKContent web service can be configured{{Version/ServerSince|4.9.0}} to react to such notifications by updating its cache; mostly the [[User_Groups_and_Rights|user group cache used for rights evaluation]].&lt;br /&gt;
&amp;lt;br/&amp;gt;Change detection can be configured in the [[Configuration_Files/AppSettings.config|application settings of the UBIKContent web service]].{{Version/ServerSince|4.9.0}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|&lt;br /&gt;
When '''EnableChangeNotifications''' is disabled, calculated properties that depend on linked objects may not be updated immediately across different UBIK sessions.&lt;br /&gt;
&lt;br /&gt;
Changes made to a linked object in another session may not be reflected until the affected object is reloaded.&lt;br /&gt;
&lt;br /&gt;
Enable '''EnableChangeNotifications''' to ensure that changes are propagated across sessions and dependent calculated values are updated automatically.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Coding|Change Detection via Change Notifications]]&lt;br /&gt;
[[Category:How-To|Use Change Detection via Change Notifications]]&lt;br /&gt;
[[Category:Studio|Change Detection via Change Notifications]]&lt;br /&gt;
[[Category:Web service|Change Detection via Change Notifications]]&lt;br /&gt;
&lt;br /&gt;
== Customizing ==&lt;br /&gt;
There are multiple possibilities to react to change detections via customizing.&lt;br /&gt;
=== Overriding the event handler of an instance ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
protected virtual void OnBeforeUpdateByChangeNotification()&lt;br /&gt;
{&lt;br /&gt;
    // Called before an already cached instance will be reloaded from the database because of a change notification.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
protected virtual void OnAfterUpdateByChangeNotification()&lt;br /&gt;
{ &lt;br /&gt;
    // Called after an instance was reloaded from the database because of a change notification.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Attaching a new event handler to the UBIKEventManager ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
// In Plugin code or custom code library, or anywhere else:&lt;br /&gt;
&lt;br /&gt;
UBIK.Kernel.UbikEventManager eventMan = Environment.GetEventManager();&lt;br /&gt;
eventMan.InstanceAfterUpdateByChangeNotification += EventMan_InstanceAfterUpdateByChangeNotification;&lt;br /&gt;
eventMan.InstanceBeforeUpdateByChangeNotification += EventMan_InstanceBeforeUpdateByChangeNotification;&lt;br /&gt;
// Don't forget to unregister from the events when the handlers are not needed anymore, to avoid a memory leak:&lt;br /&gt;
// eventMan.InstanceAfterUpdateByChangeNotification -= EventMan_InstanceAfterUpdateByChangeNotification;&lt;br /&gt;
// eventMan.InstanceBeforeUpdateByChangeNotification -= EventMan_InstanceBeforeUpdateByChangeNotification;&lt;br /&gt;
&lt;br /&gt;
// ...&lt;br /&gt;
&lt;br /&gt;
private void EventMan_InstanceBeforeUpdateByChangeNotification(BaseClass sender)&lt;br /&gt;
{&lt;br /&gt;
    // Act before imminent reload, for example:&lt;br /&gt;
    // InvalidateState(sender); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
private void EventMan_InstanceAfterUpdateByChangeNotification(BaseClass sender)&lt;br /&gt;
{&lt;br /&gt;
    // React to change, for example:&lt;br /&gt;
    // UpdateCache(sender); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Configuration_Files/AppSettings.config]]&lt;br /&gt;
* [[User_Groups_and_Rights]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Coding|Change Detection via Change Notifications]]&lt;br /&gt;
[[Category:How-To|Use Change Detection via Change Notifications]]&lt;br /&gt;
[[Category:Studio|Change Detection via Change Notifications]]&lt;br /&gt;
[[Category:Web service|Change Detection via Change Notifications]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=UBIK_Studio_Basics&amp;diff=30610</id>
		<title>UBIK Studio Basics</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=UBIK_Studio_Basics&amp;diff=30610"/>
				<updated>2026-09-25T09:31:01Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: /* Options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UBIK}} Studio is the server application and administrative tool for creating and modifying {{UBIK}} object models. It enables you to transfer your entity-relationship-model into {{UBIK}} MetaClasses and MetaProperties and build up necessary relations. It is also the instrument of choice to manage instances of MetaClasses, edit their property values and create views and queries. This section will provide you with more information on the user interface.&lt;br /&gt;
[[File:UI_Studio.png|thumb|220px|{{UBIK}} Studio]]&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
===Command line arguments===&lt;br /&gt;
&lt;br /&gt;
The following arguments can be passed to and will be recognized by the UBIK.Studio.exe:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; | width = &amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| ''-NOCUSTOM''|| Don't attempt to load the customized object code&lt;br /&gt;
|-&lt;br /&gt;
| ''-NOCUSTOMUI''|| Don't attempt to load the customized UI elements&lt;br /&gt;
|-&lt;br /&gt;
| ''-CUSTOMVERSION:version''|| Attempt to load a specific deployed ''version'' of the customizing instead of the currently released one. Use this option if you want to test a specific customizing, without releasing it to all users.&lt;br /&gt;
|-&lt;br /&gt;
| ''-CONNECTDB''|| Connects automatically to the most recently used database&lt;br /&gt;
|-&lt;br /&gt;
| ''-IGNOREUSAM''|| Ignores the Session Authorization and uses a fallback session if no authorization is granted by the [[USAM|Session]] &lt;br /&gt;
|-&lt;br /&gt;
| ''-DBMAINTENANCE:activity''|| Starts {{UBIK}} Studio in maintenance mode. Possible activities are:&lt;br /&gt;
1 = recompiling of system structures; 2 = recreate MetaProperty views; 3 = recompile database; 4=Transfer Data to Attributes.&lt;br /&gt;
Please do not use this option if you do not have any knowledge about these activities.&lt;br /&gt;
|-|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Attention|Setting these command line arguments might changes the expected behavior of a data model significantly!}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
[[File:UI_UBIKStudioOptions.png|thumb|220px|upright|alt={{UBIK}} Studio settings|{{UBIK}} Studio settings]]&lt;br /&gt;
Locate and click the menu ''File &amp;amp;rarr; Options''. Press {{key press|Apply}} or {{key press|OK}} when you're finished changing the options, or {{key press|Cancel}} if you don't want your changes to be saved. The settings are user-specific and will be stored in your local Windows user profile.&lt;br /&gt;
&lt;br /&gt;
In the options you can configure your database connection by the following parameters&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; | width = &amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| ''AutoConnect''|| If set to true, the system will attempt to automatically connect to the configured database on start up&lt;br /&gt;
|-&lt;br /&gt;
| ''DataBase''|| The name of the instance on the SQL Server&lt;br /&gt;
|-&lt;br /&gt;
| ''DataSource''|| The name of the SQL Server (specify a server via host name, UNC, IP, ...)&lt;br /&gt;
|-&lt;br /&gt;
| ''Language''|| Set the desired database language in [http://en.wikipedia.org/wiki/ISO_639-1 ISO639-1] syntax&lt;br /&gt;
|-&lt;br /&gt;
| ''WindowsAuthentication''|| If set to true, the user and password parameter are ignored and UBIK tries to connect to the SQL Server using the Windows credentials. {{Version/ServerSince|2.5.1}}&lt;br /&gt;
|-&lt;br /&gt;
| ''User''|| SQL Server user name. Only used when WindowsAuthentication is set to false.&lt;br /&gt;
|-&lt;br /&gt;
| ''Password''|| SQL Server password. Only used when WindowsAuthentication is set to false.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Take care that the specified SQL user has appropriate permissions on the database.&lt;br /&gt;
&lt;br /&gt;
Additional options are&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; | width = &amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| ''RecordLifeTime''|| Set how long records are valid before they will be requeried for changes by the kernel; -1 to turn off&lt;br /&gt;
|-&lt;br /&gt;
| ''EnableChangeNotifications''|| If set to true, {{UBIK}} Studio reacts to changes made in other {{UBIK}} sessions and reloads affected cached objects. If set to false, calculated properties that depend on linked objects may continue to display an outdated value until the affected object is reloaded.&lt;br /&gt;
|-&lt;br /&gt;
| ''AutoSaveTime''|| Set how often {{UBIK}} Studio should save all unsaved objects automatically, in minutes; -1 to turn off&lt;br /&gt;
|-&lt;br /&gt;
| ''NotifyOnError''|| Displays a notification if an error occurs; false to turn off&lt;br /&gt;
|-&lt;br /&gt;
| ''NotifyOnWarning''|| Displays a notification if a warning occurs; false to turn off&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:2.5.1|UBIK Studio Basics]]&lt;br /&gt;
[[Category:Studio|UBIK Studio Basics]]&lt;br /&gt;
&lt;br /&gt;
===Database specific settings===&lt;br /&gt;
Once successfully connected to a database, the menu item ''Database &amp;amp;rarr; {database name} settings...'' becomes visible. As the name already states, these are settings that are specific to the very database you are connected to, hence changes also only apply to it.&lt;br /&gt;
&lt;br /&gt;
The following parameters can be read, respectively edited here&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; | width = &amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| ''File store mode''|| readonly; ''UNC'' for a regular filesystem, ''Cloud'' for a cloud storage&lt;br /&gt;
|-&lt;br /&gt;
| ''Data path''|| The path to the root directory of the data storage for this database in ''UNC'' mode; In ''Cloud'' mode the path can be defined as a relative path within the specified cloud container, this parameter can be left empty when using its root directory level.&lt;br /&gt;
|-&lt;br /&gt;
| ''CloudStorageAccount''|| The name of your storage account from your cloud service provider; only evaluated if ''File store mode'' is ''Cloud''&lt;br /&gt;
|-&lt;br /&gt;
| ''CloudStorageKey''|| The authorization key from your cloud service provider to access your cloud storage; only evaluated if ''File store mode'' is ''Cloud''&lt;br /&gt;
|-&lt;br /&gt;
| ''Cloud container name''|| The name of the root cloud container where files for this database will be placed; only evaluated if ''File store mode'' is ''Cloud''&lt;br /&gt;
|-&lt;br /&gt;
| ''Language count''|| readonly; The number of languages currently configured in {{UBIK}}&lt;br /&gt;
|-&lt;br /&gt;
| ''Auto-delete dead links''|| Enable or disable the [[Auto-Delete_Dead_Links|automatic deletion of dead links]] when they are detected.&lt;br /&gt;
|-&lt;br /&gt;
| ''Date format''|| The date/time format to use in this database in [http://en.wikipedia.org/wiki/ISO_8601 ISO8601] syntax&lt;br /&gt;
|-&lt;br /&gt;
| ''Root-Metaclass for Metaproperties''|| readonly; The MetaClass where new Metaproperties will derive from&lt;br /&gt;
|-&lt;br /&gt;
| ''Root-Metaclass for metaclasses''|| readonly; The MetaClass where new MetaClass will derive from&lt;br /&gt;
|-&lt;br /&gt;
| ''SessionManagementType''|| Configure the type of session management that must be used by all UBIK sessions: 0 = Single Local Management, 1 = LAS, 2 = GAS&lt;br /&gt;
|-&lt;br /&gt;
| ''SessionServiceUrl[:Port]''|| If the SessionManagementType is configured to use a LAS or GAS, the ServiceUrl of the AS must be configure here. In the case of an Local management, this setting is ignored.&amp;lt;br /&amp;gt;The port number ''Port'' must be specified only if other than 443 (default for https). &lt;br /&gt;
|-&lt;br /&gt;
| ''BinariesDeployment''|| Configure if the customizing binaries are distributed via a server file share or database.&lt;br /&gt;
|-&lt;br /&gt;
| ''LocalFileDeployment''|| Configure if the local file documents are distributed via a server file share or database.&lt;br /&gt;
|-&lt;br /&gt;
| ''Database TimeZone''|| Configure the time zone informatoin date - values are stored in the sql database. The default value is UTC &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:2.5.1|UBIK Studio Basics]]&lt;br /&gt;
[[Category:Studio|UBIK Studio Basics]]&lt;br /&gt;
&lt;br /&gt;
==Working with {{UBIK}} Studio==&lt;br /&gt;
=== Basic UI elements ===&lt;br /&gt;
====Menu and toolbar====&lt;br /&gt;
The top area of {{UBIK}} Studio features a menu strip:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; | width = &amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Menu!!Menu item!!Shortcut!! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| rowspan = &amp;quot;6&amp;quot; | ''File'' || ''New'' || {{key press|Ctrl|N}} || No purpose yet&lt;br /&gt;
|-&lt;br /&gt;
| ''Open Database'' ||{{key press|Ctrl|O}} || Clicking the item itself will attempt to open the last configured database connection, its sub menu items will show the most recently used connections&lt;br /&gt;
|-&lt;br /&gt;
| ''Clear recent list'' ||-|| Clears the list of recently used database connections&lt;br /&gt;
|-&lt;br /&gt;
| ''Save All'' || {{key press|Ctrl|S}} || Saves all unsaved objects of the current session to the database&lt;br /&gt;
|-&lt;br /&gt;
| ''Options...'' ||-|| Opens the [[#Options|Options]] dialog &lt;br /&gt;
|-&lt;br /&gt;
| ''Exit'' ||-|| Closes {{UBIK}} Studio&lt;br /&gt;
|-&lt;br /&gt;
| rowspan = &amp;quot;5&amp;quot; | ''Database''&lt;br /&gt;
|-&lt;br /&gt;
| ''{database name} settings...'' ||-|| Opens the [[#Database specific settings|specific settings dialog for the currently connected database]]; will only appear once you successfully connected to a database&lt;br /&gt;
|-&lt;br /&gt;
| ''Manage Database...'' ||-|| Opens the [[Database Manager|Management dialog for the current database]]; will also appear if connection to the database failed&lt;br /&gt;
|-&lt;br /&gt;
| ''Sessions...'' ||-|| Opens the [[Session Manager|Management dialog for the current database sessions]]; this menu entry is only available if there is session management configured in the database settings&lt;br /&gt;
|-&lt;br /&gt;
| ''Custom System Objects...'' ||-|| Opens the [[Custom System Objects Dialog|Management dialog for custom system objects]]; will only appear once you successfully connected to a database&lt;br /&gt;
|-&lt;br /&gt;
| rowspan = &amp;quot;2&amp;quot; | ''Build''|| ''Rebuild...'' ||{{key press|F6}}|| Assembles the entire customizing code and displays the result in the [[Compiler|compiler window]]&lt;br /&gt;
|-&lt;br /&gt;
| ''Rebuild and download...'' ||{{key press|Ctrl|F6}} || Assembles the entire customizing code and attempts to deploy it according to the current database settings&lt;br /&gt;
|-&lt;br /&gt;
| rowspan = &amp;quot;5&amp;quot; | ''Tools''&lt;br /&gt;
|-&lt;br /&gt;
| ''View Test Environment...'' ||{{key press|F6}}|| Opens the [[View Test Environment]] window&lt;br /&gt;
|-&lt;br /&gt;
| ''Interface Manager...'' ||{{key press|F10}}|| Opens the [[Interface Manager]] window&lt;br /&gt;
|-&lt;br /&gt;
| ''ACM Manager...'' ||{{key press|F11}}|| Opens the [[ACM Manager]] window&lt;br /&gt;
|-&lt;br /&gt;
| ''Who-Bert'' ||{{key press|F12}}|| Opens the [[Debugger|Code and Workflow debugging]] window&lt;br /&gt;
|-&lt;br /&gt;
| rowspan = &amp;quot;4&amp;quot; | ''View''|| ''New Working Window'' ||{{key press|Ctrl|W}}|| Opens a new working window to host additional controls&lt;br /&gt;
|-&lt;br /&gt;
| ''Unsaved Objects Hierarchy'' ||{{key press|Ctrl|U}}|| Opens a window showing all currently changed, yet unsaved objects in a hierarchical style&lt;br /&gt;
|-&lt;br /&gt;
| ''Plugins'' ||-|| Opens the [[Plugin Modules]] window showing all currently loaded UBIK Plugins&lt;br /&gt;
|-&lt;br /&gt;
| ''Event Tracer'' ||-|| Opens the [[Event Tracer]] window showing all events (errors, warnings, messages) that occured while running the Studio session&lt;br /&gt;
|-&lt;br /&gt;
| rowspan = &amp;quot;3&amp;quot; | ''Help''|| ''UBIK Wiki'' ||{{key press|F1}}|| Opens the {{UBIK}} Wiki, meaning the root of this document&lt;br /&gt;
|-&lt;br /&gt;
| ''UBIK Class Documentation'' ||{{key press|Ctrl|F1}}|| Opens the help file with the {{UBIK}} Class Documentation&lt;br /&gt;
|-&lt;br /&gt;
| ''About'' ||-|| Opens a dialog with Version and [[Licensing]] information&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Status strip====&lt;br /&gt;
The very bottom of the {{UBIK}} Studio window displays a status strip, providing the following information, from left to right:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; | width = &amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Initial value!! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| ''DB''|| Current database: once connected, it will show the connection in the format ''Instance''@''Server''&lt;br /&gt;
|-&lt;br /&gt;
| ''NOT INITIALIZED''|| Current [[customizing|Customizing]]: when successfully loaded, it will display the version information of the instantiated customizing assembly, -1.-1.-1 if loading failed&lt;br /&gt;
|-&lt;br /&gt;
| ''CULTURE''|| Current language and culture in [http://en.wikipedia.org/wiki/ISO_639-1 ISO639-1] format&lt;br /&gt;
|-&lt;br /&gt;
| ''SESSION MANAGEMENT TYPE''|| Displays the type of session management in the current database; Doubleclicking the item opens the [[Session_Manager|Session Manager Dialog]] for all sessions in the current database if a multi-session management type is used&lt;br /&gt;
|-&lt;br /&gt;
| ''SESSION''|| Displays the name of the [[login|Login]] of the current [[session|Session]]; Right click on this item to switch into [[#Admin mode|Admin mode]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Status Notification ===&lt;br /&gt;
[[File:UI_StatusNotification.png|thumb|220px|upright|alt={{UBIK}} Studio status notification|{{UBIK}} Studio status notification]]&lt;br /&gt;
{{UBIK}} Studio informs the user about important events happening within the UBIK system.Therefore the Status strip has a notification area on the right showing a yellow notification icon once there has occured an event the user should be aware of. These events are warning and error messages or also a reminder from the {{UBIK}} Customizing Control to rebuild changed customizing code in order to provide the expected system behaviour. If there is a certain action involved to handle this notification, it is possible to get there immediately (e.g. open the [[Event Tracer]] window to review a warning) by clicking on the notification icon itself.&lt;br /&gt;
&lt;br /&gt;
=== Working area and controls ===&lt;br /&gt;
[[File:UI_UBIKStudio.png|thumb|220px|upright|alt={{UBIK}} Studio main window|{{UBIK}} Studio main window]]&lt;br /&gt;
The main window of {{UBIK}} Studio is split into 3 sections, where each of the 3 areas can hold an arbitrary amount of controls. The arrangement of the controls is user specific and can be saved in the user's profile. In addition to the predefined sections, the user interface can be extended with working windows, where each working window can again hold any amount of controls:&lt;br /&gt;
&lt;br /&gt;
:''View &amp;amp;rarr; New Working Window'' or {{key press|Ctrl|W}}&lt;br /&gt;
&lt;br /&gt;
However, such working windows are considered temporary and are therefore not made persistent when the layout is saved.&lt;br /&gt;
&lt;br /&gt;
====Using and connecting controls====&lt;br /&gt;
Each control provides different functionality for object creation/modification. Clicking the header of an empty tab strip in one of these areas with the left mouse button will bring up a context menu, that allows you to create a new tab page hosting one of the following controls:&lt;br /&gt;
&lt;br /&gt;
[[File:UI_UBIKControlsOverview.png|thumb|220px|upright|alt={{UBIK}} Studio controls|{{UBIK}} Studio controls]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; | width = &amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Control !! Preview !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Class Browser]]''|| [[File:UI_ClassBrowser.png|220x140px]]  || Navigate through, create and delete MetaClasses and instances&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Class Details]]''|| [[File:UI_ClassDetails.png|220x140px]] || Design MetaClasses in their details; add/remove MetaProperties and classifications&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Bulk Editor]]''|| [[File:UI_BulkEditor.png|220x140px]] || Create and edit multiple instances of a MetaClass in table style&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Code Editor]]''|| [[File:UI_CodeEditor.png|220x140px]] || Implement MetaClass specific functionality using C#&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Relation Editor]]''|| [[File:UI_RelationEditor.png|220x140px]] || Relate objects to each others and edit relational data&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Object Explorer]]''|| [[File:UI_ObjectExplorer.png|220x140px]] || Display and edit all exposed properties of objects (list style)&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Object Editor]]''|| [[File:UI_ObjectEditor.png|220x140px]] || Edit the property values of a single object&lt;br /&gt;
|-&lt;br /&gt;
| ''[[Workflow Editor]]''|| [[File:UI_WorkflowEditor.png|220x140px]] || View, design and run customer specific workflows&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
All controls in the {{UBIK}} working area offer the following interaction functionality: &lt;br /&gt;
* Set a control as [[ListenTo]] source of another control by dragging an object from the source control and drop it on the header of the hosting tab of the target control&lt;br /&gt;
* Release ListenTo by clicking the respective header and selecting the ''ListenTo: control name'' menu item&lt;br /&gt;
* Reconnect to the last known ListenTo source (if applicable) by selecting the ''Reconnect to:'' menu item&lt;br /&gt;
* Close a control by right clicking the tab header and selecting the ''Close'' menu item.&lt;br /&gt;
&lt;br /&gt;
{{Hint|Drag&amp;amp;Drop with the right mouse button to only set the context object of a control, without connecting ListenTo}}&lt;br /&gt;
{{Hint|Drag&amp;amp;Drop an object at an empty tab strip will let you select the control afterwards and subsequently sets the context object}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===User rights===&lt;br /&gt;
As of now, {{UBIK}} Studio doesn't feature a real user management system for designing data models. Although there is a distinction made between an admin and a non-admin user, with the very purpose of protecting system objects against unintended manipulation.&lt;br /&gt;
&lt;br /&gt;
However, {{UBIK}} fetches the current Windows user and creates the environment with this credentials, storing the login information on a [[Session|session]] object.&lt;br /&gt;
&lt;br /&gt;
====Admin mode====&lt;br /&gt;
[[File:UI_Property_editable_05.PNG|220 px|thumb|border|alt=Admin mode|Admin mode]]&lt;br /&gt;
Right click on the user name in the status strip and select the menu item ''Admin mode'' to switch all active controls to [[Admin mode|admin mode]]. As long as you are in admin mode, the user name in the status strip will appear red.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Be careful, manipulating system objects might results in instability of {{UBIK}} Studio or other {{UBIK}} components!}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* [[:Category:Studio controls|Studio controls]]&lt;br /&gt;
* [[HowTo:Install_UBIK_Studio|How to install UBIK Studio]]&lt;br /&gt;
* [[UBIK_Console]]&lt;br /&gt;
*[[UBIK_Studio_Manual|UBIK Studio Manual]]&lt;br /&gt;
&lt;br /&gt;
{{Category/Version|2.5.1}}&lt;br /&gt;
&lt;br /&gt;
[[Category:2.5.1|UBIK Studio Basics]]&lt;br /&gt;
[[Category:Studio|UBIK Studio Basics]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=HowTo:Use_Change_Detection_via_Change_Notifications&amp;diff=30609</id>
		<title>HowTo:Use Change Detection via Change Notifications</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=HowTo:Use_Change_Detection_via_Change_Notifications&amp;diff=30609"/>
				<updated>2026-09-25T09:26:00Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In {{UBIK}} 4, there is a mechanism for the automatic detection of changes by other {{UBIK}} processes, which provide notifications for their changes.&lt;br /&gt;
== Configuration ==&lt;br /&gt;
The UBIKContent web service can be configured{{Version/ServerSince|4.9.0}} to react to such notifications by updating its cache; mostly the [[User_Groups_and_Rights|user group cache used for rights evaluation]].&lt;br /&gt;
&amp;lt;br/&amp;gt;Change detection can be configured in the [[Configuration_Files/AppSettings.config|application settings of the UBIKContent web service]].{{Version/ServerSince|4.9.0}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|&lt;br /&gt;
When '''EnableChangeNotifications''' is disabled, calculated properties that depend on linked objects may not be updated immediately across different UBIK sessions.&lt;br /&gt;
&lt;br /&gt;
Changes made to a linked object in another session may not be reflected until the affected object is reloaded.&lt;br /&gt;
&lt;br /&gt;
Enable '''EnableChangeNotifications''' to ensure that changes are propagated across sessions and dependent calculated values are updated automatically.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Customizing ==&lt;br /&gt;
There are multiple possibilities to react to change detections via customizing.&lt;br /&gt;
=== Overriding the event handler of an instance ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
protected virtual void OnBeforeUpdateByChangeNotification()&lt;br /&gt;
{&lt;br /&gt;
    // Called before an already cached instance will be reloaded from the database because of a change notification.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
protected virtual void OnAfterUpdateByChangeNotification()&lt;br /&gt;
{ &lt;br /&gt;
    // Called after an instance was reloaded from the database because of a change notification.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Attaching a new event handler to the UBIKEventManager ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
// In Plugin code or custom code library, or anywhere else:&lt;br /&gt;
&lt;br /&gt;
UBIK.Kernel.UbikEventManager eventMan = Environment.GetEventManager();&lt;br /&gt;
eventMan.InstanceAfterUpdateByChangeNotification += EventMan_InstanceAfterUpdateByChangeNotification;&lt;br /&gt;
eventMan.InstanceBeforeUpdateByChangeNotification += EventMan_InstanceBeforeUpdateByChangeNotification;&lt;br /&gt;
// Don't forget to unregister from the events when the handlers are not needed anymore, to avoid a memory leak:&lt;br /&gt;
// eventMan.InstanceAfterUpdateByChangeNotification -= EventMan_InstanceAfterUpdateByChangeNotification;&lt;br /&gt;
// eventMan.InstanceBeforeUpdateByChangeNotification -= EventMan_InstanceBeforeUpdateByChangeNotification;&lt;br /&gt;
&lt;br /&gt;
// ...&lt;br /&gt;
&lt;br /&gt;
private void EventMan_InstanceBeforeUpdateByChangeNotification(BaseClass sender)&lt;br /&gt;
{&lt;br /&gt;
    // Act before imminent reload, for example:&lt;br /&gt;
    // InvalidateState(sender); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
private void EventMan_InstanceAfterUpdateByChangeNotification(BaseClass sender)&lt;br /&gt;
{&lt;br /&gt;
    // React to change, for example:&lt;br /&gt;
    // UpdateCache(sender); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Configuration_Files/AppSettings.config]]&lt;br /&gt;
* [[User_Groups_and_Rights]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Coding|Change Detection via Change Notifications]]&lt;br /&gt;
[[Category:How-To|Use Change Detection via Change Notifications]]&lt;br /&gt;
[[Category:Studio|Change Detection via Change Notifications]]&lt;br /&gt;
[[Category:Web service|Change Detection via Change Notifications]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_Replication_Jobs&amp;diff=30601</id>
		<title>MRO Replication Jobs</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_Replication_Jobs&amp;diff=30601"/>
				<updated>2026-09-22T07:23:24Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: /* Replication process */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MRO replication jobs generate work packages from configured maintenance plans. The processing is divided into two steps: the Maintenance Planning Orchestrator schedules jobs for eligible maintenance plans, and a separate EnterpriseService executes the scheduled jobs.&lt;br /&gt;
&lt;br /&gt;
This page describes the available MRO replication jobs, the required BasicClient App and EnterpriseService configuration, and a basic setup for testing or demonstrating MRO replication.&lt;br /&gt;
&lt;br /&gt;
For the configuration and behaviour of maintenance plans, see [[MROMaintenancePlans]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Replication process ==&lt;br /&gt;
&lt;br /&gt;
MRO replication uses the following process:&lt;br /&gt;
&lt;br /&gt;
# The Maintenance Planning Orchestrator searches for maintenance plans that are ready for automatic work package generation.&lt;br /&gt;
# Each eligible maintenance plan provides the replication job required for its plan type.&lt;br /&gt;
# The orchestrator schedules the job in '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
# A separate EnterpriseService processes the scheduled job.&lt;br /&gt;
# The replication job uses the template work package and the linked '''INSTANCE_REPLICATION''' object to generate the work package.&lt;br /&gt;
&lt;br /&gt;
Scheduling a job does not execute the replication immediately. It creates a dispatching job containing the information required for later execution.&lt;br /&gt;
&lt;br /&gt;
'''For the basic use, the scheduling and execution processes can be configured in two separate UBIK.Studio folders.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Available MRO replication jobs ==&lt;br /&gt;
&lt;br /&gt;
MRO provides two replication jobs.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Job&lt;br /&gt;
! Inheritance&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| '''ReplicateWorkpackageJob'''&lt;br /&gt;
| Derives from '''DispatchingJob''' for '''WorkPackage'''&lt;br /&gt;
| Generates a work package from the template and replication configuration of a maintenance plan.&lt;br /&gt;
|-&lt;br /&gt;
| '''ReplicateRoundWorkpackageJob'''&lt;br /&gt;
| Derives from '''ReplicateWorkpackageJob'''&lt;br /&gt;
| Generates the main work package of a maintenance round and the additional work packages configured by its child maintenance plans.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Both jobs use the same scheduling, dispatching, and execution infrastructure. The maintenance plan implementation returns the appropriate job when the Maintenance Planning Orchestrator requests its replication job.&lt;br /&gt;
&lt;br /&gt;
=== Work package replication ===&lt;br /&gt;
&lt;br /&gt;
A standard maintenance plan uses '''ReplicateWorkpackageJob'''.&lt;br /&gt;
&lt;br /&gt;
The maintenance plan provides:&lt;br /&gt;
&lt;br /&gt;
* a template work package through '''LK_WP_TMPL'''&lt;br /&gt;
* an '''INSTANCE_REPLICATION''' object through '''LK_REPLICATION_CONFIG'''&lt;br /&gt;
* the maintenance plan settings required for automatic work package generation&lt;br /&gt;
&lt;br /&gt;
The linked '''INSTANCE_REPLICATION''' object defines how the template work package is copied. The generated work package is not marked as a template.&lt;br /&gt;
&lt;br /&gt;
For the complete maintenance plan prerequisites and the properties set on generated work packages, see [[MROMaintenancePlans]].&lt;br /&gt;
&lt;br /&gt;
=== Round work package replication ===&lt;br /&gt;
&lt;br /&gt;
A '''RoundMaintenancePlan''' uses '''ReplicateRoundWorkpackageJob'''.&lt;br /&gt;
&lt;br /&gt;
The job creates the main work package from the Round Maintenance Plan. It then processes the child maintenance plans linked through '''SYSREL_ROUND_RELATION''' and creates their additional work packages. The additional work packages are assigned to the main round work package through '''TASK_OWNER'''.&lt;br /&gt;
&lt;br /&gt;
Round work package replication uses the same BasicClient App, EnterpriseService, and dispatching setup as standard work package replication. The maintenance plan implementation determines which job is scheduled.&lt;br /&gt;
&lt;br /&gt;
For the configuration and behaviour of Round Maintenance Plans, see [[MROMaintenancePlans]].&lt;br /&gt;
&lt;br /&gt;
== Scheduling and execution ==&lt;br /&gt;
&lt;br /&gt;
=== Maintenance Planning Orchestrator ===&lt;br /&gt;
&lt;br /&gt;
The scheduling process executes the following method:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| Class&lt;br /&gt;
| '''UBIK.MRO.MaintenancePlanningOrchestrator'''&lt;br /&gt;
|-&lt;br /&gt;
| Method&lt;br /&gt;
| '''Apply'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Maintenance Planning Orchestrator searches for eligible maintenance plans, requests the appropriate replication job from each plan, and schedules the job in '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
&lt;br /&gt;
=== Scheduled Orchestrator ===&lt;br /&gt;
&lt;br /&gt;
The execution process executes the following method:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| Class&lt;br /&gt;
| '''UBIK.ServiceTask.Orchestration.ScheduledOrchestrator'''&lt;br /&gt;
|-&lt;br /&gt;
| Method&lt;br /&gt;
| '''Apply'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Scheduled Orchestrator searches '''MRO_JOB_DISPATCHING''' for scheduled jobs and executes them.&lt;br /&gt;
&lt;br /&gt;
== MRO job dispatching ==&lt;br /&gt;
&lt;br /&gt;
'''MRO_JOB_DISPATCHING''' is the specialised DISPATCHING Interface Administration MetaClass used for MRO replication jobs.&lt;br /&gt;
&lt;br /&gt;
The orchestration process creates the required job objects automatically. Project teams do not need to create these objects manually.&lt;br /&gt;
&lt;br /&gt;
The execution EnterpriseService identifies '''MRO_JOB_DISPATCHING''' through the '''InterfaceAdmin''' value in '''MRO.PARAM.json'''.&lt;br /&gt;
&lt;br /&gt;
For general information about Interface Administration objects, see [[InterfaceAdministration]].&lt;br /&gt;
&lt;br /&gt;
=== Job statuses ===&lt;br /&gt;
&lt;br /&gt;
The execution status indicates the current state or result of a dispatching job.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Status&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Undefined&lt;br /&gt;
| The execution state is undefined.&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Success&lt;br /&gt;
| The execution completed successfully.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Terminated&lt;br /&gt;
| The execution was terminated.&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Conflict&lt;br /&gt;
| An export conflict occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Started&lt;br /&gt;
| Execution has started but has not yet completed.&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Scheduled&lt;br /&gt;
| The job is scheduled but has not yet been executed.&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| Error&lt;br /&gt;
| An error occurred during execution.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In a basic replication test, a newly scheduled job first has the status '''Scheduled'''. After successful execution, its status changes to '''Success'''.&lt;br /&gt;
&lt;br /&gt;
== Application setup ==&lt;br /&gt;
&lt;br /&gt;
A basic test or demonstration uses two separate UBIK.Studio folders.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Studio folder&lt;br /&gt;
! Purpose&lt;br /&gt;
! Required applications&lt;br /&gt;
|-&lt;br /&gt;
| Scheduling folder&lt;br /&gt;
| Provides the EnterpriseService web interface and starts the Maintenance Planning Orchestrator through the BasicClient App.&lt;br /&gt;
| '''UBIK.EnterpriseService.exe''' and '''UBIK.EnterpriseService.BasicClient.App.exe'''&lt;br /&gt;
|-&lt;br /&gt;
| Execution folder&lt;br /&gt;
| Runs the Scheduled Orchestrator and executes jobs from '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
| '''UBIK.EnterpriseService.exe'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The folder names and paths in the examples can be changed. Every configured path must point to the corresponding file in the local deployment.&lt;br /&gt;
&lt;br /&gt;
== Scheduling folder setup ==&lt;br /&gt;
&lt;br /&gt;
The scheduling folder requires the following files:&lt;br /&gt;
&lt;br /&gt;
* '''UBIK.EnterpriseService.exe'''&lt;br /&gt;
* '''UBIK.EnterpriseService.exe.config'''&lt;br /&gt;
* '''UBIK.EnterpriseService.BasicClient.App.exe'''&lt;br /&gt;
* '''UBIK.EnterpriseService.BasicClient.App.exe.config'''&lt;br /&gt;
* '''JSON\ReplicateWorkpackageJob.json'''&lt;br /&gt;
&lt;br /&gt;
=== Configure the scheduling EnterpriseService ===&lt;br /&gt;
&lt;br /&gt;
In '''UBIK.EnterpriseService.exe.config''', configure the following application settings:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Default value&lt;br /&gt;
! Required value&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| '''ExecuteWebInterface'''&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| Enables the web interface used by the BasicClient App.&lt;br /&gt;
|-&lt;br /&gt;
| '''ExecuteTaskByJsonFile'''&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| The scheduling EnterpriseService does not execute the recurring task configuration used by the execution EnterpriseService.&lt;br /&gt;
|-&lt;br /&gt;
| '''WebInterfacePort'''&lt;br /&gt;
| 9000&lt;br /&gt;
| 9000&lt;br /&gt;
| Defines the port used by the web interface in this example.&lt;br /&gt;
|-&lt;br /&gt;
| '''WebInterfaceHost'''&lt;br /&gt;
| http://localhost&lt;br /&gt;
| http://localhost&lt;br /&gt;
| Defines the host used by the web interface in this example.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Configure the BasicClient App ===&lt;br /&gt;
&lt;br /&gt;
In '''UBIK.EnterpriseService.BasicClient.App.exe.config''', configure the following application settings:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Example value&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| '''BaseAddress'''&lt;br /&gt;
| http://localhost:9000&lt;br /&gt;
| Identifies the web interface exposed by the scheduling EnterpriseService.&lt;br /&gt;
|-&lt;br /&gt;
| '''PathToBasicEnterpriseServiceRequestJsonFile'''&lt;br /&gt;
| Full path to ReplicateWorkpackageJob.json&lt;br /&gt;
| Identifies the request file that starts the Maintenance Planning Orchestrator.&lt;br /&gt;
|-&lt;br /&gt;
| '''PathToBasicEnterpriseServiceRequestJsonFileList'''&lt;br /&gt;
| Empty&lt;br /&gt;
| No request file list is used in this setup.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''BaseAddress''' must match '''WebInterfaceHost''' and '''WebInterfacePort''' in the scheduling EnterpriseService configuration. Replace the example path with the actual path to '''ReplicateWorkpackageJob.json'''.&lt;br /&gt;
&lt;br /&gt;
=== Configure ReplicateWorkpackageJob.json ===&lt;br /&gt;
&lt;br /&gt;
Create '''ReplicateWorkpackageJob.json''' in the JSON folder and configure the target database, orchestrator class, and method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;SSPI&amp;quot;: true,&lt;br /&gt;
  &amp;quot;SQLUser&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;SQLPassword&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;SQLServer&amp;quot;: &amp;quot;(localdb)\\MSSQLLocalDB&amp;quot;,&lt;br /&gt;
  &amp;quot;SQLInitialCatalog&amp;quot;: &amp;quot;JOB.TEST&amp;quot;,&lt;br /&gt;
  &amp;quot;ClassFullname&amp;quot;: &amp;quot;UBIK.MRO.MaintenancePlanningOrchestrator&amp;quot;,&lt;br /&gt;
  &amp;quot;MethodName&amp;quot;: &amp;quot;Apply&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adapt the database settings to the target database. Keep '''ClassFullname''' and '''MethodName''' as shown so that the request executes '''UBIK.MRO.MaintenancePlanningOrchestrator.Apply'''.&lt;br /&gt;
&lt;br /&gt;
== Execution folder setup ==&lt;br /&gt;
&lt;br /&gt;
The execution folder requires the following files:&lt;br /&gt;
&lt;br /&gt;
* '''UBIK.EnterpriseService.exe'''&lt;br /&gt;
* '''UBIK.EnterpriseService.exe.config'''&lt;br /&gt;
* '''JSON\MRO.json'''&lt;br /&gt;
* '''JSON\MRO.PARAM.json'''&lt;br /&gt;
&lt;br /&gt;
=== Configure the execution EnterpriseService ===&lt;br /&gt;
&lt;br /&gt;
In '''UBIK.EnterpriseService.exe.config''', configure the following application settings:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Default value&lt;br /&gt;
! Required value&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| '''PluginExecutionConfigPath'''&lt;br /&gt;
| Empty&lt;br /&gt;
| Full path to '''MRO.json'''&lt;br /&gt;
| Identifies the recurring task configuration.&lt;br /&gt;
|-&lt;br /&gt;
| '''ExecuteWebInterface'''&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| The execution EnterpriseService does not require the web interface in this setup.&lt;br /&gt;
|-&lt;br /&gt;
| '''ExecuteTaskByJsonFile'''&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| Enables execution of the tasks configured in '''MRO.json'''.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Configure MRO.json ===&lt;br /&gt;
&lt;br /&gt;
Create '''MRO.json''' and configure the database connection, execution interval, Scheduled Orchestrator, and path to '''MRO.PARAM.json''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;RepeateEveryMinutes&amp;quot;: 0.2,&lt;br /&gt;
  &amp;quot;SqlConnectionDefinition&amp;quot;: {&lt;br /&gt;
    &amp;quot;SSPI&amp;quot;: true,&lt;br /&gt;
    &amp;quot;SQLUser&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
    &amp;quot;SQLPassword&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
    &amp;quot;SQLServer&amp;quot;: &amp;quot;(localdb)\\MSSQLLocalDB&amp;quot;,&lt;br /&gt;
    &amp;quot;SQLInitialCatalog&amp;quot;: &amp;quot;JOB.TEST&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;Tasks&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;ClassFullname&amp;quot;: &amp;quot;UBIK.ServiceTask.Orchestration.ScheduledOrchestrator&amp;quot;,&lt;br /&gt;
      &amp;quot;MethodName&amp;quot;: &amp;quot;Apply&amp;quot;,&lt;br /&gt;
      &amp;quot;MethodParameterPathFullName&amp;quot;: &amp;quot;&amp;lt;full path to MRO.PARAM.json&amp;gt;&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adapt the database settings and '''MethodParameterPathFullName''' to the target deployment. Keep '''ClassFullname''' and '''MethodName''' as shown so that the task executes '''UBIK.ServiceTask.Orchestration.ScheduledOrchestrator.Apply'''.&lt;br /&gt;
&lt;br /&gt;
'''RepeateEveryMinutes''' defines how often the execution EnterpriseService checks for scheduled jobs. A value of 0 causes continuous checking. The value 0.2 can be used for a demonstration where continuous checking is not required.&lt;br /&gt;
&lt;br /&gt;
=== Configure MRO.PARAM.json ===&lt;br /&gt;
&lt;br /&gt;
Create '''MRO.PARAM.json''' and configure the UID of '''MRO_JOB_DISPATCHING''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;InterfaceAdmin&amp;quot;: &amp;quot;BBAF1C9E-8F3B-4C9A-9E2D-5F7A1C3E4B6D&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The '''InterfaceAdmin''' value identifies '''MRO_JOB_DISPATCHING''' for the Scheduled Orchestrator.&lt;br /&gt;
&lt;br /&gt;
== Maintenance plan prerequisites ==&lt;br /&gt;
&lt;br /&gt;
For a basic work package replication scenario, configure:&lt;br /&gt;
&lt;br /&gt;
* a concrete maintenance plan type such as '''CyclicMaintenancePlan'''&lt;br /&gt;
* an asset through '''LK_ASSET'''&lt;br /&gt;
* a template work package through '''LK_WP_TMPL'''&lt;br /&gt;
* an '''INSTANCE_REPLICATION''' object through '''LK_REPLICATION_CONFIG'''&lt;br /&gt;
* '''PLAN_STATUS''' as Active&lt;br /&gt;
* '''AUTO_CREATE''' as enabled&lt;br /&gt;
* planning dates that make the plan eligible for generation&lt;br /&gt;
* a template work package with '''ISTEMPLATE''' set&lt;br /&gt;
&lt;br /&gt;
The maintenance plan must not already have an open generated work package. Detailed generation conditions are documented in [[MROMaintenancePlans]].&lt;br /&gt;
&lt;br /&gt;
== Basic test or demonstration ==&lt;br /&gt;
&lt;br /&gt;
=== Prepare the maintenance plan ===&lt;br /&gt;
&lt;br /&gt;
# Open the database in UBIK.Studio.&lt;br /&gt;
# Create or select a valid maintenance plan.&lt;br /&gt;
# Assign the required asset through '''LK_ASSET'''.&lt;br /&gt;
# Assign a template work package through '''LK_WP_TMPL'''.&lt;br /&gt;
# Verify that '''ISTEMPLATE''' is set on the template work package.&lt;br /&gt;
# Assign an '''INSTANCE_REPLICATION''' object through '''LK_REPLICATION_CONFIG'''.&lt;br /&gt;
# Set '''PLAN_STATUS''' to Active.&lt;br /&gt;
# Enable '''AUTO_CREATE'''.&lt;br /&gt;
# Configure the planning dates so that '''EARLIEST_GENERATION_DATE''' has been reached.&lt;br /&gt;
# Verify that the maintenance plan has no open generated work package.&lt;br /&gt;
&lt;br /&gt;
=== Schedule the job ===&lt;br /&gt;
&lt;br /&gt;
# Start '''UBIK.EnterpriseService.exe''' in the scheduling folder.&lt;br /&gt;
# Start '''UBIK.EnterpriseService.BasicClient.App.exe''' manually, or start it through a configured Windows Task Scheduler task.&lt;br /&gt;
# The BasicClient App sends the request defined in '''ReplicateWorkpackageJob.json''' to the scheduling EnterpriseService.&lt;br /&gt;
# '''UBIK.MRO.MaintenancePlanningOrchestrator.Apply''' searches for eligible maintenance plans and schedules their replication jobs.&lt;br /&gt;
&lt;br /&gt;
=== Verify the scheduled job ===&lt;br /&gt;
&lt;br /&gt;
# Open '''MRO_JOB_DISPATCHING''' in UBIK.Studio.&lt;br /&gt;
# Verify that a job object was created for the eligible maintenance plan.&lt;br /&gt;
# Verify that '''INTERFACE_EXECUTION_STATUS''' is Scheduled.&lt;br /&gt;
# If the execution EnterpriseService has not been started, verify that no generated work package exists yet.&lt;br /&gt;
&lt;br /&gt;
=== Execute the job ===&lt;br /&gt;
&lt;br /&gt;
# Start '''UBIK.EnterpriseService.exe''' in the execution folder.&lt;br /&gt;
# The EnterpriseService executes '''UBIK.ServiceTask.Orchestration.ScheduledOrchestrator.Apply''' according to '''MRO.json'''.&lt;br /&gt;
# The Scheduled Orchestrator reads the scheduled job from '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
# The configured replication job generates the work package.&lt;br /&gt;
&lt;br /&gt;
=== Verify the result ===&lt;br /&gt;
&lt;br /&gt;
# Refresh '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
# Verify that the job status is Success.&lt;br /&gt;
# Refresh the Work Package MetaClass.&lt;br /&gt;
# Verify that a new work package was created.&lt;br /&gt;
# Verify that '''ISTEMPLATE''' is not set on the generated work package.&lt;br /&gt;
# Verify the links and planning values described in [[MROMaintenancePlans]].&lt;br /&gt;
&lt;br /&gt;
For a Round Maintenance Plan, also verify that:&lt;br /&gt;
&lt;br /&gt;
* the main round work package was created&lt;br /&gt;
* the child maintenance plans produced the configured additional work packages&lt;br /&gt;
* the additional work packages are assigned to the main round work package through '''TASK_OWNER'''&lt;br /&gt;
&lt;br /&gt;
== Triggering the scheduling process ==&lt;br /&gt;
&lt;br /&gt;
For a manual test or demonstration, start '''UBIK.EnterpriseService.BasicClient.App.exe''' manually.&lt;br /&gt;
&lt;br /&gt;
For recurring execution, a Windows Task Scheduler task can start '''UBIK.EnterpriseService.BasicClient.App.exe'''. The executable path is configured in the task. The request and target orchestrator are configured in '''UBIK.EnterpriseService.BasicClient.App.exe.config''' and '''ReplicateWorkpackageJob.json'''.&lt;br /&gt;
&lt;br /&gt;
Running the Maintenance Planning Orchestrator processes all eligible maintenance plans.&lt;br /&gt;
&lt;br /&gt;
== Configuration summary ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Component&lt;br /&gt;
! Configuration&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| Scheduling EnterpriseService&lt;br /&gt;
| '''ExecuteWebInterface''' = 1&lt;br /&gt;
| Exposes the web interface used by the BasicClient App.&lt;br /&gt;
|-&lt;br /&gt;
| BasicClient App&lt;br /&gt;
| '''PathToBasicEnterpriseServiceRequestJsonFile'''&lt;br /&gt;
| Points to '''ReplicateWorkpackageJob.json'''.&lt;br /&gt;
|-&lt;br /&gt;
| Scheduling request&lt;br /&gt;
| '''UBIK.MRO.MaintenancePlanningOrchestrator.Apply'''&lt;br /&gt;
| Searches for eligible maintenance plans and schedules their jobs.&lt;br /&gt;
|-&lt;br /&gt;
| Execution EnterpriseService&lt;br /&gt;
| '''ExecuteTaskByJsonFile''' = 1&lt;br /&gt;
| Enables execution using '''MRO.json'''.&lt;br /&gt;
|-&lt;br /&gt;
| Execution task&lt;br /&gt;
| '''UBIK.ServiceTask.Orchestration.ScheduledOrchestrator.Apply'''&lt;br /&gt;
| Processes scheduled dispatching jobs.&lt;br /&gt;
|-&lt;br /&gt;
| Execution parameter&lt;br /&gt;
| '''InterfaceAdmin'''&lt;br /&gt;
| Identifies '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
|-&lt;br /&gt;
| Maintenance plan&lt;br /&gt;
| '''LK_REPLICATION_CONFIG'''&lt;br /&gt;
| Links directly to the '''INSTANCE_REPLICATION''' object used to copy the template work package.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[MROMaintenancePlans]]&lt;br /&gt;
* [[InterfaceAdministration]]&lt;br /&gt;
* [[InterfaceExecution]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_Replication_Jobs&amp;diff=30600</id>
		<title>MRO Replication Jobs</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_Replication_Jobs&amp;diff=30600"/>
				<updated>2026-09-22T07:21:37Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: /* MRO Replication Jobs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MRO replication jobs generate work packages from configured maintenance plans. The processing is divided into two steps: the Maintenance Planning Orchestrator schedules jobs for eligible maintenance plans, and a separate EnterpriseService executes the scheduled jobs.&lt;br /&gt;
&lt;br /&gt;
This page describes the available MRO replication jobs, the required BasicClient App and EnterpriseService configuration, and a basic setup for testing or demonstrating MRO replication.&lt;br /&gt;
&lt;br /&gt;
For the configuration and behaviour of maintenance plans, see [[MROMaintenancePlans]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Replication process ==&lt;br /&gt;
&lt;br /&gt;
MRO replication uses the following process:&lt;br /&gt;
&lt;br /&gt;
# The Maintenance Planning Orchestrator searches for maintenance plans that are ready for automatic work package generation.&lt;br /&gt;
# Each eligible maintenance plan provides the replication job required for its plan type.&lt;br /&gt;
# The orchestrator schedules the job in '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
# A separate EnterpriseService processes the scheduled job.&lt;br /&gt;
# The replication job uses the template work package and the linked '''INSTANCE_REPLICATION''' object to generate the work package.&lt;br /&gt;
&lt;br /&gt;
Scheduling a job does not execute the replication immediately. It creates a dispatching job containing the information required for later execution.&lt;br /&gt;
&lt;br /&gt;
'''For a basic test or demonstration, the scheduling and execution processes can be configured in two separate UBIK.Studio folders.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Available MRO replication jobs ==&lt;br /&gt;
&lt;br /&gt;
MRO provides two replication jobs.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Job&lt;br /&gt;
! Inheritance&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| '''ReplicateWorkpackageJob'''&lt;br /&gt;
| Derives from '''DispatchingJob''' for '''WorkPackage'''&lt;br /&gt;
| Generates a work package from the template and replication configuration of a maintenance plan.&lt;br /&gt;
|-&lt;br /&gt;
| '''ReplicateRoundWorkpackageJob'''&lt;br /&gt;
| Derives from '''ReplicateWorkpackageJob'''&lt;br /&gt;
| Generates the main work package of a maintenance round and the additional work packages configured by its child maintenance plans.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Both jobs use the same scheduling, dispatching, and execution infrastructure. The maintenance plan implementation returns the appropriate job when the Maintenance Planning Orchestrator requests its replication job.&lt;br /&gt;
&lt;br /&gt;
=== Work package replication ===&lt;br /&gt;
&lt;br /&gt;
A standard maintenance plan uses '''ReplicateWorkpackageJob'''.&lt;br /&gt;
&lt;br /&gt;
The maintenance plan provides:&lt;br /&gt;
&lt;br /&gt;
* a template work package through '''LK_WP_TMPL'''&lt;br /&gt;
* an '''INSTANCE_REPLICATION''' object through '''LK_REPLICATION_CONFIG'''&lt;br /&gt;
* the maintenance plan settings required for automatic work package generation&lt;br /&gt;
&lt;br /&gt;
The linked '''INSTANCE_REPLICATION''' object defines how the template work package is copied. The generated work package is not marked as a template.&lt;br /&gt;
&lt;br /&gt;
For the complete maintenance plan prerequisites and the properties set on generated work packages, see [[MROMaintenancePlans]].&lt;br /&gt;
&lt;br /&gt;
=== Round work package replication ===&lt;br /&gt;
&lt;br /&gt;
A '''RoundMaintenancePlan''' uses '''ReplicateRoundWorkpackageJob'''.&lt;br /&gt;
&lt;br /&gt;
The job creates the main work package from the Round Maintenance Plan. It then processes the child maintenance plans linked through '''SYSREL_ROUND_RELATION''' and creates their additional work packages. The additional work packages are assigned to the main round work package through '''TASK_OWNER'''.&lt;br /&gt;
&lt;br /&gt;
Round work package replication uses the same BasicClient App, EnterpriseService, and dispatching setup as standard work package replication. The maintenance plan implementation determines which job is scheduled.&lt;br /&gt;
&lt;br /&gt;
For the configuration and behaviour of Round Maintenance Plans, see [[MROMaintenancePlans]].&lt;br /&gt;
&lt;br /&gt;
== Scheduling and execution ==&lt;br /&gt;
&lt;br /&gt;
=== Maintenance Planning Orchestrator ===&lt;br /&gt;
&lt;br /&gt;
The scheduling process executes the following method:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| Class&lt;br /&gt;
| '''UBIK.MRO.MaintenancePlanningOrchestrator'''&lt;br /&gt;
|-&lt;br /&gt;
| Method&lt;br /&gt;
| '''Apply'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Maintenance Planning Orchestrator searches for eligible maintenance plans, requests the appropriate replication job from each plan, and schedules the job in '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
&lt;br /&gt;
=== Scheduled Orchestrator ===&lt;br /&gt;
&lt;br /&gt;
The execution process executes the following method:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| Class&lt;br /&gt;
| '''UBIK.ServiceTask.Orchestration.ScheduledOrchestrator'''&lt;br /&gt;
|-&lt;br /&gt;
| Method&lt;br /&gt;
| '''Apply'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Scheduled Orchestrator searches '''MRO_JOB_DISPATCHING''' for scheduled jobs and executes them.&lt;br /&gt;
&lt;br /&gt;
== MRO job dispatching ==&lt;br /&gt;
&lt;br /&gt;
'''MRO_JOB_DISPATCHING''' is the specialised DISPATCHING Interface Administration MetaClass used for MRO replication jobs.&lt;br /&gt;
&lt;br /&gt;
The orchestration process creates the required job objects automatically. Project teams do not need to create these objects manually.&lt;br /&gt;
&lt;br /&gt;
The execution EnterpriseService identifies '''MRO_JOB_DISPATCHING''' through the '''InterfaceAdmin''' value in '''MRO.PARAM.json'''.&lt;br /&gt;
&lt;br /&gt;
For general information about Interface Administration objects, see [[InterfaceAdministration]].&lt;br /&gt;
&lt;br /&gt;
=== Job statuses ===&lt;br /&gt;
&lt;br /&gt;
The execution status indicates the current state or result of a dispatching job.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Status&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Undefined&lt;br /&gt;
| The execution state is undefined.&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Success&lt;br /&gt;
| The execution completed successfully.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Terminated&lt;br /&gt;
| The execution was terminated.&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Conflict&lt;br /&gt;
| An export conflict occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Started&lt;br /&gt;
| Execution has started but has not yet completed.&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Scheduled&lt;br /&gt;
| The job is scheduled but has not yet been executed.&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| Error&lt;br /&gt;
| An error occurred during execution.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In a basic replication test, a newly scheduled job first has the status '''Scheduled'''. After successful execution, its status changes to '''Success'''.&lt;br /&gt;
&lt;br /&gt;
== Application setup ==&lt;br /&gt;
&lt;br /&gt;
A basic test or demonstration uses two separate UBIK.Studio folders.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Studio folder&lt;br /&gt;
! Purpose&lt;br /&gt;
! Required applications&lt;br /&gt;
|-&lt;br /&gt;
| Scheduling folder&lt;br /&gt;
| Provides the EnterpriseService web interface and starts the Maintenance Planning Orchestrator through the BasicClient App.&lt;br /&gt;
| '''UBIK.EnterpriseService.exe''' and '''UBIK.EnterpriseService.BasicClient.App.exe'''&lt;br /&gt;
|-&lt;br /&gt;
| Execution folder&lt;br /&gt;
| Runs the Scheduled Orchestrator and executes jobs from '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
| '''UBIK.EnterpriseService.exe'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The folder names and paths in the examples can be changed. Every configured path must point to the corresponding file in the local deployment.&lt;br /&gt;
&lt;br /&gt;
== Scheduling folder setup ==&lt;br /&gt;
&lt;br /&gt;
The scheduling folder requires the following files:&lt;br /&gt;
&lt;br /&gt;
* '''UBIK.EnterpriseService.exe'''&lt;br /&gt;
* '''UBIK.EnterpriseService.exe.config'''&lt;br /&gt;
* '''UBIK.EnterpriseService.BasicClient.App.exe'''&lt;br /&gt;
* '''UBIK.EnterpriseService.BasicClient.App.exe.config'''&lt;br /&gt;
* '''JSON\ReplicateWorkpackageJob.json'''&lt;br /&gt;
&lt;br /&gt;
=== Configure the scheduling EnterpriseService ===&lt;br /&gt;
&lt;br /&gt;
In '''UBIK.EnterpriseService.exe.config''', configure the following application settings:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Default value&lt;br /&gt;
! Required value&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| '''ExecuteWebInterface'''&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| Enables the web interface used by the BasicClient App.&lt;br /&gt;
|-&lt;br /&gt;
| '''ExecuteTaskByJsonFile'''&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| The scheduling EnterpriseService does not execute the recurring task configuration used by the execution EnterpriseService.&lt;br /&gt;
|-&lt;br /&gt;
| '''WebInterfacePort'''&lt;br /&gt;
| 9000&lt;br /&gt;
| 9000&lt;br /&gt;
| Defines the port used by the web interface in this example.&lt;br /&gt;
|-&lt;br /&gt;
| '''WebInterfaceHost'''&lt;br /&gt;
| http://localhost&lt;br /&gt;
| http://localhost&lt;br /&gt;
| Defines the host used by the web interface in this example.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Configure the BasicClient App ===&lt;br /&gt;
&lt;br /&gt;
In '''UBIK.EnterpriseService.BasicClient.App.exe.config''', configure the following application settings:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Example value&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| '''BaseAddress'''&lt;br /&gt;
| http://localhost:9000&lt;br /&gt;
| Identifies the web interface exposed by the scheduling EnterpriseService.&lt;br /&gt;
|-&lt;br /&gt;
| '''PathToBasicEnterpriseServiceRequestJsonFile'''&lt;br /&gt;
| Full path to ReplicateWorkpackageJob.json&lt;br /&gt;
| Identifies the request file that starts the Maintenance Planning Orchestrator.&lt;br /&gt;
|-&lt;br /&gt;
| '''PathToBasicEnterpriseServiceRequestJsonFileList'''&lt;br /&gt;
| Empty&lt;br /&gt;
| No request file list is used in this setup.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''BaseAddress''' must match '''WebInterfaceHost''' and '''WebInterfacePort''' in the scheduling EnterpriseService configuration. Replace the example path with the actual path to '''ReplicateWorkpackageJob.json'''.&lt;br /&gt;
&lt;br /&gt;
=== Configure ReplicateWorkpackageJob.json ===&lt;br /&gt;
&lt;br /&gt;
Create '''ReplicateWorkpackageJob.json''' in the JSON folder and configure the target database, orchestrator class, and method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;SSPI&amp;quot;: true,&lt;br /&gt;
  &amp;quot;SQLUser&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;SQLPassword&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;SQLServer&amp;quot;: &amp;quot;(localdb)\\MSSQLLocalDB&amp;quot;,&lt;br /&gt;
  &amp;quot;SQLInitialCatalog&amp;quot;: &amp;quot;JOB.TEST&amp;quot;,&lt;br /&gt;
  &amp;quot;ClassFullname&amp;quot;: &amp;quot;UBIK.MRO.MaintenancePlanningOrchestrator&amp;quot;,&lt;br /&gt;
  &amp;quot;MethodName&amp;quot;: &amp;quot;Apply&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adapt the database settings to the target database. Keep '''ClassFullname''' and '''MethodName''' as shown so that the request executes '''UBIK.MRO.MaintenancePlanningOrchestrator.Apply'''.&lt;br /&gt;
&lt;br /&gt;
== Execution folder setup ==&lt;br /&gt;
&lt;br /&gt;
The execution folder requires the following files:&lt;br /&gt;
&lt;br /&gt;
* '''UBIK.EnterpriseService.exe'''&lt;br /&gt;
* '''UBIK.EnterpriseService.exe.config'''&lt;br /&gt;
* '''JSON\MRO.json'''&lt;br /&gt;
* '''JSON\MRO.PARAM.json'''&lt;br /&gt;
&lt;br /&gt;
=== Configure the execution EnterpriseService ===&lt;br /&gt;
&lt;br /&gt;
In '''UBIK.EnterpriseService.exe.config''', configure the following application settings:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Default value&lt;br /&gt;
! Required value&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| '''PluginExecutionConfigPath'''&lt;br /&gt;
| Empty&lt;br /&gt;
| Full path to '''MRO.json'''&lt;br /&gt;
| Identifies the recurring task configuration.&lt;br /&gt;
|-&lt;br /&gt;
| '''ExecuteWebInterface'''&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| The execution EnterpriseService does not require the web interface in this setup.&lt;br /&gt;
|-&lt;br /&gt;
| '''ExecuteTaskByJsonFile'''&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| Enables execution of the tasks configured in '''MRO.json'''.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Configure MRO.json ===&lt;br /&gt;
&lt;br /&gt;
Create '''MRO.json''' and configure the database connection, execution interval, Scheduled Orchestrator, and path to '''MRO.PARAM.json''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;RepeateEveryMinutes&amp;quot;: 0.2,&lt;br /&gt;
  &amp;quot;SqlConnectionDefinition&amp;quot;: {&lt;br /&gt;
    &amp;quot;SSPI&amp;quot;: true,&lt;br /&gt;
    &amp;quot;SQLUser&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
    &amp;quot;SQLPassword&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
    &amp;quot;SQLServer&amp;quot;: &amp;quot;(localdb)\\MSSQLLocalDB&amp;quot;,&lt;br /&gt;
    &amp;quot;SQLInitialCatalog&amp;quot;: &amp;quot;JOB.TEST&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;Tasks&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;ClassFullname&amp;quot;: &amp;quot;UBIK.ServiceTask.Orchestration.ScheduledOrchestrator&amp;quot;,&lt;br /&gt;
      &amp;quot;MethodName&amp;quot;: &amp;quot;Apply&amp;quot;,&lt;br /&gt;
      &amp;quot;MethodParameterPathFullName&amp;quot;: &amp;quot;&amp;lt;full path to MRO.PARAM.json&amp;gt;&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adapt the database settings and '''MethodParameterPathFullName''' to the target deployment. Keep '''ClassFullname''' and '''MethodName''' as shown so that the task executes '''UBIK.ServiceTask.Orchestration.ScheduledOrchestrator.Apply'''.&lt;br /&gt;
&lt;br /&gt;
'''RepeateEveryMinutes''' defines how often the execution EnterpriseService checks for scheduled jobs. A value of 0 causes continuous checking. The value 0.2 can be used for a demonstration where continuous checking is not required.&lt;br /&gt;
&lt;br /&gt;
=== Configure MRO.PARAM.json ===&lt;br /&gt;
&lt;br /&gt;
Create '''MRO.PARAM.json''' and configure the UID of '''MRO_JOB_DISPATCHING''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;InterfaceAdmin&amp;quot;: &amp;quot;BBAF1C9E-8F3B-4C9A-9E2D-5F7A1C3E4B6D&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The '''InterfaceAdmin''' value identifies '''MRO_JOB_DISPATCHING''' for the Scheduled Orchestrator.&lt;br /&gt;
&lt;br /&gt;
== Maintenance plan prerequisites ==&lt;br /&gt;
&lt;br /&gt;
For a basic work package replication scenario, configure:&lt;br /&gt;
&lt;br /&gt;
* a concrete maintenance plan type such as '''CyclicMaintenancePlan'''&lt;br /&gt;
* an asset through '''LK_ASSET'''&lt;br /&gt;
* a template work package through '''LK_WP_TMPL'''&lt;br /&gt;
* an '''INSTANCE_REPLICATION''' object through '''LK_REPLICATION_CONFIG'''&lt;br /&gt;
* '''PLAN_STATUS''' as Active&lt;br /&gt;
* '''AUTO_CREATE''' as enabled&lt;br /&gt;
* planning dates that make the plan eligible for generation&lt;br /&gt;
* a template work package with '''ISTEMPLATE''' set&lt;br /&gt;
&lt;br /&gt;
The maintenance plan must not already have an open generated work package. Detailed generation conditions are documented in [[MROMaintenancePlans]].&lt;br /&gt;
&lt;br /&gt;
== Basic test or demonstration ==&lt;br /&gt;
&lt;br /&gt;
=== Prepare the maintenance plan ===&lt;br /&gt;
&lt;br /&gt;
# Open the database in UBIK.Studio.&lt;br /&gt;
# Create or select a valid maintenance plan.&lt;br /&gt;
# Assign the required asset through '''LK_ASSET'''.&lt;br /&gt;
# Assign a template work package through '''LK_WP_TMPL'''.&lt;br /&gt;
# Verify that '''ISTEMPLATE''' is set on the template work package.&lt;br /&gt;
# Assign an '''INSTANCE_REPLICATION''' object through '''LK_REPLICATION_CONFIG'''.&lt;br /&gt;
# Set '''PLAN_STATUS''' to Active.&lt;br /&gt;
# Enable '''AUTO_CREATE'''.&lt;br /&gt;
# Configure the planning dates so that '''EARLIEST_GENERATION_DATE''' has been reached.&lt;br /&gt;
# Verify that the maintenance plan has no open generated work package.&lt;br /&gt;
&lt;br /&gt;
=== Schedule the job ===&lt;br /&gt;
&lt;br /&gt;
# Start '''UBIK.EnterpriseService.exe''' in the scheduling folder.&lt;br /&gt;
# Start '''UBIK.EnterpriseService.BasicClient.App.exe''' manually, or start it through a configured Windows Task Scheduler task.&lt;br /&gt;
# The BasicClient App sends the request defined in '''ReplicateWorkpackageJob.json''' to the scheduling EnterpriseService.&lt;br /&gt;
# '''UBIK.MRO.MaintenancePlanningOrchestrator.Apply''' searches for eligible maintenance plans and schedules their replication jobs.&lt;br /&gt;
&lt;br /&gt;
=== Verify the scheduled job ===&lt;br /&gt;
&lt;br /&gt;
# Open '''MRO_JOB_DISPATCHING''' in UBIK.Studio.&lt;br /&gt;
# Verify that a job object was created for the eligible maintenance plan.&lt;br /&gt;
# Verify that '''INTERFACE_EXECUTION_STATUS''' is Scheduled.&lt;br /&gt;
# If the execution EnterpriseService has not been started, verify that no generated work package exists yet.&lt;br /&gt;
&lt;br /&gt;
=== Execute the job ===&lt;br /&gt;
&lt;br /&gt;
# Start '''UBIK.EnterpriseService.exe''' in the execution folder.&lt;br /&gt;
# The EnterpriseService executes '''UBIK.ServiceTask.Orchestration.ScheduledOrchestrator.Apply''' according to '''MRO.json'''.&lt;br /&gt;
# The Scheduled Orchestrator reads the scheduled job from '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
# The configured replication job generates the work package.&lt;br /&gt;
&lt;br /&gt;
=== Verify the result ===&lt;br /&gt;
&lt;br /&gt;
# Refresh '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
# Verify that the job status is Success.&lt;br /&gt;
# Refresh the Work Package MetaClass.&lt;br /&gt;
# Verify that a new work package was created.&lt;br /&gt;
# Verify that '''ISTEMPLATE''' is not set on the generated work package.&lt;br /&gt;
# Verify the links and planning values described in [[MROMaintenancePlans]].&lt;br /&gt;
&lt;br /&gt;
For a Round Maintenance Plan, also verify that:&lt;br /&gt;
&lt;br /&gt;
* the main round work package was created&lt;br /&gt;
* the child maintenance plans produced the configured additional work packages&lt;br /&gt;
* the additional work packages are assigned to the main round work package through '''TASK_OWNER'''&lt;br /&gt;
&lt;br /&gt;
== Triggering the scheduling process ==&lt;br /&gt;
&lt;br /&gt;
For a manual test or demonstration, start '''UBIK.EnterpriseService.BasicClient.App.exe''' manually.&lt;br /&gt;
&lt;br /&gt;
For recurring execution, a Windows Task Scheduler task can start '''UBIK.EnterpriseService.BasicClient.App.exe'''. The executable path is configured in the task. The request and target orchestrator are configured in '''UBIK.EnterpriseService.BasicClient.App.exe.config''' and '''ReplicateWorkpackageJob.json'''.&lt;br /&gt;
&lt;br /&gt;
Running the Maintenance Planning Orchestrator processes all eligible maintenance plans.&lt;br /&gt;
&lt;br /&gt;
== Configuration summary ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Component&lt;br /&gt;
! Configuration&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| Scheduling EnterpriseService&lt;br /&gt;
| '''ExecuteWebInterface''' = 1&lt;br /&gt;
| Exposes the web interface used by the BasicClient App.&lt;br /&gt;
|-&lt;br /&gt;
| BasicClient App&lt;br /&gt;
| '''PathToBasicEnterpriseServiceRequestJsonFile'''&lt;br /&gt;
| Points to '''ReplicateWorkpackageJob.json'''.&lt;br /&gt;
|-&lt;br /&gt;
| Scheduling request&lt;br /&gt;
| '''UBIK.MRO.MaintenancePlanningOrchestrator.Apply'''&lt;br /&gt;
| Searches for eligible maintenance plans and schedules their jobs.&lt;br /&gt;
|-&lt;br /&gt;
| Execution EnterpriseService&lt;br /&gt;
| '''ExecuteTaskByJsonFile''' = 1&lt;br /&gt;
| Enables execution using '''MRO.json'''.&lt;br /&gt;
|-&lt;br /&gt;
| Execution task&lt;br /&gt;
| '''UBIK.ServiceTask.Orchestration.ScheduledOrchestrator.Apply'''&lt;br /&gt;
| Processes scheduled dispatching jobs.&lt;br /&gt;
|-&lt;br /&gt;
| Execution parameter&lt;br /&gt;
| '''InterfaceAdmin'''&lt;br /&gt;
| Identifies '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
|-&lt;br /&gt;
| Maintenance plan&lt;br /&gt;
| '''LK_REPLICATION_CONFIG'''&lt;br /&gt;
| Links directly to the '''INSTANCE_REPLICATION''' object used to copy the template work package.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[MROMaintenancePlans]]&lt;br /&gt;
* [[InterfaceAdministration]]&lt;br /&gt;
* [[InterfaceExecution]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_Replication_Jobs&amp;diff=30599</id>
		<title>MRO Replication Jobs</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_Replication_Jobs&amp;diff=30599"/>
				<updated>2026-09-22T07:18:23Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: /* Replication process */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== MRO Replication Jobs ==&lt;br /&gt;
MRO replication jobs generate work packages from configured maintenance plans. The processing is divided into two steps: the Maintenance Planning Orchestrator schedules jobs for eligible maintenance plans, and a separate EnterpriseService executes the scheduled jobs.&lt;br /&gt;
&lt;br /&gt;
This page describes the available MRO replication jobs, the required BasicClient App and EnterpriseService configuration, and a basic setup for testing or demonstrating MRO replication.&lt;br /&gt;
&lt;br /&gt;
For the configuration and behaviour of maintenance plans, see [[MROMaintenancePlans]].&lt;br /&gt;
&lt;br /&gt;
== Replication process ==&lt;br /&gt;
&lt;br /&gt;
MRO replication uses the following process:&lt;br /&gt;
&lt;br /&gt;
# The Maintenance Planning Orchestrator searches for maintenance plans that are ready for automatic work package generation.&lt;br /&gt;
# Each eligible maintenance plan provides the replication job required for its plan type.&lt;br /&gt;
# The orchestrator schedules the job in '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
# A separate EnterpriseService processes the scheduled job.&lt;br /&gt;
# The replication job uses the template work package and the linked '''INSTANCE_REPLICATION''' object to generate the work package.&lt;br /&gt;
&lt;br /&gt;
Scheduling a job does not execute the replication immediately. It creates a dispatching job containing the information required for later execution.&lt;br /&gt;
&lt;br /&gt;
'''For a basic test or demonstration, the scheduling and execution processes can be configured in two separate UBIK.Studio folders.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Available MRO replication jobs ==&lt;br /&gt;
&lt;br /&gt;
MRO provides two replication jobs.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Job&lt;br /&gt;
! Inheritance&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| '''ReplicateWorkpackageJob'''&lt;br /&gt;
| Derives from '''DispatchingJob''' for '''WorkPackage'''&lt;br /&gt;
| Generates a work package from the template and replication configuration of a maintenance plan.&lt;br /&gt;
|-&lt;br /&gt;
| '''ReplicateRoundWorkpackageJob'''&lt;br /&gt;
| Derives from '''ReplicateWorkpackageJob'''&lt;br /&gt;
| Generates the main work package of a maintenance round and the additional work packages configured by its child maintenance plans.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Both jobs use the same scheduling, dispatching, and execution infrastructure. The maintenance plan implementation returns the appropriate job when the Maintenance Planning Orchestrator requests its replication job.&lt;br /&gt;
&lt;br /&gt;
=== Work package replication ===&lt;br /&gt;
&lt;br /&gt;
A standard maintenance plan uses '''ReplicateWorkpackageJob'''.&lt;br /&gt;
&lt;br /&gt;
The maintenance plan provides:&lt;br /&gt;
&lt;br /&gt;
* a template work package through '''LK_WP_TMPL'''&lt;br /&gt;
* an '''INSTANCE_REPLICATION''' object through '''LK_REPLICATION_CONFIG'''&lt;br /&gt;
* the maintenance plan settings required for automatic work package generation&lt;br /&gt;
&lt;br /&gt;
The linked '''INSTANCE_REPLICATION''' object defines how the template work package is copied. The generated work package is not marked as a template.&lt;br /&gt;
&lt;br /&gt;
For the complete maintenance plan prerequisites and the properties set on generated work packages, see [[MROMaintenancePlans]].&lt;br /&gt;
&lt;br /&gt;
=== Round work package replication ===&lt;br /&gt;
&lt;br /&gt;
A '''RoundMaintenancePlan''' uses '''ReplicateRoundWorkpackageJob'''.&lt;br /&gt;
&lt;br /&gt;
The job creates the main work package from the Round Maintenance Plan. It then processes the child maintenance plans linked through '''SYSREL_ROUND_RELATION''' and creates their additional work packages. The additional work packages are assigned to the main round work package through '''TASK_OWNER'''.&lt;br /&gt;
&lt;br /&gt;
Round work package replication uses the same BasicClient App, EnterpriseService, and dispatching setup as standard work package replication. The maintenance plan implementation determines which job is scheduled.&lt;br /&gt;
&lt;br /&gt;
For the configuration and behaviour of Round Maintenance Plans, see [[MROMaintenancePlans]].&lt;br /&gt;
&lt;br /&gt;
== Scheduling and execution ==&lt;br /&gt;
&lt;br /&gt;
=== Maintenance Planning Orchestrator ===&lt;br /&gt;
&lt;br /&gt;
The scheduling process executes the following method:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| Class&lt;br /&gt;
| '''UBIK.MRO.MaintenancePlanningOrchestrator'''&lt;br /&gt;
|-&lt;br /&gt;
| Method&lt;br /&gt;
| '''Apply'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Maintenance Planning Orchestrator searches for eligible maintenance plans, requests the appropriate replication job from each plan, and schedules the job in '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
&lt;br /&gt;
=== Scheduled Orchestrator ===&lt;br /&gt;
&lt;br /&gt;
The execution process executes the following method:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| Class&lt;br /&gt;
| '''UBIK.ServiceTask.Orchestration.ScheduledOrchestrator'''&lt;br /&gt;
|-&lt;br /&gt;
| Method&lt;br /&gt;
| '''Apply'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Scheduled Orchestrator searches '''MRO_JOB_DISPATCHING''' for scheduled jobs and executes them.&lt;br /&gt;
&lt;br /&gt;
== MRO job dispatching ==&lt;br /&gt;
&lt;br /&gt;
'''MRO_JOB_DISPATCHING''' is the specialised DISPATCHING Interface Administration MetaClass used for MRO replication jobs.&lt;br /&gt;
&lt;br /&gt;
The orchestration process creates the required job objects automatically. Project teams do not need to create these objects manually.&lt;br /&gt;
&lt;br /&gt;
The execution EnterpriseService identifies '''MRO_JOB_DISPATCHING''' through the '''InterfaceAdmin''' value in '''MRO.PARAM.json'''.&lt;br /&gt;
&lt;br /&gt;
For general information about Interface Administration objects, see [[InterfaceAdministration]].&lt;br /&gt;
&lt;br /&gt;
=== Job statuses ===&lt;br /&gt;
&lt;br /&gt;
The execution status indicates the current state or result of a dispatching job.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Status&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Undefined&lt;br /&gt;
| The execution state is undefined.&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Success&lt;br /&gt;
| The execution completed successfully.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Terminated&lt;br /&gt;
| The execution was terminated.&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Conflict&lt;br /&gt;
| An export conflict occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Started&lt;br /&gt;
| Execution has started but has not yet completed.&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Scheduled&lt;br /&gt;
| The job is scheduled but has not yet been executed.&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| Error&lt;br /&gt;
| An error occurred during execution.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In a basic replication test, a newly scheduled job first has the status '''Scheduled'''. After successful execution, its status changes to '''Success'''.&lt;br /&gt;
&lt;br /&gt;
== Application setup ==&lt;br /&gt;
&lt;br /&gt;
A basic test or demonstration uses two separate UBIK.Studio folders.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Studio folder&lt;br /&gt;
! Purpose&lt;br /&gt;
! Required applications&lt;br /&gt;
|-&lt;br /&gt;
| Scheduling folder&lt;br /&gt;
| Provides the EnterpriseService web interface and starts the Maintenance Planning Orchestrator through the BasicClient App.&lt;br /&gt;
| '''UBIK.EnterpriseService.exe''' and '''UBIK.EnterpriseService.BasicClient.App.exe'''&lt;br /&gt;
|-&lt;br /&gt;
| Execution folder&lt;br /&gt;
| Runs the Scheduled Orchestrator and executes jobs from '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
| '''UBIK.EnterpriseService.exe'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The folder names and paths in the examples can be changed. Every configured path must point to the corresponding file in the local deployment.&lt;br /&gt;
&lt;br /&gt;
== Scheduling folder setup ==&lt;br /&gt;
&lt;br /&gt;
The scheduling folder requires the following files:&lt;br /&gt;
&lt;br /&gt;
* '''UBIK.EnterpriseService.exe'''&lt;br /&gt;
* '''UBIK.EnterpriseService.exe.config'''&lt;br /&gt;
* '''UBIK.EnterpriseService.BasicClient.App.exe'''&lt;br /&gt;
* '''UBIK.EnterpriseService.BasicClient.App.exe.config'''&lt;br /&gt;
* '''JSON\ReplicateWorkpackageJob.json'''&lt;br /&gt;
&lt;br /&gt;
=== Configure the scheduling EnterpriseService ===&lt;br /&gt;
&lt;br /&gt;
In '''UBIK.EnterpriseService.exe.config''', configure the following application settings:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Default value&lt;br /&gt;
! Required value&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| '''ExecuteWebInterface'''&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| Enables the web interface used by the BasicClient App.&lt;br /&gt;
|-&lt;br /&gt;
| '''ExecuteTaskByJsonFile'''&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| The scheduling EnterpriseService does not execute the recurring task configuration used by the execution EnterpriseService.&lt;br /&gt;
|-&lt;br /&gt;
| '''WebInterfacePort'''&lt;br /&gt;
| 9000&lt;br /&gt;
| 9000&lt;br /&gt;
| Defines the port used by the web interface in this example.&lt;br /&gt;
|-&lt;br /&gt;
| '''WebInterfaceHost'''&lt;br /&gt;
| http://localhost&lt;br /&gt;
| http://localhost&lt;br /&gt;
| Defines the host used by the web interface in this example.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Configure the BasicClient App ===&lt;br /&gt;
&lt;br /&gt;
In '''UBIK.EnterpriseService.BasicClient.App.exe.config''', configure the following application settings:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Example value&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| '''BaseAddress'''&lt;br /&gt;
| http://localhost:9000&lt;br /&gt;
| Identifies the web interface exposed by the scheduling EnterpriseService.&lt;br /&gt;
|-&lt;br /&gt;
| '''PathToBasicEnterpriseServiceRequestJsonFile'''&lt;br /&gt;
| Full path to ReplicateWorkpackageJob.json&lt;br /&gt;
| Identifies the request file that starts the Maintenance Planning Orchestrator.&lt;br /&gt;
|-&lt;br /&gt;
| '''PathToBasicEnterpriseServiceRequestJsonFileList'''&lt;br /&gt;
| Empty&lt;br /&gt;
| No request file list is used in this setup.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''BaseAddress''' must match '''WebInterfaceHost''' and '''WebInterfacePort''' in the scheduling EnterpriseService configuration. Replace the example path with the actual path to '''ReplicateWorkpackageJob.json'''.&lt;br /&gt;
&lt;br /&gt;
=== Configure ReplicateWorkpackageJob.json ===&lt;br /&gt;
&lt;br /&gt;
Create '''ReplicateWorkpackageJob.json''' in the JSON folder and configure the target database, orchestrator class, and method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;SSPI&amp;quot;: true,&lt;br /&gt;
  &amp;quot;SQLUser&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;SQLPassword&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;SQLServer&amp;quot;: &amp;quot;(localdb)\\MSSQLLocalDB&amp;quot;,&lt;br /&gt;
  &amp;quot;SQLInitialCatalog&amp;quot;: &amp;quot;JOB.TEST&amp;quot;,&lt;br /&gt;
  &amp;quot;ClassFullname&amp;quot;: &amp;quot;UBIK.MRO.MaintenancePlanningOrchestrator&amp;quot;,&lt;br /&gt;
  &amp;quot;MethodName&amp;quot;: &amp;quot;Apply&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adapt the database settings to the target database. Keep '''ClassFullname''' and '''MethodName''' as shown so that the request executes '''UBIK.MRO.MaintenancePlanningOrchestrator.Apply'''.&lt;br /&gt;
&lt;br /&gt;
== Execution folder setup ==&lt;br /&gt;
&lt;br /&gt;
The execution folder requires the following files:&lt;br /&gt;
&lt;br /&gt;
* '''UBIK.EnterpriseService.exe'''&lt;br /&gt;
* '''UBIK.EnterpriseService.exe.config'''&lt;br /&gt;
* '''JSON\MRO.json'''&lt;br /&gt;
* '''JSON\MRO.PARAM.json'''&lt;br /&gt;
&lt;br /&gt;
=== Configure the execution EnterpriseService ===&lt;br /&gt;
&lt;br /&gt;
In '''UBIK.EnterpriseService.exe.config''', configure the following application settings:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Default value&lt;br /&gt;
! Required value&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| '''PluginExecutionConfigPath'''&lt;br /&gt;
| Empty&lt;br /&gt;
| Full path to '''MRO.json'''&lt;br /&gt;
| Identifies the recurring task configuration.&lt;br /&gt;
|-&lt;br /&gt;
| '''ExecuteWebInterface'''&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| The execution EnterpriseService does not require the web interface in this setup.&lt;br /&gt;
|-&lt;br /&gt;
| '''ExecuteTaskByJsonFile'''&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| Enables execution of the tasks configured in '''MRO.json'''.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Configure MRO.json ===&lt;br /&gt;
&lt;br /&gt;
Create '''MRO.json''' and configure the database connection, execution interval, Scheduled Orchestrator, and path to '''MRO.PARAM.json''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;RepeateEveryMinutes&amp;quot;: 0.2,&lt;br /&gt;
  &amp;quot;SqlConnectionDefinition&amp;quot;: {&lt;br /&gt;
    &amp;quot;SSPI&amp;quot;: true,&lt;br /&gt;
    &amp;quot;SQLUser&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
    &amp;quot;SQLPassword&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
    &amp;quot;SQLServer&amp;quot;: &amp;quot;(localdb)\\MSSQLLocalDB&amp;quot;,&lt;br /&gt;
    &amp;quot;SQLInitialCatalog&amp;quot;: &amp;quot;JOB.TEST&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;Tasks&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;ClassFullname&amp;quot;: &amp;quot;UBIK.ServiceTask.Orchestration.ScheduledOrchestrator&amp;quot;,&lt;br /&gt;
      &amp;quot;MethodName&amp;quot;: &amp;quot;Apply&amp;quot;,&lt;br /&gt;
      &amp;quot;MethodParameterPathFullName&amp;quot;: &amp;quot;&amp;lt;full path to MRO.PARAM.json&amp;gt;&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adapt the database settings and '''MethodParameterPathFullName''' to the target deployment. Keep '''ClassFullname''' and '''MethodName''' as shown so that the task executes '''UBIK.ServiceTask.Orchestration.ScheduledOrchestrator.Apply'''.&lt;br /&gt;
&lt;br /&gt;
'''RepeateEveryMinutes''' defines how often the execution EnterpriseService checks for scheduled jobs. A value of 0 causes continuous checking. The value 0.2 can be used for a demonstration where continuous checking is not required.&lt;br /&gt;
&lt;br /&gt;
=== Configure MRO.PARAM.json ===&lt;br /&gt;
&lt;br /&gt;
Create '''MRO.PARAM.json''' and configure the UID of '''MRO_JOB_DISPATCHING''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;InterfaceAdmin&amp;quot;: &amp;quot;BBAF1C9E-8F3B-4C9A-9E2D-5F7A1C3E4B6D&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The '''InterfaceAdmin''' value identifies '''MRO_JOB_DISPATCHING''' for the Scheduled Orchestrator.&lt;br /&gt;
&lt;br /&gt;
== Maintenance plan prerequisites ==&lt;br /&gt;
&lt;br /&gt;
For a basic work package replication scenario, configure:&lt;br /&gt;
&lt;br /&gt;
* a concrete maintenance plan type such as '''CyclicMaintenancePlan'''&lt;br /&gt;
* an asset through '''LK_ASSET'''&lt;br /&gt;
* a template work package through '''LK_WP_TMPL'''&lt;br /&gt;
* an '''INSTANCE_REPLICATION''' object through '''LK_REPLICATION_CONFIG'''&lt;br /&gt;
* '''PLAN_STATUS''' as Active&lt;br /&gt;
* '''AUTO_CREATE''' as enabled&lt;br /&gt;
* planning dates that make the plan eligible for generation&lt;br /&gt;
* a template work package with '''ISTEMPLATE''' set&lt;br /&gt;
&lt;br /&gt;
The maintenance plan must not already have an open generated work package. Detailed generation conditions are documented in [[MROMaintenancePlans]].&lt;br /&gt;
&lt;br /&gt;
== Basic test or demonstration ==&lt;br /&gt;
&lt;br /&gt;
=== Prepare the maintenance plan ===&lt;br /&gt;
&lt;br /&gt;
# Open the database in UBIK.Studio.&lt;br /&gt;
# Create or select a valid maintenance plan.&lt;br /&gt;
# Assign the required asset through '''LK_ASSET'''.&lt;br /&gt;
# Assign a template work package through '''LK_WP_TMPL'''.&lt;br /&gt;
# Verify that '''ISTEMPLATE''' is set on the template work package.&lt;br /&gt;
# Assign an '''INSTANCE_REPLICATION''' object through '''LK_REPLICATION_CONFIG'''.&lt;br /&gt;
# Set '''PLAN_STATUS''' to Active.&lt;br /&gt;
# Enable '''AUTO_CREATE'''.&lt;br /&gt;
# Configure the planning dates so that '''EARLIEST_GENERATION_DATE''' has been reached.&lt;br /&gt;
# Verify that the maintenance plan has no open generated work package.&lt;br /&gt;
&lt;br /&gt;
=== Schedule the job ===&lt;br /&gt;
&lt;br /&gt;
# Start '''UBIK.EnterpriseService.exe''' in the scheduling folder.&lt;br /&gt;
# Start '''UBIK.EnterpriseService.BasicClient.App.exe''' manually, or start it through a configured Windows Task Scheduler task.&lt;br /&gt;
# The BasicClient App sends the request defined in '''ReplicateWorkpackageJob.json''' to the scheduling EnterpriseService.&lt;br /&gt;
# '''UBIK.MRO.MaintenancePlanningOrchestrator.Apply''' searches for eligible maintenance plans and schedules their replication jobs.&lt;br /&gt;
&lt;br /&gt;
=== Verify the scheduled job ===&lt;br /&gt;
&lt;br /&gt;
# Open '''MRO_JOB_DISPATCHING''' in UBIK.Studio.&lt;br /&gt;
# Verify that a job object was created for the eligible maintenance plan.&lt;br /&gt;
# Verify that '''INTERFACE_EXECUTION_STATUS''' is Scheduled.&lt;br /&gt;
# If the execution EnterpriseService has not been started, verify that no generated work package exists yet.&lt;br /&gt;
&lt;br /&gt;
=== Execute the job ===&lt;br /&gt;
&lt;br /&gt;
# Start '''UBIK.EnterpriseService.exe''' in the execution folder.&lt;br /&gt;
# The EnterpriseService executes '''UBIK.ServiceTask.Orchestration.ScheduledOrchestrator.Apply''' according to '''MRO.json'''.&lt;br /&gt;
# The Scheduled Orchestrator reads the scheduled job from '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
# The configured replication job generates the work package.&lt;br /&gt;
&lt;br /&gt;
=== Verify the result ===&lt;br /&gt;
&lt;br /&gt;
# Refresh '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
# Verify that the job status is Success.&lt;br /&gt;
# Refresh the Work Package MetaClass.&lt;br /&gt;
# Verify that a new work package was created.&lt;br /&gt;
# Verify that '''ISTEMPLATE''' is not set on the generated work package.&lt;br /&gt;
# Verify the links and planning values described in [[MROMaintenancePlans]].&lt;br /&gt;
&lt;br /&gt;
For a Round Maintenance Plan, also verify that:&lt;br /&gt;
&lt;br /&gt;
* the main round work package was created&lt;br /&gt;
* the child maintenance plans produced the configured additional work packages&lt;br /&gt;
* the additional work packages are assigned to the main round work package through '''TASK_OWNER'''&lt;br /&gt;
&lt;br /&gt;
== Triggering the scheduling process ==&lt;br /&gt;
&lt;br /&gt;
For a manual test or demonstration, start '''UBIK.EnterpriseService.BasicClient.App.exe''' manually.&lt;br /&gt;
&lt;br /&gt;
For recurring execution, a Windows Task Scheduler task can start '''UBIK.EnterpriseService.BasicClient.App.exe'''. The executable path is configured in the task. The request and target orchestrator are configured in '''UBIK.EnterpriseService.BasicClient.App.exe.config''' and '''ReplicateWorkpackageJob.json'''.&lt;br /&gt;
&lt;br /&gt;
Running the Maintenance Planning Orchestrator processes all eligible maintenance plans.&lt;br /&gt;
&lt;br /&gt;
== Configuration summary ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Component&lt;br /&gt;
! Configuration&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| Scheduling EnterpriseService&lt;br /&gt;
| '''ExecuteWebInterface''' = 1&lt;br /&gt;
| Exposes the web interface used by the BasicClient App.&lt;br /&gt;
|-&lt;br /&gt;
| BasicClient App&lt;br /&gt;
| '''PathToBasicEnterpriseServiceRequestJsonFile'''&lt;br /&gt;
| Points to '''ReplicateWorkpackageJob.json'''.&lt;br /&gt;
|-&lt;br /&gt;
| Scheduling request&lt;br /&gt;
| '''UBIK.MRO.MaintenancePlanningOrchestrator.Apply'''&lt;br /&gt;
| Searches for eligible maintenance plans and schedules their jobs.&lt;br /&gt;
|-&lt;br /&gt;
| Execution EnterpriseService&lt;br /&gt;
| '''ExecuteTaskByJsonFile''' = 1&lt;br /&gt;
| Enables execution using '''MRO.json'''.&lt;br /&gt;
|-&lt;br /&gt;
| Execution task&lt;br /&gt;
| '''UBIK.ServiceTask.Orchestration.ScheduledOrchestrator.Apply'''&lt;br /&gt;
| Processes scheduled dispatching jobs.&lt;br /&gt;
|-&lt;br /&gt;
| Execution parameter&lt;br /&gt;
| '''InterfaceAdmin'''&lt;br /&gt;
| Identifies '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
|-&lt;br /&gt;
| Maintenance plan&lt;br /&gt;
| '''LK_REPLICATION_CONFIG'''&lt;br /&gt;
| Links directly to the '''INSTANCE_REPLICATION''' object used to copy the template work package.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[MROMaintenancePlans]]&lt;br /&gt;
* [[InterfaceAdministration]]&lt;br /&gt;
* [[InterfaceExecution]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_Replication_Jobs&amp;diff=30598</id>
		<title>MRO Replication Jobs</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_Replication_Jobs&amp;diff=30598"/>
				<updated>2026-09-22T07:13:47Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== MRO Replication Jobs ==&lt;br /&gt;
MRO replication jobs generate work packages from configured maintenance plans. The processing is divided into two steps: the Maintenance Planning Orchestrator schedules jobs for eligible maintenance plans, and a separate EnterpriseService executes the scheduled jobs.&lt;br /&gt;
&lt;br /&gt;
This page describes the available MRO replication jobs, the required BasicClient App and EnterpriseService configuration, and a basic setup for testing or demonstrating MRO replication.&lt;br /&gt;
&lt;br /&gt;
For the configuration and behaviour of maintenance plans, see [[MROMaintenancePlans]].&lt;br /&gt;
&lt;br /&gt;
== Replication process ==&lt;br /&gt;
&lt;br /&gt;
MRO replication uses the following process:&lt;br /&gt;
&lt;br /&gt;
# The Maintenance Planning Orchestrator searches for maintenance plans that are ready for automatic work package generation.&lt;br /&gt;
# Each eligible maintenance plan provides the replication job required for its plan type.&lt;br /&gt;
# The orchestrator schedules the job in '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
# A separate EnterpriseService processes the scheduled job.&lt;br /&gt;
# The replication job uses the template work package and the linked '''INSTANCE_REPLICATION''' object to generate the work package.&lt;br /&gt;
&lt;br /&gt;
Scheduling a job does not execute the replication immediately. It creates a dispatching job containing the information required for later execution.&lt;br /&gt;
&lt;br /&gt;
For a basic test or demonstration, the scheduling and execution processes can be configured in two separate UBIK.Studio folders.&lt;br /&gt;
&lt;br /&gt;
== Available MRO replication jobs ==&lt;br /&gt;
&lt;br /&gt;
MRO provides two replication jobs.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Job&lt;br /&gt;
! Inheritance&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| '''ReplicateWorkpackageJob'''&lt;br /&gt;
| Derives from '''DispatchingJob''' for '''WorkPackage'''&lt;br /&gt;
| Generates a work package from the template and replication configuration of a maintenance plan.&lt;br /&gt;
|-&lt;br /&gt;
| '''ReplicateRoundWorkpackageJob'''&lt;br /&gt;
| Derives from '''ReplicateWorkpackageJob'''&lt;br /&gt;
| Generates the main work package of a maintenance round and the additional work packages configured by its child maintenance plans.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Both jobs use the same scheduling, dispatching, and execution infrastructure. The maintenance plan implementation returns the appropriate job when the Maintenance Planning Orchestrator requests its replication job.&lt;br /&gt;
&lt;br /&gt;
=== Work package replication ===&lt;br /&gt;
&lt;br /&gt;
A standard maintenance plan uses '''ReplicateWorkpackageJob'''.&lt;br /&gt;
&lt;br /&gt;
The maintenance plan provides:&lt;br /&gt;
&lt;br /&gt;
* a template work package through '''LK_WP_TMPL'''&lt;br /&gt;
* an '''INSTANCE_REPLICATION''' object through '''LK_REPLICATION_CONFIG'''&lt;br /&gt;
* the maintenance plan settings required for automatic work package generation&lt;br /&gt;
&lt;br /&gt;
The linked '''INSTANCE_REPLICATION''' object defines how the template work package is copied. The generated work package is not marked as a template.&lt;br /&gt;
&lt;br /&gt;
For the complete maintenance plan prerequisites and the properties set on generated work packages, see [[MROMaintenancePlans]].&lt;br /&gt;
&lt;br /&gt;
=== Round work package replication ===&lt;br /&gt;
&lt;br /&gt;
A '''RoundMaintenancePlan''' uses '''ReplicateRoundWorkpackageJob'''.&lt;br /&gt;
&lt;br /&gt;
The job creates the main work package from the Round Maintenance Plan. It then processes the child maintenance plans linked through '''SYSREL_ROUND_RELATION''' and creates their additional work packages. The additional work packages are assigned to the main round work package through '''TASK_OWNER'''.&lt;br /&gt;
&lt;br /&gt;
Round work package replication uses the same BasicClient App, EnterpriseService, and dispatching setup as standard work package replication. The maintenance plan implementation determines which job is scheduled.&lt;br /&gt;
&lt;br /&gt;
For the configuration and behaviour of Round Maintenance Plans, see [[MROMaintenancePlans]].&lt;br /&gt;
&lt;br /&gt;
== Scheduling and execution ==&lt;br /&gt;
&lt;br /&gt;
=== Maintenance Planning Orchestrator ===&lt;br /&gt;
&lt;br /&gt;
The scheduling process executes the following method:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| Class&lt;br /&gt;
| '''UBIK.MRO.MaintenancePlanningOrchestrator'''&lt;br /&gt;
|-&lt;br /&gt;
| Method&lt;br /&gt;
| '''Apply'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Maintenance Planning Orchestrator searches for eligible maintenance plans, requests the appropriate replication job from each plan, and schedules the job in '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
&lt;br /&gt;
=== Scheduled Orchestrator ===&lt;br /&gt;
&lt;br /&gt;
The execution process executes the following method:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| Class&lt;br /&gt;
| '''UBIK.ServiceTask.Orchestration.ScheduledOrchestrator'''&lt;br /&gt;
|-&lt;br /&gt;
| Method&lt;br /&gt;
| '''Apply'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Scheduled Orchestrator searches '''MRO_JOB_DISPATCHING''' for scheduled jobs and executes them.&lt;br /&gt;
&lt;br /&gt;
== MRO job dispatching ==&lt;br /&gt;
&lt;br /&gt;
'''MRO_JOB_DISPATCHING''' is the specialised DISPATCHING Interface Administration MetaClass used for MRO replication jobs.&lt;br /&gt;
&lt;br /&gt;
The orchestration process creates the required job objects automatically. Project teams do not need to create these objects manually.&lt;br /&gt;
&lt;br /&gt;
The execution EnterpriseService identifies '''MRO_JOB_DISPATCHING''' through the '''InterfaceAdmin''' value in '''MRO.PARAM.json'''.&lt;br /&gt;
&lt;br /&gt;
For general information about Interface Administration objects, see [[InterfaceAdministration]].&lt;br /&gt;
&lt;br /&gt;
=== Job statuses ===&lt;br /&gt;
&lt;br /&gt;
The execution status indicates the current state or result of a dispatching job.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Status&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Undefined&lt;br /&gt;
| The execution state is undefined.&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Success&lt;br /&gt;
| The execution completed successfully.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Terminated&lt;br /&gt;
| The execution was terminated.&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Conflict&lt;br /&gt;
| An export conflict occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Started&lt;br /&gt;
| Execution has started but has not yet completed.&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Scheduled&lt;br /&gt;
| The job is scheduled but has not yet been executed.&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| Error&lt;br /&gt;
| An error occurred during execution.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In a basic replication test, a newly scheduled job first has the status '''Scheduled'''. After successful execution, its status changes to '''Success'''.&lt;br /&gt;
&lt;br /&gt;
== Application setup ==&lt;br /&gt;
&lt;br /&gt;
A basic test or demonstration uses two separate UBIK.Studio folders.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Studio folder&lt;br /&gt;
! Purpose&lt;br /&gt;
! Required applications&lt;br /&gt;
|-&lt;br /&gt;
| Scheduling folder&lt;br /&gt;
| Provides the EnterpriseService web interface and starts the Maintenance Planning Orchestrator through the BasicClient App.&lt;br /&gt;
| '''UBIK.EnterpriseService.exe''' and '''UBIK.EnterpriseService.BasicClient.App.exe'''&lt;br /&gt;
|-&lt;br /&gt;
| Execution folder&lt;br /&gt;
| Runs the Scheduled Orchestrator and executes jobs from '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
| '''UBIK.EnterpriseService.exe'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The folder names and paths in the examples can be changed. Every configured path must point to the corresponding file in the local deployment.&lt;br /&gt;
&lt;br /&gt;
== Scheduling folder setup ==&lt;br /&gt;
&lt;br /&gt;
The scheduling folder requires the following files:&lt;br /&gt;
&lt;br /&gt;
* '''UBIK.EnterpriseService.exe'''&lt;br /&gt;
* '''UBIK.EnterpriseService.exe.config'''&lt;br /&gt;
* '''UBIK.EnterpriseService.BasicClient.App.exe'''&lt;br /&gt;
* '''UBIK.EnterpriseService.BasicClient.App.exe.config'''&lt;br /&gt;
* '''JSON\ReplicateWorkpackageJob.json'''&lt;br /&gt;
&lt;br /&gt;
=== Configure the scheduling EnterpriseService ===&lt;br /&gt;
&lt;br /&gt;
In '''UBIK.EnterpriseService.exe.config''', configure the following application settings:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Default value&lt;br /&gt;
! Required value&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| '''ExecuteWebInterface'''&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| Enables the web interface used by the BasicClient App.&lt;br /&gt;
|-&lt;br /&gt;
| '''ExecuteTaskByJsonFile'''&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| The scheduling EnterpriseService does not execute the recurring task configuration used by the execution EnterpriseService.&lt;br /&gt;
|-&lt;br /&gt;
| '''WebInterfacePort'''&lt;br /&gt;
| 9000&lt;br /&gt;
| 9000&lt;br /&gt;
| Defines the port used by the web interface in this example.&lt;br /&gt;
|-&lt;br /&gt;
| '''WebInterfaceHost'''&lt;br /&gt;
| http://localhost&lt;br /&gt;
| http://localhost&lt;br /&gt;
| Defines the host used by the web interface in this example.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Configure the BasicClient App ===&lt;br /&gt;
&lt;br /&gt;
In '''UBIK.EnterpriseService.BasicClient.App.exe.config''', configure the following application settings:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Example value&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| '''BaseAddress'''&lt;br /&gt;
| http://localhost:9000&lt;br /&gt;
| Identifies the web interface exposed by the scheduling EnterpriseService.&lt;br /&gt;
|-&lt;br /&gt;
| '''PathToBasicEnterpriseServiceRequestJsonFile'''&lt;br /&gt;
| Full path to ReplicateWorkpackageJob.json&lt;br /&gt;
| Identifies the request file that starts the Maintenance Planning Orchestrator.&lt;br /&gt;
|-&lt;br /&gt;
| '''PathToBasicEnterpriseServiceRequestJsonFileList'''&lt;br /&gt;
| Empty&lt;br /&gt;
| No request file list is used in this setup.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''BaseAddress''' must match '''WebInterfaceHost''' and '''WebInterfacePort''' in the scheduling EnterpriseService configuration. Replace the example path with the actual path to '''ReplicateWorkpackageJob.json'''.&lt;br /&gt;
&lt;br /&gt;
=== Configure ReplicateWorkpackageJob.json ===&lt;br /&gt;
&lt;br /&gt;
Create '''ReplicateWorkpackageJob.json''' in the JSON folder and configure the target database, orchestrator class, and method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;SSPI&amp;quot;: true,&lt;br /&gt;
  &amp;quot;SQLUser&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;SQLPassword&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;SQLServer&amp;quot;: &amp;quot;(localdb)\\MSSQLLocalDB&amp;quot;,&lt;br /&gt;
  &amp;quot;SQLInitialCatalog&amp;quot;: &amp;quot;JOB.TEST&amp;quot;,&lt;br /&gt;
  &amp;quot;ClassFullname&amp;quot;: &amp;quot;UBIK.MRO.MaintenancePlanningOrchestrator&amp;quot;,&lt;br /&gt;
  &amp;quot;MethodName&amp;quot;: &amp;quot;Apply&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adapt the database settings to the target database. Keep '''ClassFullname''' and '''MethodName''' as shown so that the request executes '''UBIK.MRO.MaintenancePlanningOrchestrator.Apply'''.&lt;br /&gt;
&lt;br /&gt;
== Execution folder setup ==&lt;br /&gt;
&lt;br /&gt;
The execution folder requires the following files:&lt;br /&gt;
&lt;br /&gt;
* '''UBIK.EnterpriseService.exe'''&lt;br /&gt;
* '''UBIK.EnterpriseService.exe.config'''&lt;br /&gt;
* '''JSON\MRO.json'''&lt;br /&gt;
* '''JSON\MRO.PARAM.json'''&lt;br /&gt;
&lt;br /&gt;
=== Configure the execution EnterpriseService ===&lt;br /&gt;
&lt;br /&gt;
In '''UBIK.EnterpriseService.exe.config''', configure the following application settings:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Default value&lt;br /&gt;
! Required value&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| '''PluginExecutionConfigPath'''&lt;br /&gt;
| Empty&lt;br /&gt;
| Full path to '''MRO.json'''&lt;br /&gt;
| Identifies the recurring task configuration.&lt;br /&gt;
|-&lt;br /&gt;
| '''ExecuteWebInterface'''&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| The execution EnterpriseService does not require the web interface in this setup.&lt;br /&gt;
|-&lt;br /&gt;
| '''ExecuteTaskByJsonFile'''&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| Enables execution of the tasks configured in '''MRO.json'''.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Configure MRO.json ===&lt;br /&gt;
&lt;br /&gt;
Create '''MRO.json''' and configure the database connection, execution interval, Scheduled Orchestrator, and path to '''MRO.PARAM.json''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;RepeateEveryMinutes&amp;quot;: 0.2,&lt;br /&gt;
  &amp;quot;SqlConnectionDefinition&amp;quot;: {&lt;br /&gt;
    &amp;quot;SSPI&amp;quot;: true,&lt;br /&gt;
    &amp;quot;SQLUser&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
    &amp;quot;SQLPassword&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
    &amp;quot;SQLServer&amp;quot;: &amp;quot;(localdb)\\MSSQLLocalDB&amp;quot;,&lt;br /&gt;
    &amp;quot;SQLInitialCatalog&amp;quot;: &amp;quot;JOB.TEST&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;Tasks&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;ClassFullname&amp;quot;: &amp;quot;UBIK.ServiceTask.Orchestration.ScheduledOrchestrator&amp;quot;,&lt;br /&gt;
      &amp;quot;MethodName&amp;quot;: &amp;quot;Apply&amp;quot;,&lt;br /&gt;
      &amp;quot;MethodParameterPathFullName&amp;quot;: &amp;quot;&amp;lt;full path to MRO.PARAM.json&amp;gt;&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adapt the database settings and '''MethodParameterPathFullName''' to the target deployment. Keep '''ClassFullname''' and '''MethodName''' as shown so that the task executes '''UBIK.ServiceTask.Orchestration.ScheduledOrchestrator.Apply'''.&lt;br /&gt;
&lt;br /&gt;
'''RepeateEveryMinutes''' defines how often the execution EnterpriseService checks for scheduled jobs. A value of 0 causes continuous checking. The value 0.2 can be used for a demonstration where continuous checking is not required.&lt;br /&gt;
&lt;br /&gt;
=== Configure MRO.PARAM.json ===&lt;br /&gt;
&lt;br /&gt;
Create '''MRO.PARAM.json''' and configure the UID of '''MRO_JOB_DISPATCHING''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;InterfaceAdmin&amp;quot;: &amp;quot;BBAF1C9E-8F3B-4C9A-9E2D-5F7A1C3E4B6D&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The '''InterfaceAdmin''' value identifies '''MRO_JOB_DISPATCHING''' for the Scheduled Orchestrator.&lt;br /&gt;
&lt;br /&gt;
== Maintenance plan prerequisites ==&lt;br /&gt;
&lt;br /&gt;
For a basic work package replication scenario, configure:&lt;br /&gt;
&lt;br /&gt;
* a concrete maintenance plan type such as '''CyclicMaintenancePlan'''&lt;br /&gt;
* an asset through '''LK_ASSET'''&lt;br /&gt;
* a template work package through '''LK_WP_TMPL'''&lt;br /&gt;
* an '''INSTANCE_REPLICATION''' object through '''LK_REPLICATION_CONFIG'''&lt;br /&gt;
* '''PLAN_STATUS''' as Active&lt;br /&gt;
* '''AUTO_CREATE''' as enabled&lt;br /&gt;
* planning dates that make the plan eligible for generation&lt;br /&gt;
* a template work package with '''ISTEMPLATE''' set&lt;br /&gt;
&lt;br /&gt;
The maintenance plan must not already have an open generated work package. Detailed generation conditions are documented in [[MROMaintenancePlans]].&lt;br /&gt;
&lt;br /&gt;
== Basic test or demonstration ==&lt;br /&gt;
&lt;br /&gt;
=== Prepare the maintenance plan ===&lt;br /&gt;
&lt;br /&gt;
# Open the database in UBIK.Studio.&lt;br /&gt;
# Create or select a valid maintenance plan.&lt;br /&gt;
# Assign the required asset through '''LK_ASSET'''.&lt;br /&gt;
# Assign a template work package through '''LK_WP_TMPL'''.&lt;br /&gt;
# Verify that '''ISTEMPLATE''' is set on the template work package.&lt;br /&gt;
# Assign an '''INSTANCE_REPLICATION''' object through '''LK_REPLICATION_CONFIG'''.&lt;br /&gt;
# Set '''PLAN_STATUS''' to Active.&lt;br /&gt;
# Enable '''AUTO_CREATE'''.&lt;br /&gt;
# Configure the planning dates so that '''EARLIEST_GENERATION_DATE''' has been reached.&lt;br /&gt;
# Verify that the maintenance plan has no open generated work package.&lt;br /&gt;
&lt;br /&gt;
=== Schedule the job ===&lt;br /&gt;
&lt;br /&gt;
# Start '''UBIK.EnterpriseService.exe''' in the scheduling folder.&lt;br /&gt;
# Start '''UBIK.EnterpriseService.BasicClient.App.exe''' manually, or start it through a configured Windows Task Scheduler task.&lt;br /&gt;
# The BasicClient App sends the request defined in '''ReplicateWorkpackageJob.json''' to the scheduling EnterpriseService.&lt;br /&gt;
# '''UBIK.MRO.MaintenancePlanningOrchestrator.Apply''' searches for eligible maintenance plans and schedules their replication jobs.&lt;br /&gt;
&lt;br /&gt;
=== Verify the scheduled job ===&lt;br /&gt;
&lt;br /&gt;
# Open '''MRO_JOB_DISPATCHING''' in UBIK.Studio.&lt;br /&gt;
# Verify that a job object was created for the eligible maintenance plan.&lt;br /&gt;
# Verify that '''INTERFACE_EXECUTION_STATUS''' is Scheduled.&lt;br /&gt;
# If the execution EnterpriseService has not been started, verify that no generated work package exists yet.&lt;br /&gt;
&lt;br /&gt;
=== Execute the job ===&lt;br /&gt;
&lt;br /&gt;
# Start '''UBIK.EnterpriseService.exe''' in the execution folder.&lt;br /&gt;
# The EnterpriseService executes '''UBIK.ServiceTask.Orchestration.ScheduledOrchestrator.Apply''' according to '''MRO.json'''.&lt;br /&gt;
# The Scheduled Orchestrator reads the scheduled job from '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
# The configured replication job generates the work package.&lt;br /&gt;
&lt;br /&gt;
=== Verify the result ===&lt;br /&gt;
&lt;br /&gt;
# Refresh '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
# Verify that the job status is Success.&lt;br /&gt;
# Refresh the Work Package MetaClass.&lt;br /&gt;
# Verify that a new work package was created.&lt;br /&gt;
# Verify that '''ISTEMPLATE''' is not set on the generated work package.&lt;br /&gt;
# Verify the links and planning values described in [[MROMaintenancePlans]].&lt;br /&gt;
&lt;br /&gt;
For a Round Maintenance Plan, also verify that:&lt;br /&gt;
&lt;br /&gt;
* the main round work package was created&lt;br /&gt;
* the child maintenance plans produced the configured additional work packages&lt;br /&gt;
* the additional work packages are assigned to the main round work package through '''TASK_OWNER'''&lt;br /&gt;
&lt;br /&gt;
== Triggering the scheduling process ==&lt;br /&gt;
&lt;br /&gt;
For a manual test or demonstration, start '''UBIK.EnterpriseService.BasicClient.App.exe''' manually.&lt;br /&gt;
&lt;br /&gt;
For recurring execution, a Windows Task Scheduler task can start '''UBIK.EnterpriseService.BasicClient.App.exe'''. The executable path is configured in the task. The request and target orchestrator are configured in '''UBIK.EnterpriseService.BasicClient.App.exe.config''' and '''ReplicateWorkpackageJob.json'''.&lt;br /&gt;
&lt;br /&gt;
Running the Maintenance Planning Orchestrator processes all eligible maintenance plans.&lt;br /&gt;
&lt;br /&gt;
== Configuration summary ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Component&lt;br /&gt;
! Configuration&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| Scheduling EnterpriseService&lt;br /&gt;
| '''ExecuteWebInterface''' = 1&lt;br /&gt;
| Exposes the web interface used by the BasicClient App.&lt;br /&gt;
|-&lt;br /&gt;
| BasicClient App&lt;br /&gt;
| '''PathToBasicEnterpriseServiceRequestJsonFile'''&lt;br /&gt;
| Points to '''ReplicateWorkpackageJob.json'''.&lt;br /&gt;
|-&lt;br /&gt;
| Scheduling request&lt;br /&gt;
| '''UBIK.MRO.MaintenancePlanningOrchestrator.Apply'''&lt;br /&gt;
| Searches for eligible maintenance plans and schedules their jobs.&lt;br /&gt;
|-&lt;br /&gt;
| Execution EnterpriseService&lt;br /&gt;
| '''ExecuteTaskByJsonFile''' = 1&lt;br /&gt;
| Enables execution using '''MRO.json'''.&lt;br /&gt;
|-&lt;br /&gt;
| Execution task&lt;br /&gt;
| '''UBIK.ServiceTask.Orchestration.ScheduledOrchestrator.Apply'''&lt;br /&gt;
| Processes scheduled dispatching jobs.&lt;br /&gt;
|-&lt;br /&gt;
| Execution parameter&lt;br /&gt;
| '''InterfaceAdmin'''&lt;br /&gt;
| Identifies '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
|-&lt;br /&gt;
| Maintenance plan&lt;br /&gt;
| '''LK_REPLICATION_CONFIG'''&lt;br /&gt;
| Links directly to the '''INSTANCE_REPLICATION''' object used to copy the template work package.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[MROMaintenancePlans]]&lt;br /&gt;
* [[InterfaceAdministration]]&lt;br /&gt;
* [[InterfaceExecution]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_Replication_Jobs&amp;diff=30597</id>
		<title>MRO Replication Jobs</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_Replication_Jobs&amp;diff=30597"/>
				<updated>2026-09-22T07:13:15Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MRO replication jobs generate work packages from configured maintenance plans. The processing is divided into two steps: the Maintenance Planning Orchestrator schedules jobs for eligible maintenance plans, and a separate EnterpriseService executes the scheduled jobs.&lt;br /&gt;
&lt;br /&gt;
This page describes the available MRO replication jobs, the required BasicClient App and EnterpriseService configuration, and a basic setup for testing or demonstrating MRO replication.&lt;br /&gt;
&lt;br /&gt;
For the configuration and behaviour of maintenance plans, see [[MROMaintenancePlans]].&lt;br /&gt;
&lt;br /&gt;
== Replication process ==&lt;br /&gt;
&lt;br /&gt;
MRO replication uses the following process:&lt;br /&gt;
&lt;br /&gt;
# The Maintenance Planning Orchestrator searches for maintenance plans that are ready for automatic work package generation.&lt;br /&gt;
# Each eligible maintenance plan provides the replication job required for its plan type.&lt;br /&gt;
# The orchestrator schedules the job in '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
# A separate EnterpriseService processes the scheduled job.&lt;br /&gt;
# The replication job uses the template work package and the linked '''INSTANCE_REPLICATION''' object to generate the work package.&lt;br /&gt;
&lt;br /&gt;
Scheduling a job does not execute the replication immediately. It creates a dispatching job containing the information required for later execution.&lt;br /&gt;
&lt;br /&gt;
For a basic test or demonstration, the scheduling and execution processes can be configured in two separate UBIK.Studio folders.&lt;br /&gt;
&lt;br /&gt;
== Available MRO replication jobs ==&lt;br /&gt;
&lt;br /&gt;
MRO provides two replication jobs.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Job&lt;br /&gt;
! Inheritance&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| '''ReplicateWorkpackageJob'''&lt;br /&gt;
| Derives from '''DispatchingJob''' for '''WorkPackage'''&lt;br /&gt;
| Generates a work package from the template and replication configuration of a maintenance plan.&lt;br /&gt;
|-&lt;br /&gt;
| '''ReplicateRoundWorkpackageJob'''&lt;br /&gt;
| Derives from '''ReplicateWorkpackageJob'''&lt;br /&gt;
| Generates the main work package of a maintenance round and the additional work packages configured by its child maintenance plans.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Both jobs use the same scheduling, dispatching, and execution infrastructure. The maintenance plan implementation returns the appropriate job when the Maintenance Planning Orchestrator requests its replication job.&lt;br /&gt;
&lt;br /&gt;
=== Work package replication ===&lt;br /&gt;
&lt;br /&gt;
A standard maintenance plan uses '''ReplicateWorkpackageJob'''.&lt;br /&gt;
&lt;br /&gt;
The maintenance plan provides:&lt;br /&gt;
&lt;br /&gt;
* a template work package through '''LK_WP_TMPL'''&lt;br /&gt;
* an '''INSTANCE_REPLICATION''' object through '''LK_REPLICATION_CONFIG'''&lt;br /&gt;
* the maintenance plan settings required for automatic work package generation&lt;br /&gt;
&lt;br /&gt;
The linked '''INSTANCE_REPLICATION''' object defines how the template work package is copied. The generated work package is not marked as a template.&lt;br /&gt;
&lt;br /&gt;
For the complete maintenance plan prerequisites and the properties set on generated work packages, see [[MROMaintenancePlans]].&lt;br /&gt;
&lt;br /&gt;
=== Round work package replication ===&lt;br /&gt;
&lt;br /&gt;
A '''RoundMaintenancePlan''' uses '''ReplicateRoundWorkpackageJob'''.&lt;br /&gt;
&lt;br /&gt;
The job creates the main work package from the Round Maintenance Plan. It then processes the child maintenance plans linked through '''SYSREL_ROUND_RELATION''' and creates their additional work packages. The additional work packages are assigned to the main round work package through '''TASK_OWNER'''.&lt;br /&gt;
&lt;br /&gt;
Round work package replication uses the same BasicClient App, EnterpriseService, and dispatching setup as standard work package replication. The maintenance plan implementation determines which job is scheduled.&lt;br /&gt;
&lt;br /&gt;
For the configuration and behaviour of Round Maintenance Plans, see [[MROMaintenancePlans]].&lt;br /&gt;
&lt;br /&gt;
== Scheduling and execution ==&lt;br /&gt;
&lt;br /&gt;
=== Maintenance Planning Orchestrator ===&lt;br /&gt;
&lt;br /&gt;
The scheduling process executes the following method:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| Class&lt;br /&gt;
| '''UBIK.MRO.MaintenancePlanningOrchestrator'''&lt;br /&gt;
|-&lt;br /&gt;
| Method&lt;br /&gt;
| '''Apply'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Maintenance Planning Orchestrator searches for eligible maintenance plans, requests the appropriate replication job from each plan, and schedules the job in '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
&lt;br /&gt;
=== Scheduled Orchestrator ===&lt;br /&gt;
&lt;br /&gt;
The execution process executes the following method:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| Class&lt;br /&gt;
| '''UBIK.ServiceTask.Orchestration.ScheduledOrchestrator'''&lt;br /&gt;
|-&lt;br /&gt;
| Method&lt;br /&gt;
| '''Apply'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Scheduled Orchestrator searches '''MRO_JOB_DISPATCHING''' for scheduled jobs and executes them.&lt;br /&gt;
&lt;br /&gt;
== MRO job dispatching ==&lt;br /&gt;
&lt;br /&gt;
'''MRO_JOB_DISPATCHING''' is the specialised DISPATCHING Interface Administration MetaClass used for MRO replication jobs.&lt;br /&gt;
&lt;br /&gt;
The orchestration process creates the required job objects automatically. Project teams do not need to create these objects manually.&lt;br /&gt;
&lt;br /&gt;
The execution EnterpriseService identifies '''MRO_JOB_DISPATCHING''' through the '''InterfaceAdmin''' value in '''MRO.PARAM.json'''.&lt;br /&gt;
&lt;br /&gt;
For general information about Interface Administration objects, see [[InterfaceAdministration]].&lt;br /&gt;
&lt;br /&gt;
=== Job statuses ===&lt;br /&gt;
&lt;br /&gt;
The execution status indicates the current state or result of a dispatching job.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Status&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Undefined&lt;br /&gt;
| The execution state is undefined.&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Success&lt;br /&gt;
| The execution completed successfully.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Terminated&lt;br /&gt;
| The execution was terminated.&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Conflict&lt;br /&gt;
| An export conflict occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Started&lt;br /&gt;
| Execution has started but has not yet completed.&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Scheduled&lt;br /&gt;
| The job is scheduled but has not yet been executed.&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| Error&lt;br /&gt;
| An error occurred during execution.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In a basic replication test, a newly scheduled job first has the status '''Scheduled'''. After successful execution, its status changes to '''Success'''.&lt;br /&gt;
&lt;br /&gt;
== Application setup ==&lt;br /&gt;
&lt;br /&gt;
A basic test or demonstration uses two separate UBIK.Studio folders.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Studio folder&lt;br /&gt;
! Purpose&lt;br /&gt;
! Required applications&lt;br /&gt;
|-&lt;br /&gt;
| Scheduling folder&lt;br /&gt;
| Provides the EnterpriseService web interface and starts the Maintenance Planning Orchestrator through the BasicClient App.&lt;br /&gt;
| '''UBIK.EnterpriseService.exe''' and '''UBIK.EnterpriseService.BasicClient.App.exe'''&lt;br /&gt;
|-&lt;br /&gt;
| Execution folder&lt;br /&gt;
| Runs the Scheduled Orchestrator and executes jobs from '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
| '''UBIK.EnterpriseService.exe'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The folder names and paths in the examples can be changed. Every configured path must point to the corresponding file in the local deployment.&lt;br /&gt;
&lt;br /&gt;
== Scheduling folder setup ==&lt;br /&gt;
&lt;br /&gt;
The scheduling folder requires the following files:&lt;br /&gt;
&lt;br /&gt;
* '''UBIK.EnterpriseService.exe'''&lt;br /&gt;
* '''UBIK.EnterpriseService.exe.config'''&lt;br /&gt;
* '''UBIK.EnterpriseService.BasicClient.App.exe'''&lt;br /&gt;
* '''UBIK.EnterpriseService.BasicClient.App.exe.config'''&lt;br /&gt;
* '''JSON\ReplicateWorkpackageJob.json'''&lt;br /&gt;
&lt;br /&gt;
=== Configure the scheduling EnterpriseService ===&lt;br /&gt;
&lt;br /&gt;
In '''UBIK.EnterpriseService.exe.config''', configure the following application settings:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Default value&lt;br /&gt;
! Required value&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| '''ExecuteWebInterface'''&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| Enables the web interface used by the BasicClient App.&lt;br /&gt;
|-&lt;br /&gt;
| '''ExecuteTaskByJsonFile'''&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| The scheduling EnterpriseService does not execute the recurring task configuration used by the execution EnterpriseService.&lt;br /&gt;
|-&lt;br /&gt;
| '''WebInterfacePort'''&lt;br /&gt;
| 9000&lt;br /&gt;
| 9000&lt;br /&gt;
| Defines the port used by the web interface in this example.&lt;br /&gt;
|-&lt;br /&gt;
| '''WebInterfaceHost'''&lt;br /&gt;
| http://localhost&lt;br /&gt;
| http://localhost&lt;br /&gt;
| Defines the host used by the web interface in this example.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Configure the BasicClient App ===&lt;br /&gt;
&lt;br /&gt;
In '''UBIK.EnterpriseService.BasicClient.App.exe.config''', configure the following application settings:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Example value&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| '''BaseAddress'''&lt;br /&gt;
| http://localhost:9000&lt;br /&gt;
| Identifies the web interface exposed by the scheduling EnterpriseService.&lt;br /&gt;
|-&lt;br /&gt;
| '''PathToBasicEnterpriseServiceRequestJsonFile'''&lt;br /&gt;
| Full path to ReplicateWorkpackageJob.json&lt;br /&gt;
| Identifies the request file that starts the Maintenance Planning Orchestrator.&lt;br /&gt;
|-&lt;br /&gt;
| '''PathToBasicEnterpriseServiceRequestJsonFileList'''&lt;br /&gt;
| Empty&lt;br /&gt;
| No request file list is used in this setup.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''BaseAddress''' must match '''WebInterfaceHost''' and '''WebInterfacePort''' in the scheduling EnterpriseService configuration. Replace the example path with the actual path to '''ReplicateWorkpackageJob.json'''.&lt;br /&gt;
&lt;br /&gt;
=== Configure ReplicateWorkpackageJob.json ===&lt;br /&gt;
&lt;br /&gt;
Create '''ReplicateWorkpackageJob.json''' in the JSON folder and configure the target database, orchestrator class, and method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;SSPI&amp;quot;: true,&lt;br /&gt;
  &amp;quot;SQLUser&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;SQLPassword&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;SQLServer&amp;quot;: &amp;quot;(localdb)\\MSSQLLocalDB&amp;quot;,&lt;br /&gt;
  &amp;quot;SQLInitialCatalog&amp;quot;: &amp;quot;JOB.TEST&amp;quot;,&lt;br /&gt;
  &amp;quot;ClassFullname&amp;quot;: &amp;quot;UBIK.MRO.MaintenancePlanningOrchestrator&amp;quot;,&lt;br /&gt;
  &amp;quot;MethodName&amp;quot;: &amp;quot;Apply&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adapt the database settings to the target database. Keep '''ClassFullname''' and '''MethodName''' as shown so that the request executes '''UBIK.MRO.MaintenancePlanningOrchestrator.Apply'''.&lt;br /&gt;
&lt;br /&gt;
== Execution folder setup ==&lt;br /&gt;
&lt;br /&gt;
The execution folder requires the following files:&lt;br /&gt;
&lt;br /&gt;
* '''UBIK.EnterpriseService.exe'''&lt;br /&gt;
* '''UBIK.EnterpriseService.exe.config'''&lt;br /&gt;
* '''JSON\MRO.json'''&lt;br /&gt;
* '''JSON\MRO.PARAM.json'''&lt;br /&gt;
&lt;br /&gt;
=== Configure the execution EnterpriseService ===&lt;br /&gt;
&lt;br /&gt;
In '''UBIK.EnterpriseService.exe.config''', configure the following application settings:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Default value&lt;br /&gt;
! Required value&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| '''PluginExecutionConfigPath'''&lt;br /&gt;
| Empty&lt;br /&gt;
| Full path to '''MRO.json'''&lt;br /&gt;
| Identifies the recurring task configuration.&lt;br /&gt;
|-&lt;br /&gt;
| '''ExecuteWebInterface'''&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| The execution EnterpriseService does not require the web interface in this setup.&lt;br /&gt;
|-&lt;br /&gt;
| '''ExecuteTaskByJsonFile'''&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| Enables execution of the tasks configured in '''MRO.json'''.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Configure MRO.json ===&lt;br /&gt;
&lt;br /&gt;
Create '''MRO.json''' and configure the database connection, execution interval, Scheduled Orchestrator, and path to '''MRO.PARAM.json''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;RepeateEveryMinutes&amp;quot;: 0.2,&lt;br /&gt;
  &amp;quot;SqlConnectionDefinition&amp;quot;: {&lt;br /&gt;
    &amp;quot;SSPI&amp;quot;: true,&lt;br /&gt;
    &amp;quot;SQLUser&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
    &amp;quot;SQLPassword&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
    &amp;quot;SQLServer&amp;quot;: &amp;quot;(localdb)\\MSSQLLocalDB&amp;quot;,&lt;br /&gt;
    &amp;quot;SQLInitialCatalog&amp;quot;: &amp;quot;JOB.TEST&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;Tasks&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;ClassFullname&amp;quot;: &amp;quot;UBIK.ServiceTask.Orchestration.ScheduledOrchestrator&amp;quot;,&lt;br /&gt;
      &amp;quot;MethodName&amp;quot;: &amp;quot;Apply&amp;quot;,&lt;br /&gt;
      &amp;quot;MethodParameterPathFullName&amp;quot;: &amp;quot;&amp;lt;full path to MRO.PARAM.json&amp;gt;&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adapt the database settings and '''MethodParameterPathFullName''' to the target deployment. Keep '''ClassFullname''' and '''MethodName''' as shown so that the task executes '''UBIK.ServiceTask.Orchestration.ScheduledOrchestrator.Apply'''.&lt;br /&gt;
&lt;br /&gt;
'''RepeateEveryMinutes''' defines how often the execution EnterpriseService checks for scheduled jobs. A value of 0 causes continuous checking. The value 0.2 can be used for a demonstration where continuous checking is not required.&lt;br /&gt;
&lt;br /&gt;
=== Configure MRO.PARAM.json ===&lt;br /&gt;
&lt;br /&gt;
Create '''MRO.PARAM.json''' and configure the UID of '''MRO_JOB_DISPATCHING''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;InterfaceAdmin&amp;quot;: &amp;quot;BBAF1C9E-8F3B-4C9A-9E2D-5F7A1C3E4B6D&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The '''InterfaceAdmin''' value identifies '''MRO_JOB_DISPATCHING''' for the Scheduled Orchestrator.&lt;br /&gt;
&lt;br /&gt;
== Maintenance plan prerequisites ==&lt;br /&gt;
&lt;br /&gt;
For a basic work package replication scenario, configure:&lt;br /&gt;
&lt;br /&gt;
* a concrete maintenance plan type such as '''CyclicMaintenancePlan'''&lt;br /&gt;
* an asset through '''LK_ASSET'''&lt;br /&gt;
* a template work package through '''LK_WP_TMPL'''&lt;br /&gt;
* an '''INSTANCE_REPLICATION''' object through '''LK_REPLICATION_CONFIG'''&lt;br /&gt;
* '''PLAN_STATUS''' as Active&lt;br /&gt;
* '''AUTO_CREATE''' as enabled&lt;br /&gt;
* planning dates that make the plan eligible for generation&lt;br /&gt;
* a template work package with '''ISTEMPLATE''' set&lt;br /&gt;
&lt;br /&gt;
The maintenance plan must not already have an open generated work package. Detailed generation conditions are documented in [[MROMaintenancePlans]].&lt;br /&gt;
&lt;br /&gt;
== Basic test or demonstration ==&lt;br /&gt;
&lt;br /&gt;
=== Prepare the maintenance plan ===&lt;br /&gt;
&lt;br /&gt;
# Open the database in UBIK.Studio.&lt;br /&gt;
# Create or select a valid maintenance plan.&lt;br /&gt;
# Assign the required asset through '''LK_ASSET'''.&lt;br /&gt;
# Assign a template work package through '''LK_WP_TMPL'''.&lt;br /&gt;
# Verify that '''ISTEMPLATE''' is set on the template work package.&lt;br /&gt;
# Assign an '''INSTANCE_REPLICATION''' object through '''LK_REPLICATION_CONFIG'''.&lt;br /&gt;
# Set '''PLAN_STATUS''' to Active.&lt;br /&gt;
# Enable '''AUTO_CREATE'''.&lt;br /&gt;
# Configure the planning dates so that '''EARLIEST_GENERATION_DATE''' has been reached.&lt;br /&gt;
# Verify that the maintenance plan has no open generated work package.&lt;br /&gt;
&lt;br /&gt;
=== Schedule the job ===&lt;br /&gt;
&lt;br /&gt;
# Start '''UBIK.EnterpriseService.exe''' in the scheduling folder.&lt;br /&gt;
# Start '''UBIK.EnterpriseService.BasicClient.App.exe''' manually, or start it through a configured Windows Task Scheduler task.&lt;br /&gt;
# The BasicClient App sends the request defined in '''ReplicateWorkpackageJob.json''' to the scheduling EnterpriseService.&lt;br /&gt;
# '''UBIK.MRO.MaintenancePlanningOrchestrator.Apply''' searches for eligible maintenance plans and schedules their replication jobs.&lt;br /&gt;
&lt;br /&gt;
=== Verify the scheduled job ===&lt;br /&gt;
&lt;br /&gt;
# Open '''MRO_JOB_DISPATCHING''' in UBIK.Studio.&lt;br /&gt;
# Verify that a job object was created for the eligible maintenance plan.&lt;br /&gt;
# Verify that '''INTERFACE_EXECUTION_STATUS''' is Scheduled.&lt;br /&gt;
# If the execution EnterpriseService has not been started, verify that no generated work package exists yet.&lt;br /&gt;
&lt;br /&gt;
=== Execute the job ===&lt;br /&gt;
&lt;br /&gt;
# Start '''UBIK.EnterpriseService.exe''' in the execution folder.&lt;br /&gt;
# The EnterpriseService executes '''UBIK.ServiceTask.Orchestration.ScheduledOrchestrator.Apply''' according to '''MRO.json'''.&lt;br /&gt;
# The Scheduled Orchestrator reads the scheduled job from '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
# The configured replication job generates the work package.&lt;br /&gt;
&lt;br /&gt;
=== Verify the result ===&lt;br /&gt;
&lt;br /&gt;
# Refresh '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
# Verify that the job status is Success.&lt;br /&gt;
# Refresh the Work Package MetaClass.&lt;br /&gt;
# Verify that a new work package was created.&lt;br /&gt;
# Verify that '''ISTEMPLATE''' is not set on the generated work package.&lt;br /&gt;
# Verify the links and planning values described in [[MROMaintenancePlans]].&lt;br /&gt;
&lt;br /&gt;
For a Round Maintenance Plan, also verify that:&lt;br /&gt;
&lt;br /&gt;
* the main round work package was created&lt;br /&gt;
* the child maintenance plans produced the configured additional work packages&lt;br /&gt;
* the additional work packages are assigned to the main round work package through '''TASK_OWNER'''&lt;br /&gt;
&lt;br /&gt;
== Triggering the scheduling process ==&lt;br /&gt;
&lt;br /&gt;
For a manual test or demonstration, start '''UBIK.EnterpriseService.BasicClient.App.exe''' manually.&lt;br /&gt;
&lt;br /&gt;
For recurring execution, a Windows Task Scheduler task can start '''UBIK.EnterpriseService.BasicClient.App.exe'''. The executable path is configured in the task. The request and target orchestrator are configured in '''UBIK.EnterpriseService.BasicClient.App.exe.config''' and '''ReplicateWorkpackageJob.json'''.&lt;br /&gt;
&lt;br /&gt;
Running the Maintenance Planning Orchestrator processes all eligible maintenance plans.&lt;br /&gt;
&lt;br /&gt;
== Configuration summary ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Component&lt;br /&gt;
! Configuration&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| Scheduling EnterpriseService&lt;br /&gt;
| '''ExecuteWebInterface''' = 1&lt;br /&gt;
| Exposes the web interface used by the BasicClient App.&lt;br /&gt;
|-&lt;br /&gt;
| BasicClient App&lt;br /&gt;
| '''PathToBasicEnterpriseServiceRequestJsonFile'''&lt;br /&gt;
| Points to '''ReplicateWorkpackageJob.json'''.&lt;br /&gt;
|-&lt;br /&gt;
| Scheduling request&lt;br /&gt;
| '''UBIK.MRO.MaintenancePlanningOrchestrator.Apply'''&lt;br /&gt;
| Searches for eligible maintenance plans and schedules their jobs.&lt;br /&gt;
|-&lt;br /&gt;
| Execution EnterpriseService&lt;br /&gt;
| '''ExecuteTaskByJsonFile''' = 1&lt;br /&gt;
| Enables execution using '''MRO.json'''.&lt;br /&gt;
|-&lt;br /&gt;
| Execution task&lt;br /&gt;
| '''UBIK.ServiceTask.Orchestration.ScheduledOrchestrator.Apply'''&lt;br /&gt;
| Processes scheduled dispatching jobs.&lt;br /&gt;
|-&lt;br /&gt;
| Execution parameter&lt;br /&gt;
| '''InterfaceAdmin'''&lt;br /&gt;
| Identifies '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
|-&lt;br /&gt;
| Maintenance plan&lt;br /&gt;
| '''LK_REPLICATION_CONFIG'''&lt;br /&gt;
| Links directly to the '''INSTANCE_REPLICATION''' object used to copy the template work package.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[MROMaintenancePlans]]&lt;br /&gt;
* [[InterfaceAdministration]]&lt;br /&gt;
* [[InterfaceExecution]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MROMaintenancePlans&amp;diff=30596</id>
		<title>MROMaintenancePlans</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MROMaintenancePlans&amp;diff=30596"/>
				<updated>2026-09-21T11:33:11Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: /* See also */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= MRO Maintenance Planning =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Summary:''' The Maintenance Planning feature in MRO is used to plan recurring maintenance work and automatically generate work packages from maintenance plans. The maintenance plan defines the rules. The generated work package is used by users to execute and complete the actual maintenance work.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
A maintenance plan defines the rules for creating work packages. These rules include:&lt;br /&gt;
&lt;br /&gt;
* when a work package should be created&lt;br /&gt;
* which asset the work package belongs to&lt;br /&gt;
* which template work package is used&lt;br /&gt;
* how the template work package is copied&lt;br /&gt;
* how many days before the planned execution date the work package may be generated&lt;br /&gt;
* how future planning dates are calculated&lt;br /&gt;
&lt;br /&gt;
The actual maintenance work is not executed by the maintenance plan itself. The maintenance plan creates work packages. These generated work packages are then used by users to execute and complete the maintenance work.&lt;br /&gt;
&lt;br /&gt;
In MRO, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaintenancePlan&amp;lt;/span&amp;gt; is the abstract base class for maintenance planning. It provides the common foundation for maintenance plans, but it is not intended to be used directly.&lt;br /&gt;
&lt;br /&gt;
The fully implemented maintenance plan types in standard MRO are:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CyclicMaintenancePlan&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RoundMaintenancePlan&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Custom maintenance plan types can be implemented by deriving from the abstract &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaintenancePlan&amp;lt;/span&amp;gt; base class. However, the standard MRO maintenance planning feature is based on cyclic maintenance plans and round maintenance plans.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Important:''' &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CyclicMaintenancePlan&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RoundMaintenancePlan&amp;lt;/span&amp;gt; support recurrence-based scheduling. This includes planned execution dates, automatic work package generation, calendar-based scheduling, completion-based scheduling, automatic recalculation of scheduling dates, and generation based on due dates.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RoundMaintenancePlan&amp;lt;/span&amp;gt; additionally supports maintenance rounds. A round maintenance plan creates one main work package for the round. It can also create additional work packages from child maintenance plans linked via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt;. These additional work packages are assigned to the main round work package.&lt;br /&gt;
&lt;br /&gt;
== Basic Concept ==&lt;br /&gt;
&lt;br /&gt;
The maintenance planning feature is built around four main parts:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Part&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaintenancePlan&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines the rules for creating generated work packages.&lt;br /&gt;
|-&lt;br /&gt;
| Template work package&lt;br /&gt;
| Defines what the generated work package should look like.&lt;br /&gt;
|-&lt;br /&gt;
| Replication configuration&lt;br /&gt;
| Defines how the template work package is copied.&lt;br /&gt;
|-&lt;br /&gt;
| Generated work package&lt;br /&gt;
| The actual work package created by the maintenance plan.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Maintenance Plan ===&lt;br /&gt;
&lt;br /&gt;
The maintenance plan defines the rules for creating work packages.&lt;br /&gt;
&lt;br /&gt;
This includes, for example:&lt;br /&gt;
&lt;br /&gt;
* when a work package should be created&lt;br /&gt;
* which asset the work package should belong to&lt;br /&gt;
* how many days before the planned execution date the work package may be created&lt;br /&gt;
* which template work package should be used&lt;br /&gt;
* which recurrence pattern should be used&lt;br /&gt;
* whether future dates are calculated calendar-based or completion-based&lt;br /&gt;
&lt;br /&gt;
=== Template Work Package ===&lt;br /&gt;
&lt;br /&gt;
The template work package defines what the generated work package should look like.&lt;br /&gt;
&lt;br /&gt;
It is the source work package that is copied when the maintenance plan creates a new work package.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Rule:''' Only work packages with &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ISTEMPLATE&amp;lt;/span&amp;gt; set can be used as template work packages.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Replication Configuration ===&lt;br /&gt;
&lt;br /&gt;
The replication configuration defines how the template work package is copied.&lt;br /&gt;
&lt;br /&gt;
This includes, for example:&lt;br /&gt;
&lt;br /&gt;
* which properties are copied&lt;br /&gt;
* how referenced objects are handled&lt;br /&gt;
* what the target meta class of the generated work package should be&lt;br /&gt;
&lt;br /&gt;
=== Generated Work Package ===&lt;br /&gt;
&lt;br /&gt;
The generated work package is the actual result created by the maintenance plan.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
# A pump has to be inspected every month.&lt;br /&gt;
# A cyclic maintenance plan is created for this pump.&lt;br /&gt;
# The plan is configured with a monthly recurrence, an assigned asset, a template work package, and a replication configuration.&lt;br /&gt;
# When the plan becomes due, the system uses a replication job to create a new work package from the configured template work package.&lt;br /&gt;
# The generated work package is linked back to the maintenance plan via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MAINTENANCE_PLAN&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
This link allows the maintenance plan to react when the generated work package is planned or completed.&lt;br /&gt;
&lt;br /&gt;
== MaintenancePlan Base Class ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaintenancePlan&amp;lt;/span&amp;gt; is the abstract base class for maintenance planning in MRO.&lt;br /&gt;
&lt;br /&gt;
It provides the common properties and logic required by maintenance plan implementations.&lt;br /&gt;
&lt;br /&gt;
Because &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaintenancePlan&amp;lt;/span&amp;gt; is abstract, users do not create or use this base class directly in the standard MRO feature. Instead, the concrete maintenance plan types are used:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CyclicMaintenancePlan&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RoundMaintenancePlan&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Developers can derive from the abstract base class if a project requires a custom maintenance plan type. In that case, the custom implementation must provide the missing plan-specific behavior.&lt;br /&gt;
&lt;br /&gt;
=== Base Class Properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Purpose&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt;&lt;br /&gt;
| Links the maintenance plan to the asset that requires maintenance.&lt;br /&gt;
| Required for a valid cyclic maintenance plan.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt;&lt;br /&gt;
| Links the maintenance plan to the template work package.&lt;br /&gt;
| The linked work package must have &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ISTEMPLATE&amp;lt;/span&amp;gt; set.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_REPLICATION_CONFIG&amp;lt;/span&amp;gt;&lt;br /&gt;
| Links the maintenance plan to the replication configuration.&lt;br /&gt;
| Required for work package generation.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines the planned execution date of the next maintenance activity.&lt;br /&gt;
| Used as &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt; on generated work packages.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines how many days before &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; the system may create the work package.&lt;br /&gt;
| Does not define the recurrence interval.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines the earliest date on which the maintenance plan may create a work package.&lt;br /&gt;
| Calculated by the system.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_STATUS&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines whether the maintenance plan is active or inactive.&lt;br /&gt;
| Only active plans are considered for automatic generation.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AUTO_CREATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines whether the system is allowed to automatically create work packages.&lt;br /&gt;
| If disabled, the plan does not automatically create work packages.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LAST_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stores the most recent completion date of a generated work package linked to the maintenance plan.&lt;br /&gt;
| Especially relevant for completion-based scheduling.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PRIORITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| Numeric value that can be used to sort maintenance plans.&lt;br /&gt;
| For round maintenance plans, see also &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_SELECTION_RULE&amp;lt;/span&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt; is the link to the asset that requires maintenance.&lt;br /&gt;
&lt;br /&gt;
This can be, for example:&lt;br /&gt;
&lt;br /&gt;
* equipment&lt;br /&gt;
* a functional location&lt;br /&gt;
* another customized maintainable object deriving from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Asset&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The generated work package is linked to the same asset.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #f0ad4e; background-color: #fff8e5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Requirement:''' A cyclic maintenance plan requires &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt; to be assigned in order to be valid.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt; is the link to the template work package.&lt;br /&gt;
&lt;br /&gt;
The template work package defines what the generated work package should look like.&lt;br /&gt;
&lt;br /&gt;
When the maintenance plan creates a work package, the system copies the work package referenced by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The linked work package must be a template work package. This means its &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ISTEMPLATE&amp;lt;/span&amp;gt; property must be set.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #f0ad4e; background-color: #fff8e5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Requirement:''' &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt; must be configured before the maintenance plan can create a work package.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_REPLICATION_CONFIG&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_REPLICATION_CONFIG&amp;lt;/span&amp;gt; is the link to the replication configuration.&lt;br /&gt;
&lt;br /&gt;
The replication configuration defines how the template work package is copied into a generated work package.&lt;br /&gt;
&lt;br /&gt;
It can define, for example:&lt;br /&gt;
&lt;br /&gt;
* which properties are copied&lt;br /&gt;
* how references are copied&lt;br /&gt;
* what the target meta class of the generated work package should be&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #f0ad4e; background-color: #fff8e5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Requirement:''' &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_REPLICATION_CONFIG&amp;lt;/span&amp;gt; must be configured before the maintenance plan can create a work package.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; defines the planned execution date of the next maintenance activity.&lt;br /&gt;
&lt;br /&gt;
It answers the question: '''When should the next maintenance work be performed?'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is not necessarily the date on which the work package is created.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 15 March&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt;&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 12 March&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In this example, the system may create the work package on 12 March, but the generated work package is planned for 15 March.&lt;br /&gt;
&lt;br /&gt;
When a work package is generated, the generated work package receives the maintenance plan’s &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; as its &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt; defines how many days before &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; the system may create the work package.&lt;br /&gt;
&lt;br /&gt;
This is used to create work packages before the actual planned execution date.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 15 March&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt;&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| Resulting &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 12 March&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Note:''' &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt; does not define the recurrence interval. It only defines how early the work package may be generated before the planned execution date.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt; is calculated by the system.&lt;br /&gt;
&lt;br /&gt;
It defines the earliest date on which the maintenance plan may create a work package.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EARLIEST_GENERATION_DATE = NEXT_DATE - LEAD_DAYS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 15 March&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt;&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 12 March&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The maintenance planning orchestrator searches for active plans where &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt; has been reached.&lt;br /&gt;
&lt;br /&gt;
A plan can be considered for automatic work package generation when:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EARLIEST_GENERATION_DATE &amp;lt;= current date&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt; has not yet been reached, no work package is created.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_STATUS&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_STATUS&amp;lt;/span&amp;gt; defines whether the maintenance plan is active or inactive.&lt;br /&gt;
&lt;br /&gt;
Only active plans are considered for automatic work package generation. Inactive plans are ignored by the maintenance planning process.&lt;br /&gt;
&lt;br /&gt;
Typical values are:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Inactive&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Active&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This allows users to temporarily disable a maintenance plan without deleting it.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AUTO_CREATE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AUTO_CREATE&amp;lt;/span&amp;gt; defines whether the system is allowed to automatically create work packages from the maintenance plan.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AUTO_CREATE&amp;lt;/span&amp;gt; is enabled, the maintenance planning orchestrator can create work packages once the plan is due.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AUTO_CREATE&amp;lt;/span&amp;gt; is disabled, the plan does not automatically create work packages.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LAST_DATE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LAST_DATE&amp;lt;/span&amp;gt; stores the date when the most recent generated work package linked to the maintenance plan was completed.&lt;br /&gt;
&lt;br /&gt;
This property is especially important for completion-based scheduling.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| Previous generated work package completed&lt;br /&gt;
| 20 March&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Completion-Based&lt;br /&gt;
|-&lt;br /&gt;
| Next date is calculated from&lt;br /&gt;
| 20 March&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The system updates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LAST_DATE&amp;lt;/span&amp;gt; when a generated work package is completed.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PRIORITY&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PRIORITY&amp;lt;/span&amp;gt; is a numeric value that can be used to sort maintenance plans.&lt;br /&gt;
&lt;br /&gt;
For round maintenance plans, there is also a property called &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_SELECTION_RULE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #f0ad4e; background-color: #fff8e5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Open point:''' The exact effect of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_SELECTION_RULE&amp;lt;/span&amp;gt; should only be documented after the implementation behavior has been verified.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Work Package Properties Used by Maintenance Planning ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Used on&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MAINTENANCE_PLAN&amp;lt;/span&amp;gt;&lt;br /&gt;
| Generated work package&lt;br /&gt;
| Links the generated work package back to the maintenance plan that triggered its creation.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt;&lt;br /&gt;
| Generated work package&lt;br /&gt;
| Stores the template work package that was used to create the generated work package.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt;&lt;br /&gt;
| Generated work package&lt;br /&gt;
| Stores the asset for which the work package was created.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt;&lt;br /&gt;
| Generated work package&lt;br /&gt;
| Stores the planned start date of the generated work package.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ORGA_STATUS&amp;lt;/span&amp;gt;&lt;br /&gt;
| Generated work package&lt;br /&gt;
| Used to determine whether a generated work package is finished.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;TASK_OWNER&amp;lt;/span&amp;gt;&lt;br /&gt;
| Additional round work package&lt;br /&gt;
| Assigns additional generated work packages to the main round work package.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ORDERID&amp;lt;/span&amp;gt;&lt;br /&gt;
| Additional round work package&lt;br /&gt;
| Can be copied from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt; to structure or order round work packages.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GROUPID&amp;lt;/span&amp;gt;&lt;br /&gt;
| Additional round work package&lt;br /&gt;
| Can be copied from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt; to group round work packages.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MAINTENANCE_PLAN&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MAINTENANCE_PLAN&amp;lt;/span&amp;gt; is set on generated work packages.&lt;br /&gt;
&lt;br /&gt;
It stores the maintenance plan that triggered the creation of the work package.&lt;br /&gt;
&lt;br /&gt;
This is important because the maintenance plan itself does not directly store a list of generated work packages. Instead, generated work packages reference their source maintenance plan via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MAINTENANCE_PLAN&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
This link allows the system to find work packages created from a maintenance plan and to update the maintenance plan when a generated work package is planned or completed.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
On a generated work package, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt; stores the template work package that was used to create the generated work package.&lt;br /&gt;
&lt;br /&gt;
This allows users and the system to see which template was used as the source.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
On a generated work package, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt; stores the asset for which the work package was created.&lt;br /&gt;
&lt;br /&gt;
This is usually copied or assigned based on the maintenance plan’s &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt; stores the planned start date of the generated work package.&lt;br /&gt;
&lt;br /&gt;
When a maintenance plan generates a work package, the system sets:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
generated WorkPackage.PLANNED_START = MaintenancePlan.NEXT_DATE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ORGA_STATUS&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ORGA_STATUS&amp;lt;/span&amp;gt; is used to determine whether a generated work package is finished.&lt;br /&gt;
&lt;br /&gt;
A work package is considered finished when:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ORGA_STATUS == 100&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open work packages are generated work packages linked to the maintenance plan where:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ORGA_STATUS != 100&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #f0ad4e; background-color: #fff8e5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Generation rule:''' A maintenance plan does not create another work package while it still has an open generated work package.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;TASK_OWNER&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;TASK_OWNER&amp;lt;/span&amp;gt; is used in round maintenance scenarios.&lt;br /&gt;
&lt;br /&gt;
When a round maintenance plan creates a main work package and additional work packages from linked child plans, the additional work packages are assigned to the main round work package via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;TASK_OWNER&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ORDERID&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GROUPID&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ORDERID&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GROUPID&amp;lt;/span&amp;gt; can be copied from the &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt; relation to generated work packages in a round maintenance scenario.&lt;br /&gt;
&lt;br /&gt;
They can be used to order or group the additional work packages that belong to the generated round work package.&lt;br /&gt;
&lt;br /&gt;
== CyclicMaintenancePlan ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CyclicMaintenancePlan&amp;lt;/span&amp;gt; is used for recurring maintenance work on an asset.&lt;br /&gt;
&lt;br /&gt;
It is the standard maintenance plan type for maintenance activities that repeat according to a defined recurrence pattern.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
* inspect a pump every month&lt;br /&gt;
* service a machine every 6 months&lt;br /&gt;
* check safety equipment every Monday&lt;br /&gt;
* replace a filter every 30 days&lt;br /&gt;
* perform annual maintenance on a functional location&lt;br /&gt;
&lt;br /&gt;
A cyclic maintenance plan uses &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; to define the recurrence. It also uses &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt; to define how future dates are calculated.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Key concept:''' &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt; defines whether the plan follows fixed calendar dates or whether the next date depends on the actual completion date of the previous generated work package.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The supported scheduling modes are:&lt;br /&gt;
&lt;br /&gt;
* Calendar-Based&lt;br /&gt;
* Completion-Based&lt;br /&gt;
&lt;br /&gt;
== CyclicMaintenancePlan Properties ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Purpose&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines the recurrence pattern.&lt;br /&gt;
| Must be valid and parseable.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_START_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines when the recurrence pattern starts.&lt;br /&gt;
| Used as the start point for recurrence calculation.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_UNTIL_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Optional end date for the recurrence.&lt;br /&gt;
| No further occurrences are generated after this date.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_COUNT&amp;lt;/span&amp;gt;&lt;br /&gt;
| Limits how many work packages can be created from the plan.&lt;br /&gt;
| Further occurrences stop once the count is reached.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines how &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is calculated.&lt;br /&gt;
| Supports Calendar-Based and Completion-Based scheduling.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; defines the recurrence pattern of a cyclic maintenance plan.&lt;br /&gt;
&lt;br /&gt;
It describes how often the maintenance should occur.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FREQ=DAILY&lt;br /&gt;
FREQ=WEEKLY;BYDAY=MO,WE,FR&lt;br /&gt;
FREQ=MONTHLY;BYMONTHDAY=15&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The system uses &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; to calculate future planned execution dates.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #d33; background-color: #fff5f5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Problem:''' If &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; is invalid and cannot be parsed, the cyclic maintenance plan is not valid and cannot create work packages.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_START_DATE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_START_DATE&amp;lt;/span&amp;gt; defines when the recurrence pattern starts.&lt;br /&gt;
&lt;br /&gt;
The recurrence rule is calculated from this date forward.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_START_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 01 January&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Monthly on the 15th&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The system uses these values to determine valid planned execution dates.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_UNTIL_DATE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_UNTIL_DATE&amp;lt;/span&amp;gt; is an optional end date for the recurrence.&lt;br /&gt;
&lt;br /&gt;
If this date is configured, no further occurrences are generated after this date.&lt;br /&gt;
&lt;br /&gt;
This can be used for maintenance plans that should only run until a certain date.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_COUNT&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_COUNT&amp;lt;/span&amp;gt; limits how many work packages can be created from the plan.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_COUNT&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When the number of related generated work packages reaches &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_COUNT&amp;lt;/span&amp;gt;, the system no longer calculates new occurrences for the plan.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt; defines how &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is calculated for a cyclic maintenance plan.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt; is only relevant for concrete maintenance plan types that use recurrence logic, such as &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CyclicMaintenancePlan&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RoundMaintenancePlan&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The supported scheduling modes are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Scheduling mode&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Calendar-Based&lt;br /&gt;
| Future dates follow the recurrence pattern defined by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Completion-Based&lt;br /&gt;
| Future dates are calculated from the actual completion date of the previous generated work package.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This property is one of the most important settings because it defines whether future dates follow the calendar or depend on the actual completion of the previous generated work package.&lt;br /&gt;
&lt;br /&gt;
== Calendar-Based Scheduling ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
Calendar-based scheduling is used when maintenance should follow fixed calendar occurrences.&lt;br /&gt;
&lt;br /&gt;
The next planned execution date is calculated according to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; and the calendar recurrence.&lt;br /&gt;
&lt;br /&gt;
This means that delays in completing a work package do not automatically shift the whole future schedule.&lt;br /&gt;
&lt;br /&gt;
Use calendar-based scheduling when the maintenance should happen on fixed dates or fixed calendar intervals.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
* inspection every 15th day of the month&lt;br /&gt;
* safety check every Monday&lt;br /&gt;
* yearly inspection every January&lt;br /&gt;
* quarterly maintenance in fixed maintenance windows&lt;br /&gt;
&lt;br /&gt;
=== How Calendar-Based Scheduling Works ===&lt;br /&gt;
&lt;br /&gt;
In calendar-based scheduling, the system calculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; based on the recurrence rule and the relevant dates of existing generated work packages.&lt;br /&gt;
&lt;br /&gt;
The system determines the highest relevant planned or finished date of generated work packages linked to the maintenance plan. Then it uses the recurrence rule to calculate the next valid occurrence after that date.&lt;br /&gt;
&lt;br /&gt;
This means the schedule continues according to the recurrence pattern.&lt;br /&gt;
&lt;br /&gt;
If a work package is completed later than planned, the future schedule does not necessarily move with that completion date.&lt;br /&gt;
&lt;br /&gt;
=== Example: Calendar-Based Scheduling ===&lt;br /&gt;
&lt;br /&gt;
A pump must be inspected on the 15th of every month.&lt;br /&gt;
&lt;br /&gt;
==== Configuration ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| Plan type&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CyclicMaintenancePlan&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt;&lt;br /&gt;
| Pump 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt;&lt;br /&gt;
| Pump Inspection Template&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_REPLICATION_CONFIG&amp;lt;/span&amp;gt;&lt;br /&gt;
| Pump Inspection Replication&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Calendar-Based&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Monthly on the 15th&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_START_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 01 January&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 15 March&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt;&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_STATUS&amp;lt;/span&amp;gt;&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AUTO_CREATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Enabled&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Result ====&lt;br /&gt;
&lt;br /&gt;
The system calculates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EARLIEST_GENERATION_DATE = 12 March&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On or after 12 March, the system can create the work package.&lt;br /&gt;
&lt;br /&gt;
Generated work package:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt;&lt;br /&gt;
| 15 March&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
After the work package is planned, the system can calculate the next occurrence:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NEXT_DATE = 15 April&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the March work package is completed on 20 March, the next date still follows the monthly recurrence. The next planned execution date remains 15 April.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Result:''' The late completion does not shift the future schedule to 20 April.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Completion-Based Scheduling ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
Completion-based scheduling is used when the next maintenance date should depend on the actual completion date of the previous generated work package.&lt;br /&gt;
&lt;br /&gt;
This means that the interval starts after the work has actually been completed.&lt;br /&gt;
&lt;br /&gt;
Use completion-based scheduling when the maintenance should repeat based on the time since the last completed maintenance activity.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
* service every 30 days after the last service&lt;br /&gt;
* inspection 6 months after the previous inspection was completed&lt;br /&gt;
* replacement 90 days after the previous replacement&lt;br /&gt;
* maintenance where a delay should also delay the next cycle&lt;br /&gt;
&lt;br /&gt;
=== How Completion-Based Scheduling Works ===&lt;br /&gt;
&lt;br /&gt;
In completion-based scheduling, the system recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; after a generated work package is completed.&lt;br /&gt;
&lt;br /&gt;
The completion date becomes the basis for the next occurrence.&lt;br /&gt;
&lt;br /&gt;
Planning changes alone do not define the next recurrence in the same way as calendar-based scheduling.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Important:''' The plan waits for the generated work package to be completed. Then the system calculates the next date from the completion date.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example: Completion-Based Scheduling ===&lt;br /&gt;
&lt;br /&gt;
A machine must be serviced every 30 days after the previous service was completed.&lt;br /&gt;
&lt;br /&gt;
==== Configuration ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| Plan type&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CyclicMaintenancePlan&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt;&lt;br /&gt;
| Machine 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt;&lt;br /&gt;
| Machine Service Template&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_REPLICATION_CONFIG&amp;lt;/span&amp;gt;&lt;br /&gt;
| Machine Service Replication&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Completion-Based&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Every 30 days&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_START_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 01 March&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 15 March&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt;&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_STATUS&amp;lt;/span&amp;gt;&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AUTO_CREATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Enabled&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Result ====&lt;br /&gt;
&lt;br /&gt;
The system calculates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EARLIEST_GENERATION_DATE = 12 March&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On or after 12 March, the system can create the work package.&lt;br /&gt;
&lt;br /&gt;
Generated work package:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt;&lt;br /&gt;
| 15 March&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The work package is completed on 20 March.&lt;br /&gt;
&lt;br /&gt;
Because the plan is completion-based, the system calculates the next date from 20 March.&lt;br /&gt;
&lt;br /&gt;
If the recurrence is every 30 days:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| around 19 April&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt;&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| around 16 April&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Result:''' In this mode, the delay from 15 March to 20 March shifts the future schedule.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calendar-Based vs Completion-Based Scheduling ==&lt;br /&gt;
&lt;br /&gt;
The difference is the date that is used as the basis for calculating &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Aspect&lt;br /&gt;
! Calendar-Based&lt;br /&gt;
! Completion-Based&lt;br /&gt;
|-&lt;br /&gt;
| Basis for &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Recurrence defined by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Actual completion date of the previous generated work package&lt;br /&gt;
|-&lt;br /&gt;
| Effect of late completion&lt;br /&gt;
| Future dates are not automatically shifted&lt;br /&gt;
| Future dates move with the completion date&lt;br /&gt;
|-&lt;br /&gt;
| Typical use case&lt;br /&gt;
| Fixed maintenance windows, fixed calendar intervals, legal or organizational inspection dates&lt;br /&gt;
| Service intervals that depend on the actual last maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Example&lt;br /&gt;
| Planned: 15 March&amp;lt;br /&amp;gt;Completed: 20 March&amp;lt;br /&amp;gt;Next date: 15 April&lt;br /&gt;
| Planned: 15 March&amp;lt;br /&amp;gt;Completed: 20 March&amp;lt;br /&amp;gt;Interval: 30 days&amp;lt;br /&amp;gt;Next date: around 19 April&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Calendar-Based ===&lt;br /&gt;
&lt;br /&gt;
Calendar-based scheduling should be used when the maintenance must follow fixed planned dates.&lt;br /&gt;
&lt;br /&gt;
Characteristics:&lt;br /&gt;
&lt;br /&gt;
* The plan follows the &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; calendar pattern.&lt;br /&gt;
* Future dates are not automatically shifted just because a work package was completed late.&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; can be recalculated after planning updates.&lt;br /&gt;
* It is useful for fixed maintenance windows and legally or organizationally fixed inspection dates.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Event&lt;br /&gt;
! Date&lt;br /&gt;
|-&lt;br /&gt;
| Planned inspection&lt;br /&gt;
| 15 March&lt;br /&gt;
|-&lt;br /&gt;
| Completed&lt;br /&gt;
| 20 March&lt;br /&gt;
|-&lt;br /&gt;
| Next date&lt;br /&gt;
| 15 April&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The future date stays aligned with the calendar recurrence.&lt;br /&gt;
&lt;br /&gt;
=== Completion-Based ===&lt;br /&gt;
&lt;br /&gt;
Completion-based scheduling should be used when the next maintenance interval starts after the previous work was completed.&lt;br /&gt;
&lt;br /&gt;
Characteristics:&lt;br /&gt;
&lt;br /&gt;
* The plan waits for completion.&lt;br /&gt;
* The completion date is used as the basis for &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
* If the work is completed late, the future schedule moves.&lt;br /&gt;
* It is useful for service intervals that depend on the actual last maintenance.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Event&lt;br /&gt;
! Date&lt;br /&gt;
|-&lt;br /&gt;
| Planned service&lt;br /&gt;
| 15 March&lt;br /&gt;
|-&lt;br /&gt;
| Completed&lt;br /&gt;
| 20 March&lt;br /&gt;
|-&lt;br /&gt;
| Interval&lt;br /&gt;
| 30 days&lt;br /&gt;
|-&lt;br /&gt;
| Next date&lt;br /&gt;
| around 19 April&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The future date shifts because the work was completed later.&lt;br /&gt;
&lt;br /&gt;
== RoundMaintenancePlan ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RoundMaintenancePlan&amp;lt;/span&amp;gt; is used for recurring maintenance rounds.&lt;br /&gt;
&lt;br /&gt;
It is a specialized type of cyclic maintenance plan. This means that it also uses &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In addition to the cyclic scheduling logic, a round maintenance plan includes child maintenance plans linked via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
When the round maintenance plan is due, the system creates the main work package for the round. Then it creates additional work packages from the child maintenance plans linked via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #f0ad4e; background-color: #fff8e5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Important for child plans:''' For the child plans, the system does not care whether they are due, active, auto-created, or whether they have a valid &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt;. The round maintenance plan uses the child plans as configuration for the additional work packages that should be created as part of the round.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The important configuration on the child plans is their work package generation setup, especially the configured template work package and replication setup.&lt;br /&gt;
&lt;br /&gt;
=== Generated Result ===&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Element&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| Round maintenance plan&lt;br /&gt;
| Machine Room Round&lt;br /&gt;
|-&lt;br /&gt;
| Linked child plan 1&lt;br /&gt;
| Pump 1 Inspection&lt;br /&gt;
|-&lt;br /&gt;
| Linked child plan 2&lt;br /&gt;
| Pump 2 Inspection&lt;br /&gt;
|-&lt;br /&gt;
| Linked child plan 3&lt;br /&gt;
| Pump 3 Inspection&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Generated main work package:&lt;br /&gt;
&lt;br /&gt;
* Machine Room Round&lt;br /&gt;
&lt;br /&gt;
Additional generated work packages inside the main round work package:&lt;br /&gt;
&lt;br /&gt;
* Pump 1 Inspection&lt;br /&gt;
* Pump 2 Inspection&lt;br /&gt;
* Pump 3 Inspection&lt;br /&gt;
&lt;br /&gt;
The additional work packages are assigned to the main round work package. This allows the result of the round maintenance plan to be structured as one complete maintenance round.&lt;br /&gt;
&lt;br /&gt;
== RoundMaintenancePlan Properties and Relations ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Property / relation&lt;br /&gt;
! Purpose&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt;&lt;br /&gt;
| Links the round maintenance plan to its child maintenance plans.&lt;br /&gt;
| Child plans define additional work packages created as part of the round.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_SELECTION_RULE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Exists on &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RoundMaintenancePlan&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Runtime behavior must be verified before documenting further effects.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ORDERID&amp;lt;/span&amp;gt;&lt;br /&gt;
| Can exist on the relation between the round plan and a child plan.&lt;br /&gt;
| Can be copied to generated work packages.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GROUPID&amp;lt;/span&amp;gt;&lt;br /&gt;
| Can exist on the relation between the round plan and a child plan.&lt;br /&gt;
| Can be copied to generated work packages.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt; links the round maintenance plan to its child maintenance plans.&lt;br /&gt;
&lt;br /&gt;
The linked child plans define which additional work packages should be generated when the round maintenance plan is due.&lt;br /&gt;
&lt;br /&gt;
When the round plan generates work packages, the system creates:&lt;br /&gt;
&lt;br /&gt;
* one main work package from the round plan’s own &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt;&lt;br /&gt;
* one additional work package for each child maintenance plan linked via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The child maintenance plans do not need to be due themselves for the round maintenance plan to use them during round generation.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_SELECTION_RULE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_SELECTION_RULE&amp;lt;/span&amp;gt; exists on &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RoundMaintenancePlan&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #f0ad4e; background-color: #fff8e5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Open point:''' The exact runtime effect of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_SELECTION_RULE&amp;lt;/span&amp;gt; should be documented after the implementation behavior has been verified. Until that behavior is confirmed, the wiki should not claim that &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_SELECTION_RULE&amp;lt;/span&amp;gt; filters child plans by due date, asset, or priority.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ORDERID&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GROUPID&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
The relation between the round maintenance plan and a linked child maintenance plan can contain &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ORDERID&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GROUPID&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
When the system creates an additional work package from a linked child maintenance plan, these values can be copied to the generated work package.&lt;br /&gt;
&lt;br /&gt;
This can be used to structure, order, or group the additional work packages in the generated round.&lt;br /&gt;
&lt;br /&gt;
== Properties Calculated or Updated by the System ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Property / link&lt;br /&gt;
! System behavior&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Calculated from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Calculated or recalculated for &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CyclicMaintenancePlan&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RoundMaintenancePlan&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LAST_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Updated when a generated work package is completed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt;&lt;br /&gt;
| Set on generated work packages from the maintenance plan’s &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Links on generated work packages&lt;br /&gt;
| Required links are set automatically during generation.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt; is calculated by the system from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EARLIEST_GENERATION_DATE = NEXT_DATE - LEAD_DAYS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This value is recalculated when:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; changes&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt; changes&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is recalculated after planning or completion&lt;br /&gt;
* recurrence settings cause a new &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; to be calculated&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
For &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CyclicMaintenancePlan&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RoundMaintenancePlan&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; can be calculated or recalculated by the system.&lt;br /&gt;
&lt;br /&gt;
The calculation depends on:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_START_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_UNTIL_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_COUNT&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;&lt;br /&gt;
* related generated work packages&lt;br /&gt;
* planning events&lt;br /&gt;
* completion events&lt;br /&gt;
&lt;br /&gt;
For calendar-based scheduling, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is calculated from the recurrence pattern and the highest relevant planned or finished date of related generated work packages.&lt;br /&gt;
&lt;br /&gt;
For completion-based scheduling, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is calculated from the completion date of the previous generated work package.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LAST_DATE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LAST_DATE&amp;lt;/span&amp;gt; is updated by the system when a generated work package is completed.&lt;br /&gt;
&lt;br /&gt;
It stores the latest completion date of a generated work package related to the maintenance plan.&lt;br /&gt;
&lt;br /&gt;
This value is especially relevant for completion-based scheduling.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt; on Generated Work Packages ===&lt;br /&gt;
&lt;br /&gt;
When the system generates a work package from a maintenance plan, it sets the generated work package’s &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt; to the maintenance plan’s &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MaintenancePlan.NEXT_DATE: 15 March&lt;br /&gt;
Generated WorkPackage.PLANNED_START: 15 March&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Links on Generated Work Packages ===&lt;br /&gt;
&lt;br /&gt;
When the system generates a work package, it automatically sets the required links on the generated work package.&lt;br /&gt;
&lt;br /&gt;
The generated work package is linked to:&lt;br /&gt;
&lt;br /&gt;
* the source maintenance plan via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MAINTENANCE_PLAN&amp;lt;/span&amp;gt;&lt;br /&gt;
* the template work package via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt;&lt;br /&gt;
* the assigned asset via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For round maintenance plans, additional generated work packages from linked child maintenance plans are assigned to the main round work package via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;TASK_OWNER&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Properties and Events That Trigger Recalculation ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Trigger&lt;br /&gt;
! Recalculation behavior&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; changed&lt;br /&gt;
| Recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt; changed&lt;br /&gt;
| Recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; changed&lt;br /&gt;
| Recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; based on the new recurrence rule and selected &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_START_DATE&amp;lt;/span&amp;gt; changed&lt;br /&gt;
| Recalculates the schedule and may change &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_UNTIL_DATE&amp;lt;/span&amp;gt; changed&lt;br /&gt;
| Checks whether future occurrences are still available.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_COUNT&amp;lt;/span&amp;gt; changed&lt;br /&gt;
| Checks whether the maximum number of generated work packages has already been reached.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt; changed&lt;br /&gt;
| Recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; according to the selected scheduling mode.&lt;br /&gt;
|-&lt;br /&gt;
| Generated work package &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt; changed&lt;br /&gt;
| Notifies the linked maintenance plan and may trigger date recalculation.&lt;br /&gt;
|-&lt;br /&gt;
| Generated work package completed&lt;br /&gt;
| Updates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LAST_DATE&amp;lt;/span&amp;gt; and recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; according to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; Changed ===&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; changes, the system recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EARLIEST_GENERATION_DATE = NEXT_DATE - LEAD_DAYS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt; Changed ===&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt; changes, the system recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EARLIEST_GENERATION_DATE = NEXT_DATE - LEAD_DAYS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; Changed ===&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; changes, the recurrence pattern changes.&lt;br /&gt;
&lt;br /&gt;
The system recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; based on the new recurrence rule and the selected &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
After &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is recalculated, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt; is recalculated as well.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_START_DATE&amp;lt;/span&amp;gt; Changed ===&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_START_DATE&amp;lt;/span&amp;gt; changes, the start point of the recurrence changes.&lt;br /&gt;
&lt;br /&gt;
The system recalculates the schedule. This can change &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; changes, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt; is recalculated as well.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_UNTIL_DATE&amp;lt;/span&amp;gt; Changed ===&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_UNTIL_DATE&amp;lt;/span&amp;gt; changes, the end boundary of the recurrence changes.&lt;br /&gt;
&lt;br /&gt;
The system checks whether future occurrences are still available.&lt;br /&gt;
&lt;br /&gt;
If no further occurrence is possible because of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_UNTIL_DATE&amp;lt;/span&amp;gt;, the system cannot calculate a new &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_COUNT&amp;lt;/span&amp;gt; Changed ===&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_COUNT&amp;lt;/span&amp;gt; changes, the system checks whether the maximum number of generated work packages has already been reached.&lt;br /&gt;
&lt;br /&gt;
If the number of related generated work packages is greater than or equal to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_COUNT&amp;lt;/span&amp;gt;, the system does not calculate further occurrences.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt; Changed ===&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt; changes, the logic for calculating future dates changes.&lt;br /&gt;
&lt;br /&gt;
Changing to Calendar-Based means that the plan follows the calendar recurrence.&lt;br /&gt;
&lt;br /&gt;
Changing to Completion-Based means that the plan calculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; from the completion of the previous generated work package.&lt;br /&gt;
&lt;br /&gt;
Because this changes the calculation logic, the system recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; according to the selected &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; changes, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt; is recalculated as well.&lt;br /&gt;
&lt;br /&gt;
=== Generated Work Package &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt; Changed ===&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt; of a generated work package is set or changed, the work package notifies the linked maintenance plan.&lt;br /&gt;
&lt;br /&gt;
For calendar-based cyclic maintenance plans, this can trigger recalculation of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;. The system uses the planning information to continue the calendar-based recurrence.&lt;br /&gt;
&lt;br /&gt;
For completion-based cyclic maintenance plans, a &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt; change does not drive the recurrence in the same way. &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is mainly calculated after the work package is completed.&lt;br /&gt;
&lt;br /&gt;
=== Generated Work Package Completed ===&lt;br /&gt;
&lt;br /&gt;
When a generated work package is completed, the work package notifies the linked maintenance plan.&lt;br /&gt;
&lt;br /&gt;
A work package is considered completed when:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ORGA_STATUS == 100&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The system updates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LAST_DATE&amp;lt;/span&amp;gt;. Then the system recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; according to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For calendar-based scheduling:&lt;br /&gt;
&lt;br /&gt;
* the system continues according to the calendar recurrence&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is calculated from the recurrence pattern and relevant planned or finished dates&lt;br /&gt;
&lt;br /&gt;
For completion-based scheduling:&lt;br /&gt;
&lt;br /&gt;
* the completion date becomes the basis for the next occurrence&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is calculated from the completion date&lt;br /&gt;
&lt;br /&gt;
After &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is updated, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt; is recalculated.&lt;br /&gt;
&lt;br /&gt;
== Work Package Generation Logic ==&lt;br /&gt;
&lt;br /&gt;
=== When Is a Plan Ready to Create a Work Package? ===&lt;br /&gt;
&lt;br /&gt;
A cyclic or round maintenance plan can create a work package only if all required conditions are fulfilled.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Requirement&lt;br /&gt;
! Condition&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| Plan validity&lt;br /&gt;
| The plan must be valid.&lt;br /&gt;
| For cyclic maintenance plans, this requires a valid &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt;, assigned &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt;, and available &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Plan status&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_STATUS == Active&amp;lt;/span&amp;gt;&lt;br /&gt;
| Inactive plans are ignored.&lt;br /&gt;
|-&lt;br /&gt;
| Automatic generation&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AUTO_CREATE&amp;lt;/span&amp;gt; must be enabled.&lt;br /&gt;
| If disabled, the plan does not automatically create work packages.&lt;br /&gt;
|-&lt;br /&gt;
| Template work package&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt; must be set.&lt;br /&gt;
| The linked work package must be a template work package.&lt;br /&gt;
|-&lt;br /&gt;
| Replication configuration&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_REPLICATION_CONFIG&amp;lt;/span&amp;gt; must be set.&lt;br /&gt;
| Required to copy the template work package.&lt;br /&gt;
|-&lt;br /&gt;
| Earliest generation date&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE &amp;lt;= current date&amp;lt;/span&amp;gt;&lt;br /&gt;
| The plan may only generate once the earliest generation date has been reached.&lt;br /&gt;
|-&lt;br /&gt;
| Open work packages&lt;br /&gt;
| No open generated work package may exist for the plan.&lt;br /&gt;
| There must be no generated work package linked via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MAINTENANCE_PLAN&amp;lt;/span&amp;gt; where &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ORGA_STATUS != 100&amp;lt;/span&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #f0ad4e; background-color: #fff8e5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Generation rule:''' The open work package check prevents the system from creating multiple open work packages for the same maintenance plan.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Round Work Package Generation ==&lt;br /&gt;
&lt;br /&gt;
A round maintenance plan creates a main work package for the round.&lt;br /&gt;
&lt;br /&gt;
After the main work package has been created, the system processes the maintenance plans linked via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For each linked child maintenance plan, the system creates an additional work package.&lt;br /&gt;
&lt;br /&gt;
These additional generated work packages are assigned to the main round work package via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;TASK_OWNER&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For child plans used in a round, the system does not care whether the child plan:&lt;br /&gt;
&lt;br /&gt;
* has &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_STATUS == Active&amp;lt;/span&amp;gt;&lt;br /&gt;
* has &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AUTO_CREATE == true&amp;lt;/span&amp;gt;&lt;br /&gt;
* has a valid &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt;&lt;br /&gt;
* has a valid &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
* is due based on its own &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Rule:''' The round plan controls the timing. The child plans define what additional work packages should be created as part of the round.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[MRO (Plugin)]]&lt;br /&gt;
* [[MRO_Objects_(Client)]]&lt;br /&gt;
* [[MRO_Implemented_Objects]]&lt;br /&gt;
* [[MRO_Material_Management]]&lt;br /&gt;
* [[MRO_Notification]]&lt;br /&gt;
* [[MRO_Replication_Jobs]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_Replication_Jobs&amp;diff=30591</id>
		<title>MRO Replication Jobs</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_Replication_Jobs&amp;diff=30591"/>
				<updated>2026-09-21T10:05:54Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: Created page with &amp;quot;= MRO Replication Jobs =  MRO replication jobs generate work packages from configured maintenance plans. The processing is divided into two steps: the Maintenance Planning Orc...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= MRO Replication Jobs =&lt;br /&gt;
&lt;br /&gt;
MRO replication jobs generate work packages from configured maintenance plans. The processing is divided into two steps: the Maintenance Planning Orchestrator schedules jobs for eligible maintenance plans, and a separate EnterpriseService executes the scheduled jobs.&lt;br /&gt;
&lt;br /&gt;
This page describes the available MRO replication jobs, the required BasicClient App and EnterpriseService configuration, and a basic setup for testing or demonstrating MRO replication.&lt;br /&gt;
&lt;br /&gt;
For the configuration and behaviour of maintenance plans, see [[MROMaintenancePlans]].&lt;br /&gt;
&lt;br /&gt;
== Replication process ==&lt;br /&gt;
&lt;br /&gt;
MRO replication uses the following process:&lt;br /&gt;
&lt;br /&gt;
# The Maintenance Planning Orchestrator searches for maintenance plans that are ready for automatic work package generation.&lt;br /&gt;
# Each eligible maintenance plan provides the replication job required for its plan type.&lt;br /&gt;
# The orchestrator schedules the job in '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
# A separate EnterpriseService processes the scheduled job.&lt;br /&gt;
# The replication job uses the template work package and the linked '''INSTANCE_REPLICATION''' object to generate the work package.&lt;br /&gt;
&lt;br /&gt;
Scheduling a job does not execute the replication immediately. It creates a dispatching job containing the information required for later execution.&lt;br /&gt;
&lt;br /&gt;
For a basic test or demonstration, the scheduling and execution processes can be configured in two separate UBIK.Studio folders.&lt;br /&gt;
&lt;br /&gt;
== Available MRO replication jobs ==&lt;br /&gt;
&lt;br /&gt;
MRO provides two replication jobs.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Job&lt;br /&gt;
! Inheritance&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| '''ReplicateWorkpackageJob'''&lt;br /&gt;
| Derives from '''DispatchingJob''' for '''WorkPackage'''&lt;br /&gt;
| Generates a work package from the template and replication configuration of a maintenance plan.&lt;br /&gt;
|-&lt;br /&gt;
| '''ReplicateRoundWorkpackageJob'''&lt;br /&gt;
| Derives from '''ReplicateWorkpackageJob'''&lt;br /&gt;
| Generates the main work package of a maintenance round and the additional work packages configured by its child maintenance plans.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Both jobs use the same scheduling, dispatching, and execution infrastructure. The maintenance plan implementation returns the appropriate job when the Maintenance Planning Orchestrator requests its replication job.&lt;br /&gt;
&lt;br /&gt;
=== Work package replication ===&lt;br /&gt;
&lt;br /&gt;
A standard maintenance plan uses '''ReplicateWorkpackageJob'''.&lt;br /&gt;
&lt;br /&gt;
The maintenance plan provides:&lt;br /&gt;
&lt;br /&gt;
* a template work package through '''LK_WP_TMPL'''&lt;br /&gt;
* an '''INSTANCE_REPLICATION''' object through '''LK_REPLICATION_CONFIG'''&lt;br /&gt;
* the maintenance plan settings required for automatic work package generation&lt;br /&gt;
&lt;br /&gt;
The linked '''INSTANCE_REPLICATION''' object defines how the template work package is copied. The generated work package is not marked as a template.&lt;br /&gt;
&lt;br /&gt;
For the complete maintenance plan prerequisites and the properties set on generated work packages, see [[MROMaintenancePlans]].&lt;br /&gt;
&lt;br /&gt;
=== Round work package replication ===&lt;br /&gt;
&lt;br /&gt;
A '''RoundMaintenancePlan''' uses '''ReplicateRoundWorkpackageJob'''.&lt;br /&gt;
&lt;br /&gt;
The job creates the main work package from the Round Maintenance Plan. It then processes the child maintenance plans linked through '''SYSREL_ROUND_RELATION''' and creates their additional work packages. The additional work packages are assigned to the main round work package through '''TASK_OWNER'''.&lt;br /&gt;
&lt;br /&gt;
Round work package replication uses the same BasicClient App, EnterpriseService, and dispatching setup as standard work package replication. The maintenance plan implementation determines which job is scheduled.&lt;br /&gt;
&lt;br /&gt;
For the configuration and behaviour of Round Maintenance Plans, see [[MROMaintenancePlans]].&lt;br /&gt;
&lt;br /&gt;
== Scheduling and execution ==&lt;br /&gt;
&lt;br /&gt;
=== Maintenance Planning Orchestrator ===&lt;br /&gt;
&lt;br /&gt;
The scheduling process executes the following method:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| Class&lt;br /&gt;
| '''UBIK.MRO.MaintenancePlanningOrchestrator'''&lt;br /&gt;
|-&lt;br /&gt;
| Method&lt;br /&gt;
| '''Apply'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Maintenance Planning Orchestrator searches for eligible maintenance plans, requests the appropriate replication job from each plan, and schedules the job in '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
&lt;br /&gt;
=== Scheduled Orchestrator ===&lt;br /&gt;
&lt;br /&gt;
The execution process executes the following method:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| Class&lt;br /&gt;
| '''UBIK.ServiceTask.Orchestration.ScheduledOrchestrator'''&lt;br /&gt;
|-&lt;br /&gt;
| Method&lt;br /&gt;
| '''Apply'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Scheduled Orchestrator searches '''MRO_JOB_DISPATCHING''' for scheduled jobs and executes them.&lt;br /&gt;
&lt;br /&gt;
== MRO job dispatching ==&lt;br /&gt;
&lt;br /&gt;
'''MRO_JOB_DISPATCHING''' is the specialised DISPATCHING Interface Administration MetaClass used for MRO replication jobs.&lt;br /&gt;
&lt;br /&gt;
The orchestration process creates the required job objects automatically. Project teams do not need to create these objects manually.&lt;br /&gt;
&lt;br /&gt;
The execution EnterpriseService identifies '''MRO_JOB_DISPATCHING''' through the '''InterfaceAdmin''' value in '''MRO.PARAM.json'''.&lt;br /&gt;
&lt;br /&gt;
For general information about Interface Administration objects, see [[InterfaceAdministration]].&lt;br /&gt;
&lt;br /&gt;
=== Job statuses ===&lt;br /&gt;
&lt;br /&gt;
The execution status indicates the current state or result of a dispatching job.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Status&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Undefined&lt;br /&gt;
| The execution state is undefined.&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Success&lt;br /&gt;
| The execution completed successfully.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Terminated&lt;br /&gt;
| The execution was terminated.&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Conflict&lt;br /&gt;
| An export conflict occurred.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Started&lt;br /&gt;
| Execution has started but has not yet completed.&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Scheduled&lt;br /&gt;
| The job is scheduled but has not yet been executed.&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| Error&lt;br /&gt;
| An error occurred during execution.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In a basic replication test, a newly scheduled job first has the status '''Scheduled'''. After successful execution, its status changes to '''Success'''.&lt;br /&gt;
&lt;br /&gt;
== Application setup ==&lt;br /&gt;
&lt;br /&gt;
A basic test or demonstration uses two separate UBIK.Studio folders.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Studio folder&lt;br /&gt;
! Purpose&lt;br /&gt;
! Required applications&lt;br /&gt;
|-&lt;br /&gt;
| Scheduling folder&lt;br /&gt;
| Provides the EnterpriseService web interface and starts the Maintenance Planning Orchestrator through the BasicClient App.&lt;br /&gt;
| '''UBIK.EnterpriseService.exe''' and '''UBIK.EnterpriseService.BasicClient.App.exe'''&lt;br /&gt;
|-&lt;br /&gt;
| Execution folder&lt;br /&gt;
| Runs the Scheduled Orchestrator and executes jobs from '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
| '''UBIK.EnterpriseService.exe'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The folder names and paths in the examples can be changed. Every configured path must point to the corresponding file in the local deployment.&lt;br /&gt;
&lt;br /&gt;
== Scheduling folder setup ==&lt;br /&gt;
&lt;br /&gt;
The scheduling folder requires the following files:&lt;br /&gt;
&lt;br /&gt;
* '''UBIK.EnterpriseService.exe'''&lt;br /&gt;
* '''UBIK.EnterpriseService.exe.config'''&lt;br /&gt;
* '''UBIK.EnterpriseService.BasicClient.App.exe'''&lt;br /&gt;
* '''UBIK.EnterpriseService.BasicClient.App.exe.config'''&lt;br /&gt;
* '''JSON\ReplicateWorkpackageJob.json'''&lt;br /&gt;
&lt;br /&gt;
=== Configure the scheduling EnterpriseService ===&lt;br /&gt;
&lt;br /&gt;
In '''UBIK.EnterpriseService.exe.config''', configure the following application settings:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Default value&lt;br /&gt;
! Required value&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| '''ExecuteWebInterface'''&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| Enables the web interface used by the BasicClient App.&lt;br /&gt;
|-&lt;br /&gt;
| '''ExecuteTaskByJsonFile'''&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| The scheduling EnterpriseService does not execute the recurring task configuration used by the execution EnterpriseService.&lt;br /&gt;
|-&lt;br /&gt;
| '''WebInterfacePort'''&lt;br /&gt;
| 9000&lt;br /&gt;
| 9000&lt;br /&gt;
| Defines the port used by the web interface in this example.&lt;br /&gt;
|-&lt;br /&gt;
| '''WebInterfaceHost'''&lt;br /&gt;
| http://localhost&lt;br /&gt;
| http://localhost&lt;br /&gt;
| Defines the host used by the web interface in this example.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Configure the BasicClient App ===&lt;br /&gt;
&lt;br /&gt;
In '''UBIK.EnterpriseService.BasicClient.App.exe.config''', configure the following application settings:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Example value&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| '''BaseAddress'''&lt;br /&gt;
| http://localhost:9000&lt;br /&gt;
| Identifies the web interface exposed by the scheduling EnterpriseService.&lt;br /&gt;
|-&lt;br /&gt;
| '''PathToBasicEnterpriseServiceRequestJsonFile'''&lt;br /&gt;
| Full path to ReplicateWorkpackageJob.json&lt;br /&gt;
| Identifies the request file that starts the Maintenance Planning Orchestrator.&lt;br /&gt;
|-&lt;br /&gt;
| '''PathToBasicEnterpriseServiceRequestJsonFileList'''&lt;br /&gt;
| Empty&lt;br /&gt;
| No request file list is used in this setup.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''BaseAddress''' must match '''WebInterfaceHost''' and '''WebInterfacePort''' in the scheduling EnterpriseService configuration. Replace the example path with the actual path to '''ReplicateWorkpackageJob.json'''.&lt;br /&gt;
&lt;br /&gt;
=== Configure ReplicateWorkpackageJob.json ===&lt;br /&gt;
&lt;br /&gt;
Create '''ReplicateWorkpackageJob.json''' in the JSON folder and configure the target database, orchestrator class, and method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;SSPI&amp;quot;: true,&lt;br /&gt;
  &amp;quot;SQLUser&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;SQLPassword&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;SQLServer&amp;quot;: &amp;quot;(localdb)\\MSSQLLocalDB&amp;quot;,&lt;br /&gt;
  &amp;quot;SQLInitialCatalog&amp;quot;: &amp;quot;JOB.TEST&amp;quot;,&lt;br /&gt;
  &amp;quot;ClassFullname&amp;quot;: &amp;quot;UBIK.MRO.MaintenancePlanningOrchestrator&amp;quot;,&lt;br /&gt;
  &amp;quot;MethodName&amp;quot;: &amp;quot;Apply&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adapt the database settings to the target database. Keep '''ClassFullname''' and '''MethodName''' as shown so that the request executes '''UBIK.MRO.MaintenancePlanningOrchestrator.Apply'''.&lt;br /&gt;
&lt;br /&gt;
== Execution folder setup ==&lt;br /&gt;
&lt;br /&gt;
The execution folder requires the following files:&lt;br /&gt;
&lt;br /&gt;
* '''UBIK.EnterpriseService.exe'''&lt;br /&gt;
* '''UBIK.EnterpriseService.exe.config'''&lt;br /&gt;
* '''JSON\MRO.json'''&lt;br /&gt;
* '''JSON\MRO.PARAM.json'''&lt;br /&gt;
&lt;br /&gt;
=== Configure the execution EnterpriseService ===&lt;br /&gt;
&lt;br /&gt;
In '''UBIK.EnterpriseService.exe.config''', configure the following application settings:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Default value&lt;br /&gt;
! Required value&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| '''PluginExecutionConfigPath'''&lt;br /&gt;
| Empty&lt;br /&gt;
| Full path to '''MRO.json'''&lt;br /&gt;
| Identifies the recurring task configuration.&lt;br /&gt;
|-&lt;br /&gt;
| '''ExecuteWebInterface'''&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| The execution EnterpriseService does not require the web interface in this setup.&lt;br /&gt;
|-&lt;br /&gt;
| '''ExecuteTaskByJsonFile'''&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| Enables execution of the tasks configured in '''MRO.json'''.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Configure MRO.json ===&lt;br /&gt;
&lt;br /&gt;
Create '''MRO.json''' and configure the database connection, execution interval, Scheduled Orchestrator, and path to '''MRO.PARAM.json''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;RepeateEveryMinutes&amp;quot;: 0.2,&lt;br /&gt;
  &amp;quot;SqlConnectionDefinition&amp;quot;: {&lt;br /&gt;
    &amp;quot;SSPI&amp;quot;: true,&lt;br /&gt;
    &amp;quot;SQLUser&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
    &amp;quot;SQLPassword&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
    &amp;quot;SQLServer&amp;quot;: &amp;quot;(localdb)\\MSSQLLocalDB&amp;quot;,&lt;br /&gt;
    &amp;quot;SQLInitialCatalog&amp;quot;: &amp;quot;JOB.TEST&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;Tasks&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;ClassFullname&amp;quot;: &amp;quot;UBIK.ServiceTask.Orchestration.ScheduledOrchestrator&amp;quot;,&lt;br /&gt;
      &amp;quot;MethodName&amp;quot;: &amp;quot;Apply&amp;quot;,&lt;br /&gt;
      &amp;quot;MethodParameterPathFullName&amp;quot;: &amp;quot;&amp;lt;full path to MRO.PARAM.json&amp;gt;&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adapt the database settings and '''MethodParameterPathFullName''' to the target deployment. Keep '''ClassFullname''' and '''MethodName''' as shown so that the task executes '''UBIK.ServiceTask.Orchestration.ScheduledOrchestrator.Apply'''.&lt;br /&gt;
&lt;br /&gt;
'''RepeateEveryMinutes''' defines how often the execution EnterpriseService checks for scheduled jobs. A value of 0 causes continuous checking. The value 0.2 can be used for a demonstration where continuous checking is not required.&lt;br /&gt;
&lt;br /&gt;
=== Configure MRO.PARAM.json ===&lt;br /&gt;
&lt;br /&gt;
Create '''MRO.PARAM.json''' and configure the UID of '''MRO_JOB_DISPATCHING''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;InterfaceAdmin&amp;quot;: &amp;quot;BBAF1C9E-8F3B-4C9A-9E2D-5F7A1C3E4B6D&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The '''InterfaceAdmin''' value identifies '''MRO_JOB_DISPATCHING''' for the Scheduled Orchestrator.&lt;br /&gt;
&lt;br /&gt;
== Maintenance plan prerequisites ==&lt;br /&gt;
&lt;br /&gt;
For a basic work package replication scenario, configure:&lt;br /&gt;
&lt;br /&gt;
* a concrete maintenance plan type such as '''CyclicMaintenancePlan'''&lt;br /&gt;
* an asset through '''LK_ASSET'''&lt;br /&gt;
* a template work package through '''LK_WP_TMPL'''&lt;br /&gt;
* an '''INSTANCE_REPLICATION''' object through '''LK_REPLICATION_CONFIG'''&lt;br /&gt;
* '''PLAN_STATUS''' as Active&lt;br /&gt;
* '''AUTO_CREATE''' as enabled&lt;br /&gt;
* planning dates that make the plan eligible for generation&lt;br /&gt;
* a template work package with '''ISTEMPLATE''' set&lt;br /&gt;
&lt;br /&gt;
The maintenance plan must not already have an open generated work package. Detailed generation conditions are documented in [[MROMaintenancePlans]].&lt;br /&gt;
&lt;br /&gt;
== Basic test or demonstration ==&lt;br /&gt;
&lt;br /&gt;
=== Prepare the maintenance plan ===&lt;br /&gt;
&lt;br /&gt;
# Open the database in UBIK.Studio.&lt;br /&gt;
# Create or select a valid maintenance plan.&lt;br /&gt;
# Assign the required asset through '''LK_ASSET'''.&lt;br /&gt;
# Assign a template work package through '''LK_WP_TMPL'''.&lt;br /&gt;
# Verify that '''ISTEMPLATE''' is set on the template work package.&lt;br /&gt;
# Assign an '''INSTANCE_REPLICATION''' object through '''LK_REPLICATION_CONFIG'''.&lt;br /&gt;
# Set '''PLAN_STATUS''' to Active.&lt;br /&gt;
# Enable '''AUTO_CREATE'''.&lt;br /&gt;
# Configure the planning dates so that '''EARLIEST_GENERATION_DATE''' has been reached.&lt;br /&gt;
# Verify that the maintenance plan has no open generated work package.&lt;br /&gt;
&lt;br /&gt;
=== Schedule the job ===&lt;br /&gt;
&lt;br /&gt;
# Start '''UBIK.EnterpriseService.exe''' in the scheduling folder.&lt;br /&gt;
# Start '''UBIK.EnterpriseService.BasicClient.App.exe''' manually, or start it through a configured Windows Task Scheduler task.&lt;br /&gt;
# The BasicClient App sends the request defined in '''ReplicateWorkpackageJob.json''' to the scheduling EnterpriseService.&lt;br /&gt;
# '''UBIK.MRO.MaintenancePlanningOrchestrator.Apply''' searches for eligible maintenance plans and schedules their replication jobs.&lt;br /&gt;
&lt;br /&gt;
=== Verify the scheduled job ===&lt;br /&gt;
&lt;br /&gt;
# Open '''MRO_JOB_DISPATCHING''' in UBIK.Studio.&lt;br /&gt;
# Verify that a job object was created for the eligible maintenance plan.&lt;br /&gt;
# Verify that '''INTERFACE_EXECUTION_STATUS''' is Scheduled.&lt;br /&gt;
# If the execution EnterpriseService has not been started, verify that no generated work package exists yet.&lt;br /&gt;
&lt;br /&gt;
=== Execute the job ===&lt;br /&gt;
&lt;br /&gt;
# Start '''UBIK.EnterpriseService.exe''' in the execution folder.&lt;br /&gt;
# The EnterpriseService executes '''UBIK.ServiceTask.Orchestration.ScheduledOrchestrator.Apply''' according to '''MRO.json'''.&lt;br /&gt;
# The Scheduled Orchestrator reads the scheduled job from '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
# The configured replication job generates the work package.&lt;br /&gt;
&lt;br /&gt;
=== Verify the result ===&lt;br /&gt;
&lt;br /&gt;
# Refresh '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
# Verify that the job status is Success.&lt;br /&gt;
# Refresh the Work Package MetaClass.&lt;br /&gt;
# Verify that a new work package was created.&lt;br /&gt;
# Verify that '''ISTEMPLATE''' is not set on the generated work package.&lt;br /&gt;
# Verify the links and planning values described in [[MROMaintenancePlans]].&lt;br /&gt;
&lt;br /&gt;
For a Round Maintenance Plan, also verify that:&lt;br /&gt;
&lt;br /&gt;
* the main round work package was created&lt;br /&gt;
* the child maintenance plans produced the configured additional work packages&lt;br /&gt;
* the additional work packages are assigned to the main round work package through '''TASK_OWNER'''&lt;br /&gt;
&lt;br /&gt;
== Triggering the scheduling process ==&lt;br /&gt;
&lt;br /&gt;
For a manual test or demonstration, start '''UBIK.EnterpriseService.BasicClient.App.exe''' manually.&lt;br /&gt;
&lt;br /&gt;
For recurring execution, a Windows Task Scheduler task can start '''UBIK.EnterpriseService.BasicClient.App.exe'''. The executable path is configured in the task. The request and target orchestrator are configured in '''UBIK.EnterpriseService.BasicClient.App.exe.config''' and '''ReplicateWorkpackageJob.json'''.&lt;br /&gt;
&lt;br /&gt;
Running the Maintenance Planning Orchestrator processes all eligible maintenance plans.&lt;br /&gt;
&lt;br /&gt;
== Configuration summary ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Component&lt;br /&gt;
! Configuration&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| Scheduling EnterpriseService&lt;br /&gt;
| '''ExecuteWebInterface''' = 1&lt;br /&gt;
| Exposes the web interface used by the BasicClient App.&lt;br /&gt;
|-&lt;br /&gt;
| BasicClient App&lt;br /&gt;
| '''PathToBasicEnterpriseServiceRequestJsonFile'''&lt;br /&gt;
| Points to '''ReplicateWorkpackageJob.json'''.&lt;br /&gt;
|-&lt;br /&gt;
| Scheduling request&lt;br /&gt;
| '''UBIK.MRO.MaintenancePlanningOrchestrator.Apply'''&lt;br /&gt;
| Searches for eligible maintenance plans and schedules their jobs.&lt;br /&gt;
|-&lt;br /&gt;
| Execution EnterpriseService&lt;br /&gt;
| '''ExecuteTaskByJsonFile''' = 1&lt;br /&gt;
| Enables execution using '''MRO.json'''.&lt;br /&gt;
|-&lt;br /&gt;
| Execution task&lt;br /&gt;
| '''UBIK.ServiceTask.Orchestration.ScheduledOrchestrator.Apply'''&lt;br /&gt;
| Processes scheduled dispatching jobs.&lt;br /&gt;
|-&lt;br /&gt;
| Execution parameter&lt;br /&gt;
| '''InterfaceAdmin'''&lt;br /&gt;
| Identifies '''MRO_JOB_DISPATCHING'''.&lt;br /&gt;
|-&lt;br /&gt;
| Maintenance plan&lt;br /&gt;
| '''LK_REPLICATION_CONFIG'''&lt;br /&gt;
| Links directly to the '''INSTANCE_REPLICATION''' object used to copy the template work package.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[MROMaintenancePlans]]&lt;br /&gt;
* [[InterfaceAdministration]]&lt;br /&gt;
* [[InterfaceExecution]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=UNC_File_Storage_Layout&amp;diff=30555</id>
		<title>UNC File Storage Layout</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=UNC_File_Storage_Layout&amp;diff=30555"/>
				<updated>2026-09-04T10:15:56Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= UNC File Storage Layout =&lt;br /&gt;
&lt;br /&gt;
The UNC File Storage Layout defines how local file documents are physically stored in the UNC document root. UBIK supports a flat layout and a folder-partitioned layout.&lt;br /&gt;
&lt;br /&gt;
Folder partitioning is available from UBIK 5.2 and is the recommended layout for UNC file storage. To maintain downward compatibility, the default remains the existing flat layout until an administrator starts the transfer.&lt;br /&gt;
&lt;br /&gt;
The layout changes only the physical file location. The document object and its '''LOCALPATH''' value remain unchanged.&lt;br /&gt;
&lt;br /&gt;
== Scope ==&lt;br /&gt;
&lt;br /&gt;
The UNC File Storage Layout applies only when '''File Storage Mode''' is set to '''UNC'''.&lt;br /&gt;
&lt;br /&gt;
Folder partitioning is not a separate File Storage Mode. The existing modes remain unchanged:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! File Storage Mode&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Undefined&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| UNC&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Cloud&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Only local file documents with '''IsLocalDoc = true''' are affected. Cloud documents and non-local file documents are ignored.&lt;br /&gt;
&lt;br /&gt;
== UNC File Storage Layout Setting ==&lt;br /&gt;
&lt;br /&gt;
The database setting '''UNC File Storage Layout''' identifies the layout currently used by the database.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Flat&lt;br /&gt;
| Local file documents are stored directly in the document root folder.&lt;br /&gt;
|-&lt;br /&gt;
| Folder Partitioning&lt;br /&gt;
| Local file documents are distributed across generated subfolders based on the document UID.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The setting is visible in the database settings but is read-only. It can be changed only by successfully completing the transfer tool.&lt;br /&gt;
&lt;br /&gt;
For new and existing databases, the default value is '''Flat'''. Updating a database does not change its existing '''File Storage Mode''' or move any files automatically.&lt;br /&gt;
&lt;br /&gt;
== Storage Layouts ==&lt;br /&gt;
&lt;br /&gt;
=== Flat ===&lt;br /&gt;
&lt;br /&gt;
With the flat layout, local file documents are stored directly in the document root folder.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
:''.../doc/8ec24142-17eb-4640-bdcf-31d696c398de.jpg''&lt;br /&gt;
&lt;br /&gt;
=== Folder Partitioning ===&lt;br /&gt;
&lt;br /&gt;
With folder partitioning, UBIK generates two folder levels from the document UID:&lt;br /&gt;
&lt;br /&gt;
* The first character of the UID is used for the first folder level.&lt;br /&gt;
* The second and third characters of the UID are used for the second folder level.&lt;br /&gt;
* Generated folder names use lowercase characters.&lt;br /&gt;
&lt;br /&gt;
Example UID:&lt;br /&gt;
&lt;br /&gt;
:''8ec24142-17eb-4640-bdcf-31d696c398de''&lt;br /&gt;
&lt;br /&gt;
Resulting physical path:&lt;br /&gt;
&lt;br /&gt;
:''.../doc/8/ec/8ec24142-17eb-4640-bdcf-31d696c398de.jpg''&lt;br /&gt;
&lt;br /&gt;
== LOCALPATH and Physical File Resolution ==&lt;br /&gt;
&lt;br /&gt;
The '''LOCALPATH''' property continues to contain only the file name and extension:&lt;br /&gt;
&lt;br /&gt;
:''8ec24142-17eb-4640-bdcf-31d696c398de.jpg''&lt;br /&gt;
&lt;br /&gt;
Folder-partitioning subfolders are not stored in '''LOCALPATH'''. UBIK calculates the complete physical file path when the file is accessed, using:&lt;br /&gt;
&lt;br /&gt;
* the document root path&lt;br /&gt;
* the File Storage Mode&lt;br /&gt;
* the UNC File Storage Layout&lt;br /&gt;
* the document UID and '''LOCALPATH'''&lt;br /&gt;
&lt;br /&gt;
== Database-wide Layout ==&lt;br /&gt;
&lt;br /&gt;
A database uses one UNC storage layout for all local file documents. Flat storage and folder partitioning must not be mixed within the same database.&lt;br /&gt;
&lt;br /&gt;
After a successful transfer, all existing and newly created local file documents use the selected layout.&lt;br /&gt;
&lt;br /&gt;
== Transferring Local File Documents ==&lt;br /&gt;
&lt;br /&gt;
Administrators can transfer all local file documents to the other layout using:&lt;br /&gt;
&lt;br /&gt;
:''Tools → Apply UNC File Storage Layout to All Files''&lt;br /&gt;
&lt;br /&gt;
Tooltip:&lt;br /&gt;
&lt;br /&gt;
:''Updates all local files to use the other UNC file storage layout.''&lt;br /&gt;
&lt;br /&gt;
The tool is available only when '''File Storage Mode = UNC'''. Because there are only two layouts, UBIK determines the target automatically:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Current layout&lt;br /&gt;
! Target layout&lt;br /&gt;
|-&lt;br /&gt;
| Flat&lt;br /&gt;
| Folder Partitioning&lt;br /&gt;
|-&lt;br /&gt;
| Folder Partitioning&lt;br /&gt;
| Flat&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The '''UNC File Storage Layout''' setting is changed only after all affected files have been transferred successfully.&lt;br /&gt;
&lt;br /&gt;
=== Transfer Process ===&lt;br /&gt;
&lt;br /&gt;
For each local file document, UBIK:&lt;br /&gt;
&lt;br /&gt;
# calculates the current and target physical file paths&lt;br /&gt;
# creates the required target folders&lt;br /&gt;
# copies the file to the target path&lt;br /&gt;
# verifies that the copied file exists&lt;br /&gt;
# deletes the source file only after successful verification&lt;br /&gt;
&lt;br /&gt;
If a file already exists at the target path, the transfer is aborted to prevent data loss.&lt;br /&gt;
&lt;br /&gt;
The transfer changes only the physical storage location. It does not:&lt;br /&gt;
&lt;br /&gt;
* change '''LOCALPATH'''&lt;br /&gt;
* update UTS&lt;br /&gt;
* create a new document version&lt;br /&gt;
* update the update session&lt;br /&gt;
* fire events&lt;br /&gt;
&lt;br /&gt;
Empty folders may remain in the previous folder structure after the transfer, but they no longer contain transferred files.&lt;br /&gt;
&lt;br /&gt;
=== Access During the Transfer ===&lt;br /&gt;
&lt;br /&gt;
Local file documents are locked database-wide for all clients and services while the transfer is running. During this time, users and services cannot:&lt;br /&gt;
&lt;br /&gt;
* create new local file document objects&lt;br /&gt;
* change existing local file document objects or their properties&lt;br /&gt;
* open, read, download, or view local document files&lt;br /&gt;
&lt;br /&gt;
Cloud documents and non-local file documents remain available and are not affected by the lock.&lt;br /&gt;
&lt;br /&gt;
== Transfer Result and Error Handling ==&lt;br /&gt;
&lt;br /&gt;
After a successful transfer, UBIK changes the database setting to the target layout and displays the number of transferred files.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
:''1000 files have been transferred.''&lt;br /&gt;
&lt;br /&gt;
If the transfer fails or is interrupted:&lt;br /&gt;
&lt;br /&gt;
* the transfer is aborted&lt;br /&gt;
* the affected file document is reported&lt;br /&gt;
* the '''UNC File Storage Layout''' setting remains unchanged&lt;br /&gt;
* the database is not left with a mixed UNC storage layout&lt;br /&gt;
* the administrator must start the transfer again&lt;br /&gt;
&lt;br /&gt;
A transfer is aborted if a file cannot be found, copied, verified, or deleted, or if the target file already exists.&lt;br /&gt;
&lt;br /&gt;
Failure message:&lt;br /&gt;
&lt;br /&gt;
:''The transfer could not be completed. The UNC File Storage Layout has not been changed.''&lt;br /&gt;
&lt;br /&gt;
== Example: Migrating an Existing Database ==&lt;br /&gt;
&lt;br /&gt;
An existing UBIK database contains 1000 local file documents in flat UNC storage.&lt;br /&gt;
&lt;br /&gt;
# The system is updated to UBIK 5.2.&lt;br /&gt;
# The existing File Storage Mode remains unchanged.&lt;br /&gt;
# The new '''UNC File Storage Layout''' setting is initialized as '''Flat'''.&lt;br /&gt;
# All existing documents remain readable in their current locations.&lt;br /&gt;
# An administrator selects ''Tools → Apply UNC File Storage Layout to All Files''.&lt;br /&gt;
# UBIK locks local file documents and transfers all files to the generated folder structure.&lt;br /&gt;
# After all files have been copied, verified, and removed from their source locations, the layout setting changes to '''Folder Partitioning'''.&lt;br /&gt;
# UBIK confirms that 1000 files have been transferred. &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
From this point onward, newly created local file documents are stored using folder partitioning.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[SYSCLS_DOCUMENT]]&lt;br /&gt;
* [[SYSCLS_FILEDOCUMENT]]&lt;br /&gt;
* [[FILEDOCUMENT]]&lt;br /&gt;
* [[SYSCLS_EDITABLEDOCUMENT]]&lt;br /&gt;
* [[Documents (Client)]]&lt;br /&gt;
* [[UBIK_Studio_Basics]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Document|UNC File Storage Layout]]&lt;br /&gt;
[[Category:Studio|UNC File Storage Layout]]&lt;br /&gt;
[[Category:Studio tools|UNC File Storage Layout]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=UNC_File_Storage_Layout&amp;diff=30554</id>
		<title>UNC File Storage Layout</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=UNC_File_Storage_Layout&amp;diff=30554"/>
				<updated>2026-09-04T10:14:09Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: /* See also */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= UNC File Storage Layout =&lt;br /&gt;
&lt;br /&gt;
The UNC File Storage Layout defines how local file documents are physically stored in the UNC document root. UBIK supports a flat layout and a folder-partitioned layout.&lt;br /&gt;
&lt;br /&gt;
Folder partitioning is available from UBIK 5.2 and is the recommended layout for UNC file storage. To maintain downward compatibility, the default remains the existing flat layout until an administrator starts the transfer.&lt;br /&gt;
&lt;br /&gt;
The layout changes only the physical file location. The document object and its '''LOCALPATH''' value remain unchanged.&lt;br /&gt;
&lt;br /&gt;
== Scope ==&lt;br /&gt;
&lt;br /&gt;
The UNC File Storage Layout applies only when '''File Storage Mode''' is set to '''UNC'''.&lt;br /&gt;
&lt;br /&gt;
Folder partitioning is not a separate File Storage Mode. The existing modes remain unchanged:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! File Storage Mode&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Undefined&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| UNC&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Cloud&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Only local file documents with '''IsLocalDoc = true''' are affected. Cloud documents and non-local file documents are ignored.&lt;br /&gt;
&lt;br /&gt;
== UNC File Storage Layout Setting ==&lt;br /&gt;
&lt;br /&gt;
The database setting '''UNC File Storage Layout''' identifies the layout currently used by the database.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Flat&lt;br /&gt;
| Local file documents are stored directly in the document root folder.&lt;br /&gt;
|-&lt;br /&gt;
| Folder Partitioning&lt;br /&gt;
| Local file documents are distributed across generated subfolders based on the document UID.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The setting is visible in the database settings but is read-only. It can be changed only by successfully completing the transfer tool.&lt;br /&gt;
&lt;br /&gt;
For new and existing databases, the default value is '''Flat'''. Updating a database does not change its existing '''File Storage Mode''' or move any files automatically.&lt;br /&gt;
&lt;br /&gt;
== Storage Layouts ==&lt;br /&gt;
&lt;br /&gt;
=== Flat ===&lt;br /&gt;
&lt;br /&gt;
With the flat layout, local file documents are stored directly in the document root folder.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
:''.../doc/8ec24142-17eb-4640-bdcf-31d696c398de.jpg''&lt;br /&gt;
&lt;br /&gt;
=== Folder Partitioning ===&lt;br /&gt;
&lt;br /&gt;
With folder partitioning, UBIK generates two folder levels from the document UID:&lt;br /&gt;
&lt;br /&gt;
* The first character of the UID is used for the first folder level.&lt;br /&gt;
* The second and third characters of the UID are used for the second folder level.&lt;br /&gt;
* Generated folder names use lowercase characters.&lt;br /&gt;
&lt;br /&gt;
Example UID:&lt;br /&gt;
&lt;br /&gt;
:''8ec24142-17eb-4640-bdcf-31d696c398de''&lt;br /&gt;
&lt;br /&gt;
Resulting physical path:&lt;br /&gt;
&lt;br /&gt;
:''.../doc/8/ec/8ec24142-17eb-4640-bdcf-31d696c398de.jpg''&lt;br /&gt;
&lt;br /&gt;
== LOCALPATH and Physical File Resolution ==&lt;br /&gt;
&lt;br /&gt;
The '''LOCALPATH''' property continues to contain only the file name and extension:&lt;br /&gt;
&lt;br /&gt;
:''8ec24142-17eb-4640-bdcf-31d696c398de.jpg''&lt;br /&gt;
&lt;br /&gt;
Folder-partitioning subfolders are not stored in '''LOCALPATH'''. UBIK calculates the complete physical file path when the file is accessed, using:&lt;br /&gt;
&lt;br /&gt;
* the document root path&lt;br /&gt;
* the File Storage Mode&lt;br /&gt;
* the UNC File Storage Layout&lt;br /&gt;
* the document UID and '''LOCALPATH'''&lt;br /&gt;
&lt;br /&gt;
== Database-wide Layout ==&lt;br /&gt;
&lt;br /&gt;
A database uses one UNC storage layout for all local file documents. Flat storage and folder partitioning must not be mixed within the same database.&lt;br /&gt;
&lt;br /&gt;
After a successful transfer, all existing and newly created local file documents use the selected layout.&lt;br /&gt;
&lt;br /&gt;
== Transferring Local File Documents ==&lt;br /&gt;
&lt;br /&gt;
Administrators can transfer all local file documents to the other layout using:&lt;br /&gt;
&lt;br /&gt;
:''Tools → Apply UNC File Storage Layout to All Files''&lt;br /&gt;
&lt;br /&gt;
Tooltip:&lt;br /&gt;
&lt;br /&gt;
:''Updates all local files to use the other UNC file storage layout.''&lt;br /&gt;
&lt;br /&gt;
The tool is available only when '''File Storage Mode = UNC'''. Because there are only two layouts, UBIK determines the target automatically:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Current layout&lt;br /&gt;
! Target layout&lt;br /&gt;
|-&lt;br /&gt;
| Flat&lt;br /&gt;
| Folder Partitioning&lt;br /&gt;
|-&lt;br /&gt;
| Folder Partitioning&lt;br /&gt;
| Flat&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The '''UNC File Storage Layout''' setting is changed only after all affected files have been transferred successfully.&lt;br /&gt;
&lt;br /&gt;
=== Transfer Process ===&lt;br /&gt;
&lt;br /&gt;
For each local file document, UBIK:&lt;br /&gt;
&lt;br /&gt;
# calculates the current and target physical file paths&lt;br /&gt;
# creates the required target folders&lt;br /&gt;
# copies the file to the target path&lt;br /&gt;
# verifies that the copied file exists&lt;br /&gt;
# deletes the source file only after successful verification&lt;br /&gt;
&lt;br /&gt;
If a file already exists at the target path, the transfer is aborted to prevent data loss.&lt;br /&gt;
&lt;br /&gt;
The transfer changes only the physical storage location. It does not:&lt;br /&gt;
&lt;br /&gt;
* change '''LOCALPATH'''&lt;br /&gt;
* update UTS&lt;br /&gt;
* create a new document version&lt;br /&gt;
* update the update session&lt;br /&gt;
* fire events&lt;br /&gt;
&lt;br /&gt;
Empty folders may remain in the previous folder structure after the transfer, but they no longer contain transferred files.&lt;br /&gt;
&lt;br /&gt;
=== Access During the Transfer ===&lt;br /&gt;
&lt;br /&gt;
Local file documents are locked database-wide for all clients and services while the transfer is running. During this time, users and services cannot:&lt;br /&gt;
&lt;br /&gt;
* create new local file document objects&lt;br /&gt;
* change existing local file document objects or their properties&lt;br /&gt;
* open, read, download, or view local document files&lt;br /&gt;
&lt;br /&gt;
Cloud documents and non-local file documents remain available and are not affected by the lock.&lt;br /&gt;
&lt;br /&gt;
== Transfer Result and Error Handling ==&lt;br /&gt;
&lt;br /&gt;
After a successful transfer, UBIK changes the database setting to the target layout and displays the number of transferred files.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
:''1000 files have been transferred.''&lt;br /&gt;
&lt;br /&gt;
If the transfer fails or is interrupted:&lt;br /&gt;
&lt;br /&gt;
* the transfer is aborted&lt;br /&gt;
* the affected file document is reported&lt;br /&gt;
* the '''UNC File Storage Layout''' setting remains unchanged&lt;br /&gt;
* the database is not left with a mixed UNC storage layout&lt;br /&gt;
* the administrator must start the transfer again&lt;br /&gt;
&lt;br /&gt;
A transfer is aborted if a file cannot be found, copied, verified, or deleted, or if the target file already exists.&lt;br /&gt;
&lt;br /&gt;
Failure message:&lt;br /&gt;
&lt;br /&gt;
:''The transfer could not be completed. The UNC File Storage Layout has not been changed.''&lt;br /&gt;
&lt;br /&gt;
== Example: Migrating an Existing Database ==&lt;br /&gt;
&lt;br /&gt;
An existing UBIK database contains 1000 local file documents in flat UNC storage.&lt;br /&gt;
&lt;br /&gt;
# The system is updated to UBIK 5.2.&lt;br /&gt;
# The existing File Storage Mode remains unchanged.&lt;br /&gt;
# The new '''UNC File Storage Layout''' setting is initialized as '''Flat'''.&lt;br /&gt;
# All existing documents remain readable in their current locations.&lt;br /&gt;
# An administrator selects ''Tools → Apply UNC File Storage Layout to All Files''.&lt;br /&gt;
# UBIK locks local file documents and transfers all files to the generated folder structure.&lt;br /&gt;
# After all files have been copied, verified, and removed from their source locations, the layout setting changes to '''Folder Partitioning'''.&lt;br /&gt;
# UBIK confirms that 1000 files have been transferred. &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
From this point onward, newly created local file documents are stored using folder partitioning.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[SYSCLS_DOCUMENT]]&lt;br /&gt;
* [[SYSCLS_FILEDOCUMENT]]&lt;br /&gt;
* [[FILEDOCUMENT]]&lt;br /&gt;
* [[SYSCLS_EDITABLEDOCUMENT]]&lt;br /&gt;
* [[Documents (Client)]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Document|UNC File Storage Layout]]&lt;br /&gt;
[[Category:Studio|UNC File Storage Layout]]&lt;br /&gt;
[[Category:Studio tools|UNC File Storage Layout]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=UNC_File_Storage_Layout&amp;diff=30553</id>
		<title>UNC File Storage Layout</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=UNC_File_Storage_Layout&amp;diff=30553"/>
				<updated>2026-09-04T10:13:09Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= UNC File Storage Layout =&lt;br /&gt;
&lt;br /&gt;
The UNC File Storage Layout defines how local file documents are physically stored in the UNC document root. UBIK supports a flat layout and a folder-partitioned layout.&lt;br /&gt;
&lt;br /&gt;
Folder partitioning is available from UBIK 5.2 and is the recommended layout for UNC file storage. To maintain downward compatibility, the default remains the existing flat layout until an administrator starts the transfer.&lt;br /&gt;
&lt;br /&gt;
The layout changes only the physical file location. The document object and its '''LOCALPATH''' value remain unchanged.&lt;br /&gt;
&lt;br /&gt;
== Scope ==&lt;br /&gt;
&lt;br /&gt;
The UNC File Storage Layout applies only when '''File Storage Mode''' is set to '''UNC'''.&lt;br /&gt;
&lt;br /&gt;
Folder partitioning is not a separate File Storage Mode. The existing modes remain unchanged:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! File Storage Mode&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Undefined&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| UNC&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Cloud&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Only local file documents with '''IsLocalDoc = true''' are affected. Cloud documents and non-local file documents are ignored.&lt;br /&gt;
&lt;br /&gt;
== UNC File Storage Layout Setting ==&lt;br /&gt;
&lt;br /&gt;
The database setting '''UNC File Storage Layout''' identifies the layout currently used by the database.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Flat&lt;br /&gt;
| Local file documents are stored directly in the document root folder.&lt;br /&gt;
|-&lt;br /&gt;
| Folder Partitioning&lt;br /&gt;
| Local file documents are distributed across generated subfolders based on the document UID.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The setting is visible in the database settings but is read-only. It can be changed only by successfully completing the transfer tool.&lt;br /&gt;
&lt;br /&gt;
For new and existing databases, the default value is '''Flat'''. Updating a database does not change its existing '''File Storage Mode''' or move any files automatically.&lt;br /&gt;
&lt;br /&gt;
== Storage Layouts ==&lt;br /&gt;
&lt;br /&gt;
=== Flat ===&lt;br /&gt;
&lt;br /&gt;
With the flat layout, local file documents are stored directly in the document root folder.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
:''.../doc/8ec24142-17eb-4640-bdcf-31d696c398de.jpg''&lt;br /&gt;
&lt;br /&gt;
=== Folder Partitioning ===&lt;br /&gt;
&lt;br /&gt;
With folder partitioning, UBIK generates two folder levels from the document UID:&lt;br /&gt;
&lt;br /&gt;
* The first character of the UID is used for the first folder level.&lt;br /&gt;
* The second and third characters of the UID are used for the second folder level.&lt;br /&gt;
* Generated folder names use lowercase characters.&lt;br /&gt;
&lt;br /&gt;
Example UID:&lt;br /&gt;
&lt;br /&gt;
:''8ec24142-17eb-4640-bdcf-31d696c398de''&lt;br /&gt;
&lt;br /&gt;
Resulting physical path:&lt;br /&gt;
&lt;br /&gt;
:''.../doc/8/ec/8ec24142-17eb-4640-bdcf-31d696c398de.jpg''&lt;br /&gt;
&lt;br /&gt;
== LOCALPATH and Physical File Resolution ==&lt;br /&gt;
&lt;br /&gt;
The '''LOCALPATH''' property continues to contain only the file name and extension:&lt;br /&gt;
&lt;br /&gt;
:''8ec24142-17eb-4640-bdcf-31d696c398de.jpg''&lt;br /&gt;
&lt;br /&gt;
Folder-partitioning subfolders are not stored in '''LOCALPATH'''. UBIK calculates the complete physical file path when the file is accessed, using:&lt;br /&gt;
&lt;br /&gt;
* the document root path&lt;br /&gt;
* the File Storage Mode&lt;br /&gt;
* the UNC File Storage Layout&lt;br /&gt;
* the document UID and '''LOCALPATH'''&lt;br /&gt;
&lt;br /&gt;
== Database-wide Layout ==&lt;br /&gt;
&lt;br /&gt;
A database uses one UNC storage layout for all local file documents. Flat storage and folder partitioning must not be mixed within the same database.&lt;br /&gt;
&lt;br /&gt;
After a successful transfer, all existing and newly created local file documents use the selected layout.&lt;br /&gt;
&lt;br /&gt;
== Transferring Local File Documents ==&lt;br /&gt;
&lt;br /&gt;
Administrators can transfer all local file documents to the other layout using:&lt;br /&gt;
&lt;br /&gt;
:''Tools → Apply UNC File Storage Layout to All Files''&lt;br /&gt;
&lt;br /&gt;
Tooltip:&lt;br /&gt;
&lt;br /&gt;
:''Updates all local files to use the other UNC file storage layout.''&lt;br /&gt;
&lt;br /&gt;
The tool is available only when '''File Storage Mode = UNC'''. Because there are only two layouts, UBIK determines the target automatically:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Current layout&lt;br /&gt;
! Target layout&lt;br /&gt;
|-&lt;br /&gt;
| Flat&lt;br /&gt;
| Folder Partitioning&lt;br /&gt;
|-&lt;br /&gt;
| Folder Partitioning&lt;br /&gt;
| Flat&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The '''UNC File Storage Layout''' setting is changed only after all affected files have been transferred successfully.&lt;br /&gt;
&lt;br /&gt;
=== Transfer Process ===&lt;br /&gt;
&lt;br /&gt;
For each local file document, UBIK:&lt;br /&gt;
&lt;br /&gt;
# calculates the current and target physical file paths&lt;br /&gt;
# creates the required target folders&lt;br /&gt;
# copies the file to the target path&lt;br /&gt;
# verifies that the copied file exists&lt;br /&gt;
# deletes the source file only after successful verification&lt;br /&gt;
&lt;br /&gt;
If a file already exists at the target path, the transfer is aborted to prevent data loss.&lt;br /&gt;
&lt;br /&gt;
The transfer changes only the physical storage location. It does not:&lt;br /&gt;
&lt;br /&gt;
* change '''LOCALPATH'''&lt;br /&gt;
* update UTS&lt;br /&gt;
* create a new document version&lt;br /&gt;
* update the update session&lt;br /&gt;
* fire events&lt;br /&gt;
&lt;br /&gt;
Empty folders may remain in the previous folder structure after the transfer, but they no longer contain transferred files.&lt;br /&gt;
&lt;br /&gt;
=== Access During the Transfer ===&lt;br /&gt;
&lt;br /&gt;
Local file documents are locked database-wide for all clients and services while the transfer is running. During this time, users and services cannot:&lt;br /&gt;
&lt;br /&gt;
* create new local file document objects&lt;br /&gt;
* change existing local file document objects or their properties&lt;br /&gt;
* open, read, download, or view local document files&lt;br /&gt;
&lt;br /&gt;
Cloud documents and non-local file documents remain available and are not affected by the lock.&lt;br /&gt;
&lt;br /&gt;
== Transfer Result and Error Handling ==&lt;br /&gt;
&lt;br /&gt;
After a successful transfer, UBIK changes the database setting to the target layout and displays the number of transferred files.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
:''1000 files have been transferred.''&lt;br /&gt;
&lt;br /&gt;
If the transfer fails or is interrupted:&lt;br /&gt;
&lt;br /&gt;
* the transfer is aborted&lt;br /&gt;
* the affected file document is reported&lt;br /&gt;
* the '''UNC File Storage Layout''' setting remains unchanged&lt;br /&gt;
* the database is not left with a mixed UNC storage layout&lt;br /&gt;
* the administrator must start the transfer again&lt;br /&gt;
&lt;br /&gt;
A transfer is aborted if a file cannot be found, copied, verified, or deleted, or if the target file already exists.&lt;br /&gt;
&lt;br /&gt;
Failure message:&lt;br /&gt;
&lt;br /&gt;
:''The transfer could not be completed. The UNC File Storage Layout has not been changed.''&lt;br /&gt;
&lt;br /&gt;
== Example: Migrating an Existing Database ==&lt;br /&gt;
&lt;br /&gt;
An existing UBIK database contains 1000 local file documents in flat UNC storage.&lt;br /&gt;
&lt;br /&gt;
# The system is updated to UBIK 5.2.&lt;br /&gt;
# The existing File Storage Mode remains unchanged.&lt;br /&gt;
# The new '''UNC File Storage Layout''' setting is initialized as '''Flat'''.&lt;br /&gt;
# All existing documents remain readable in their current locations.&lt;br /&gt;
# An administrator selects ''Tools → Apply UNC File Storage Layout to All Files''.&lt;br /&gt;
# UBIK locks local file documents and transfers all files to the generated folder structure.&lt;br /&gt;
# After all files have been copied, verified, and removed from their source locations, the layout setting changes to '''Folder Partitioning'''.&lt;br /&gt;
# UBIK confirms that 1000 files have been transferred. &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
From this point onward, newly created local file documents are stored using folder partitioning.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[SYSCLS_DOCUMENT]]&lt;br /&gt;
* [[SYSCLS_FILEDOCUMENT]]&lt;br /&gt;
* [[FILEDOCUMENT]]&lt;br /&gt;
* [[SYSCLS_EDITABLEDOCUMENT]]&lt;br /&gt;
* [[Documents (Client)]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Document|UNC File Storage Layout]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=UNC_File_Storage_Layout&amp;diff=30552</id>
		<title>UNC File Storage Layout</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=UNC_File_Storage_Layout&amp;diff=30552"/>
				<updated>2026-09-04T10:09:02Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= UNC File Storage Layout =&lt;br /&gt;
&lt;br /&gt;
The UNC File Storage Layout defines how local file documents are physically stored in the UNC document root. UBIK supports a flat layout and a folder-partitioned layout.&lt;br /&gt;
&lt;br /&gt;
Folder partitioning is available from UBIK 5.2 and is the recommended layout for UNC file storage. To maintain downward compatibility, the default remains the existing flat layout until an administrator starts the transfer.&lt;br /&gt;
&lt;br /&gt;
The layout changes only the physical file location. The document object and its '''LOCALPATH''' value remain unchanged.&lt;br /&gt;
&lt;br /&gt;
== Scope ==&lt;br /&gt;
&lt;br /&gt;
The UNC File Storage Layout applies only when '''File Storage Mode''' is set to '''UNC'''.&lt;br /&gt;
&lt;br /&gt;
Folder partitioning is not a separate File Storage Mode. The existing modes remain unchanged:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! File Storage Mode&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Undefined&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| UNC&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Cloud&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Only local file documents with '''IsLocalDoc = true''' are affected. Cloud documents and non-local file documents are ignored.&lt;br /&gt;
&lt;br /&gt;
== UNC File Storage Layout Setting ==&lt;br /&gt;
&lt;br /&gt;
The database setting '''UNC File Storage Layout''' identifies the layout currently used by the database.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Flat&lt;br /&gt;
| Local file documents are stored directly in the document root folder.&lt;br /&gt;
|-&lt;br /&gt;
| Folder Partitioning&lt;br /&gt;
| Local file documents are distributed across generated subfolders based on the document UID.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The setting is visible in the database settings but is read-only. It can be changed only by successfully completing the transfer tool.&lt;br /&gt;
&lt;br /&gt;
For new and existing databases, the default value is '''Flat'''. Updating a database does not change its existing '''File Storage Mode''' or move any files automatically.&lt;br /&gt;
&lt;br /&gt;
== Storage Layouts ==&lt;br /&gt;
&lt;br /&gt;
=== Flat ===&lt;br /&gt;
&lt;br /&gt;
With the flat layout, local file documents are stored directly in the document root folder.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
:''.../doc/8ec24142-17eb-4640-bdcf-31d696c398de.jpg''&lt;br /&gt;
&lt;br /&gt;
=== Folder Partitioning ===&lt;br /&gt;
&lt;br /&gt;
With folder partitioning, UBIK generates two folder levels from the document UID:&lt;br /&gt;
&lt;br /&gt;
* The first character of the UID is used for the first folder level.&lt;br /&gt;
* The second and third characters of the UID are used for the second folder level.&lt;br /&gt;
* Generated folder names use lowercase characters.&lt;br /&gt;
&lt;br /&gt;
Example UID:&lt;br /&gt;
&lt;br /&gt;
:''8ec24142-17eb-4640-bdcf-31d696c398de''&lt;br /&gt;
&lt;br /&gt;
Resulting physical path:&lt;br /&gt;
&lt;br /&gt;
:''.../doc/8/ec/8ec24142-17eb-4640-bdcf-31d696c398de.jpg''&lt;br /&gt;
&lt;br /&gt;
== LOCALPATH and Physical File Resolution ==&lt;br /&gt;
&lt;br /&gt;
The '''LOCALPATH''' property continues to contain only the file name and extension:&lt;br /&gt;
&lt;br /&gt;
:''8ec24142-17eb-4640-bdcf-31d696c398de.jpg''&lt;br /&gt;
&lt;br /&gt;
Folder-partitioning subfolders are not stored in '''LOCALPATH'''. UBIK calculates the complete physical file path when the file is accessed, using:&lt;br /&gt;
&lt;br /&gt;
* the document root path&lt;br /&gt;
* the File Storage Mode&lt;br /&gt;
* the UNC File Storage Layout&lt;br /&gt;
* the document UID and '''LOCALPATH'''&lt;br /&gt;
&lt;br /&gt;
== Database-wide Layout ==&lt;br /&gt;
&lt;br /&gt;
A database uses one UNC storage layout for all local file documents. Flat storage and folder partitioning must not be mixed within the same database.&lt;br /&gt;
&lt;br /&gt;
After a successful transfer, all existing and newly created local file documents use the selected layout.&lt;br /&gt;
&lt;br /&gt;
== Transferring Local File Documents ==&lt;br /&gt;
&lt;br /&gt;
Administrators can transfer all local file documents to the other layout using:&lt;br /&gt;
&lt;br /&gt;
:''Tools → Apply UNC File Storage Layout to All Files''&lt;br /&gt;
&lt;br /&gt;
Tooltip:&lt;br /&gt;
&lt;br /&gt;
:''Updates all local files to use the other UNC file storage layout.''&lt;br /&gt;
&lt;br /&gt;
The tool is available only when '''File Storage Mode = UNC'''. Because there are only two layouts, UBIK determines the target automatically:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Current layout&lt;br /&gt;
! Target layout&lt;br /&gt;
|-&lt;br /&gt;
| Flat&lt;br /&gt;
| Folder Partitioning&lt;br /&gt;
|-&lt;br /&gt;
| Folder Partitioning&lt;br /&gt;
| Flat&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The '''UNC File Storage Layout''' setting is changed only after all affected files have been transferred successfully.&lt;br /&gt;
&lt;br /&gt;
=== Transfer Process ===&lt;br /&gt;
&lt;br /&gt;
For each local file document, UBIK:&lt;br /&gt;
&lt;br /&gt;
# calculates the current and target physical file paths&lt;br /&gt;
# creates the required target folders&lt;br /&gt;
# copies the file to the target path&lt;br /&gt;
# verifies that the copied file exists&lt;br /&gt;
# deletes the source file only after successful verification&lt;br /&gt;
&lt;br /&gt;
If a file already exists at the target path, the transfer is aborted to prevent data loss.&lt;br /&gt;
&lt;br /&gt;
The transfer changes only the physical storage location. It does not:&lt;br /&gt;
&lt;br /&gt;
* change '''LOCALPATH'''&lt;br /&gt;
* update UTS&lt;br /&gt;
* create a new document version&lt;br /&gt;
* update the update session&lt;br /&gt;
* fire events&lt;br /&gt;
&lt;br /&gt;
Empty folders may remain in the previous folder structure after the transfer, but they no longer contain transferred files.&lt;br /&gt;
&lt;br /&gt;
=== Access During the Transfer ===&lt;br /&gt;
&lt;br /&gt;
Local file documents are locked database-wide for all clients and services while the transfer is running. During this time, users and services cannot:&lt;br /&gt;
&lt;br /&gt;
* create new local file document objects&lt;br /&gt;
* change existing local file document objects or their properties&lt;br /&gt;
* open, read, download, or view local document files&lt;br /&gt;
&lt;br /&gt;
Cloud documents and non-local file documents remain available and are not affected by the lock.&lt;br /&gt;
&lt;br /&gt;
== Transfer Result and Error Handling ==&lt;br /&gt;
&lt;br /&gt;
After a successful transfer, UBIK changes the database setting to the target layout and displays the number of transferred files.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
:''1000 files have been transferred.''&lt;br /&gt;
&lt;br /&gt;
If the transfer fails or is interrupted:&lt;br /&gt;
&lt;br /&gt;
* the transfer is aborted&lt;br /&gt;
* the affected file document is reported&lt;br /&gt;
* the '''UNC File Storage Layout''' setting remains unchanged&lt;br /&gt;
* the database is not left with a mixed UNC storage layout&lt;br /&gt;
* the administrator must start the transfer again&lt;br /&gt;
&lt;br /&gt;
A transfer is aborted if a file cannot be found, copied, verified, or deleted, or if the target file already exists.&lt;br /&gt;
&lt;br /&gt;
Failure message:&lt;br /&gt;
&lt;br /&gt;
:''The transfer could not be completed. The UNC File Storage Layout has not been changed.''&lt;br /&gt;
&lt;br /&gt;
== Example: Migrating an Existing Database ==&lt;br /&gt;
&lt;br /&gt;
An existing UBIK database contains 1000 local file documents in flat UNC storage.&lt;br /&gt;
&lt;br /&gt;
# The system is updated to UBIK 5.2.&lt;br /&gt;
# The existing File Storage Mode remains unchanged.&lt;br /&gt;
# The new '''UNC File Storage Layout''' setting is initialized as '''Flat'''.&lt;br /&gt;
# All existing documents remain readable in their current locations.&lt;br /&gt;
# An administrator selects ''Tools → Apply UNC File Storage Layout to All Files''.&lt;br /&gt;
# UBIK locks local file documents and transfers all files to the generated folder structure.&lt;br /&gt;
# After all files have been copied, verified, and removed from their source locations, the layout setting changes to '''Folder Partitioning'''.&lt;br /&gt;
# UBIK confirms that 1000 files have been transferred.&lt;br /&gt;
&lt;br /&gt;
From this point onward, newly created local file documents are stored using folder partitioning.&lt;br /&gt;
&lt;br /&gt;
[[Category:Document|UNC File Storage Layout]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=UNC_File_Storage_Layout&amp;diff=30551</id>
		<title>UNC File Storage Layout</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=UNC_File_Storage_Layout&amp;diff=30551"/>
				<updated>2026-09-04T10:06:24Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: Created page with &amp;quot;= UNC File Storage Layout =  The UNC File Storage Layout defines how local file documents are physically stored in the UNC document root. UBIK supports a flat layout and a fol...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= UNC File Storage Layout =&lt;br /&gt;
&lt;br /&gt;
The UNC File Storage Layout defines how local file documents are physically stored in the UNC document root. UBIK supports a flat layout and a folder-partitioned layout.&lt;br /&gt;
&lt;br /&gt;
Folder partitioning is available from UBIK 5.2 and is the recommended layout for UNC file storage. To maintain downward compatibility, the default remains the existing flat layout until an administrator starts the transfer.&lt;br /&gt;
&lt;br /&gt;
The layout changes only the physical file location. The document object and its '''LOCALPATH''' value remain unchanged.&lt;br /&gt;
&lt;br /&gt;
== Scope ==&lt;br /&gt;
&lt;br /&gt;
The UNC File Storage Layout applies only when '''File Storage Mode''' is set to '''UNC'''.&lt;br /&gt;
&lt;br /&gt;
Folder partitioning is not a separate File Storage Mode. The existing modes remain unchanged:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! File Storage Mode&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Undefined&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| UNC&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Cloud&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Only local file documents with '''IsLocalDoc = true''' are affected. Cloud documents and non-local file documents are ignored.&lt;br /&gt;
&lt;br /&gt;
== UNC File Storage Layout Setting ==&lt;br /&gt;
&lt;br /&gt;
The database setting '''UNC File Storage Layout''' identifies the layout currently used by the database.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Flat&lt;br /&gt;
| Local file documents are stored directly in the document root folder.&lt;br /&gt;
|-&lt;br /&gt;
| Folder Partitioning&lt;br /&gt;
| Local file documents are distributed across generated subfolders based on the document UID.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The setting is visible in the database settings but is read-only. It can be changed only by successfully completing the transfer tool.&lt;br /&gt;
&lt;br /&gt;
For new and existing databases, the default value is '''Flat'''. Updating a database does not change its existing '''File Storage Mode''' or move any files automatically.&lt;br /&gt;
&lt;br /&gt;
== Storage Layouts ==&lt;br /&gt;
&lt;br /&gt;
=== Flat ===&lt;br /&gt;
&lt;br /&gt;
With the flat layout, local file documents are stored directly in the document root folder.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
:''.../doc/8ec24142-17eb-4640-bdcf-31d696c398de.jpg''&lt;br /&gt;
&lt;br /&gt;
=== Folder Partitioning ===&lt;br /&gt;
&lt;br /&gt;
With folder partitioning, UBIK generates two folder levels from the document UID:&lt;br /&gt;
&lt;br /&gt;
* The first character of the UID is used for the first folder level.&lt;br /&gt;
* The second and third characters of the UID are used for the second folder level.&lt;br /&gt;
* Generated folder names use lowercase characters.&lt;br /&gt;
&lt;br /&gt;
Example UID:&lt;br /&gt;
&lt;br /&gt;
:''8ec24142-17eb-4640-bdcf-31d696c398de''&lt;br /&gt;
&lt;br /&gt;
Resulting physical path:&lt;br /&gt;
&lt;br /&gt;
:''.../doc/8/ec/8ec24142-17eb-4640-bdcf-31d696c398de.jpg''&lt;br /&gt;
&lt;br /&gt;
== LOCALPATH and Physical File Resolution ==&lt;br /&gt;
&lt;br /&gt;
The '''LOCALPATH''' property continues to contain only the file name and extension:&lt;br /&gt;
&lt;br /&gt;
:''8ec24142-17eb-4640-bdcf-31d696c398de.jpg''&lt;br /&gt;
&lt;br /&gt;
Folder-partitioning subfolders are not stored in '''LOCALPATH'''. UBIK calculates the complete physical file path when the file is accessed, using:&lt;br /&gt;
&lt;br /&gt;
* the document root path&lt;br /&gt;
* the File Storage Mode&lt;br /&gt;
* the UNC File Storage Layout&lt;br /&gt;
* the document UID and '''LOCALPATH'''&lt;br /&gt;
&lt;br /&gt;
== Database-wide Layout ==&lt;br /&gt;
&lt;br /&gt;
A database uses one UNC storage layout for all local file documents. Flat storage and folder partitioning must not be mixed within the same database.&lt;br /&gt;
&lt;br /&gt;
After a successful transfer, all existing and newly created local file documents use the selected layout.&lt;br /&gt;
&lt;br /&gt;
== Transferring Local File Documents ==&lt;br /&gt;
&lt;br /&gt;
Administrators can transfer all local file documents to the other layout using:&lt;br /&gt;
&lt;br /&gt;
:''Tools → Apply UNC File Storage Layout to All Files''&lt;br /&gt;
&lt;br /&gt;
Tooltip:&lt;br /&gt;
&lt;br /&gt;
:''Updates all local files to use the other UNC file storage layout.''&lt;br /&gt;
&lt;br /&gt;
The tool is available only when '''File Storage Mode = UNC'''. Because there are only two layouts, UBIK determines the target automatically:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Current layout&lt;br /&gt;
! Target layout&lt;br /&gt;
|-&lt;br /&gt;
| Flat&lt;br /&gt;
| Folder Partitioning&lt;br /&gt;
|-&lt;br /&gt;
| Folder Partitioning&lt;br /&gt;
| Flat&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The '''UNC File Storage Layout''' setting is changed only after all affected files have been transferred successfully.&lt;br /&gt;
&lt;br /&gt;
=== Transfer Process ===&lt;br /&gt;
&lt;br /&gt;
For each local file document, UBIK:&lt;br /&gt;
&lt;br /&gt;
# calculates the current and target physical file paths&lt;br /&gt;
# creates the required target folders&lt;br /&gt;
# copies the file to the target path&lt;br /&gt;
# verifies that the copied file exists&lt;br /&gt;
# deletes the source file only after successful verification&lt;br /&gt;
&lt;br /&gt;
If a file already exists at the target path, the transfer is aborted to prevent data loss.&lt;br /&gt;
&lt;br /&gt;
The transfer changes only the physical storage location. It does not:&lt;br /&gt;
&lt;br /&gt;
* change '''LOCALPATH'''&lt;br /&gt;
* update UTS&lt;br /&gt;
* create a new document version&lt;br /&gt;
* update the update session&lt;br /&gt;
* fire events&lt;br /&gt;
&lt;br /&gt;
Empty folders may remain in the previous folder structure after the transfer, but they no longer contain transferred files.&lt;br /&gt;
&lt;br /&gt;
=== Access During the Transfer ===&lt;br /&gt;
&lt;br /&gt;
Local file documents are locked database-wide for all clients and services while the transfer is running. During this time, users and services cannot:&lt;br /&gt;
&lt;br /&gt;
* create new local file document objects&lt;br /&gt;
* change existing local file document objects or their properties&lt;br /&gt;
* open, read, download, or view local document files&lt;br /&gt;
&lt;br /&gt;
Cloud documents and non-local file documents remain available and are not affected by the lock.&lt;br /&gt;
&lt;br /&gt;
== Transfer Result and Error Handling ==&lt;br /&gt;
&lt;br /&gt;
After a successful transfer, UBIK changes the database setting to the target layout and displays the number of transferred files.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
:''1000 files have been transferred.''&lt;br /&gt;
&lt;br /&gt;
If the transfer fails or is interrupted:&lt;br /&gt;
&lt;br /&gt;
* the transfer is aborted&lt;br /&gt;
* the affected file document is reported&lt;br /&gt;
* the '''UNC File Storage Layout''' setting remains unchanged&lt;br /&gt;
* the database is not left with a mixed UNC storage layout&lt;br /&gt;
* the administrator must start the transfer again&lt;br /&gt;
&lt;br /&gt;
A transfer is aborted if a file cannot be found, copied, verified, or deleted, or if the target file already exists.&lt;br /&gt;
&lt;br /&gt;
Failure message:&lt;br /&gt;
&lt;br /&gt;
:''The transfer could not be completed. The UNC File Storage Layout has not been changed.''&lt;br /&gt;
&lt;br /&gt;
== Example: Migrating an Existing Database ==&lt;br /&gt;
&lt;br /&gt;
An existing UBIK database contains 1000 local file documents in flat UNC storage.&lt;br /&gt;
&lt;br /&gt;
# The system is updated to UBIK 5.2.&lt;br /&gt;
# The existing File Storage Mode remains unchanged.&lt;br /&gt;
# The new '''UNC File Storage Layout''' setting is initialized as '''Flat'''.&lt;br /&gt;
# All existing documents remain readable in their current locations.&lt;br /&gt;
# An administrator selects ''Tools → Apply UNC File Storage Layout to All Files''.&lt;br /&gt;
# UBIK locks local file documents and transfers all files to the generated folder structure.&lt;br /&gt;
# After all files have been copied, verified, and removed from their source locations, the layout setting changes to '''Folder Partitioning'''.&lt;br /&gt;
# UBIK confirms that 1000 files have been transferred.&lt;br /&gt;
&lt;br /&gt;
From this point onward, newly created local file documents are stored using folder partitioning.&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_Material_Management&amp;diff=30550</id>
		<title>MRO Material Management</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_Material_Management&amp;diff=30550"/>
				<updated>2026-09-04T08:37:53Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: /* See also */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== MRO Material Management ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''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 &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;, and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;. Materials are linked to master data and storage locations. Reservations are created manually by users and link materials to tasks.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MRO material management is used to support maintenance work with required spare parts, consumables, tools, or other material items.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Basic concept ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Object&lt;br /&gt;
! Type&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;&lt;br /&gt;
| Master data&lt;br /&gt;
| Defines the catalogue entry for a material, including item number, unit, packaging, manufacturer data, and material type.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Quantity-bearing MRO object&lt;br /&gt;
| 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.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Workflow object&lt;br /&gt;
| Represents a manually created material reservation for a task. It links a material to a task and stores planned and actual quantities.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;&lt;br /&gt;
| Technical base class&lt;br /&gt;
| Provides the common &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property used by both materials and reservations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Related storage object&lt;br /&gt;
| Represents a physical storage location for materials.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Core idea:''' &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt; defines what the material is. &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; represents the material in stock or material context. &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; links a material to a task and reserves a planned quantity for maintenance execution.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MaterialMaster ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt; represents the material master or catalogue entry.&lt;br /&gt;
&lt;br /&gt;
It stores item-level master data that can be referenced by material instances in MRO.&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ITEM_NUMBER&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Item number or material number.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PACKAGING_UNIT&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Packaging unit.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PACKAGING_SIZE&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Packaging size.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ACTIVE&amp;lt;/span&amp;gt;&lt;br /&gt;
| bool&lt;br /&gt;
| Defines whether the material master is active.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UNIT_OF_MEASURE&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Unit of measure.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_TYPE&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| Material type.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MANUFACTURER_COMPANY_NAME&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Manufacturer company name.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MANUFACTURER_PRODUCT_TAG&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Manufacturer product tag or product identifier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Material type ===&lt;br /&gt;
&lt;br /&gt;
Values of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt; are:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SpareParts&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Consumables&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Tools&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Material ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; represents a material instance or stock entry in MRO.&lt;br /&gt;
&lt;br /&gt;
It inherits from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt; and therefore uses the inherited &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property as its material quantity.&lt;br /&gt;
&lt;br /&gt;
A material links to:&lt;br /&gt;
&lt;br /&gt;
* a material master via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
* a storage location via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
! Stored or calculated&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the material master data.&lt;br /&gt;
| Stored link&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the storage location where the material is located.&lt;br /&gt;
| Stored link&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Material quantity. Inherited from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Stored property&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Sum of planned quantities of confirmed reservations for this material.&lt;br /&gt;
| Calculated property&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_STATUS&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialStatus&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| Material status.&lt;br /&gt;
| User/admin managed property&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Material status ===&lt;br /&gt;
&lt;br /&gt;
The material status is stored in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_STATUS&amp;lt;/span&amp;gt; and exposed through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialStatus&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The property is managed by the user or administrator. The system does not change it automatically.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Numeric value&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Undefined&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
| No specific material status is defined.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Inactive&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
| Material is inactive and should not be used for new reservations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Active&amp;lt;/span&amp;gt;&lt;br /&gt;
| 20&lt;br /&gt;
| Material is active and can be used for reservations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Reserved quantity ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt; is calculated at read time.&lt;br /&gt;
&lt;br /&gt;
The calculation uses reservations where:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; points to the current material&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STATUS&amp;lt;/span&amp;gt; is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus.Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The calculated value is the sum of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; of these confirmed reservations.&lt;br /&gt;
&lt;br /&gt;
=== Available quantity ===&lt;br /&gt;
&lt;br /&gt;
The available material quantity is calculated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 8px 10px; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
AvailableQuantity = QUANTITY - RESERVED_QUANTITY&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Delete behavior ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.InternalDeleteAllowed()&amp;lt;/span&amp;gt; prevents deleting a material if it still has quantity or active reservations.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #d33; background-color: #fff5f5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Restriction:''' A &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; cannot be deleted while it has a quantity greater than 0 or active reservations.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reservation ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; represents a manually created material reservation for a task.&lt;br /&gt;
&lt;br /&gt;
It links:&lt;br /&gt;
&lt;br /&gt;
* a task via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
* a material via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It stores the planned reservation quantity in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; and the actually issued or consumed quantity in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
! Important behavior&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Task&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the task for which the material is reserved.&lt;br /&gt;
| Setter is blocked when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the material being reserved.&lt;br /&gt;
| Setter is blocked when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STATUS&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| Reservation status.&lt;br /&gt;
| Changes are validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Planned quantity for the reservation.&lt;br /&gt;
| Setter validates through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Actually issued or consumed quantity. Overrides &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement.QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Setter validates through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Reservation status ===&lt;br /&gt;
&lt;br /&gt;
Values of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus&amp;lt;/span&amp;gt; are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Status&lt;br /&gt;
! Numeric value&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
| Reservation is planned.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
| Reservation is confirmed and contributes to the material's reserved quantity.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
| 20&lt;br /&gt;
| Material has been physically issued.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Cancelled&amp;lt;/span&amp;gt;&lt;br /&gt;
| 30&lt;br /&gt;
| Reservation was cancelled.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Expired&amp;lt;/span&amp;gt;&lt;br /&gt;
| 50&lt;br /&gt;
| Reservation has expired.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Status change rules ===&lt;br /&gt;
&lt;br /&gt;
Status changes are controlled by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The following rules are applied:&lt;br /&gt;
&lt;br /&gt;
* no status change is allowed when the current status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
* changing from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt; back to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; is not allowed&lt;br /&gt;
* other status changes are allowed by this method&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #d33; background-color: #fff5f5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Restriction:''' Once a reservation has status &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;, its status can no longer be changed by the normal status setter logic.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Planned quantity validation ===&lt;br /&gt;
&lt;br /&gt;
The setter of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; validates changes through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A new planned quantity is only allowed if:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt; is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus.Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; is assigned&lt;br /&gt;
* the new quantity is greater than 0&lt;br /&gt;
* the new quantity is lower than or equal to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Quantity rule:''' A planned reservation quantity can only be set while the reservation is still &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; and only if the selected material has enough available quantity.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Actual quantity validation ===&lt;br /&gt;
&lt;br /&gt;
The overridden &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; setter validates changes through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A new actual quantity is only allowed if:&lt;br /&gt;
&lt;br /&gt;
* the new quantity is greater than 0&lt;br /&gt;
* the status is either &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Link editing rules ===&lt;br /&gt;
&lt;br /&gt;
The setters of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; are guarded by reservation status.&lt;br /&gt;
&lt;br /&gt;
The links cannot be changed when the reservation is:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== StorageLocation ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt; is a related object used to represent a physical storage location.&lt;br /&gt;
&lt;br /&gt;
A material can reference a storage location via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Important properties and values ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Values / meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STORAGE_TYPE&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageType&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Floor&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Shelf&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Rack&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Bin&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Pallet&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Container&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ACCESS_TYPE&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AccessType&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Manual&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Forklift&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Crane&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Automated&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OCCUPANCY_STATUS&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OccupancyStatus&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Empty&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Partial&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Full&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reserved&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Blocked&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OutOfService&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STORAGE_LABEL&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Label of the storage location.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEVEL&amp;lt;/span&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| Level of the storage location.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;POSITION&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Position identifier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GoodsMovement ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt; is a technical base class.&lt;br /&gt;
&lt;br /&gt;
It provides the common &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property for material-related objects such as &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Quantity concepts ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Quantity&lt;br /&gt;
! Property / method&lt;br /&gt;
! Object&lt;br /&gt;
! Stored or calculated&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| Material quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Inherited from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Reserved quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Calculated&lt;br /&gt;
| Sum of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; of confirmed reservations for the material.&lt;br /&gt;
|-&lt;br /&gt;
| Available quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Calculated&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; minus &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Actually issued or consumed quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Overrides &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement.QUANTITY&amp;lt;/span&amp;gt; and is validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Reservation workflow ==&lt;br /&gt;
&lt;br /&gt;
=== Creating or editing a reservation ===&lt;br /&gt;
&lt;br /&gt;
Reservations are created manually by the user.&lt;br /&gt;
&lt;br /&gt;
A reservation links a material to a task.&lt;br /&gt;
&lt;br /&gt;
For a reservation to define its planned quantity correctly:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; must be set.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; must point to the task requiring the material.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt; must still be &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must not exceed &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Confirmed reservations ===&lt;br /&gt;
&lt;br /&gt;
When a reservation is confirmed, it contributes to the material's reserved quantity.&lt;br /&gt;
&lt;br /&gt;
This affects the available quantity of the material.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 8px 10px; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
AvailableQuantity = QUANTITY - sum(QTY_PLANNED of confirmed reservations)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Finishing a task ===&lt;br /&gt;
&lt;br /&gt;
When a task is finished, the task logic calls &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CloseReservations()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Workflow effect:''' Finishing a task closes its reservations. Confirmed reservations become &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;; other active reservations become &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Cancelled&amp;lt;/span&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Usage in tasks ==&lt;br /&gt;
&lt;br /&gt;
Reservations are the central link between material handling and task execution.&lt;br /&gt;
&lt;br /&gt;
A reservation connects:&lt;br /&gt;
&lt;br /&gt;
* the required material through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
* the task through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
* the planned quantity through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
* the actually issued or consumed quantity through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
* the reservation state through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This means that material usage is tracked at task level.&lt;br /&gt;
&lt;br /&gt;
== Example workflow ==&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Material master exists ===&lt;br /&gt;
&lt;br /&gt;
A spare part is defined as a &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ITEM_NUMBER&amp;lt;/span&amp;gt;&lt;br /&gt;
| OF-10045&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UNIT_OF_MEASURE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Piece&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SpareParts&amp;lt;/span&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Material exists in a storage location ===&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; object references the material master and a storage location.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
| Oil Filter Type A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
| Storage Shelf A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
| 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Reservation is created for a task ===&lt;br /&gt;
&lt;br /&gt;
A user manually creates a &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; and links the material to the task.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
| Replace oil filter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
| Oil Filter Type A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 4: Reservation is confirmed ===&lt;br /&gt;
&lt;br /&gt;
The reservation status is changed to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
After confirmation, the material's reserved quantity includes the reservation's planned quantity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Quantity&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
| 9&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 5: Actual quantity is entered ===&lt;br /&gt;
&lt;br /&gt;
The actually issued or consumed quantity is stored in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation.QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation.QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 6: Task is finished ===&lt;br /&gt;
&lt;br /&gt;
When the task is finished, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CloseReservations()&amp;lt;/span&amp;gt; is called.&lt;br /&gt;
&lt;br /&gt;
The confirmed reservation is changed to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Validation and business rules ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Area&lt;br /&gt;
! Rule&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; can only be changed while the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must not exceed &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Actual issued or consumed quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
|-&lt;br /&gt;
| Actual issued or consumed quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; can only be changed while the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Reservation status&lt;br /&gt;
| Status cannot be changed once the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Reservation status&lt;br /&gt;
| A reservation cannot be changed from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt; back to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Reservation links&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; cannot be changed when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Material deletion&lt;br /&gt;
| Material cannot be deleted while &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; is greater than 0.&lt;br /&gt;
|-&lt;br /&gt;
| Material deletion&lt;br /&gt;
| Material cannot be deleted while active reservations exist.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[MRO (Plugin)]]&lt;br /&gt;
* [[MRO_Objects_(Client)]]&lt;br /&gt;
* [[MRO_Implemented_Objects]]&lt;br /&gt;
* [[MROMaintenancePlans]]&lt;br /&gt;
* [[MRO_Notification]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_Notification&amp;diff=30549</id>
		<title>MRO Notification</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_Notification&amp;diff=30549"/>
				<updated>2026-09-04T08:35:33Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: Created page with &amp;quot;An MRO Notification represents a reported maintenance issue related to an Asset. It records the responsible user, due date, priority, and current processing status. A Notifica...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An MRO Notification represents a reported maintenance issue related to an Asset. It records the responsible user, due date, priority, and current processing status. A Notification can also serve as the origin of a [[MRO (Plugin)#Work Package|Work Package]]. The created Work Package references the Notification so that its origin remains traceable.&lt;br /&gt;
&lt;br /&gt;
Technical object name: NOTIFICATION&lt;br /&gt;
&lt;br /&gt;
Runtime class: UBIK.MRO.Notification&lt;br /&gt;
&lt;br /&gt;
== Creating and Editing Notifications ==&lt;br /&gt;
&lt;br /&gt;
A Notification is created for an Asset using LK_ASSET. Functional Locations and Equipment can be referenced because they are specialized Asset types.&lt;br /&gt;
&lt;br /&gt;
In addition to the standard properties of a {{UBIK}} content object, a Notification provides MRO-specific properties for its Asset, assigned user, due date, priority, status, and optional Work Package template. These properties can be edited after creation. Changes to NOTIF_STATUS are restricted by the [[#Notification Status|defined status transitions]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| LK_ASSET || {{Guid}} || Link to the Asset for which the Notification was created&lt;br /&gt;
|-&lt;br /&gt;
| LK_WP_TMPL || {{Guid}} || Optional link to a Work Package template&lt;br /&gt;
|-&lt;br /&gt;
| LK_ASGN_USER || {{Guid}} || Link to the assigned user&lt;br /&gt;
|-&lt;br /&gt;
| NOTIF_DUE_DATE || {{DateTime}} || Due date of the Notification&lt;br /&gt;
|-&lt;br /&gt;
| NOTIF_PRIORITY || {{Integer}} || Priority of the Notification&lt;br /&gt;
|-&lt;br /&gt;
| NOTIF_STATUS || {{Integer}} || Current processing status of the Notification&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Notification Priority ===&lt;br /&gt;
&lt;br /&gt;
The priority is stored in NOTIF_PRIORITY. The following values are available:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;50%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Undefined || No priority has been assigned&lt;br /&gt;
|-&lt;br /&gt;
| 10 || Low || Low priority&lt;br /&gt;
|-&lt;br /&gt;
| 20 || Medium || Medium priority&lt;br /&gt;
|-&lt;br /&gt;
| 30 || High || High priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Notification Status ===&lt;br /&gt;
&lt;br /&gt;
The current processing state is stored in NOTIF_STATUS. The following values are available:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;50%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value !! Status&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Undefined&lt;br /&gt;
|-&lt;br /&gt;
| 10 || New&lt;br /&gt;
|-&lt;br /&gt;
| 20 || Confirmed&lt;br /&gt;
|-&lt;br /&gt;
| 30 || In Progress&lt;br /&gt;
|-&lt;br /&gt;
| 40 || Completed&lt;br /&gt;
|-&lt;br /&gt;
| 50 || Rejected&lt;br /&gt;
|-&lt;br /&gt;
| 60 || Closed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Status changes are validated by the Notification. Only the following transitions are permitted:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Current status !! Permitted next status&lt;br /&gt;
|-&lt;br /&gt;
| Undefined || New&lt;br /&gt;
|-&lt;br /&gt;
| New || Confirmed or Rejected&lt;br /&gt;
|-&lt;br /&gt;
| Confirmed || In Progress&lt;br /&gt;
|-&lt;br /&gt;
| In Progress || Completed&lt;br /&gt;
|-&lt;br /&gt;
| Completed || Closed&lt;br /&gt;
|-&lt;br /&gt;
| Rejected || Closed&lt;br /&gt;
|-&lt;br /&gt;
| Closed || No further transition&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Setting the same status again is permitted. Other status changes are rejected. Completed and Rejected Notifications can only be moved to Closed and cannot be reopened through the standard status logic.&lt;br /&gt;
&lt;br /&gt;
== Creating a Work Package from a Notification ==&lt;br /&gt;
&lt;br /&gt;
A Work Package can be created from a Notification either using a Maintenance Plan or through manual creation. In both cases, the created Work Package is linked to the originating Notification using LK_NOTIFICATION. This makes the origin of the Work Package traceable.&lt;br /&gt;
&lt;br /&gt;
=== Maintenance Plan-based Creation ===&lt;br /&gt;
&lt;br /&gt;
For Maintenance Plan-based creation, the Maintenance Plans assigned to the Notification's Asset are evaluated.&lt;br /&gt;
&lt;br /&gt;
* If multiple Maintenance Plans are available, one of them is selected for the creation.&lt;br /&gt;
* The Work Package is created based on the selected Maintenance Plan and its Work Package template.&lt;br /&gt;
* The created Work Package references the originating Notification through LK_NOTIFICATION.&lt;br /&gt;
&lt;br /&gt;
=== Manual Creation ===&lt;br /&gt;
&lt;br /&gt;
For manual creation, a new Work Package is created for the same Asset as the Notification.&lt;br /&gt;
&lt;br /&gt;
* The Work Package is linked to the Asset referenced by LK_ASSET.&lt;br /&gt;
* The Work Package references the originating Notification through LK_NOTIFICATION.&lt;br /&gt;
* Subordinate Work Packages and Tasks can be added to structure the required maintenance work.&lt;br /&gt;
&lt;br /&gt;
'''Relevant Work Package property'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| LK_NOTIFICATION || {{Guid}} || Link from the Work Package to the originating Notification&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Supporting File Documents ==&lt;br /&gt;
&lt;br /&gt;
The FileDocumentNotification class provides document attachments for Notifications. Each document is linked to its Notification using LK_NOTIFICATION.&lt;br /&gt;
&lt;br /&gt;
Runtime class: UBIK.MRO.FileDocumentNotification&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| LK_NOTIFICATION || {{Guid}} || Link to the associated Notification&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The MRO Notification implementation does not define additional restrictions for file types, file sizes, or the number of attached documents.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[MRO (Plugin)]]&lt;br /&gt;
* [[MRO (Plugin)#Work Package|Work Package]]&lt;br /&gt;
* [[MRO_Objects_(Client)]]&lt;br /&gt;
* [[MRO_Implemented_Objects]]&lt;br /&gt;
* [[MROMaintenancePlans]]&lt;br /&gt;
* [[MRO_Material_Management]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MROMaintenancePlans&amp;diff=30548</id>
		<title>MROMaintenancePlans</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MROMaintenancePlans&amp;diff=30548"/>
				<updated>2026-09-04T08:26:53Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: /* See also */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= MRO Maintenance Planning =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Summary:''' The Maintenance Planning feature in MRO is used to plan recurring maintenance work and automatically generate work packages from maintenance plans. The maintenance plan defines the rules. The generated work package is used by users to execute and complete the actual maintenance work.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
A maintenance plan defines the rules for creating work packages. These rules include:&lt;br /&gt;
&lt;br /&gt;
* when a work package should be created&lt;br /&gt;
* which asset the work package belongs to&lt;br /&gt;
* which template work package is used&lt;br /&gt;
* how the template work package is copied&lt;br /&gt;
* how many days before the planned execution date the work package may be generated&lt;br /&gt;
* how future planning dates are calculated&lt;br /&gt;
&lt;br /&gt;
The actual maintenance work is not executed by the maintenance plan itself. The maintenance plan creates work packages. These generated work packages are then used by users to execute and complete the maintenance work.&lt;br /&gt;
&lt;br /&gt;
In MRO, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaintenancePlan&amp;lt;/span&amp;gt; is the abstract base class for maintenance planning. It provides the common foundation for maintenance plans, but it is not intended to be used directly.&lt;br /&gt;
&lt;br /&gt;
The fully implemented maintenance plan types in standard MRO are:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CyclicMaintenancePlan&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RoundMaintenancePlan&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Custom maintenance plan types can be implemented by deriving from the abstract &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaintenancePlan&amp;lt;/span&amp;gt; base class. However, the standard MRO maintenance planning feature is based on cyclic maintenance plans and round maintenance plans.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Important:''' &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CyclicMaintenancePlan&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RoundMaintenancePlan&amp;lt;/span&amp;gt; support recurrence-based scheduling. This includes planned execution dates, automatic work package generation, calendar-based scheduling, completion-based scheduling, automatic recalculation of scheduling dates, and generation based on due dates.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RoundMaintenancePlan&amp;lt;/span&amp;gt; additionally supports maintenance rounds. A round maintenance plan creates one main work package for the round. It can also create additional work packages from child maintenance plans linked via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt;. These additional work packages are assigned to the main round work package.&lt;br /&gt;
&lt;br /&gt;
== Basic Concept ==&lt;br /&gt;
&lt;br /&gt;
The maintenance planning feature is built around four main parts:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Part&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaintenancePlan&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines the rules for creating generated work packages.&lt;br /&gt;
|-&lt;br /&gt;
| Template work package&lt;br /&gt;
| Defines what the generated work package should look like.&lt;br /&gt;
|-&lt;br /&gt;
| Replication configuration&lt;br /&gt;
| Defines how the template work package is copied.&lt;br /&gt;
|-&lt;br /&gt;
| Generated work package&lt;br /&gt;
| The actual work package created by the maintenance plan.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Maintenance Plan ===&lt;br /&gt;
&lt;br /&gt;
The maintenance plan defines the rules for creating work packages.&lt;br /&gt;
&lt;br /&gt;
This includes, for example:&lt;br /&gt;
&lt;br /&gt;
* when a work package should be created&lt;br /&gt;
* which asset the work package should belong to&lt;br /&gt;
* how many days before the planned execution date the work package may be created&lt;br /&gt;
* which template work package should be used&lt;br /&gt;
* which recurrence pattern should be used&lt;br /&gt;
* whether future dates are calculated calendar-based or completion-based&lt;br /&gt;
&lt;br /&gt;
=== Template Work Package ===&lt;br /&gt;
&lt;br /&gt;
The template work package defines what the generated work package should look like.&lt;br /&gt;
&lt;br /&gt;
It is the source work package that is copied when the maintenance plan creates a new work package.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Rule:''' Only work packages with &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ISTEMPLATE&amp;lt;/span&amp;gt; set can be used as template work packages.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Replication Configuration ===&lt;br /&gt;
&lt;br /&gt;
The replication configuration defines how the template work package is copied.&lt;br /&gt;
&lt;br /&gt;
This includes, for example:&lt;br /&gt;
&lt;br /&gt;
* which properties are copied&lt;br /&gt;
* how referenced objects are handled&lt;br /&gt;
* what the target meta class of the generated work package should be&lt;br /&gt;
&lt;br /&gt;
=== Generated Work Package ===&lt;br /&gt;
&lt;br /&gt;
The generated work package is the actual result created by the maintenance plan.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
# A pump has to be inspected every month.&lt;br /&gt;
# A cyclic maintenance plan is created for this pump.&lt;br /&gt;
# The plan is configured with a monthly recurrence, an assigned asset, a template work package, and a replication configuration.&lt;br /&gt;
# When the plan becomes due, the system uses a replication job to create a new work package from the configured template work package.&lt;br /&gt;
# The generated work package is linked back to the maintenance plan via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MAINTENANCE_PLAN&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
This link allows the maintenance plan to react when the generated work package is planned or completed.&lt;br /&gt;
&lt;br /&gt;
== MaintenancePlan Base Class ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaintenancePlan&amp;lt;/span&amp;gt; is the abstract base class for maintenance planning in MRO.&lt;br /&gt;
&lt;br /&gt;
It provides the common properties and logic required by maintenance plan implementations.&lt;br /&gt;
&lt;br /&gt;
Because &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaintenancePlan&amp;lt;/span&amp;gt; is abstract, users do not create or use this base class directly in the standard MRO feature. Instead, the concrete maintenance plan types are used:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CyclicMaintenancePlan&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RoundMaintenancePlan&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Developers can derive from the abstract base class if a project requires a custom maintenance plan type. In that case, the custom implementation must provide the missing plan-specific behavior.&lt;br /&gt;
&lt;br /&gt;
=== Base Class Properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Purpose&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt;&lt;br /&gt;
| Links the maintenance plan to the asset that requires maintenance.&lt;br /&gt;
| Required for a valid cyclic maintenance plan.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt;&lt;br /&gt;
| Links the maintenance plan to the template work package.&lt;br /&gt;
| The linked work package must have &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ISTEMPLATE&amp;lt;/span&amp;gt; set.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_REPLICATION_CONFIG&amp;lt;/span&amp;gt;&lt;br /&gt;
| Links the maintenance plan to the replication configuration.&lt;br /&gt;
| Required for work package generation.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines the planned execution date of the next maintenance activity.&lt;br /&gt;
| Used as &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt; on generated work packages.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines how many days before &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; the system may create the work package.&lt;br /&gt;
| Does not define the recurrence interval.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines the earliest date on which the maintenance plan may create a work package.&lt;br /&gt;
| Calculated by the system.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_STATUS&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines whether the maintenance plan is active or inactive.&lt;br /&gt;
| Only active plans are considered for automatic generation.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AUTO_CREATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines whether the system is allowed to automatically create work packages.&lt;br /&gt;
| If disabled, the plan does not automatically create work packages.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LAST_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stores the most recent completion date of a generated work package linked to the maintenance plan.&lt;br /&gt;
| Especially relevant for completion-based scheduling.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PRIORITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| Numeric value that can be used to sort maintenance plans.&lt;br /&gt;
| For round maintenance plans, see also &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_SELECTION_RULE&amp;lt;/span&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt; is the link to the asset that requires maintenance.&lt;br /&gt;
&lt;br /&gt;
This can be, for example:&lt;br /&gt;
&lt;br /&gt;
* equipment&lt;br /&gt;
* a functional location&lt;br /&gt;
* another customized maintainable object deriving from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Asset&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The generated work package is linked to the same asset.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #f0ad4e; background-color: #fff8e5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Requirement:''' A cyclic maintenance plan requires &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt; to be assigned in order to be valid.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt; is the link to the template work package.&lt;br /&gt;
&lt;br /&gt;
The template work package defines what the generated work package should look like.&lt;br /&gt;
&lt;br /&gt;
When the maintenance plan creates a work package, the system copies the work package referenced by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The linked work package must be a template work package. This means its &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ISTEMPLATE&amp;lt;/span&amp;gt; property must be set.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #f0ad4e; background-color: #fff8e5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Requirement:''' &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt; must be configured before the maintenance plan can create a work package.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_REPLICATION_CONFIG&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_REPLICATION_CONFIG&amp;lt;/span&amp;gt; is the link to the replication configuration.&lt;br /&gt;
&lt;br /&gt;
The replication configuration defines how the template work package is copied into a generated work package.&lt;br /&gt;
&lt;br /&gt;
It can define, for example:&lt;br /&gt;
&lt;br /&gt;
* which properties are copied&lt;br /&gt;
* how references are copied&lt;br /&gt;
* what the target meta class of the generated work package should be&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #f0ad4e; background-color: #fff8e5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Requirement:''' &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_REPLICATION_CONFIG&amp;lt;/span&amp;gt; must be configured before the maintenance plan can create a work package.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; defines the planned execution date of the next maintenance activity.&lt;br /&gt;
&lt;br /&gt;
It answers the question: '''When should the next maintenance work be performed?'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is not necessarily the date on which the work package is created.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 15 March&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt;&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 12 March&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In this example, the system may create the work package on 12 March, but the generated work package is planned for 15 March.&lt;br /&gt;
&lt;br /&gt;
When a work package is generated, the generated work package receives the maintenance plan’s &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; as its &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt; defines how many days before &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; the system may create the work package.&lt;br /&gt;
&lt;br /&gt;
This is used to create work packages before the actual planned execution date.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 15 March&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt;&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| Resulting &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 12 March&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Note:''' &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt; does not define the recurrence interval. It only defines how early the work package may be generated before the planned execution date.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt; is calculated by the system.&lt;br /&gt;
&lt;br /&gt;
It defines the earliest date on which the maintenance plan may create a work package.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EARLIEST_GENERATION_DATE = NEXT_DATE - LEAD_DAYS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 15 March&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt;&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 12 March&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The maintenance planning orchestrator searches for active plans where &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt; has been reached.&lt;br /&gt;
&lt;br /&gt;
A plan can be considered for automatic work package generation when:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EARLIEST_GENERATION_DATE &amp;lt;= current date&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt; has not yet been reached, no work package is created.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_STATUS&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_STATUS&amp;lt;/span&amp;gt; defines whether the maintenance plan is active or inactive.&lt;br /&gt;
&lt;br /&gt;
Only active plans are considered for automatic work package generation. Inactive plans are ignored by the maintenance planning process.&lt;br /&gt;
&lt;br /&gt;
Typical values are:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Inactive&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Active&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This allows users to temporarily disable a maintenance plan without deleting it.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AUTO_CREATE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AUTO_CREATE&amp;lt;/span&amp;gt; defines whether the system is allowed to automatically create work packages from the maintenance plan.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AUTO_CREATE&amp;lt;/span&amp;gt; is enabled, the maintenance planning orchestrator can create work packages once the plan is due.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AUTO_CREATE&amp;lt;/span&amp;gt; is disabled, the plan does not automatically create work packages.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LAST_DATE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LAST_DATE&amp;lt;/span&amp;gt; stores the date when the most recent generated work package linked to the maintenance plan was completed.&lt;br /&gt;
&lt;br /&gt;
This property is especially important for completion-based scheduling.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| Previous generated work package completed&lt;br /&gt;
| 20 March&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Completion-Based&lt;br /&gt;
|-&lt;br /&gt;
| Next date is calculated from&lt;br /&gt;
| 20 March&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The system updates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LAST_DATE&amp;lt;/span&amp;gt; when a generated work package is completed.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PRIORITY&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PRIORITY&amp;lt;/span&amp;gt; is a numeric value that can be used to sort maintenance plans.&lt;br /&gt;
&lt;br /&gt;
For round maintenance plans, there is also a property called &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_SELECTION_RULE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #f0ad4e; background-color: #fff8e5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Open point:''' The exact effect of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_SELECTION_RULE&amp;lt;/span&amp;gt; should only be documented after the implementation behavior has been verified.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Work Package Properties Used by Maintenance Planning ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Used on&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MAINTENANCE_PLAN&amp;lt;/span&amp;gt;&lt;br /&gt;
| Generated work package&lt;br /&gt;
| Links the generated work package back to the maintenance plan that triggered its creation.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt;&lt;br /&gt;
| Generated work package&lt;br /&gt;
| Stores the template work package that was used to create the generated work package.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt;&lt;br /&gt;
| Generated work package&lt;br /&gt;
| Stores the asset for which the work package was created.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt;&lt;br /&gt;
| Generated work package&lt;br /&gt;
| Stores the planned start date of the generated work package.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ORGA_STATUS&amp;lt;/span&amp;gt;&lt;br /&gt;
| Generated work package&lt;br /&gt;
| Used to determine whether a generated work package is finished.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;TASK_OWNER&amp;lt;/span&amp;gt;&lt;br /&gt;
| Additional round work package&lt;br /&gt;
| Assigns additional generated work packages to the main round work package.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ORDERID&amp;lt;/span&amp;gt;&lt;br /&gt;
| Additional round work package&lt;br /&gt;
| Can be copied from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt; to structure or order round work packages.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GROUPID&amp;lt;/span&amp;gt;&lt;br /&gt;
| Additional round work package&lt;br /&gt;
| Can be copied from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt; to group round work packages.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MAINTENANCE_PLAN&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MAINTENANCE_PLAN&amp;lt;/span&amp;gt; is set on generated work packages.&lt;br /&gt;
&lt;br /&gt;
It stores the maintenance plan that triggered the creation of the work package.&lt;br /&gt;
&lt;br /&gt;
This is important because the maintenance plan itself does not directly store a list of generated work packages. Instead, generated work packages reference their source maintenance plan via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MAINTENANCE_PLAN&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
This link allows the system to find work packages created from a maintenance plan and to update the maintenance plan when a generated work package is planned or completed.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
On a generated work package, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt; stores the template work package that was used to create the generated work package.&lt;br /&gt;
&lt;br /&gt;
This allows users and the system to see which template was used as the source.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
On a generated work package, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt; stores the asset for which the work package was created.&lt;br /&gt;
&lt;br /&gt;
This is usually copied or assigned based on the maintenance plan’s &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt; stores the planned start date of the generated work package.&lt;br /&gt;
&lt;br /&gt;
When a maintenance plan generates a work package, the system sets:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
generated WorkPackage.PLANNED_START = MaintenancePlan.NEXT_DATE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ORGA_STATUS&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ORGA_STATUS&amp;lt;/span&amp;gt; is used to determine whether a generated work package is finished.&lt;br /&gt;
&lt;br /&gt;
A work package is considered finished when:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ORGA_STATUS == 100&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open work packages are generated work packages linked to the maintenance plan where:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ORGA_STATUS != 100&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #f0ad4e; background-color: #fff8e5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Generation rule:''' A maintenance plan does not create another work package while it still has an open generated work package.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;TASK_OWNER&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;TASK_OWNER&amp;lt;/span&amp;gt; is used in round maintenance scenarios.&lt;br /&gt;
&lt;br /&gt;
When a round maintenance plan creates a main work package and additional work packages from linked child plans, the additional work packages are assigned to the main round work package via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;TASK_OWNER&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ORDERID&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GROUPID&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ORDERID&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GROUPID&amp;lt;/span&amp;gt; can be copied from the &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt; relation to generated work packages in a round maintenance scenario.&lt;br /&gt;
&lt;br /&gt;
They can be used to order or group the additional work packages that belong to the generated round work package.&lt;br /&gt;
&lt;br /&gt;
== CyclicMaintenancePlan ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CyclicMaintenancePlan&amp;lt;/span&amp;gt; is used for recurring maintenance work on an asset.&lt;br /&gt;
&lt;br /&gt;
It is the standard maintenance plan type for maintenance activities that repeat according to a defined recurrence pattern.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
* inspect a pump every month&lt;br /&gt;
* service a machine every 6 months&lt;br /&gt;
* check safety equipment every Monday&lt;br /&gt;
* replace a filter every 30 days&lt;br /&gt;
* perform annual maintenance on a functional location&lt;br /&gt;
&lt;br /&gt;
A cyclic maintenance plan uses &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; to define the recurrence. It also uses &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt; to define how future dates are calculated.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Key concept:''' &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt; defines whether the plan follows fixed calendar dates or whether the next date depends on the actual completion date of the previous generated work package.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The supported scheduling modes are:&lt;br /&gt;
&lt;br /&gt;
* Calendar-Based&lt;br /&gt;
* Completion-Based&lt;br /&gt;
&lt;br /&gt;
== CyclicMaintenancePlan Properties ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Purpose&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines the recurrence pattern.&lt;br /&gt;
| Must be valid and parseable.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_START_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines when the recurrence pattern starts.&lt;br /&gt;
| Used as the start point for recurrence calculation.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_UNTIL_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Optional end date for the recurrence.&lt;br /&gt;
| No further occurrences are generated after this date.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_COUNT&amp;lt;/span&amp;gt;&lt;br /&gt;
| Limits how many work packages can be created from the plan.&lt;br /&gt;
| Further occurrences stop once the count is reached.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines how &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is calculated.&lt;br /&gt;
| Supports Calendar-Based and Completion-Based scheduling.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; defines the recurrence pattern of a cyclic maintenance plan.&lt;br /&gt;
&lt;br /&gt;
It describes how often the maintenance should occur.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FREQ=DAILY&lt;br /&gt;
FREQ=WEEKLY;BYDAY=MO,WE,FR&lt;br /&gt;
FREQ=MONTHLY;BYMONTHDAY=15&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The system uses &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; to calculate future planned execution dates.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #d33; background-color: #fff5f5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Problem:''' If &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; is invalid and cannot be parsed, the cyclic maintenance plan is not valid and cannot create work packages.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_START_DATE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_START_DATE&amp;lt;/span&amp;gt; defines when the recurrence pattern starts.&lt;br /&gt;
&lt;br /&gt;
The recurrence rule is calculated from this date forward.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_START_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 01 January&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Monthly on the 15th&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The system uses these values to determine valid planned execution dates.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_UNTIL_DATE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_UNTIL_DATE&amp;lt;/span&amp;gt; is an optional end date for the recurrence.&lt;br /&gt;
&lt;br /&gt;
If this date is configured, no further occurrences are generated after this date.&lt;br /&gt;
&lt;br /&gt;
This can be used for maintenance plans that should only run until a certain date.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_COUNT&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_COUNT&amp;lt;/span&amp;gt; limits how many work packages can be created from the plan.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_COUNT&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When the number of related generated work packages reaches &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_COUNT&amp;lt;/span&amp;gt;, the system no longer calculates new occurrences for the plan.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt; defines how &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is calculated for a cyclic maintenance plan.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt; is only relevant for concrete maintenance plan types that use recurrence logic, such as &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CyclicMaintenancePlan&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RoundMaintenancePlan&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The supported scheduling modes are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Scheduling mode&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Calendar-Based&lt;br /&gt;
| Future dates follow the recurrence pattern defined by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Completion-Based&lt;br /&gt;
| Future dates are calculated from the actual completion date of the previous generated work package.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This property is one of the most important settings because it defines whether future dates follow the calendar or depend on the actual completion of the previous generated work package.&lt;br /&gt;
&lt;br /&gt;
== Calendar-Based Scheduling ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
Calendar-based scheduling is used when maintenance should follow fixed calendar occurrences.&lt;br /&gt;
&lt;br /&gt;
The next planned execution date is calculated according to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; and the calendar recurrence.&lt;br /&gt;
&lt;br /&gt;
This means that delays in completing a work package do not automatically shift the whole future schedule.&lt;br /&gt;
&lt;br /&gt;
Use calendar-based scheduling when the maintenance should happen on fixed dates or fixed calendar intervals.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
* inspection every 15th day of the month&lt;br /&gt;
* safety check every Monday&lt;br /&gt;
* yearly inspection every January&lt;br /&gt;
* quarterly maintenance in fixed maintenance windows&lt;br /&gt;
&lt;br /&gt;
=== How Calendar-Based Scheduling Works ===&lt;br /&gt;
&lt;br /&gt;
In calendar-based scheduling, the system calculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; based on the recurrence rule and the relevant dates of existing generated work packages.&lt;br /&gt;
&lt;br /&gt;
The system determines the highest relevant planned or finished date of generated work packages linked to the maintenance plan. Then it uses the recurrence rule to calculate the next valid occurrence after that date.&lt;br /&gt;
&lt;br /&gt;
This means the schedule continues according to the recurrence pattern.&lt;br /&gt;
&lt;br /&gt;
If a work package is completed later than planned, the future schedule does not necessarily move with that completion date.&lt;br /&gt;
&lt;br /&gt;
=== Example: Calendar-Based Scheduling ===&lt;br /&gt;
&lt;br /&gt;
A pump must be inspected on the 15th of every month.&lt;br /&gt;
&lt;br /&gt;
==== Configuration ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| Plan type&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CyclicMaintenancePlan&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt;&lt;br /&gt;
| Pump 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt;&lt;br /&gt;
| Pump Inspection Template&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_REPLICATION_CONFIG&amp;lt;/span&amp;gt;&lt;br /&gt;
| Pump Inspection Replication&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Calendar-Based&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Monthly on the 15th&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_START_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 01 January&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 15 March&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt;&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_STATUS&amp;lt;/span&amp;gt;&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AUTO_CREATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Enabled&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Result ====&lt;br /&gt;
&lt;br /&gt;
The system calculates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EARLIEST_GENERATION_DATE = 12 March&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On or after 12 March, the system can create the work package.&lt;br /&gt;
&lt;br /&gt;
Generated work package:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt;&lt;br /&gt;
| 15 March&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
After the work package is planned, the system can calculate the next occurrence:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NEXT_DATE = 15 April&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the March work package is completed on 20 March, the next date still follows the monthly recurrence. The next planned execution date remains 15 April.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Result:''' The late completion does not shift the future schedule to 20 April.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Completion-Based Scheduling ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
Completion-based scheduling is used when the next maintenance date should depend on the actual completion date of the previous generated work package.&lt;br /&gt;
&lt;br /&gt;
This means that the interval starts after the work has actually been completed.&lt;br /&gt;
&lt;br /&gt;
Use completion-based scheduling when the maintenance should repeat based on the time since the last completed maintenance activity.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
* service every 30 days after the last service&lt;br /&gt;
* inspection 6 months after the previous inspection was completed&lt;br /&gt;
* replacement 90 days after the previous replacement&lt;br /&gt;
* maintenance where a delay should also delay the next cycle&lt;br /&gt;
&lt;br /&gt;
=== How Completion-Based Scheduling Works ===&lt;br /&gt;
&lt;br /&gt;
In completion-based scheduling, the system recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; after a generated work package is completed.&lt;br /&gt;
&lt;br /&gt;
The completion date becomes the basis for the next occurrence.&lt;br /&gt;
&lt;br /&gt;
Planning changes alone do not define the next recurrence in the same way as calendar-based scheduling.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Important:''' The plan waits for the generated work package to be completed. Then the system calculates the next date from the completion date.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example: Completion-Based Scheduling ===&lt;br /&gt;
&lt;br /&gt;
A machine must be serviced every 30 days after the previous service was completed.&lt;br /&gt;
&lt;br /&gt;
==== Configuration ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| Plan type&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CyclicMaintenancePlan&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt;&lt;br /&gt;
| Machine 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt;&lt;br /&gt;
| Machine Service Template&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_REPLICATION_CONFIG&amp;lt;/span&amp;gt;&lt;br /&gt;
| Machine Service Replication&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Completion-Based&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Every 30 days&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_START_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 01 March&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 15 March&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt;&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_STATUS&amp;lt;/span&amp;gt;&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AUTO_CREATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Enabled&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Result ====&lt;br /&gt;
&lt;br /&gt;
The system calculates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EARLIEST_GENERATION_DATE = 12 March&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On or after 12 March, the system can create the work package.&lt;br /&gt;
&lt;br /&gt;
Generated work package:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt;&lt;br /&gt;
| 15 March&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The work package is completed on 20 March.&lt;br /&gt;
&lt;br /&gt;
Because the plan is completion-based, the system calculates the next date from 20 March.&lt;br /&gt;
&lt;br /&gt;
If the recurrence is every 30 days:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| around 19 April&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt;&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| around 16 April&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Result:''' In this mode, the delay from 15 March to 20 March shifts the future schedule.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calendar-Based vs Completion-Based Scheduling ==&lt;br /&gt;
&lt;br /&gt;
The difference is the date that is used as the basis for calculating &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Aspect&lt;br /&gt;
! Calendar-Based&lt;br /&gt;
! Completion-Based&lt;br /&gt;
|-&lt;br /&gt;
| Basis for &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Recurrence defined by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Actual completion date of the previous generated work package&lt;br /&gt;
|-&lt;br /&gt;
| Effect of late completion&lt;br /&gt;
| Future dates are not automatically shifted&lt;br /&gt;
| Future dates move with the completion date&lt;br /&gt;
|-&lt;br /&gt;
| Typical use case&lt;br /&gt;
| Fixed maintenance windows, fixed calendar intervals, legal or organizational inspection dates&lt;br /&gt;
| Service intervals that depend on the actual last maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Example&lt;br /&gt;
| Planned: 15 March&amp;lt;br /&amp;gt;Completed: 20 March&amp;lt;br /&amp;gt;Next date: 15 April&lt;br /&gt;
| Planned: 15 March&amp;lt;br /&amp;gt;Completed: 20 March&amp;lt;br /&amp;gt;Interval: 30 days&amp;lt;br /&amp;gt;Next date: around 19 April&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Calendar-Based ===&lt;br /&gt;
&lt;br /&gt;
Calendar-based scheduling should be used when the maintenance must follow fixed planned dates.&lt;br /&gt;
&lt;br /&gt;
Characteristics:&lt;br /&gt;
&lt;br /&gt;
* The plan follows the &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; calendar pattern.&lt;br /&gt;
* Future dates are not automatically shifted just because a work package was completed late.&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; can be recalculated after planning updates.&lt;br /&gt;
* It is useful for fixed maintenance windows and legally or organizationally fixed inspection dates.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Event&lt;br /&gt;
! Date&lt;br /&gt;
|-&lt;br /&gt;
| Planned inspection&lt;br /&gt;
| 15 March&lt;br /&gt;
|-&lt;br /&gt;
| Completed&lt;br /&gt;
| 20 March&lt;br /&gt;
|-&lt;br /&gt;
| Next date&lt;br /&gt;
| 15 April&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The future date stays aligned with the calendar recurrence.&lt;br /&gt;
&lt;br /&gt;
=== Completion-Based ===&lt;br /&gt;
&lt;br /&gt;
Completion-based scheduling should be used when the next maintenance interval starts after the previous work was completed.&lt;br /&gt;
&lt;br /&gt;
Characteristics:&lt;br /&gt;
&lt;br /&gt;
* The plan waits for completion.&lt;br /&gt;
* The completion date is used as the basis for &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
* If the work is completed late, the future schedule moves.&lt;br /&gt;
* It is useful for service intervals that depend on the actual last maintenance.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Event&lt;br /&gt;
! Date&lt;br /&gt;
|-&lt;br /&gt;
| Planned service&lt;br /&gt;
| 15 March&lt;br /&gt;
|-&lt;br /&gt;
| Completed&lt;br /&gt;
| 20 March&lt;br /&gt;
|-&lt;br /&gt;
| Interval&lt;br /&gt;
| 30 days&lt;br /&gt;
|-&lt;br /&gt;
| Next date&lt;br /&gt;
| around 19 April&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The future date shifts because the work was completed later.&lt;br /&gt;
&lt;br /&gt;
== RoundMaintenancePlan ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RoundMaintenancePlan&amp;lt;/span&amp;gt; is used for recurring maintenance rounds.&lt;br /&gt;
&lt;br /&gt;
It is a specialized type of cyclic maintenance plan. This means that it also uses &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In addition to the cyclic scheduling logic, a round maintenance plan includes child maintenance plans linked via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
When the round maintenance plan is due, the system creates the main work package for the round. Then it creates additional work packages from the child maintenance plans linked via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #f0ad4e; background-color: #fff8e5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Important for child plans:''' For the child plans, the system does not care whether they are due, active, auto-created, or whether they have a valid &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt;. The round maintenance plan uses the child plans as configuration for the additional work packages that should be created as part of the round.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The important configuration on the child plans is their work package generation setup, especially the configured template work package and replication setup.&lt;br /&gt;
&lt;br /&gt;
=== Generated Result ===&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Element&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| Round maintenance plan&lt;br /&gt;
| Machine Room Round&lt;br /&gt;
|-&lt;br /&gt;
| Linked child plan 1&lt;br /&gt;
| Pump 1 Inspection&lt;br /&gt;
|-&lt;br /&gt;
| Linked child plan 2&lt;br /&gt;
| Pump 2 Inspection&lt;br /&gt;
|-&lt;br /&gt;
| Linked child plan 3&lt;br /&gt;
| Pump 3 Inspection&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Generated main work package:&lt;br /&gt;
&lt;br /&gt;
* Machine Room Round&lt;br /&gt;
&lt;br /&gt;
Additional generated work packages inside the main round work package:&lt;br /&gt;
&lt;br /&gt;
* Pump 1 Inspection&lt;br /&gt;
* Pump 2 Inspection&lt;br /&gt;
* Pump 3 Inspection&lt;br /&gt;
&lt;br /&gt;
The additional work packages are assigned to the main round work package. This allows the result of the round maintenance plan to be structured as one complete maintenance round.&lt;br /&gt;
&lt;br /&gt;
== RoundMaintenancePlan Properties and Relations ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Property / relation&lt;br /&gt;
! Purpose&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt;&lt;br /&gt;
| Links the round maintenance plan to its child maintenance plans.&lt;br /&gt;
| Child plans define additional work packages created as part of the round.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_SELECTION_RULE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Exists on &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RoundMaintenancePlan&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Runtime behavior must be verified before documenting further effects.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ORDERID&amp;lt;/span&amp;gt;&lt;br /&gt;
| Can exist on the relation between the round plan and a child plan.&lt;br /&gt;
| Can be copied to generated work packages.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GROUPID&amp;lt;/span&amp;gt;&lt;br /&gt;
| Can exist on the relation between the round plan and a child plan.&lt;br /&gt;
| Can be copied to generated work packages.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt; links the round maintenance plan to its child maintenance plans.&lt;br /&gt;
&lt;br /&gt;
The linked child plans define which additional work packages should be generated when the round maintenance plan is due.&lt;br /&gt;
&lt;br /&gt;
When the round plan generates work packages, the system creates:&lt;br /&gt;
&lt;br /&gt;
* one main work package from the round plan’s own &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt;&lt;br /&gt;
* one additional work package for each child maintenance plan linked via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The child maintenance plans do not need to be due themselves for the round maintenance plan to use them during round generation.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_SELECTION_RULE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_SELECTION_RULE&amp;lt;/span&amp;gt; exists on &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RoundMaintenancePlan&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #f0ad4e; background-color: #fff8e5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Open point:''' The exact runtime effect of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_SELECTION_RULE&amp;lt;/span&amp;gt; should be documented after the implementation behavior has been verified. Until that behavior is confirmed, the wiki should not claim that &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_SELECTION_RULE&amp;lt;/span&amp;gt; filters child plans by due date, asset, or priority.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ORDERID&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GROUPID&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
The relation between the round maintenance plan and a linked child maintenance plan can contain &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ORDERID&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GROUPID&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
When the system creates an additional work package from a linked child maintenance plan, these values can be copied to the generated work package.&lt;br /&gt;
&lt;br /&gt;
This can be used to structure, order, or group the additional work packages in the generated round.&lt;br /&gt;
&lt;br /&gt;
== Properties Calculated or Updated by the System ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Property / link&lt;br /&gt;
! System behavior&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Calculated from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Calculated or recalculated for &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CyclicMaintenancePlan&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RoundMaintenancePlan&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LAST_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Updated when a generated work package is completed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt;&lt;br /&gt;
| Set on generated work packages from the maintenance plan’s &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Links on generated work packages&lt;br /&gt;
| Required links are set automatically during generation.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt; is calculated by the system from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EARLIEST_GENERATION_DATE = NEXT_DATE - LEAD_DAYS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This value is recalculated when:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; changes&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt; changes&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is recalculated after planning or completion&lt;br /&gt;
* recurrence settings cause a new &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; to be calculated&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
For &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CyclicMaintenancePlan&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RoundMaintenancePlan&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; can be calculated or recalculated by the system.&lt;br /&gt;
&lt;br /&gt;
The calculation depends on:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_START_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_UNTIL_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_COUNT&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;&lt;br /&gt;
* related generated work packages&lt;br /&gt;
* planning events&lt;br /&gt;
* completion events&lt;br /&gt;
&lt;br /&gt;
For calendar-based scheduling, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is calculated from the recurrence pattern and the highest relevant planned or finished date of related generated work packages.&lt;br /&gt;
&lt;br /&gt;
For completion-based scheduling, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is calculated from the completion date of the previous generated work package.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LAST_DATE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LAST_DATE&amp;lt;/span&amp;gt; is updated by the system when a generated work package is completed.&lt;br /&gt;
&lt;br /&gt;
It stores the latest completion date of a generated work package related to the maintenance plan.&lt;br /&gt;
&lt;br /&gt;
This value is especially relevant for completion-based scheduling.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt; on Generated Work Packages ===&lt;br /&gt;
&lt;br /&gt;
When the system generates a work package from a maintenance plan, it sets the generated work package’s &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt; to the maintenance plan’s &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MaintenancePlan.NEXT_DATE: 15 March&lt;br /&gt;
Generated WorkPackage.PLANNED_START: 15 March&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Links on Generated Work Packages ===&lt;br /&gt;
&lt;br /&gt;
When the system generates a work package, it automatically sets the required links on the generated work package.&lt;br /&gt;
&lt;br /&gt;
The generated work package is linked to:&lt;br /&gt;
&lt;br /&gt;
* the source maintenance plan via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MAINTENANCE_PLAN&amp;lt;/span&amp;gt;&lt;br /&gt;
* the template work package via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt;&lt;br /&gt;
* the assigned asset via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For round maintenance plans, additional generated work packages from linked child maintenance plans are assigned to the main round work package via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;TASK_OWNER&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Properties and Events That Trigger Recalculation ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Trigger&lt;br /&gt;
! Recalculation behavior&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; changed&lt;br /&gt;
| Recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt; changed&lt;br /&gt;
| Recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; changed&lt;br /&gt;
| Recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; based on the new recurrence rule and selected &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_START_DATE&amp;lt;/span&amp;gt; changed&lt;br /&gt;
| Recalculates the schedule and may change &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_UNTIL_DATE&amp;lt;/span&amp;gt; changed&lt;br /&gt;
| Checks whether future occurrences are still available.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_COUNT&amp;lt;/span&amp;gt; changed&lt;br /&gt;
| Checks whether the maximum number of generated work packages has already been reached.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt; changed&lt;br /&gt;
| Recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; according to the selected scheduling mode.&lt;br /&gt;
|-&lt;br /&gt;
| Generated work package &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt; changed&lt;br /&gt;
| Notifies the linked maintenance plan and may trigger date recalculation.&lt;br /&gt;
|-&lt;br /&gt;
| Generated work package completed&lt;br /&gt;
| Updates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LAST_DATE&amp;lt;/span&amp;gt; and recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; according to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; Changed ===&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; changes, the system recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EARLIEST_GENERATION_DATE = NEXT_DATE - LEAD_DAYS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt; Changed ===&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt; changes, the system recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EARLIEST_GENERATION_DATE = NEXT_DATE - LEAD_DAYS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; Changed ===&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; changes, the recurrence pattern changes.&lt;br /&gt;
&lt;br /&gt;
The system recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; based on the new recurrence rule and the selected &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
After &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is recalculated, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt; is recalculated as well.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_START_DATE&amp;lt;/span&amp;gt; Changed ===&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_START_DATE&amp;lt;/span&amp;gt; changes, the start point of the recurrence changes.&lt;br /&gt;
&lt;br /&gt;
The system recalculates the schedule. This can change &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; changes, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt; is recalculated as well.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_UNTIL_DATE&amp;lt;/span&amp;gt; Changed ===&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_UNTIL_DATE&amp;lt;/span&amp;gt; changes, the end boundary of the recurrence changes.&lt;br /&gt;
&lt;br /&gt;
The system checks whether future occurrences are still available.&lt;br /&gt;
&lt;br /&gt;
If no further occurrence is possible because of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_UNTIL_DATE&amp;lt;/span&amp;gt;, the system cannot calculate a new &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_COUNT&amp;lt;/span&amp;gt; Changed ===&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_COUNT&amp;lt;/span&amp;gt; changes, the system checks whether the maximum number of generated work packages has already been reached.&lt;br /&gt;
&lt;br /&gt;
If the number of related generated work packages is greater than or equal to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_COUNT&amp;lt;/span&amp;gt;, the system does not calculate further occurrences.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt; Changed ===&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt; changes, the logic for calculating future dates changes.&lt;br /&gt;
&lt;br /&gt;
Changing to Calendar-Based means that the plan follows the calendar recurrence.&lt;br /&gt;
&lt;br /&gt;
Changing to Completion-Based means that the plan calculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; from the completion of the previous generated work package.&lt;br /&gt;
&lt;br /&gt;
Because this changes the calculation logic, the system recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; according to the selected &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; changes, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt; is recalculated as well.&lt;br /&gt;
&lt;br /&gt;
=== Generated Work Package &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt; Changed ===&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt; of a generated work package is set or changed, the work package notifies the linked maintenance plan.&lt;br /&gt;
&lt;br /&gt;
For calendar-based cyclic maintenance plans, this can trigger recalculation of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;. The system uses the planning information to continue the calendar-based recurrence.&lt;br /&gt;
&lt;br /&gt;
For completion-based cyclic maintenance plans, a &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt; change does not drive the recurrence in the same way. &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is mainly calculated after the work package is completed.&lt;br /&gt;
&lt;br /&gt;
=== Generated Work Package Completed ===&lt;br /&gt;
&lt;br /&gt;
When a generated work package is completed, the work package notifies the linked maintenance plan.&lt;br /&gt;
&lt;br /&gt;
A work package is considered completed when:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ORGA_STATUS == 100&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The system updates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LAST_DATE&amp;lt;/span&amp;gt;. Then the system recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; according to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For calendar-based scheduling:&lt;br /&gt;
&lt;br /&gt;
* the system continues according to the calendar recurrence&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is calculated from the recurrence pattern and relevant planned or finished dates&lt;br /&gt;
&lt;br /&gt;
For completion-based scheduling:&lt;br /&gt;
&lt;br /&gt;
* the completion date becomes the basis for the next occurrence&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is calculated from the completion date&lt;br /&gt;
&lt;br /&gt;
After &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is updated, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt; is recalculated.&lt;br /&gt;
&lt;br /&gt;
== Work Package Generation Logic ==&lt;br /&gt;
&lt;br /&gt;
=== When Is a Plan Ready to Create a Work Package? ===&lt;br /&gt;
&lt;br /&gt;
A cyclic or round maintenance plan can create a work package only if all required conditions are fulfilled.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Requirement&lt;br /&gt;
! Condition&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| Plan validity&lt;br /&gt;
| The plan must be valid.&lt;br /&gt;
| For cyclic maintenance plans, this requires a valid &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt;, assigned &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt;, and available &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Plan status&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_STATUS == Active&amp;lt;/span&amp;gt;&lt;br /&gt;
| Inactive plans are ignored.&lt;br /&gt;
|-&lt;br /&gt;
| Automatic generation&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AUTO_CREATE&amp;lt;/span&amp;gt; must be enabled.&lt;br /&gt;
| If disabled, the plan does not automatically create work packages.&lt;br /&gt;
|-&lt;br /&gt;
| Template work package&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt; must be set.&lt;br /&gt;
| The linked work package must be a template work package.&lt;br /&gt;
|-&lt;br /&gt;
| Replication configuration&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_REPLICATION_CONFIG&amp;lt;/span&amp;gt; must be set.&lt;br /&gt;
| Required to copy the template work package.&lt;br /&gt;
|-&lt;br /&gt;
| Earliest generation date&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE &amp;lt;= current date&amp;lt;/span&amp;gt;&lt;br /&gt;
| The plan may only generate once the earliest generation date has been reached.&lt;br /&gt;
|-&lt;br /&gt;
| Open work packages&lt;br /&gt;
| No open generated work package may exist for the plan.&lt;br /&gt;
| There must be no generated work package linked via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MAINTENANCE_PLAN&amp;lt;/span&amp;gt; where &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ORGA_STATUS != 100&amp;lt;/span&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #f0ad4e; background-color: #fff8e5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Generation rule:''' The open work package check prevents the system from creating multiple open work packages for the same maintenance plan.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Round Work Package Generation ==&lt;br /&gt;
&lt;br /&gt;
A round maintenance plan creates a main work package for the round.&lt;br /&gt;
&lt;br /&gt;
After the main work package has been created, the system processes the maintenance plans linked via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For each linked child maintenance plan, the system creates an additional work package.&lt;br /&gt;
&lt;br /&gt;
These additional generated work packages are assigned to the main round work package via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;TASK_OWNER&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For child plans used in a round, the system does not care whether the child plan:&lt;br /&gt;
&lt;br /&gt;
* has &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_STATUS == Active&amp;lt;/span&amp;gt;&lt;br /&gt;
* has &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AUTO_CREATE == true&amp;lt;/span&amp;gt;&lt;br /&gt;
* has a valid &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt;&lt;br /&gt;
* has a valid &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
* is due based on its own &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Rule:''' The round plan controls the timing. The child plans define what additional work packages should be created as part of the round.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[MRO (Plugin)]]&lt;br /&gt;
* [[MRO_Objects_(Client)]]&lt;br /&gt;
* [[MRO_Implemented_Objects]]&lt;br /&gt;
* [[MRO_Material_Management]]&lt;br /&gt;
* [[MRO_Notification]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MROCLS_INTEGER_TASK&amp;diff=30478</id>
		<title>MROCLS INTEGER TASK</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MROCLS_INTEGER_TASK&amp;diff=30478"/>
				<updated>2026-08-24T11:29:05Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: Created page with &amp;quot;{{ClassificationInfoBox  | title = Integer Task classification  | name = {{PAGENAMEE}}  | inheritance = MROCLS_MRO_TASK#Task  | namespace = UBIK.MRO.Classification  | purp...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ClassificationInfoBox &lt;br /&gt;
| title = Integer Task classification &lt;br /&gt;
| name = {{PAGENAMEE}} &lt;br /&gt;
| inheritance = [[MROCLS_MRO_TASK#Task]] &lt;br /&gt;
| namespace = UBIK.MRO.Classification &lt;br /&gt;
| purpose = Classify objects as Integer Tasks &lt;br /&gt;
| version = 5.2.0+ &lt;br /&gt;
| id = {2CE8E155-3E52-4C88-BE21-36F0C44484D2} &lt;br /&gt;
}} &lt;br /&gt;
&lt;br /&gt;
An [[MRO_(Plugin)#Integer_Task|Integer Task]] object is an {{UBIK}} content object which is used to document work by entering an integer value.&lt;br /&gt;
&lt;br /&gt;
== MetaProperties == &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=50% &lt;br /&gt;
|- &lt;br /&gt;
! width=30% | Name !! width=30% | Data type !! Comment &lt;br /&gt;
|- &lt;br /&gt;
| ''VALUE'' || {{Integer}} || The integer value entered for the task &lt;br /&gt;
|- &lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
== See also == &lt;br /&gt;
* [[MROCLS_MRO_TASK#Task]] (Classification) &lt;br /&gt;
* [[MROCLS_MRO_MEASUREMENT_TASK#Measurement Task]] (Classification) &lt;br /&gt;
* [[MROCLS_MRO_CHECK_TASK#Check Task]] (Classification) &lt;br /&gt;
* [[MROCLS_MRO_INSPECTION_TASK#Inspection Task]] (Classification) &lt;br /&gt;
* [[MRO_Objects_(Client)#Integer_Task]] &lt;br /&gt;
* [[MRO_(Plugin)#Integer_Task]] &lt;br /&gt;
* [[MROCLS_PROCEDURE#Procedure Workpackage]] (Classification) &lt;br /&gt;
* [[MROCLS_CALCULATION_TASK#Calculation Task]] (Classification)&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_(Plugin)&amp;diff=30477</id>
		<title>MRO (Plugin)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_(Plugin)&amp;diff=30477"/>
				<updated>2026-08-24T11:28:10Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The MRO plugin provides a set of {{UBIK}} objects for representing and documenting maintenance, repair and operations work. The MRO features are available in the supported Mobile and {{UBIK WinX}} clients.&lt;br /&gt;
&lt;br /&gt;
This page is the main documentation for the MRO object model and its task types. Common client behaviour, such as status indicators, locking, and the general evaluation of sequential and grouped tasks, is documented in [[MRO Objects (Client)]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Page !! Scope&lt;br /&gt;
|-&lt;br /&gt;
| '''MRO (Plugin)''' || MRO concepts, task types, task-specific behaviour, and relevant technical properties&lt;br /&gt;
|-&lt;br /&gt;
| [[MRO Objects (Client)]] || Common client presentation, status indicators, locking, and behaviour shared by multiple MRO objects&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Basic Features ==&lt;br /&gt;
&lt;br /&gt;
Objects classified as MRO objects generally provide a technical and organisational status as well as an overall work progress based on their underlying data branch.&lt;br /&gt;
&lt;br /&gt;
=== Technical Status ===&lt;br /&gt;
&lt;br /&gt;
For detailed information, see [[MRO Objects (Client)#Technical Status|Technical Status]].&lt;br /&gt;
&lt;br /&gt;
=== Organisational Status ===&lt;br /&gt;
&lt;br /&gt;
For detailed information, see [[MRO Objects (Client)#Organisational Status|Organisational Status]].&lt;br /&gt;
&lt;br /&gt;
=== Work Progress ===&lt;br /&gt;
&lt;br /&gt;
For detailed information, see [[MRO Objects (Client)#Work Progress|Work Progress]].&lt;br /&gt;
&lt;br /&gt;
== MRO Objects ==&lt;br /&gt;
&lt;br /&gt;
MRO uses Task Owners, Work Packages, Tasks, and Procedure Workpackages to represent maintenance workflows.&lt;br /&gt;
&lt;br /&gt;
=== Task Owner ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_TASKOWNER|Task Owner]] is an object with an underlying structure of work to be performed. It can contain other Task Owners or Work Packages. Their technical status, organisational status, and work progress are accumulated and reported to the Task Owner.&lt;br /&gt;
&lt;br /&gt;
=== Work Package ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_WORKPACKAGE|Work Package]] collects and summarizes other Work Packages or Tasks. A Work Package can be confirmed when all associated Tasks have reached the required progress and all subordinate Work Packages have been confirmed.&lt;br /&gt;
&lt;br /&gt;
For Work Package presentation and confirmation in the clients, see [[MRO Objects (Client)#Work Package|Work Package]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Task ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_TASK|Task]] reports work progress to its owning Work Package. The available task types provide different input, validation, or automatic workflow behaviour.&lt;br /&gt;
&lt;br /&gt;
MRO task values must be validated for work progress to be calculated. A MetaAttribute providing a validation timestamp must therefore be attached to the relevant MetaProperty.&lt;br /&gt;
&lt;br /&gt;
{{Attention|A task value property has to use [[Attributes]] so that its value can be validated. Otherwise, work progress cannot be calculated.}}&lt;br /&gt;
&lt;br /&gt;
All user-editable MRO task types can be set to ''Not Applicable''. In the clients, a completed user-editable task can be reset by selecting ''Not Applicable'' twice. General client behaviour is documented in [[MRO Objects (Client)#Task|Task]].&lt;br /&gt;
&lt;br /&gt;
=== Procedure Workpackage ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PROCEDURE_WORKPACKAGE'''&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_PROCEDURE|Procedure Workpackage]] is a specialized Work Package for structured workflows. Its structure is defined in JSON using a workflow editor and can contain Tasks as well as subordinate Procedure Workpackages. Depending on its state, the corresponding objects are created or updated.&lt;br /&gt;
&lt;br /&gt;
Procedure Workpackages can use [[MRO Objects (Client)#Sequential Task|sequential execution]], [[MRO Objects (Client)#Grouped Task|grouped Tasks]], [[#Switch Start Task|branching]], [[#Calculation Task|calculations]], and references to linked data. Their workflows support online and offline use. Steps that require data exchange wait until connectivity is available.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| PROCEDURE_STATUS || {{Integer}} || Current state: Draft = 10, ReadyToUse = 20, Published = 30, Open = 40, Executing = 50, Completed = 60, Approved = 70, Rejected = 80&lt;br /&gt;
|-&lt;br /&gt;
| JSON || {{String}} || JSON representation of the Procedure Workpackage&lt;br /&gt;
|-&lt;br /&gt;
| ISTEMPLATE || {{Boolean}} || Indicates whether the Procedure Workpackage is a template&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MRO Task Types ==&lt;br /&gt;
&lt;br /&gt;
The following task types are available in MRO. The technical object names are included to make the task types discoverable through the wiki search.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Task type !! Technical object name !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| [[#Blinding Task|Blinding Task]] || BLINDING_TASK || Documents a blinding or deblinding operation&lt;br /&gt;
|-&lt;br /&gt;
| [[#Calculation Task|Calculation Task]] || CALCULATION_TASK || Evaluates an expression and writes its result to a target property&lt;br /&gt;
|-&lt;br /&gt;
| [[#Check Task|Check Task]] || CHECK_TASK || Confirms a Boolean task using a checkbox&lt;br /&gt;
|-&lt;br /&gt;
| [[#Commissioning Task|Commissioning Task]] || COMMISSIONING_TASK || Represents a task in an MRO commissioning workflow&lt;br /&gt;
|-&lt;br /&gt;
| [[#Inspection Task|Inspection Task]] || INSPECTION_TASK || Records a Boolean inspection result with configurable labels&lt;br /&gt;
|-&lt;br /&gt;
| [[#Interface Task|Interface Task]] || INTERFACE_TASK || Waits for completion information from another software system&lt;br /&gt;
|-&lt;br /&gt;
| [[#Integer Task|Integer Task]] || INTEGER_TASK || Records an integer value&lt;br /&gt;
|-&lt;br /&gt;
| [[#Joint Task|Joint Task]] || JOINT_TASK || Documents the state of a joint location&lt;br /&gt;
|-&lt;br /&gt;
| [[#Measurement Task|Measurement Task]] || MROCLS_MRO_MEASUREMENT_TASK || Records a measured Double value&lt;br /&gt;
|-&lt;br /&gt;
| [[#Numeric Task|Numeric Task]] || NUMERIC_TASK || Records a numeric value and evaluates it against a configured range&lt;br /&gt;
|-&lt;br /&gt;
| [[#Pick List Task|Pick List Task]] || PICKLIST_TASK || Selects one integer value from an instance-specific Active List&lt;br /&gt;
|-&lt;br /&gt;
| [[#Picture Task|Picture Task]] || PICTURE_TASK || Requires at least one child document containing a valid file&lt;br /&gt;
|-&lt;br /&gt;
| [[#Progress Task|Progress Task]] || PROGRESS_TASK || Reports progress between 0% and 100%&lt;br /&gt;
|-&lt;br /&gt;
| [[#Signature Task|Signature Task]] || SIGNATURE_TASK || Captures a handwritten signature&lt;br /&gt;
|-&lt;br /&gt;
| [[#Supervisor Check Task|Supervisor Check Task]] || SUPERVISOR_CHECK_TASK || Applies the four-eyes principle to a [[#Check Task|Check Task]]&lt;br /&gt;
|-&lt;br /&gt;
| [[#Switch End Task|Switch End Task]] || SWITCH_END_TASK || Rejoins the branches of a Procedure workflow&lt;br /&gt;
|-&lt;br /&gt;
| [[#Switch Start Task|Switch Start Task]] || SWITCH_START_TASK || Selects a Procedure branch by evaluating a Boolean expression&lt;br /&gt;
|-&lt;br /&gt;
| [[#Text Task|Text Task]] || TEXT_TASK || Records free-form text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Hint|For the available Procedure variants and their workflow execution, see [[#Procedure Task Variants and Workflow Execution|Procedure Tasks]].}}&lt;br /&gt;
&lt;br /&gt;
=== Blinding Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''BLINDING_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_BLINDINGTASK]]&lt;br /&gt;
&lt;br /&gt;
A Blinding Task documents either a blinding or deblinding operation at a linked blinding location. The configured operation type determines the state that must be reported to complete the task.&lt;br /&gt;
&lt;br /&gt;
'''Relevant properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| BLINDING_TYPE || Configured operation type: Blinding or DeBlinding&lt;br /&gt;
|-&lt;br /&gt;
| LK_BLINDING_LOCATION || Link to the associated blinding location&lt;br /&gt;
|-&lt;br /&gt;
| LK_PREVIOUS_TASK || Link to the preceding Blinding Task&lt;br /&gt;
|-&lt;br /&gt;
| LOCKED || Prevents the task from being edited&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || Reported blinding state&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The task is complete only when '''VALUE''' matches the configured '''BLINDING_TYPE'''.&lt;br /&gt;
&lt;br /&gt;
=== Calculation Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''CALCULATION_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_CALCULATION_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Calculation Task automatically evaluates a predefined expression on the client and writes the result to a configured property on its owner. No user input is required.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| EXPRESSION || {{String}} || Expression evaluated by the client&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Integer}} || Evaluation state: Undefined = 0, Pending = 10, Finished = 20, Error = 30&lt;br /&gt;
|-&lt;br /&gt;
| TARGET_PROPERTY_NAME || {{String}} || Name of the target property on the owner&lt;br /&gt;
|-&lt;br /&gt;
| TARGET_PROPERTY_TYPE || {{Integer}} || Target type: Undefined = 0, Boolean = 1, Integer = 3, Double = 4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The task is automatically finished after successful evaluation. The clients display an indicator for a successful evaluation or an evaluation error. A Pending state does not receive an additional indicator.&lt;br /&gt;
&lt;br /&gt;
See also [[#Procedure Task Variants and Workflow Execution|Procedure Task Variants and Workflow Execution]].&lt;br /&gt;
&lt;br /&gt;
=== Check Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''CHECK_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_CHECK_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Check Task is a simple Boolean task represented by a checkbox. Clicking the checkbox sets its value and completes the task. It can alternatively be completed using ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task value and completion&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Check Task finished UWP.png|Check Task (WinX)&lt;br /&gt;
File:Check Task android.jpg|Not Applicable Check Task (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Commissioning Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''COMMISSIONING_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_COMMISSIONINGCHECK]]&lt;br /&gt;
&lt;br /&gt;
A Commissioning Task is a specialized task type used in MRO commissioning workflows.&lt;br /&gt;
&lt;br /&gt;
'''Relevant property'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| NOTAPPLICABLE || {{Boolean}} || Not Applicable state&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Inspection Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''INSPECTION_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_INSPECTION_TASK]]&lt;br /&gt;
&lt;br /&gt;
An Inspection Task captures a Boolean inspection result. The client presents a positive and a negative option as well as ''Not Applicable''. Selecting an option completes the task.&lt;br /&gt;
&lt;br /&gt;
The labels for the positive and negative outcomes can be configured. Selecting the negative outcome displays the configured false label.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Selected inspection result&lt;br /&gt;
|-&lt;br /&gt;
| LABEL_TRUE || {{String}} || Label for the positive outcome&lt;br /&gt;
|-&lt;br /&gt;
| LABEL_FALSE || {{String}} || Label for the negative outcome&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Finished Inspection Task UWP.png|Finished Inspection Task (WinX)&lt;br /&gt;
File:Inspection task android.jpg|Finished Inspection Task (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Interface Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''INTERFACE_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_INTERFACE_TASK]]&lt;br /&gt;
&lt;br /&gt;
An Interface Task cannot be completed directly on the client and typically depends on an external software system to provide its completion value. This is common for long-running asynchronous processes, such as waiting for analysis results from a laboratory&lt;br /&gt;
The task is complete when its Boolean '''VALUE''' becomes true. If the client is offline, the task waits until connectivity and synchronization are available again.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task completion supplied by the external software system&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Integer Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''INTEGER_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_INTEGER_TASK]]&lt;br /&gt;
&lt;br /&gt;
An Integer Task records an Integer value. Entering a value or selecting ''Not Applicable'' completes the task. A Selective List can be configured on the value property to restrict the available values.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Integer}} || Entered integer value&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Joint Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''JOINT_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_JOINTTASK]]&lt;br /&gt;
&lt;br /&gt;
A Joint Task documents the state of a linked joint location. The user selects one of the available Joint States.&lt;br /&gt;
&lt;br /&gt;
'''Relevant properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| LK_JOINT_LOCATION || Link to the associated joint location&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || Selected Joint State&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The available states are:&lt;br /&gt;
&lt;br /&gt;
* Closed&lt;br /&gt;
* Disconnected&lt;br /&gt;
* Open&lt;br /&gt;
* Planned&lt;br /&gt;
* Reconnected&lt;br /&gt;
* Torqued&lt;br /&gt;
* Undefined&lt;br /&gt;
* Verified&lt;br /&gt;
&lt;br /&gt;
The Joint Task is complete when its state is '''Planned''' or '''Closed'''.&lt;br /&gt;
&lt;br /&gt;
=== Measurement Task ===&lt;br /&gt;
&lt;br /&gt;
Technical classification name: '''MROCLS_MRO_MEASUREMENT_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_MEASUREMENT_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Measurement Task records a measured Double value, for example a value read from a pressure gauge. Selecting the displayed value opens an editor. If no value has been entered, the editor initially displays an empty value. Entering a value or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
An optional secondary value indicator can display a previously recorded value. Its behaviour has to be configured separately.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Double}} || Currently recorded measurement&lt;br /&gt;
|-&lt;br /&gt;
| PREVIOUS_VALUE || {{Double}} || Previously recorded measurement&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Measurment Task Empty UWP.png|Measurement Task without a recorded value (WinX)&lt;br /&gt;
File:Measurment Task Not Empty UWP.png|Measurement Task with a recorded value (WinX)&lt;br /&gt;
File:Measurment Task Empty Android.jpg|Measurement Task without a recorded value (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Numeric Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''NUMERIC_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_NUMERIC_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Numeric Task records a Double value, for example a value read from a temperature sensor. Entering a value or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
The value is compared against a configured acceptable range that cannot be edited on the client. A value outside the range produces visual feedback and sets the [[MRO Objects (Client)#Technical Status|technical status]] to indicate an issue. An invalid configured range, such as a minimum greater than the maximum, also produces an issue when a value is entered.&lt;br /&gt;
&lt;br /&gt;
A value unit can be configured for an individual task. When present, it overrides the standard unit configured on the [[MetaProperty#Unit_Item|MetaProperty]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Double}} || Recorded numeric value&lt;br /&gt;
|-&lt;br /&gt;
| VALUE_UNIT || {{String}} || Instance-specific value unit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Pick List Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PICKLIST_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_PICK_LIST_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Pick List Task allows the user to select one value from an [[UBIK Active Lists|Active List]] configured on the task instance. It behaves similarly to a standard [[#Integer Task|Integer Task]] with a Selective List, but the selectable values are supplied by the Active List rather than being defined globally.&lt;br /&gt;
&lt;br /&gt;
Every list item has an Integer value. Selecting an item or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Integer}} || Value of the selected Active List item&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Picture Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PICTURE_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_PICTURE_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Picture Task is a Boolean task that can only be finished when it has at least one child document containing a valid file. Multiple child documents can be attached. Although pictures are the most common files, the child document can contain another file type.&lt;br /&gt;
&lt;br /&gt;
The clients display a file or photo button next to the task checkbox. The task cannot be completed through the checkbox until the file requirement is satisfied. Selecting ''Not Applicable'' is always possible and bypasses the child-document requirement.&lt;br /&gt;
&lt;br /&gt;
When the user attempts to finish the task while online, the client may first synchronize the task's child objects and download the files of its child documents. During synchronization, the checkbox is replaced by a wait indicator.&lt;br /&gt;
&lt;br /&gt;
* If no child document or no local file is available, the task remains unfinished and the user is informed.&lt;br /&gt;
* If at least one child document with a valid local file is available, the task is finished and the file or photo button is disabled.&lt;br /&gt;
&lt;br /&gt;
Child-count information can be configured but is not required. WinX can display the child documents in an expander. This is not shown by default on Mobile due to the available screen size, but it can be customized using [[Object_hierarchy_in_XAML:_NextLevel,_ParentLevel,_LinkedLevel#Show_NextLevel_Children.2FDocuments|Show NextLevel Children/Documents]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task completion&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Progress Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PROGRESS_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_PROGRESS_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Progress Task reports progress between 0% and 100%. The reported value contributes to the progress of the owning Work Package. Values below 100% represent partial progress; the task is finished only when the reported progress reaches 100%. It can alternatively be completed using ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Double}} || Currently reported progress&lt;br /&gt;
|-&lt;br /&gt;
| PREVIOUS_VALUE || {{Double}} || Previously reported progress&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
An [[MRO_PROGRESS_TASK_EDITOR|alternative editor]] is available for Progress Tasks.{{Version/WinXSince|2.5.4}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Progress Task UWP.png|Progress Task with reported progress (WinX)&lt;br /&gt;
File:Progress Task Android.jpg|Progress Task with current and previous progress (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Signature Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SIGNATURE_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_SIGNATURE_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Signature Task is completed by capturing a handwritten signature. Selecting the signature editor opens an in-app dialog in which the user can sign. Confirming the signature saves it and automatically completes the task.&lt;br /&gt;
&lt;br /&gt;
When signing while online, the server resolves and displays the signee and generates the validation timestamp. When signing offline, the signee is resolved and displayed once the client is online again. If the complete signee or validation timestamp cannot be displayed in the editor field, selecting the field opens a popup with the complete information.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || Signature || Captured signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Supervisor Check Task {{Version/XamarinSince|4.8}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SUPERVISOR_CHECK_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_SUPERVISOR_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Supervisor Check Task applies the four-eyes principle to a Boolean [[#Check Task|Check Task]] on one device. The worker hands the device to a supervisor. The supervisor scans an NFC tag and enters the supervisor PIN. After successful authentication, the checkbox is enabled and must still be selected to finish the task.&lt;br /&gt;
&lt;br /&gt;
Selecting ''Not Applicable'' does not require supervisor authentication.&lt;br /&gt;
&lt;br /&gt;
Successful supervisor authentication removes only the supervisor-related lock. The task can remain locked for another reason, such as sequential dependencies or user rights. If an incorrect PIN is entered three times, authentication is cancelled and the NFC tag has to be scanned again. A setting controls [[RFID tags#Choose which information to use from a tag|which tag information is used]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || [[#Check Task|Check Task]] completion&lt;br /&gt;
|-&lt;br /&gt;
| SUPERVISOR || {{Guid}} || Authenticated supervisor&lt;br /&gt;
|-&lt;br /&gt;
| PERMISSION || {{String}} || Required supervisor permission&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=300px heights=300px&amp;gt;&lt;br /&gt;
File:UI_Xamarin_Supervisor_Task_Before_Verification.jpg|Supervisor Check Task before verification&lt;br /&gt;
File:UI_Xamarin_Supervisor_Task_Enter_PIN.jpg|Supervisor PIN entry&lt;br /&gt;
File:UI_Xamarin_Supervisor_Task_After_Verification.jpg|Supervisor Check Task after verification&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Switch End Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SWITCH_END_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_SWITCH_END_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Switch End Task marks the point at which the two branches created by a [[#Switch Start Task|Switch Start Task]] merge again. It is linked to exactly one corresponding [[#Switch Start Task|Switch Start Task]]. It is not shown to the user and completes automatically after the selected branch has finished, allowing the common Procedure workflow to continue.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task completion&lt;br /&gt;
|-&lt;br /&gt;
| LK_SWITCH_START_TASK || {{Guid}} || Link to the corresponding [[#Switch Start Task|Switch Start Task]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
See also [[#Procedure Task Variants and Workflow Execution|Procedure Task Variants and Workflow Execution]].&lt;br /&gt;
&lt;br /&gt;
=== Switch Start Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SWITCH_START_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_SWITCH_START_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Switch Start Task is a sequential workflow-control task used in a Procedure Workpackage. It automatically evaluates a Boolean expression on the client and selects either the true or false branch. Each branch represents a different path of Tasks and must lead to a corresponding [[#Switch End Task|Switch End Task]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| EXPRESSION || {{String}} || Expression evaluated by the client&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Integer}} || Evaluation state: Undefined = 0, Pending = 10, Finished = 20, Error = 30&lt;br /&gt;
|-&lt;br /&gt;
| BRANCH_TRUE || {{Guid}} || Link to the Task or Task Owner that starts the true branch&lt;br /&gt;
|-&lt;br /&gt;
| BRANCH_FALSE || {{Guid}} || Link to the Task or Task Owner that starts the false branch&lt;br /&gt;
|-&lt;br /&gt;
| DISPLAYSTRING_TRUE || {{String}} || Display string for a true result&lt;br /&gt;
|-&lt;br /&gt;
| DISPLAYSTRING_FALSE || {{String}} || Display string for a false result&lt;br /&gt;
|-&lt;br /&gt;
| EVALUATION_RESULT || {{Boolean}} || Result of the evaluated expression&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
After evaluation, only the selected branch is executed. The other branch remains hidden and its Procedure Tasks are set to ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
See also [[#Procedure Task Variants and Workflow Execution|Procedure Task Variants and Workflow Execution]].&lt;br /&gt;
&lt;br /&gt;
=== Text Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''TEXT_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_TEXT_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Text Task allows the user to enter free-form text. Entering a value or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{String}} || Entered text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Supervisor Base Type {{Version/XamarinSince|4.8}} ==&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SUPERVISOR_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_SUPERVISOR_TASK]]&lt;br /&gt;
&lt;br /&gt;
Supervisor Task is a base type that provides supervisor authentication behaviour. It is not used as a standalone user task. The concrete task type using this behaviour is [[#Supervisor Check Task|Supervisor Check Task]].&lt;br /&gt;
&lt;br /&gt;
== Procedure Task Variants and Workflow Execution {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ==&lt;br /&gt;
&lt;br /&gt;
{{Hint|For the complete list of base task types and their task-specific behaviour, see [[#MRO Task Types|MRO Task Types]].}}&lt;br /&gt;
&lt;br /&gt;
Procedure variants are specialized versions of task types for use within Procedure Workpackages. They retain the behaviour of their corresponding task type and additionally implement the [[MROCLS_SEQUENTIALTASK|Sequential Task]] and [[MROCLS_GROUPEDTASK|Grouped Task]] classifications.&lt;br /&gt;
&lt;br /&gt;
Procedure variants are available for:&lt;br /&gt;
&lt;br /&gt;
* [[#Calculation Task|Calculation Task]]&lt;br /&gt;
* [[#Check Task|Check Task]]&lt;br /&gt;
* [[#Inspection Task|Inspection Task]]&lt;br /&gt;
* [[#Interface Task|Interface Task]]&lt;br /&gt;
* [[#Numeric Task|Numeric Task]]&lt;br /&gt;
* [[#Pick List Task|Pick List Task]]&lt;br /&gt;
* [[#Picture Task|Picture Task]]&lt;br /&gt;
* [[#Signature Task|Signature Task]]&lt;br /&gt;
* [[#Supervisor Check Task|Supervisor Check Task]]&lt;br /&gt;
* [[#Text Task|Text Task]]&lt;br /&gt;
&lt;br /&gt;
[[#Switch Start Task|Switch Start Tasks]], [[#Switch End Task|Switch End Tasks]], and [[#Calculation Task|Calculation Tasks]] provide automatic workflow-control behaviour in a Procedure Workpackage.&lt;br /&gt;
&lt;br /&gt;
For automatic [[#Calculation Task|Calculation Tasks]] and [[#Switch Start Task|Switch Start Tasks]], the clients display an evaluation indicator:&lt;br /&gt;
&lt;br /&gt;
* '''Finished:''' The Task was automatically evaluated successfully.&lt;br /&gt;
* '''Error:''' The Task was evaluated but resulted in an error.&lt;br /&gt;
* '''Pending:''' The Task has not yet been evaluated. No additional indicator is displayed for this state.&lt;br /&gt;
&lt;br /&gt;
When a predecessor [[#Switch Start Task|Switch Start Task]] has not yet finished, its follow-up Procedure Tasks are hidden because the relevant branch is not yet known. After evaluation, the selected branch becomes visible. The other branch remains hidden, is not executed, and its Procedure Tasks are set to ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
For example, several predecessor [[#Numeric Task|Numeric Tasks]] can record temperatures from different parts of an equipment. A subsequent [[#Calculation Task|Calculation Task]] can calculate their average. A [[#Switch Start Task|Switch Start Task]] can then select a branch based on whether the average exceeds a configured temperature. One branch can contain a Task for activating a cooling mechanism, while the other branch can lead directly to the [[#Switch End Task|Switch End Task]] or contain further [[#Switch Start Task|Switch Tasks]].&lt;br /&gt;
&lt;br /&gt;
Procedure Tasks are intended to execute automatically when their predecessors are finished. However, the completion of the predecessor has to be triggered by a user. If a predecessor becomes finished only because of a server update, the follow-up Procedure workflow is not triggered. This prevents a workflow from executing in the name of users who did not initiate or observe the completion.&lt;br /&gt;
&lt;br /&gt;
The general online and offline evaluation rules for sequential and grouped Tasks are documented in [[MRO Objects (Client)#Sequential Task|Sequential Task]] and [[MRO Objects (Client)#Grouped Task|Grouped Task]].&lt;br /&gt;
&lt;br /&gt;
== Supporting File Documents ==&lt;br /&gt;
&lt;br /&gt;
=== Procedure JSON File Document ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''FILEDOCUMENT_MRO_JSON'''&lt;br /&gt;
&lt;br /&gt;
This File Document stores the JSON definition of a [[#Procedure Workpackage|Procedure Workpackage]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| LK_PROCEDURE_WORKPACKAGE || {{Guid}} || Link to the associated [[#Procedure Workpackage|Procedure Workpackage]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Picture Task File Document ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''FILEDOCUMENT_MRO_PICTURE_TASK'''&lt;br /&gt;
&lt;br /&gt;
This is a dedicated File Document linked to a [[#Picture Task|Picture Task]]. A [[#Picture Task|Picture Task]] can also use another child-document type, provided that the child document contains a valid file.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| LK_PICTURE_TASK || {{Guid}} || Link to the associated [[#Picture Task|Picture Task]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[MRO Objects (Client)]]&lt;br /&gt;
* [[MROCLS_MRO_TASKOWNER]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_WORKPACKAGE]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_PROGRESS_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_MEASUREMENT_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_CHECK_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_INSPECTION_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_INTEGER_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_SEQUENTIALTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_GROUPEDTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_PROCEDURE]] (Classification)&lt;br /&gt;
* [[MROCLS_SWITCH_START_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_SWITCH_END_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_CALCULATION_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_PICK_LIST_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_PICTURE_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_BLINDINGTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_COMMISSIONINGCHECK]] (Classification)&lt;br /&gt;
* [[MROCLS_JOINTTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_SIGNATURE_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_TEXT_TASK]] (Classification)&lt;br /&gt;
&lt;br /&gt;
[[Category:Android|MRO (Plugin)]]&lt;br /&gt;
[[Category:Client|MRO (Plugin)]]&lt;br /&gt;
[[Category:Mobile|MRO (Plugin)]]&lt;br /&gt;
[[Category:Module|MRO (Plugin)]]&lt;br /&gt;
[[Category:WinX|MRO (Plugin)]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MROCLS_INTERFACE_TASK&amp;diff=30476</id>
		<title>MROCLS INTERFACE TASK</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MROCLS_INTERFACE_TASK&amp;diff=30476"/>
				<updated>2026-08-24T11:23:48Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ClassificationInfoBox &lt;br /&gt;
| title = Interface Task classification &lt;br /&gt;
| name = {{PAGENAMEE}} &lt;br /&gt;
| inheritance = [[MROCLS_MRO_CHECK_TASK#Check Task]] &lt;br /&gt;
| namespace = UBIK.MRO.Classification &lt;br /&gt;
| purpose = Classify objects as Interface Tasks &lt;br /&gt;
| version = 5.2.0+ &lt;br /&gt;
| id = {C109AA2F-D37E-47F7-A5C9-FD8C4556C61D} &lt;br /&gt;
}} &lt;br /&gt;
&lt;br /&gt;
An [[MRO_(Plugin)#Interface_Task|Interface Task]] object is an {{UBIK}} content object which is used to document work using a boolean value.&lt;br /&gt;
&lt;br /&gt;
== MetaProperties == &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=50% &lt;br /&gt;
|- &lt;br /&gt;
! width=30% | Name !! width=30% | Data type !! Comment &lt;br /&gt;
|- &lt;br /&gt;
| ''VALUE'' || {{Boolean}} || The boolean value of the task (inherited from [[MROCLS_MRO_CHECK_TASK#Check Task]]) &lt;br /&gt;
|- &lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
== See also == &lt;br /&gt;
* [[MROCLS_MRO_TASK#Task]] (Classification) &lt;br /&gt;
* [[MROCLS_MRO_CHECK_TASK#Check Task]] (Classification) &lt;br /&gt;
* [[MROCLS_MRO_MEASUREMENT_TASK#Measurement Task]] (Classification) &lt;br /&gt;
* [[MROCLS_MRO_INSPECTION_TASK#Inspection Task]] (Classification) &lt;br /&gt;
* [[MRO_Objects_(Client)#Interface_Task]] &lt;br /&gt;
* [[MRO_(Plugin)#Interface_Task]] &lt;br /&gt;
* [[MROCLS_PROCEDURE#Procedure Workpackage]] (Classification) &lt;br /&gt;
* [[MROCLS_CALCULATION_TASK#Calculation Task]] (Classification)&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MROCLS_INTERFACE_TASK&amp;diff=30475</id>
		<title>MROCLS INTERFACE TASK</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MROCLS_INTERFACE_TASK&amp;diff=30475"/>
				<updated>2026-08-24T11:22:22Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: Created page with &amp;quot;{{ClassificationInfoBox  | title = Interface Task classification  | name = {{PAGENAMEE}}  | inheritance = MROCLS_MRO_CHECK_TASK#Check Task  | namespace = UBIK.MRO.Classifi...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ClassificationInfoBox &lt;br /&gt;
| title = Interface Task classification &lt;br /&gt;
| name = {{PAGENAMEE}} &lt;br /&gt;
| inheritance = [[MROCLS_MRO_CHECK_TASK#Check Task]] &lt;br /&gt;
| namespace = UBIK.MRO.Classification &lt;br /&gt;
| purpose = Classify objects as Interface Tasks &lt;br /&gt;
| version = 5.2.0+ &lt;br /&gt;
| id = {C109AA2F-D37E-47F7-A5C9-FD8C4556C61D} &lt;br /&gt;
}} &lt;br /&gt;
&lt;br /&gt;
An [[MRO_Objects_(Client)#Interface_Task|Interface Task]] object is an {{UBIK}} content object which is used to document work using a boolean value.&lt;br /&gt;
&lt;br /&gt;
== MetaProperties == &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=50% &lt;br /&gt;
|- &lt;br /&gt;
! width=30% | Name !! width=30% | Data type !! Comment &lt;br /&gt;
|- &lt;br /&gt;
| ''VALUE'' || {{Boolean}} || The boolean value of the task (inherited from [[MROCLS_MRO_CHECK_TASK#Check Task]]) &lt;br /&gt;
|- &lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
== See also == &lt;br /&gt;
* [[MROCLS_MRO_TASK#Task]] (Classification) &lt;br /&gt;
* [[MROCLS_MRO_CHECK_TASK#Check Task]] (Classification) &lt;br /&gt;
* [[MROCLS_MRO_MEASUREMENT_TASK#Measurement Task]] (Classification) &lt;br /&gt;
* [[MROCLS_MRO_INSPECTION_TASK#Inspection Task]] (Classification) &lt;br /&gt;
* [[MRO_Objects_(Client)#Interface_Task]] &lt;br /&gt;
* [[MRO_(Plugin)#Interface_Task]] &lt;br /&gt;
* [[MROCLS_PROCEDURE#Procedure Workpackage]] (Classification) &lt;br /&gt;
* [[MROCLS_CALCULATION_TASK#Calculation Task]] (Classification)&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_(Plugin)&amp;diff=30474</id>
		<title>MRO (Plugin)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_(Plugin)&amp;diff=30474"/>
				<updated>2026-08-24T11:21:46Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: /* Interface Task */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The MRO plugin provides a set of {{UBIK}} objects for representing and documenting maintenance, repair and operations work. The MRO features are available in the supported Mobile and {{UBIK WinX}} clients.&lt;br /&gt;
&lt;br /&gt;
This page is the main documentation for the MRO object model and its task types. Common client behaviour, such as status indicators, locking, and the general evaluation of sequential and grouped tasks, is documented in [[MRO Objects (Client)]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Page !! Scope&lt;br /&gt;
|-&lt;br /&gt;
| '''MRO (Plugin)''' || MRO concepts, task types, task-specific behaviour, and relevant technical properties&lt;br /&gt;
|-&lt;br /&gt;
| [[MRO Objects (Client)]] || Common client presentation, status indicators, locking, and behaviour shared by multiple MRO objects&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Basic Features ==&lt;br /&gt;
&lt;br /&gt;
Objects classified as MRO objects generally provide a technical and organisational status as well as an overall work progress based on their underlying data branch.&lt;br /&gt;
&lt;br /&gt;
=== Technical Status ===&lt;br /&gt;
&lt;br /&gt;
For detailed information, see [[MRO Objects (Client)#Technical Status|Technical Status]].&lt;br /&gt;
&lt;br /&gt;
=== Organisational Status ===&lt;br /&gt;
&lt;br /&gt;
For detailed information, see [[MRO Objects (Client)#Organisational Status|Organisational Status]].&lt;br /&gt;
&lt;br /&gt;
=== Work Progress ===&lt;br /&gt;
&lt;br /&gt;
For detailed information, see [[MRO Objects (Client)#Work Progress|Work Progress]].&lt;br /&gt;
&lt;br /&gt;
== MRO Objects ==&lt;br /&gt;
&lt;br /&gt;
MRO uses Task Owners, Work Packages, Tasks, and Procedure Workpackages to represent maintenance workflows.&lt;br /&gt;
&lt;br /&gt;
=== Task Owner ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_TASKOWNER|Task Owner]] is an object with an underlying structure of work to be performed. It can contain other Task Owners or Work Packages. Their technical status, organisational status, and work progress are accumulated and reported to the Task Owner.&lt;br /&gt;
&lt;br /&gt;
=== Work Package ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_WORKPACKAGE|Work Package]] collects and summarizes other Work Packages or Tasks. A Work Package can be confirmed when all associated Tasks have reached the required progress and all subordinate Work Packages have been confirmed.&lt;br /&gt;
&lt;br /&gt;
For Work Package presentation and confirmation in the clients, see [[MRO Objects (Client)#Work Package|Work Package]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Android|MRO (Plugin)]]&lt;br /&gt;
[[Category:Client|MRO (Plugin)]]&lt;br /&gt;
[[Category:Mobile|MRO (Plugin)]]&lt;br /&gt;
[[Category:Module|MRO (Plugin)]]&lt;br /&gt;
[[Category:WinX|MRO (Plugin)]]&lt;br /&gt;
&lt;br /&gt;
=== Task ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_TASK|Task]] reports work progress to its owning Work Package. The available task types provide different input, validation, or automatic workflow behaviour.&lt;br /&gt;
&lt;br /&gt;
MRO task values must be validated for work progress to be calculated. A MetaAttribute providing a validation timestamp must therefore be attached to the relevant MetaProperty.&lt;br /&gt;
&lt;br /&gt;
{{Attention|A task value property has to use [[Attributes]] so that its value can be validated. Otherwise, work progress cannot be calculated.}}&lt;br /&gt;
&lt;br /&gt;
All user-editable MRO task types can be set to ''Not Applicable''. In the clients, a completed user-editable task can be reset by selecting ''Not Applicable'' twice. General client behaviour is documented in [[MRO Objects (Client)#Task|Task]].&lt;br /&gt;
&lt;br /&gt;
=== Procedure Workpackage ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PROCEDURE_WORKPACKAGE'''&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_PROCEDURE|Procedure Workpackage]] is a specialized Work Package for structured workflows. Its structure is defined in JSON using a workflow editor and can contain Tasks as well as subordinate Procedure Workpackages. Depending on its state, the corresponding objects are created or updated.&lt;br /&gt;
&lt;br /&gt;
Procedure Workpackages can use [[MRO Objects (Client)#Sequential Task|sequential execution]], [[MRO Objects (Client)#Grouped Task|grouped Tasks]], [[#Switch Start Task|branching]], [[#Calculation Task|calculations]], and references to linked data. Their workflows support online and offline use. Steps that require data exchange wait until connectivity is available.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| PROCEDURE_STATUS || {{Integer}} || Current state: Draft = 10, ReadyToUse = 20, Published = 30, Open = 40, Executing = 50, Completed = 60, Approved = 70, Rejected = 80&lt;br /&gt;
|-&lt;br /&gt;
| JSON || {{String}} || JSON representation of the Procedure Workpackage&lt;br /&gt;
|-&lt;br /&gt;
| ISTEMPLATE || {{Boolean}} || Indicates whether the Procedure Workpackage is a template&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MRO Task Types ==&lt;br /&gt;
&lt;br /&gt;
The following task types are available in MRO. The technical object names are included to make the task types discoverable through the wiki search.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Task type !! Technical object name !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| [[#Blinding Task|Blinding Task]] || BLINDING_TASK || Documents a blinding or deblinding operation&lt;br /&gt;
|-&lt;br /&gt;
| [[#Calculation Task|Calculation Task]] || CALCULATION_TASK || Evaluates an expression and writes its result to a target property&lt;br /&gt;
|-&lt;br /&gt;
| [[#Check Task|Check Task]] || CHECK_TASK || Confirms a Boolean task using a checkbox&lt;br /&gt;
|-&lt;br /&gt;
| [[#Commissioning Task|Commissioning Task]] || COMMISSIONING_TASK || Represents a task in an MRO commissioning workflow&lt;br /&gt;
|-&lt;br /&gt;
| [[#Inspection Task|Inspection Task]] || INSPECTION_TASK || Records a Boolean inspection result with configurable labels&lt;br /&gt;
|-&lt;br /&gt;
| [[#Interface Task|Interface Task]] || INTERFACE_TASK || Waits for completion information from another software system&lt;br /&gt;
|-&lt;br /&gt;
| [[#Joint Task|Joint Task]] || JOINT_TASK || Documents the state of a joint location&lt;br /&gt;
|-&lt;br /&gt;
| [[#Measurement Task|Measurement Task]] || MROCLS_MRO_MEASUREMENT_TASK || Records a measured Double value&lt;br /&gt;
|-&lt;br /&gt;
| [[#Numeric Task|Numeric Task]] || NUMERIC_TASK || Records a numeric value and evaluates it against a configured range&lt;br /&gt;
|-&lt;br /&gt;
| [[#Pick List Task|Pick List Task]] || PICKLIST_TASK || Selects one integer value from an instance-specific Active List&lt;br /&gt;
|-&lt;br /&gt;
| [[#Picture Task|Picture Task]] || PICTURE_TASK || Requires at least one child document containing a valid file&lt;br /&gt;
|-&lt;br /&gt;
| [[#Progress Task|Progress Task]] || PROGRESS_TASK || Reports progress between 0% and 100%&lt;br /&gt;
|-&lt;br /&gt;
| [[#Signature Task|Signature Task]] || SIGNATURE_TASK || Captures a handwritten signature&lt;br /&gt;
|-&lt;br /&gt;
| [[#Supervisor Check Task|Supervisor Check Task]] || SUPERVISOR_CHECK_TASK || Applies the four-eyes principle to a [[#Check Task|Check Task]]&lt;br /&gt;
|-&lt;br /&gt;
| [[#Switch End Task|Switch End Task]] || SWITCH_END_TASK || Rejoins the branches of a Procedure workflow&lt;br /&gt;
|-&lt;br /&gt;
| [[#Switch Start Task|Switch Start Task]] || SWITCH_START_TASK || Selects a Procedure branch by evaluating a Boolean expression&lt;br /&gt;
|-&lt;br /&gt;
| [[#Text Task|Text Task]] || TEXT_TASK || Records free-form text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Hint|For the available Procedure variants and their workflow execution, see [[#Procedure Task Variants and Workflow Execution|Procedure Tasks]].}}&lt;br /&gt;
&lt;br /&gt;
=== Blinding Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''BLINDING_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_BLINDINGTASK]]&lt;br /&gt;
&lt;br /&gt;
A Blinding Task documents either a blinding or deblinding operation at a linked blinding location. The configured operation type determines the state that must be reported to complete the task.&lt;br /&gt;
&lt;br /&gt;
'''Relevant properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| BLINDING_TYPE || Configured operation type: Blinding or DeBlinding&lt;br /&gt;
|-&lt;br /&gt;
| LK_BLINDING_LOCATION || Link to the associated blinding location&lt;br /&gt;
|-&lt;br /&gt;
| LK_PREVIOUS_TASK || Link to the preceding Blinding Task&lt;br /&gt;
|-&lt;br /&gt;
| LOCKED || Prevents the task from being edited&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || Reported blinding state&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The task is complete only when '''VALUE''' matches the configured '''BLINDING_TYPE'''.&lt;br /&gt;
&lt;br /&gt;
=== Calculation Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''CALCULATION_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_CALCULATION_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Calculation Task automatically evaluates a predefined expression on the client and writes the result to a configured property on its owner. No user input is required.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| EXPRESSION || {{String}} || Expression evaluated by the client&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Integer}} || Evaluation state: Undefined = 0, Pending = 10, Finished = 20, Error = 30&lt;br /&gt;
|-&lt;br /&gt;
| TARGET_PROPERTY_NAME || {{String}} || Name of the target property on the owner&lt;br /&gt;
|-&lt;br /&gt;
| TARGET_PROPERTY_TYPE || {{Integer}} || Target type: Undefined = 0, Boolean = 1, Integer = 3, Double = 4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The task is automatically finished after successful evaluation. The clients display an indicator for a successful evaluation or an evaluation error. A Pending state does not receive an additional indicator.&lt;br /&gt;
&lt;br /&gt;
See also [[#Procedure Task Variants and Workflow Execution|Procedure Task Variants and Workflow Execution]].&lt;br /&gt;
&lt;br /&gt;
=== Check Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''CHECK_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_CHECK_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Check Task is a simple Boolean task represented by a checkbox. Clicking the checkbox sets its value and completes the task. It can alternatively be completed using ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task value and completion&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Check Task finished UWP.png|Check Task (WinX)&lt;br /&gt;
File:Check Task android.jpg|Not Applicable Check Task (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Commissioning Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''COMMISSIONING_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_COMMISSIONINGCHECK]]&lt;br /&gt;
&lt;br /&gt;
A Commissioning Task is a specialized task type used in MRO commissioning workflows.&lt;br /&gt;
&lt;br /&gt;
'''Relevant property'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| NOTAPPLICABLE || {{Boolean}} || Not Applicable state&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Inspection Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''INSPECTION_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_INSPECTION_TASK]]&lt;br /&gt;
&lt;br /&gt;
An Inspection Task captures a Boolean inspection result. The client presents a positive and a negative option as well as ''Not Applicable''. Selecting an option completes the task.&lt;br /&gt;
&lt;br /&gt;
The labels for the positive and negative outcomes can be configured. Selecting the negative outcome displays the configured false label.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Selected inspection result&lt;br /&gt;
|-&lt;br /&gt;
| LABEL_TRUE || {{String}} || Label for the positive outcome&lt;br /&gt;
|-&lt;br /&gt;
| LABEL_FALSE || {{String}} || Label for the negative outcome&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Finished Inspection Task UWP.png|Finished Inspection Task (WinX)&lt;br /&gt;
File:Inspection task android.jpg|Finished Inspection Task (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Interface Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''INTERFACE_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_INTERFACE_TASK]]&lt;br /&gt;
&lt;br /&gt;
An Interface Task cannot be completed directly on the client and typically depends on an external software system to provide its completion value. This is common for long-running asynchronous processes, such as waiting for analysis results from a laboratory&lt;br /&gt;
The task is complete when its Boolean '''VALUE''' becomes true. If the client is offline, the task waits until connectivity and synchronization are available again.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task completion supplied by the external software system&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Android|MRO (Plugin)]]&lt;br /&gt;
[[Category:Client|MRO (Plugin)]]&lt;br /&gt;
[[Category:Mobile|MRO (Plugin)]]&lt;br /&gt;
[[Category:Module|MRO (Plugin)]]&lt;br /&gt;
[[Category:WinX|MRO (Plugin)]]&lt;br /&gt;
&lt;br /&gt;
=== Joint Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''JOINT_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_JOINTTASK]]&lt;br /&gt;
&lt;br /&gt;
A Joint Task documents the state of a linked joint location. The user selects one of the available Joint States.&lt;br /&gt;
&lt;br /&gt;
'''Relevant properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| LK_JOINT_LOCATION || Link to the associated joint location&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || Selected Joint State&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The available states are:&lt;br /&gt;
&lt;br /&gt;
* Closed&lt;br /&gt;
* Disconnected&lt;br /&gt;
* Open&lt;br /&gt;
* Planned&lt;br /&gt;
* Reconnected&lt;br /&gt;
* Torqued&lt;br /&gt;
* Undefined&lt;br /&gt;
* Verified&lt;br /&gt;
&lt;br /&gt;
The Joint Task is complete when its state is '''Planned''' or '''Closed'''.&lt;br /&gt;
&lt;br /&gt;
=== Measurement Task ===&lt;br /&gt;
&lt;br /&gt;
Technical classification name: '''MROCLS_MRO_MEASUREMENT_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_MEASUREMENT_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Measurement Task records a measured Double value, for example a value read from a pressure gauge. Selecting the displayed value opens an editor. If no value has been entered, the editor initially displays an empty value. Entering a value or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
An optional secondary value indicator can display a previously recorded value. Its behaviour has to be configured separately.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Double}} || Currently recorded measurement&lt;br /&gt;
|-&lt;br /&gt;
| PREVIOUS_VALUE || {{Double}} || Previously recorded measurement&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Measurment Task Empty UWP.png|Measurement Task without a recorded value (WinX)&lt;br /&gt;
File:Measurment Task Not Empty UWP.png|Measurement Task with a recorded value (WinX)&lt;br /&gt;
File:Measurment Task Empty Android.jpg|Measurement Task without a recorded value (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Numeric Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''NUMERIC_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_NUMERIC_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Numeric Task records a Double value, for example a value read from a temperature sensor. Entering a value or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
The value is compared against a configured acceptable range that cannot be edited on the client. A value outside the range produces visual feedback and sets the [[MRO Objects (Client)#Technical Status|technical status]] to indicate an issue. An invalid configured range, such as a minimum greater than the maximum, also produces an issue when a value is entered.&lt;br /&gt;
&lt;br /&gt;
A value unit can be configured for an individual task. When present, it overrides the standard unit configured on the [[MetaProperty#Unit_Item|MetaProperty]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Double}} || Recorded numeric value&lt;br /&gt;
|-&lt;br /&gt;
| VALUE_UNIT || {{String}} || Instance-specific value unit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Pick List Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PICKLIST_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_PICK_LIST_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Pick List Task allows the user to select one value from an [[UBIK Active Lists|Active List]] configured on the task instance. It behaves similarly to a standard Integer Task with a Selective List, but the selectable values are supplied by the Active List rather than being defined globally.&lt;br /&gt;
&lt;br /&gt;
Every list item has an Integer value. Selecting an item or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Integer}} || Value of the selected Active List item&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Picture Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PICTURE_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_PICTURE_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Picture Task is a Boolean task that can only be finished when it has at least one child document containing a valid file. Multiple child documents can be attached. Although pictures are the most common files, the child document can contain another file type.&lt;br /&gt;
&lt;br /&gt;
The clients display a file or photo button next to the task checkbox. The task cannot be completed through the checkbox until the file requirement is satisfied. Selecting ''Not Applicable'' is always possible and bypasses the child-document requirement.&lt;br /&gt;
&lt;br /&gt;
When the user attempts to finish the task while online, the client may first synchronize the task's child objects and download the files of its child documents. During synchronization, the checkbox is replaced by a wait indicator.&lt;br /&gt;
&lt;br /&gt;
* If no child document or no local file is available, the task remains unfinished and the user is informed.&lt;br /&gt;
* If at least one child document with a valid local file is available, the task is finished and the file or photo button is disabled.&lt;br /&gt;
&lt;br /&gt;
Child-count information can be configured but is not required. WinX can display the child documents in an expander. This is not shown by default on Mobile due to the available screen size, but it can be customized using [[Object_hierarchy_in_XAML:_NextLevel,_ParentLevel,_LinkedLevel#Show_NextLevel_Children.2FDocuments|Show NextLevel Children/Documents]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task completion&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Progress Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PROGRESS_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_PROGRESS_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Progress Task reports progress between 0% and 100%. The reported value contributes to the progress of the owning Work Package. Values below 100% represent partial progress; the task is finished only when the reported progress reaches 100%. It can alternatively be completed using ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Double}} || Currently reported progress&lt;br /&gt;
|-&lt;br /&gt;
| PREVIOUS_VALUE || {{Double}} || Previously reported progress&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
An [[MRO_PROGRESS_TASK_EDITOR|alternative editor]] is available for Progress Tasks.{{Version/WinXSince|2.5.4}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Progress Task UWP.png|Progress Task with reported progress (WinX)&lt;br /&gt;
File:Progress Task Android.jpg|Progress Task with current and previous progress (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Signature Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SIGNATURE_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_SIGNATURE_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Signature Task is completed by capturing a handwritten signature. Selecting the signature editor opens an in-app dialog in which the user can sign. Confirming the signature saves it and automatically completes the task.&lt;br /&gt;
&lt;br /&gt;
When signing while online, the server resolves and displays the signee and generates the validation timestamp. When signing offline, the signee is resolved and displayed once the client is online again. If the complete signee or validation timestamp cannot be displayed in the editor field, selecting the field opens a popup with the complete information.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || Signature || Captured signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Supervisor Check Task {{Version/XamarinSince|4.8}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SUPERVISOR_CHECK_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_SUPERVISOR_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Supervisor Check Task applies the four-eyes principle to a Boolean [[#Check Task|Check Task]] on one device. The worker hands the device to a supervisor. The supervisor scans an NFC tag and enters the supervisor PIN. After successful authentication, the checkbox is enabled and must still be selected to finish the task.&lt;br /&gt;
&lt;br /&gt;
Selecting ''Not Applicable'' does not require supervisor authentication.&lt;br /&gt;
&lt;br /&gt;
Successful supervisor authentication removes only the supervisor-related lock. The task can remain locked for another reason, such as sequential dependencies or user rights. If an incorrect PIN is entered three times, authentication is cancelled and the NFC tag has to be scanned again. A setting controls [[RFID tags#Choose which information to use from a tag|which tag information is used]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || [[#Check Task|Check Task]] completion&lt;br /&gt;
|-&lt;br /&gt;
| SUPERVISOR || {{Guid}} || Authenticated supervisor&lt;br /&gt;
|-&lt;br /&gt;
| PERMISSION || {{String}} || Required supervisor permission&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=300px heights=300px&amp;gt;&lt;br /&gt;
File:UI_Xamarin_Supervisor_Task_Before_Verification.jpg|Supervisor Check Task before verification&lt;br /&gt;
File:UI_Xamarin_Supervisor_Task_Enter_PIN.jpg|Supervisor PIN entry&lt;br /&gt;
File:UI_Xamarin_Supervisor_Task_After_Verification.jpg|Supervisor Check Task after verification&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Switch End Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SWITCH_END_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_SWITCH_END_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Switch End Task marks the point at which the two branches created by a [[#Switch Start Task|Switch Start Task]] merge again. It is linked to exactly one corresponding [[#Switch Start Task|Switch Start Task]]. It is not shown to the user and completes automatically after the selected branch has finished, allowing the common Procedure workflow to continue.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task completion&lt;br /&gt;
|-&lt;br /&gt;
| LK_SWITCH_START_TASK || {{Guid}} || Link to the corresponding [[#Switch Start Task|Switch Start Task]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
See also [[#Procedure Task Variants and Workflow Execution|Procedure Task Variants and Workflow Execution]].&lt;br /&gt;
&lt;br /&gt;
=== Switch Start Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SWITCH_START_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_SWITCH_START_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Switch Start Task is a sequential workflow-control task used in a Procedure Workpackage. It automatically evaluates a Boolean expression on the client and selects either the true or false branch. Each branch represents a different path of Tasks and must lead to a corresponding [[#Switch End Task|Switch End Task]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| EXPRESSION || {{String}} || Expression evaluated by the client&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Integer}} || Evaluation state: Undefined = 0, Pending = 10, Finished = 20, Error = 30&lt;br /&gt;
|-&lt;br /&gt;
| BRANCH_TRUE || {{Guid}} || Link to the Task or Task Owner that starts the true branch&lt;br /&gt;
|-&lt;br /&gt;
| BRANCH_FALSE || {{Guid}} || Link to the Task or Task Owner that starts the false branch&lt;br /&gt;
|-&lt;br /&gt;
| DISPLAYSTRING_TRUE || {{String}} || Display string for a true result&lt;br /&gt;
|-&lt;br /&gt;
| DISPLAYSTRING_FALSE || {{String}} || Display string for a false result&lt;br /&gt;
|-&lt;br /&gt;
| EVALUATION_RESULT || {{Boolean}} || Result of the evaluated expression&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
After evaluation, only the selected branch is executed. The other branch remains hidden and its Procedure Tasks are set to ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
See also [[#Procedure Task Variants and Workflow Execution|Procedure Task Variants and Workflow Execution]].&lt;br /&gt;
&lt;br /&gt;
=== Text Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''TEXT_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_TEXT_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Text Task allows the user to enter free-form text. Entering a value or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{String}} || Entered text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Supervisor Base Type {{Version/XamarinSince|4.8}} ==&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SUPERVISOR_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_SUPERVISOR_TASK]]&lt;br /&gt;
&lt;br /&gt;
Supervisor Task is a base type that provides supervisor authentication behaviour. It is not used as a standalone user task. The concrete task type using this behaviour is [[#Supervisor Check Task|Supervisor Check Task]].&lt;br /&gt;
&lt;br /&gt;
== Procedure Task Variants and Workflow Execution {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ==&lt;br /&gt;
&lt;br /&gt;
{{Hint|For the complete list of base task types and their task-specific behaviour, see [[#MRO Task Types|MRO Task Types]].}}&lt;br /&gt;
&lt;br /&gt;
Procedure variants are specialized versions of task types for use within Procedure Workpackages. They retain the behaviour of their corresponding task type and additionally implement the [[MROCLS_SEQUENTIALTASK|Sequential Task]] and [[MROCLS_GROUPEDTASK|Grouped Task]] classifications.&lt;br /&gt;
&lt;br /&gt;
Procedure variants are available for:&lt;br /&gt;
&lt;br /&gt;
* [[#Calculation Task|Calculation Task]]&lt;br /&gt;
* [[#Check Task|Check Task]]&lt;br /&gt;
* [[#Inspection Task|Inspection Task]]&lt;br /&gt;
* [[#Interface Task|Interface Task]]&lt;br /&gt;
* [[#Numeric Task|Numeric Task]]&lt;br /&gt;
* [[#Pick List Task|Pick List Task]]&lt;br /&gt;
* [[#Picture Task|Picture Task]]&lt;br /&gt;
* [[#Signature Task|Signature Task]]&lt;br /&gt;
* [[#Supervisor Check Task|Supervisor Check Task]]&lt;br /&gt;
* [[#Text Task|Text Task]]&lt;br /&gt;
&lt;br /&gt;
[[#Switch Start Task|Switch Start Tasks]], [[#Switch End Task|Switch End Tasks]], and [[#Calculation Task|Calculation Tasks]] provide automatic workflow-control behaviour in a Procedure Workpackage.&lt;br /&gt;
&lt;br /&gt;
For automatic [[#Calculation Task|Calculation Tasks]] and [[#Switch Start Task|Switch Start Tasks]], the clients display an evaluation indicator:&lt;br /&gt;
&lt;br /&gt;
* '''Finished:''' The Task was automatically evaluated successfully.&lt;br /&gt;
* '''Error:''' The Task was evaluated but resulted in an error.&lt;br /&gt;
* '''Pending:''' The Task has not yet been evaluated. No additional indicator is displayed for this state.&lt;br /&gt;
&lt;br /&gt;
When a predecessor [[#Switch Start Task|Switch Start Task]] has not yet finished, its follow-up Procedure Tasks are hidden because the relevant branch is not yet known. After evaluation, the selected branch becomes visible. The other branch remains hidden, is not executed, and its Procedure Tasks are set to ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
For example, several predecessor [[#Numeric Task|Numeric Tasks]] can record temperatures from different parts of an equipment. A subsequent [[#Calculation Task|Calculation Task]] can calculate their average. A [[#Switch Start Task|Switch Start Task]] can then select a branch based on whether the average exceeds a configured temperature. One branch can contain a Task for activating a cooling mechanism, while the other branch can lead directly to the [[#Switch End Task|Switch End Task]] or contain further [[#Switch Start Task|Switch Tasks]].&lt;br /&gt;
&lt;br /&gt;
Procedure Tasks are intended to execute automatically when their predecessors are finished. However, the completion of the predecessor has to be triggered by a user. If a predecessor becomes finished only because of a server update, the follow-up Procedure workflow is not triggered. This prevents a workflow from executing in the name of users who did not initiate or observe the completion.&lt;br /&gt;
&lt;br /&gt;
The general online and offline evaluation rules for sequential and grouped Tasks are documented in [[MRO Objects (Client)#Sequential Task|Sequential Task]] and [[MRO Objects (Client)#Grouped Task|Grouped Task]].&lt;br /&gt;
&lt;br /&gt;
== Supporting File Documents ==&lt;br /&gt;
&lt;br /&gt;
=== Procedure JSON File Document ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''FILEDOCUMENT_MRO_JSON'''&lt;br /&gt;
&lt;br /&gt;
This File Document stores the JSON definition of a [[#Procedure Workpackage|Procedure Workpackage]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| LK_PROCEDURE_WORKPACKAGE || {{Guid}} || Link to the associated [[#Procedure Workpackage|Procedure Workpackage]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Picture Task File Document ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''FILEDOCUMENT_MRO_PICTURE_TASK'''&lt;br /&gt;
&lt;br /&gt;
This is a dedicated File Document linked to a [[#Picture Task|Picture Task]]. A [[#Picture Task|Picture Task]] can also use another child-document type, provided that the child document contains a valid file.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| LK_PICTURE_TASK || {{Guid}} || Link to the associated [[#Picture Task|Picture Task]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[MRO Objects (Client)]]&lt;br /&gt;
* [[MROCLS_MRO_TASKOWNER]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_WORKPACKAGE]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_PROGRESS_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_MEASUREMENT_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_CHECK_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_INSPECTION_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_SEQUENTIALTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_GROUPEDTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_PROCEDURE]] (Classification)&lt;br /&gt;
* [[MROCLS_SWITCH_START_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_SWITCH_END_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_CALCULATION_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_PICK_LIST_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_PICTURE_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_BLINDINGTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_COMMISSIONINGCHECK]] (Classification)&lt;br /&gt;
* [[MROCLS_JOINTTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_SIGNATURE_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_TEXT_TASK]] (Classification)&lt;br /&gt;
&lt;br /&gt;
[[Category:Module|MRO (Plugin)]]&lt;br /&gt;
[[Category:Android|MRO (Plugin)]]&lt;br /&gt;
[[Category:Mobile|MRO (Plugin)]]&lt;br /&gt;
[[Category:Client|MRO (Plugin)]]&lt;br /&gt;
[[Category:WinX|MRO (Plugin)]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_(Plugin)&amp;diff=30467</id>
		<title>MRO (Plugin)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_(Plugin)&amp;diff=30467"/>
				<updated>2026-08-18T13:50:36Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: /* Work Package */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The MRO plugin provides a set of {{UBIK}} objects for representing and documenting maintenance, repair and operations work. The MRO features are available in the supported Mobile and {{UBIK WinX}} clients.&lt;br /&gt;
&lt;br /&gt;
This page is the main documentation for the MRO object model and its task types. Common client behaviour, such as status indicators, locking, and the general evaluation of sequential and grouped tasks, is documented in [[MRO Objects (Client)]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Page !! Scope&lt;br /&gt;
|-&lt;br /&gt;
| '''MRO (Plugin)''' || MRO concepts, task types, task-specific behaviour, and relevant technical properties&lt;br /&gt;
|-&lt;br /&gt;
| [[MRO Objects (Client)]] || Common client presentation, status indicators, locking, and behaviour shared by multiple MRO objects&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Basic Features ==&lt;br /&gt;
&lt;br /&gt;
Objects classified as MRO objects generally provide a technical and organisational status as well as an overall work progress based on their underlying data branch.&lt;br /&gt;
&lt;br /&gt;
=== Technical Status ===&lt;br /&gt;
&lt;br /&gt;
For detailed information, see [[MRO Objects (Client)#Technical Status|Technical Status]].&lt;br /&gt;
&lt;br /&gt;
=== Organisational Status ===&lt;br /&gt;
&lt;br /&gt;
For detailed information, see [[MRO Objects (Client)#Organisational Status|Organisational Status]].&lt;br /&gt;
&lt;br /&gt;
=== Work Progress ===&lt;br /&gt;
&lt;br /&gt;
For detailed information, see [[MRO Objects (Client)#Work Progress|Work Progress]].&lt;br /&gt;
&lt;br /&gt;
== MRO Objects ==&lt;br /&gt;
&lt;br /&gt;
MRO uses Task Owners, Work Packages, Tasks, and Procedure Workpackages to represent maintenance workflows.&lt;br /&gt;
&lt;br /&gt;
=== Task Owner ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_TASKOWNER|Task Owner]] is an object with an underlying structure of work to be performed. It can contain other Task Owners or Work Packages. Their technical status, organisational status, and work progress are accumulated and reported to the Task Owner.&lt;br /&gt;
&lt;br /&gt;
=== Work Package ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_WORKPACKAGE|Work Package]] collects and summarizes other Work Packages or Tasks. A Work Package can be confirmed when all associated Tasks have reached the required progress and all subordinate Work Packages have been confirmed.&lt;br /&gt;
&lt;br /&gt;
For Work Package presentation and confirmation in the clients, see [[MRO Objects (Client)#Work Package|Work Package]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Android|MRO (Plugin)]]&lt;br /&gt;
[[Category:Client|MRO (Plugin)]]&lt;br /&gt;
[[Category:Mobile|MRO (Plugin)]]&lt;br /&gt;
[[Category:Module|MRO (Plugin)]]&lt;br /&gt;
[[Category:WinX|MRO (Plugin)]]&lt;br /&gt;
&lt;br /&gt;
=== Task ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_TASK|Task]] reports work progress to its owning Work Package. The available task types provide different input, validation, or automatic workflow behaviour.&lt;br /&gt;
&lt;br /&gt;
MRO task values must be validated for work progress to be calculated. A MetaAttribute providing a validation timestamp must therefore be attached to the relevant MetaProperty.&lt;br /&gt;
&lt;br /&gt;
{{Attention|A task value property has to use [[Attributes]] so that its value can be validated. Otherwise, work progress cannot be calculated.}}&lt;br /&gt;
&lt;br /&gt;
All user-editable MRO task types can be set to ''Not Applicable''. In the clients, a completed user-editable task can be reset by selecting ''Not Applicable'' twice. General client behaviour is documented in [[MRO Objects (Client)#Task|Task]].&lt;br /&gt;
&lt;br /&gt;
=== Procedure Workpackage ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PROCEDURE_WORKPACKAGE'''&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_PROCEDURE|Procedure Workpackage]] is a specialized Work Package for structured workflows. Its structure is defined in JSON using a workflow editor and can contain Tasks as well as subordinate Procedure Workpackages. Depending on its state, the corresponding objects are created or updated.&lt;br /&gt;
&lt;br /&gt;
Procedure Workpackages can use [[MRO Objects (Client)#Sequential Task|sequential execution]], [[MRO Objects (Client)#Grouped Task|grouped Tasks]], [[#Switch Start Task|branching]], [[#Calculation Task|calculations]], and references to linked data. Their workflows support online and offline use. Steps that require data exchange wait until connectivity is available.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| PROCEDURE_STATUS || {{Integer}} || Current state: Draft = 10, ReadyToUse = 20, Published = 30, Open = 40, Executing = 50, Completed = 60, Approved = 70, Rejected = 80&lt;br /&gt;
|-&lt;br /&gt;
| JSON || {{String}} || JSON representation of the Procedure Workpackage&lt;br /&gt;
|-&lt;br /&gt;
| ISTEMPLATE || {{Boolean}} || Indicates whether the Procedure Workpackage is a template&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MRO Task Types ==&lt;br /&gt;
&lt;br /&gt;
The following task types are available in MRO. The technical object names are included to make the task types discoverable through the wiki search.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Task type !! Technical object name !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| [[#Blinding Task|Blinding Task]] || BLINDING_TASK || Documents a blinding or deblinding operation&lt;br /&gt;
|-&lt;br /&gt;
| [[#Calculation Task|Calculation Task]] || CALCULATION_TASK || Evaluates an expression and writes its result to a target property&lt;br /&gt;
|-&lt;br /&gt;
| [[#Check Task|Check Task]] || CHECK_TASK || Confirms a Boolean task using a checkbox&lt;br /&gt;
|-&lt;br /&gt;
| [[#Commissioning Task|Commissioning Task]] || COMMISSIONING_TASK || Represents a task in an MRO commissioning workflow&lt;br /&gt;
|-&lt;br /&gt;
| [[#Inspection Task|Inspection Task]] || INSPECTION_TASK || Records a Boolean inspection result with configurable labels&lt;br /&gt;
|-&lt;br /&gt;
| [[#Interface Task|Interface Task]] || INTERFACE_TASK || Waits for completion information from another software system&lt;br /&gt;
|-&lt;br /&gt;
| [[#Joint Task|Joint Task]] || JOINT_TASK || Documents the state of a joint location&lt;br /&gt;
|-&lt;br /&gt;
| [[#Measurement Task|Measurement Task]] || MROCLS_MRO_MEASUREMENT_TASK || Records a measured Double value&lt;br /&gt;
|-&lt;br /&gt;
| [[#Numeric Task|Numeric Task]] || NUMERIC_TASK || Records a numeric value and evaluates it against a configured range&lt;br /&gt;
|-&lt;br /&gt;
| [[#Pick List Task|Pick List Task]] || PICKLIST_TASK || Selects one integer value from an instance-specific Active List&lt;br /&gt;
|-&lt;br /&gt;
| [[#Picture Task|Picture Task]] || PICTURE_TASK || Requires at least one child document containing a valid file&lt;br /&gt;
|-&lt;br /&gt;
| [[#Progress Task|Progress Task]] || PROGRESS_TASK || Reports progress between 0% and 100%&lt;br /&gt;
|-&lt;br /&gt;
| [[#Signature Task|Signature Task]] || SIGNATURE_TASK || Captures a handwritten signature&lt;br /&gt;
|-&lt;br /&gt;
| [[#Supervisor Check Task|Supervisor Check Task]] || SUPERVISOR_CHECK_TASK || Applies the four-eyes principle to a [[#Check Task|Check Task]]&lt;br /&gt;
|-&lt;br /&gt;
| [[#Switch End Task|Switch End Task]] || SWITCH_END_TASK || Rejoins the branches of a Procedure workflow&lt;br /&gt;
|-&lt;br /&gt;
| [[#Switch Start Task|Switch Start Task]] || SWITCH_START_TASK || Selects a Procedure branch by evaluating a Boolean expression&lt;br /&gt;
|-&lt;br /&gt;
| [[#Text Task|Text Task]] || TEXT_TASK || Records free-form text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Hint|For the available Procedure variants and their workflow execution, see [[#Procedure Task Variants and Workflow Execution|Procedure Tasks]].}}&lt;br /&gt;
&lt;br /&gt;
=== Blinding Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''BLINDING_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_BLINDINGTASK]]&lt;br /&gt;
&lt;br /&gt;
A Blinding Task documents either a blinding or deblinding operation at a linked blinding location. The configured operation type determines the state that must be reported to complete the task.&lt;br /&gt;
&lt;br /&gt;
'''Relevant properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| BLINDING_TYPE || Configured operation type: Blinding or DeBlinding&lt;br /&gt;
|-&lt;br /&gt;
| LK_BLINDING_LOCATION || Link to the associated blinding location&lt;br /&gt;
|-&lt;br /&gt;
| LK_PREVIOUS_TASK || Link to the preceding Blinding Task&lt;br /&gt;
|-&lt;br /&gt;
| LOCKED || Prevents the task from being edited&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || Reported blinding state&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The task is complete only when '''VALUE''' matches the configured '''BLINDING_TYPE'''.&lt;br /&gt;
&lt;br /&gt;
=== Calculation Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''CALCULATION_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_CALCULATION_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Calculation Task automatically evaluates a predefined expression on the client and writes the result to a configured property on its owner. No user input is required.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| EXPRESSION || {{String}} || Expression evaluated by the client&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Integer}} || Evaluation state: Undefined = 0, Pending = 10, Finished = 20, Error = 30&lt;br /&gt;
|-&lt;br /&gt;
| TARGET_PROPERTY_NAME || {{String}} || Name of the target property on the owner&lt;br /&gt;
|-&lt;br /&gt;
| TARGET_PROPERTY_TYPE || {{Integer}} || Target type: Undefined = 0, Boolean = 1, Integer = 3, Double = 4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The task is automatically finished after successful evaluation. The clients display an indicator for a successful evaluation or an evaluation error. A Pending state does not receive an additional indicator.&lt;br /&gt;
&lt;br /&gt;
See also [[#Procedure Task Variants and Workflow Execution|Procedure Task Variants and Workflow Execution]].&lt;br /&gt;
&lt;br /&gt;
=== Check Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''CHECK_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_CHECK_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Check Task is a simple Boolean task represented by a checkbox. Clicking the checkbox sets its value and completes the task. It can alternatively be completed using ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task value and completion&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Check Task finished UWP.png|Check Task (WinX)&lt;br /&gt;
File:Check Task android.jpg|Not Applicable Check Task (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Commissioning Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''COMMISSIONING_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_COMMISSIONINGCHECK]]&lt;br /&gt;
&lt;br /&gt;
A Commissioning Task is a specialized task type used in MRO commissioning workflows.&lt;br /&gt;
&lt;br /&gt;
'''Relevant property'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| NOTAPPLICABLE || {{Boolean}} || Not Applicable state&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Inspection Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''INSPECTION_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_INSPECTION_TASK]]&lt;br /&gt;
&lt;br /&gt;
An Inspection Task captures a Boolean inspection result. The client presents a positive and a negative option as well as ''Not Applicable''. Selecting an option completes the task.&lt;br /&gt;
&lt;br /&gt;
The labels for the positive and negative outcomes can be configured. Selecting the negative outcome displays the configured false label.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Selected inspection result&lt;br /&gt;
|-&lt;br /&gt;
| LABEL_TRUE || {{String}} || Label for the positive outcome&lt;br /&gt;
|-&lt;br /&gt;
| LABEL_FALSE || {{String}} || Label for the negative outcome&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Finished Inspection Task UWP.png|Finished Inspection Task (WinX)&lt;br /&gt;
File:Inspection task android.jpg|Finished Inspection Task (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Interface Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''INTERFACE_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_CHECK_TASK]]&lt;br /&gt;
&lt;br /&gt;
An Interface Task waits for another software system to provide its completion value. The task is complete when its Boolean '''VALUE''' becomes true. If the client is offline, the task waits until connectivity and synchronization are available again.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task completion supplied by the external software system&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Joint Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''JOINT_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_JOINTTASK]]&lt;br /&gt;
&lt;br /&gt;
A Joint Task documents the state of a linked joint location. The user selects one of the available Joint States.&lt;br /&gt;
&lt;br /&gt;
'''Relevant properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| LK_JOINT_LOCATION || Link to the associated joint location&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || Selected Joint State&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The available states are:&lt;br /&gt;
&lt;br /&gt;
* Closed&lt;br /&gt;
* Disconnected&lt;br /&gt;
* Open&lt;br /&gt;
* Planned&lt;br /&gt;
* Reconnected&lt;br /&gt;
* Torqued&lt;br /&gt;
* Undefined&lt;br /&gt;
* Verified&lt;br /&gt;
&lt;br /&gt;
The Joint Task is complete when its state is '''Planned''' or '''Closed'''.&lt;br /&gt;
&lt;br /&gt;
=== Measurement Task ===&lt;br /&gt;
&lt;br /&gt;
Technical classification name: '''MROCLS_MRO_MEASUREMENT_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_MEASUREMENT_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Measurement Task records a measured Double value, for example a value read from a pressure gauge. Selecting the displayed value opens an editor. If no value has been entered, the editor initially displays an empty value. Entering a value or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
An optional secondary value indicator can display a previously recorded value. Its behaviour has to be configured separately.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Double}} || Currently recorded measurement&lt;br /&gt;
|-&lt;br /&gt;
| PREVIOUS_VALUE || {{Double}} || Previously recorded measurement&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Measurment Task Empty UWP.png|Measurement Task without a recorded value (WinX)&lt;br /&gt;
File:Measurment Task Not Empty UWP.png|Measurement Task with a recorded value (WinX)&lt;br /&gt;
File:Measurment Task Empty Android.jpg|Measurement Task without a recorded value (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Numeric Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''NUMERIC_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_NUMERIC_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Numeric Task records a Double value, for example a value read from a temperature sensor. Entering a value or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
The value is compared against a configured acceptable range that cannot be edited on the client. A value outside the range produces visual feedback and sets the [[MRO Objects (Client)#Technical Status|technical status]] to indicate an issue. An invalid configured range, such as a minimum greater than the maximum, also produces an issue when a value is entered.&lt;br /&gt;
&lt;br /&gt;
A value unit can be configured for an individual task. When present, it overrides the standard unit configured on the [[MetaProperty#Unit_Item|MetaProperty]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Double}} || Recorded numeric value&lt;br /&gt;
|-&lt;br /&gt;
| VALUE_UNIT || {{String}} || Instance-specific value unit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Pick List Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PICKLIST_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_PICK_LIST_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Pick List Task allows the user to select one value from an [[UBIK Active Lists|Active List]] configured on the task instance. It behaves similarly to a standard Integer Task with a Selective List, but the selectable values are supplied by the Active List rather than being defined globally.&lt;br /&gt;
&lt;br /&gt;
Every list item has an Integer value. Selecting an item or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Integer}} || Value of the selected Active List item&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Picture Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PICTURE_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_PICTURE_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Picture Task is a Boolean task that can only be finished when it has at least one child document containing a valid file. Multiple child documents can be attached. Although pictures are the most common files, the child document can contain another file type.&lt;br /&gt;
&lt;br /&gt;
The clients display a file or photo button next to the task checkbox. The task cannot be completed through the checkbox until the file requirement is satisfied. Selecting ''Not Applicable'' is always possible and bypasses the child-document requirement.&lt;br /&gt;
&lt;br /&gt;
When the user attempts to finish the task while online, the client may first synchronize the task's child objects and download the files of its child documents. During synchronization, the checkbox is replaced by a wait indicator.&lt;br /&gt;
&lt;br /&gt;
* If no child document or no local file is available, the task remains unfinished and the user is informed.&lt;br /&gt;
* If at least one child document with a valid local file is available, the task is finished and the file or photo button is disabled.&lt;br /&gt;
&lt;br /&gt;
Child-count information can be configured but is not required. WinX can display the child documents in an expander. This is not shown by default on Mobile due to the available screen size, but it can be customized using [[Object_hierarchy_in_XAML:_NextLevel,_ParentLevel,_LinkedLevel#Show_NextLevel_Children.2FDocuments|Show NextLevel Children/Documents]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task completion&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Progress Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PROGRESS_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_PROGRESS_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Progress Task reports progress between 0% and 100%. The reported value contributes to the progress of the owning Work Package. Values below 100% represent partial progress; the task is finished only when the reported progress reaches 100%. It can alternatively be completed using ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Double}} || Currently reported progress&lt;br /&gt;
|-&lt;br /&gt;
| PREVIOUS_VALUE || {{Double}} || Previously reported progress&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
An [[MRO_PROGRESS_TASK_EDITOR|alternative editor]] is available for Progress Tasks.{{Version/WinXSince|2.5.4}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Progress Task UWP.png|Progress Task with reported progress (WinX)&lt;br /&gt;
File:Progress Task Android.jpg|Progress Task with current and previous progress (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Signature Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SIGNATURE_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_SIGNATURE_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Signature Task is completed by capturing a handwritten signature. Selecting the signature editor opens an in-app dialog in which the user can sign. Confirming the signature saves it and automatically completes the task.&lt;br /&gt;
&lt;br /&gt;
When signing while online, the server resolves and displays the signee and generates the validation timestamp. When signing offline, the signee is resolved and displayed once the client is online again. If the complete signee or validation timestamp cannot be displayed in the editor field, selecting the field opens a popup with the complete information.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || Signature || Captured signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Supervisor Check Task {{Version/XamarinSince|4.8}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SUPERVISOR_CHECK_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_SUPERVISOR_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Supervisor Check Task applies the four-eyes principle to a Boolean [[#Check Task|Check Task]] on one device. The worker hands the device to a supervisor. The supervisor scans an NFC tag and enters the supervisor PIN. After successful authentication, the checkbox is enabled and must still be selected to finish the task.&lt;br /&gt;
&lt;br /&gt;
Selecting ''Not Applicable'' does not require supervisor authentication.&lt;br /&gt;
&lt;br /&gt;
Successful supervisor authentication removes only the supervisor-related lock. The task can remain locked for another reason, such as sequential dependencies or user rights. If an incorrect PIN is entered three times, authentication is cancelled and the NFC tag has to be scanned again. A setting controls [[RFID tags#Choose which information to use from a tag|which tag information is used]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || [[#Check Task|Check Task]] completion&lt;br /&gt;
|-&lt;br /&gt;
| SUPERVISOR || {{Guid}} || Authenticated supervisor&lt;br /&gt;
|-&lt;br /&gt;
| PERMISSION || {{String}} || Required supervisor permission&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=300px heights=300px&amp;gt;&lt;br /&gt;
File:UI_Xamarin_Supervisor_Task_Before_Verification.jpg|Supervisor Check Task before verification&lt;br /&gt;
File:UI_Xamarin_Supervisor_Task_Enter_PIN.jpg|Supervisor PIN entry&lt;br /&gt;
File:UI_Xamarin_Supervisor_Task_After_Verification.jpg|Supervisor Check Task after verification&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Switch End Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SWITCH_END_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_SWITCH_END_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Switch End Task marks the point at which the two branches created by a [[#Switch Start Task|Switch Start Task]] merge again. It is linked to exactly one corresponding [[#Switch Start Task|Switch Start Task]]. It is not shown to the user and completes automatically after the selected branch has finished, allowing the common Procedure workflow to continue.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task completion&lt;br /&gt;
|-&lt;br /&gt;
| LK_SWITCH_START_TASK || {{Guid}} || Link to the corresponding [[#Switch Start Task|Switch Start Task]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
See also [[#Procedure Task Variants and Workflow Execution|Procedure Task Variants and Workflow Execution]].&lt;br /&gt;
&lt;br /&gt;
=== Switch Start Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SWITCH_START_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_SWITCH_START_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Switch Start Task is a sequential workflow-control task used in a Procedure Workpackage. It automatically evaluates a Boolean expression on the client and selects either the true or false branch. Each branch represents a different path of Tasks and must lead to a corresponding [[#Switch End Task|Switch End Task]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| EXPRESSION || {{String}} || Expression evaluated by the client&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Integer}} || Evaluation state: Undefined = 0, Pending = 10, Finished = 20, Error = 30&lt;br /&gt;
|-&lt;br /&gt;
| BRANCH_TRUE || {{Guid}} || Link to the Task or Task Owner that starts the true branch&lt;br /&gt;
|-&lt;br /&gt;
| BRANCH_FALSE || {{Guid}} || Link to the Task or Task Owner that starts the false branch&lt;br /&gt;
|-&lt;br /&gt;
| DISPLAYSTRING_TRUE || {{String}} || Display string for a true result&lt;br /&gt;
|-&lt;br /&gt;
| DISPLAYSTRING_FALSE || {{String}} || Display string for a false result&lt;br /&gt;
|-&lt;br /&gt;
| EVALUATION_RESULT || {{Boolean}} || Result of the evaluated expression&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
After evaluation, only the selected branch is executed. The other branch remains hidden and its Procedure Tasks are set to ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
See also [[#Procedure Task Variants and Workflow Execution|Procedure Task Variants and Workflow Execution]].&lt;br /&gt;
&lt;br /&gt;
=== Text Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''TEXT_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_TEXT_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Text Task allows the user to enter free-form text. Entering a value or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{String}} || Entered text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Supervisor Base Type {{Version/XamarinSince|4.8}} ==&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SUPERVISOR_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_SUPERVISOR_TASK]]&lt;br /&gt;
&lt;br /&gt;
Supervisor Task is a base type that provides supervisor authentication behaviour. It is not used as a standalone user task. The concrete task type using this behaviour is [[#Supervisor Check Task|Supervisor Check Task]].&lt;br /&gt;
&lt;br /&gt;
== Procedure Task Variants and Workflow Execution {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ==&lt;br /&gt;
&lt;br /&gt;
{{Hint|For the complete list of base task types and their task-specific behaviour, see [[#MRO Task Types|MRO Task Types]].}}&lt;br /&gt;
&lt;br /&gt;
Procedure variants are specialized versions of task types for use within Procedure Workpackages. They retain the behaviour of their corresponding task type and additionally implement the [[MROCLS_SEQUENTIALTASK|Sequential Task]] and [[MROCLS_GROUPEDTASK|Grouped Task]] classifications.&lt;br /&gt;
&lt;br /&gt;
Procedure variants are available for:&lt;br /&gt;
&lt;br /&gt;
* [[#Calculation Task|Calculation Task]]&lt;br /&gt;
* [[#Check Task|Check Task]]&lt;br /&gt;
* [[#Inspection Task|Inspection Task]]&lt;br /&gt;
* [[#Interface Task|Interface Task]]&lt;br /&gt;
* [[#Numeric Task|Numeric Task]]&lt;br /&gt;
* [[#Pick List Task|Pick List Task]]&lt;br /&gt;
* [[#Picture Task|Picture Task]]&lt;br /&gt;
* [[#Signature Task|Signature Task]]&lt;br /&gt;
* [[#Supervisor Check Task|Supervisor Check Task]]&lt;br /&gt;
* [[#Text Task|Text Task]]&lt;br /&gt;
&lt;br /&gt;
[[#Switch Start Task|Switch Start Tasks]], [[#Switch End Task|Switch End Tasks]], and [[#Calculation Task|Calculation Tasks]] provide automatic workflow-control behaviour in a Procedure Workpackage.&lt;br /&gt;
&lt;br /&gt;
For automatic [[#Calculation Task|Calculation Tasks]] and [[#Switch Start Task|Switch Start Tasks]], the clients display an evaluation indicator:&lt;br /&gt;
&lt;br /&gt;
* '''Finished:''' The Task was automatically evaluated successfully.&lt;br /&gt;
* '''Error:''' The Task was evaluated but resulted in an error.&lt;br /&gt;
* '''Pending:''' The Task has not yet been evaluated. No additional indicator is displayed for this state.&lt;br /&gt;
&lt;br /&gt;
When a predecessor [[#Switch Start Task|Switch Start Task]] has not yet finished, its follow-up Procedure Tasks are hidden because the relevant branch is not yet known. After evaluation, the selected branch becomes visible. The other branch remains hidden, is not executed, and its Procedure Tasks are set to ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
For example, several predecessor [[#Numeric Task|Numeric Tasks]] can record temperatures from different parts of an equipment. A subsequent [[#Calculation Task|Calculation Task]] can calculate their average. A [[#Switch Start Task|Switch Start Task]] can then select a branch based on whether the average exceeds a configured temperature. One branch can contain a Task for activating a cooling mechanism, while the other branch can lead directly to the [[#Switch End Task|Switch End Task]] or contain further [[#Switch Start Task|Switch Tasks]].&lt;br /&gt;
&lt;br /&gt;
Procedure Tasks are intended to execute automatically when their predecessors are finished. However, the completion of the predecessor has to be triggered by a user. If a predecessor becomes finished only because of a server update, the follow-up Procedure workflow is not triggered. This prevents a workflow from executing in the name of users who did not initiate or observe the completion.&lt;br /&gt;
&lt;br /&gt;
The general online and offline evaluation rules for sequential and grouped Tasks are documented in [[MRO Objects (Client)#Sequential Task|Sequential Task]] and [[MRO Objects (Client)#Grouped Task|Grouped Task]].&lt;br /&gt;
&lt;br /&gt;
== Supporting File Documents ==&lt;br /&gt;
&lt;br /&gt;
=== Procedure JSON File Document ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''FILEDOCUMENT_MRO_JSON'''&lt;br /&gt;
&lt;br /&gt;
This File Document stores the JSON definition of a [[#Procedure Workpackage|Procedure Workpackage]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| LK_PROCEDURE_WORKPACKAGE || {{Guid}} || Link to the associated [[#Procedure Workpackage|Procedure Workpackage]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Picture Task File Document ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''FILEDOCUMENT_MRO_PICTURE_TASK'''&lt;br /&gt;
&lt;br /&gt;
This is a dedicated File Document linked to a [[#Picture Task|Picture Task]]. A [[#Picture Task|Picture Task]] can also use another child-document type, provided that the child document contains a valid file.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| LK_PICTURE_TASK || {{Guid}} || Link to the associated [[#Picture Task|Picture Task]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[MRO Objects (Client)]]&lt;br /&gt;
* [[MROCLS_MRO_TASKOWNER]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_WORKPACKAGE]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_PROGRESS_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_MEASUREMENT_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_CHECK_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_INSPECTION_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_SEQUENTIALTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_GROUPEDTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_PROCEDURE]] (Classification)&lt;br /&gt;
* [[MROCLS_SWITCH_START_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_SWITCH_END_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_CALCULATION_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_PICK_LIST_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_PICTURE_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_BLINDINGTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_COMMISSIONINGCHECK]] (Classification)&lt;br /&gt;
* [[MROCLS_JOINTTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_SIGNATURE_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_TEXT_TASK]] (Classification)&lt;br /&gt;
&lt;br /&gt;
[[Category:Module|MRO (Plugin)]]&lt;br /&gt;
[[Category:Android|MRO (Plugin)]]&lt;br /&gt;
[[Category:Mobile|MRO (Plugin)]]&lt;br /&gt;
[[Category:Client|MRO (Plugin)]]&lt;br /&gt;
[[Category:WinX|MRO (Plugin)]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MROCLS_SIGNATURE_TASK&amp;diff=30466</id>
		<title>MROCLS SIGNATURE TASK</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MROCLS_SIGNATURE_TASK&amp;diff=30466"/>
				<updated>2026-08-18T12:47:09Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: Created page with &amp;quot;{{ClassificationInfoBox | title = Signature Task classification | name = {{PAGENAMEE}} | inheritance = MROCLS_MRO_TASK#Task | namespace = UBIK.MRO.Classification | purpose...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ClassificationInfoBox&lt;br /&gt;
| title = Signature Task classification&lt;br /&gt;
| name = {{PAGENAMEE}}&lt;br /&gt;
| inheritance = [[MROCLS_MRO_TASK#Task]]&lt;br /&gt;
| namespace = UBIK.MRO.Classification&lt;br /&gt;
| purpose = Classify objects as Signature Tasks&lt;br /&gt;
| version = 5.2.0+&lt;br /&gt;
| id = {37CC32F9-0113-4AF1-8A02-E21F5E7472F0}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
A [[MRO_Objects_(Client)#Signature_Task|Signature Task]] object is an {{UBIK}} content object which is used to document work by providing a signature.&lt;br /&gt;
&lt;br /&gt;
== MetaProperties ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=50%&lt;br /&gt;
|-&lt;br /&gt;
! width=30% | Name !! width=30% | Data type !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| ''VALUE'' || Signature || The signature entered for the task&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[MROCLS_MRO_TASK#Task]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_MEASUREMENT_TASK#Measurement Task]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_CHECK_TASK#Check Task]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_INSPECTION_TASK#Inspection Task]] (Classification)&lt;br /&gt;
* [[MRO_Objects_(Client)#Signature_Task]]&lt;br /&gt;
* [[MRO_(Plugin)#Signature_Task]]&lt;br /&gt;
* [[MROCLS_PROCEDURE#Procedure Workpackage]] (Classification)&lt;br /&gt;
* [[MROCLS_CALCULATION_TASK#Calculation Task]] (Classification)&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MROCLS_TEXT_TASK&amp;diff=30465</id>
		<title>MROCLS TEXT TASK</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MROCLS_TEXT_TASK&amp;diff=30465"/>
				<updated>2026-08-18T12:46:44Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: Created page with &amp;quot;{{ClassificationInfoBox | title = Text Task classification | name = {{PAGENAMEE}} | inheritance = MROCLS_MRO_TASK#Task | namespace = UBIK.MRO.Classification | purpose = Cl...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ClassificationInfoBox&lt;br /&gt;
| title = Text Task classification&lt;br /&gt;
| name = {{PAGENAMEE}}&lt;br /&gt;
| inheritance = [[MROCLS_MRO_TASK#Task]]&lt;br /&gt;
| namespace = UBIK.MRO.Classification&lt;br /&gt;
| purpose = Classify objects as Text Tasks&lt;br /&gt;
| version = 5.2.0+&lt;br /&gt;
| id = {6042083C-54A2-434C-8318-2CFC8A2BCEE2}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
A [[MRO_Objects_(Client)#Text_Task|Text Task]] object is an {{UBIK}} content object which is used to document work by entering text.&lt;br /&gt;
&lt;br /&gt;
== MetaProperties ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=50%&lt;br /&gt;
|-&lt;br /&gt;
! width=30% | Name !! width=30% | Data type !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| ''VALUE'' || {{String}} || The text entered for the task&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[MROCLS_MRO_TASK#Task]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_MEASUREMENT_TASK#Measurement Task]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_CHECK_TASK#Check Task]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_INSPECTION_TASK#Inspection Task]] (Classification)&lt;br /&gt;
* [[MRO_Objects_(Client)#Text_Task]]&lt;br /&gt;
* [[MRO_(Plugin)#Text_Task]]&lt;br /&gt;
* [[MROCLS_PROCEDURE#Procedure Workpackage]] (Classification)&lt;br /&gt;
* [[MROCLS_CALCULATION_TASK#Calculation Task]] (Classification)&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_(Plugin)&amp;diff=30464</id>
		<title>MRO (Plugin)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_(Plugin)&amp;diff=30464"/>
				<updated>2026-08-18T09:38:17Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The MRO plugin provides a set of {{UBIK}} objects for representing and documenting maintenance, repair and operations work. The MRO features are available in the supported Mobile and {{UBIK WinX}} clients.&lt;br /&gt;
&lt;br /&gt;
This page is the main documentation for the MRO object model and its task types. Common client behaviour, such as status indicators, locking, and the general evaluation of sequential and grouped tasks, is documented in [[MRO Objects (Client)]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Page !! Scope&lt;br /&gt;
|-&lt;br /&gt;
| '''MRO (Plugin)''' || MRO concepts, task types, task-specific behaviour, and relevant technical properties&lt;br /&gt;
|-&lt;br /&gt;
| [[MRO Objects (Client)]] || Common client presentation, status indicators, locking, and behaviour shared by multiple MRO objects&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Basic Features ==&lt;br /&gt;
&lt;br /&gt;
Objects classified as MRO objects generally provide a technical and organisational status as well as an overall work progress based on their underlying data branch.&lt;br /&gt;
&lt;br /&gt;
=== Technical Status ===&lt;br /&gt;
&lt;br /&gt;
For detailed information, see [[MRO Objects (Client)#Technical Status|Technical Status]].&lt;br /&gt;
&lt;br /&gt;
=== Organisational Status ===&lt;br /&gt;
&lt;br /&gt;
For detailed information, see [[MRO Objects (Client)#Organisational Status|Organisational Status]].&lt;br /&gt;
&lt;br /&gt;
=== Work Progress ===&lt;br /&gt;
&lt;br /&gt;
For detailed information, see [[MRO Objects (Client)#Work Progress|Work Progress]].&lt;br /&gt;
&lt;br /&gt;
== MRO Objects ==&lt;br /&gt;
&lt;br /&gt;
MRO uses Task Owners, Work Packages, Tasks, and Procedure Workpackages to represent maintenance workflows.&lt;br /&gt;
&lt;br /&gt;
=== Task Owner ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_TASKOWNER|Task Owner]] is an object with an underlying structure of work to be performed. It can contain other Task Owners or Work Packages. Their technical status, organisational status, and work progress are accumulated and reported to the Task Owner.&lt;br /&gt;
&lt;br /&gt;
=== Work Package ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_WORKPACKAGE|Work Package]] collects and summarizes Task Owners, other Work Packages, or Tasks. A Work Package can be confirmed when all associated Tasks have reached the required progress and all subordinate Work Packages have been confirmed.&lt;br /&gt;
&lt;br /&gt;
For Work Package presentation and confirmation in the clients, see [[MRO Objects (Client)#Work Package|Work Package]].&lt;br /&gt;
&lt;br /&gt;
=== Task ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_TASK|Task]] reports work progress to its owning Work Package. The available task types provide different input, validation, or automatic workflow behaviour.&lt;br /&gt;
&lt;br /&gt;
MRO task values must be validated for work progress to be calculated. A MetaAttribute providing a validation timestamp must therefore be attached to the relevant MetaProperty.&lt;br /&gt;
&lt;br /&gt;
{{Attention|A task value property has to use [[Attributes]] so that its value can be validated. Otherwise, work progress cannot be calculated.}}&lt;br /&gt;
&lt;br /&gt;
All user-editable MRO task types can be set to ''Not Applicable''. In the clients, a completed user-editable task can be reset by selecting ''Not Applicable'' twice. General client behaviour is documented in [[MRO Objects (Client)#Task|Task]].&lt;br /&gt;
&lt;br /&gt;
=== Procedure Workpackage ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PROCEDURE_WORKPACKAGE'''&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_PROCEDURE|Procedure Workpackage]] is a specialized Work Package for structured workflows. Its structure is defined in JSON using a workflow editor and can contain Tasks as well as subordinate Procedure Workpackages. Depending on its state, the corresponding objects are created or updated.&lt;br /&gt;
&lt;br /&gt;
Procedure Workpackages can use [[MRO Objects (Client)#Sequential Task|sequential execution]], [[MRO Objects (Client)#Grouped Task|grouped Tasks]], [[#Switch Start Task|branching]], [[#Calculation Task|calculations]], and references to linked data. Their workflows support online and offline use. Steps that require data exchange wait until connectivity is available.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| PROCEDURE_STATUS || {{Integer}} || Current state: Draft = 10, ReadyToUse = 20, Published = 30, Open = 40, Executing = 50, Completed = 60, Approved = 70, Rejected = 80&lt;br /&gt;
|-&lt;br /&gt;
| JSON || {{String}} || JSON representation of the Procedure Workpackage&lt;br /&gt;
|-&lt;br /&gt;
| ISTEMPLATE || {{Boolean}} || Indicates whether the Procedure Workpackage is a template&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MRO Task Types ==&lt;br /&gt;
&lt;br /&gt;
The following task types are available in MRO. The technical object names are included to make the task types discoverable through the wiki search.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Task type !! Technical object name !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| [[#Blinding Task|Blinding Task]] || BLINDING_TASK || Documents a blinding or deblinding operation&lt;br /&gt;
|-&lt;br /&gt;
| [[#Calculation Task|Calculation Task]] || CALCULATION_TASK || Evaluates an expression and writes its result to a target property&lt;br /&gt;
|-&lt;br /&gt;
| [[#Check Task|Check Task]] || CHECK_TASK || Confirms a Boolean task using a checkbox&lt;br /&gt;
|-&lt;br /&gt;
| [[#Commissioning Task|Commissioning Task]] || COMMISSIONING_TASK || Represents a task in an MRO commissioning workflow&lt;br /&gt;
|-&lt;br /&gt;
| [[#Inspection Task|Inspection Task]] || INSPECTION_TASK || Records a Boolean inspection result with configurable labels&lt;br /&gt;
|-&lt;br /&gt;
| [[#Interface Task|Interface Task]] || INTERFACE_TASK || Waits for completion information from another software system&lt;br /&gt;
|-&lt;br /&gt;
| [[#Joint Task|Joint Task]] || JOINT_TASK || Documents the state of a joint location&lt;br /&gt;
|-&lt;br /&gt;
| [[#Measurement Task|Measurement Task]] || MROCLS_MRO_MEASUREMENT_TASK || Records a measured Double value&lt;br /&gt;
|-&lt;br /&gt;
| [[#Numeric Task|Numeric Task]] || NUMERIC_TASK || Records a numeric value and evaluates it against a configured range&lt;br /&gt;
|-&lt;br /&gt;
| [[#Pick List Task|Pick List Task]] || PICKLIST_TASK || Selects one integer value from an instance-specific Active List&lt;br /&gt;
|-&lt;br /&gt;
| [[#Picture Task|Picture Task]] || PICTURE_TASK || Requires at least one child document containing a valid file&lt;br /&gt;
|-&lt;br /&gt;
| [[#Progress Task|Progress Task]] || PROGRESS_TASK || Reports progress between 0% and 100%&lt;br /&gt;
|-&lt;br /&gt;
| [[#Signature Task|Signature Task]] || SIGNATURE_TASK || Captures a handwritten signature&lt;br /&gt;
|-&lt;br /&gt;
| [[#Supervisor Check Task|Supervisor Check Task]] || SUPERVISOR_CHECK_TASK || Applies the four-eyes principle to a [[#Check Task|Check Task]]&lt;br /&gt;
|-&lt;br /&gt;
| [[#Switch End Task|Switch End Task]] || SWITCH_END_TASK || Rejoins the branches of a Procedure workflow&lt;br /&gt;
|-&lt;br /&gt;
| [[#Switch Start Task|Switch Start Task]] || SWITCH_START_TASK || Selects a Procedure branch by evaluating a Boolean expression&lt;br /&gt;
|-&lt;br /&gt;
| [[#Text Task|Text Task]] || TEXT_TASK || Records free-form text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Hint|For the available Procedure variants and their workflow execution, see [[#Procedure Task Variants and Workflow Execution|Procedure Tasks]].}}&lt;br /&gt;
&lt;br /&gt;
=== Blinding Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''BLINDING_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_BLINDINGTASK]]&lt;br /&gt;
&lt;br /&gt;
A Blinding Task documents either a blinding or deblinding operation at a linked blinding location. The configured operation type determines the state that must be reported to complete the task.&lt;br /&gt;
&lt;br /&gt;
'''Relevant properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| BLINDING_TYPE || Configured operation type: Blinding or DeBlinding&lt;br /&gt;
|-&lt;br /&gt;
| LK_BLINDING_LOCATION || Link to the associated blinding location&lt;br /&gt;
|-&lt;br /&gt;
| LK_PREVIOUS_TASK || Link to the preceding Blinding Task&lt;br /&gt;
|-&lt;br /&gt;
| LOCKED || Prevents the task from being edited&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || Reported blinding state&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The task is complete only when '''VALUE''' matches the configured '''BLINDING_TYPE'''.&lt;br /&gt;
&lt;br /&gt;
=== Calculation Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''CALCULATION_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_CALCULATION_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Calculation Task automatically evaluates a predefined expression on the client and writes the result to a configured property on its owner. No user input is required.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| EXPRESSION || {{String}} || Expression evaluated by the client&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Integer}} || Evaluation state: Undefined = 0, Pending = 10, Finished = 20, Error = 30&lt;br /&gt;
|-&lt;br /&gt;
| TARGET_PROPERTY_NAME || {{String}} || Name of the target property on the owner&lt;br /&gt;
|-&lt;br /&gt;
| TARGET_PROPERTY_TYPE || {{Integer}} || Target type: Undefined = 0, Boolean = 1, Integer = 3, Double = 4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The task is automatically finished after successful evaluation. The clients display an indicator for a successful evaluation or an evaluation error. A Pending state does not receive an additional indicator.&lt;br /&gt;
&lt;br /&gt;
See also [[#Procedure Task Variants and Workflow Execution|Procedure Task Variants and Workflow Execution]].&lt;br /&gt;
&lt;br /&gt;
=== Check Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''CHECK_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_CHECK_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Check Task is a simple Boolean task represented by a checkbox. Clicking the checkbox sets its value and completes the task. It can alternatively be completed using ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task value and completion&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Check Task finished UWP.png|Check Task (WinX)&lt;br /&gt;
File:Check Task android.jpg|Not Applicable Check Task (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Commissioning Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''COMMISSIONING_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_COMMISSIONINGCHECK]]&lt;br /&gt;
&lt;br /&gt;
A Commissioning Task is a specialized task type used in MRO commissioning workflows.&lt;br /&gt;
&lt;br /&gt;
'''Relevant property'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| NOTAPPLICABLE || {{Boolean}} || Not Applicable state&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Inspection Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''INSPECTION_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_INSPECTION_TASK]]&lt;br /&gt;
&lt;br /&gt;
An Inspection Task captures a Boolean inspection result. The client presents a positive and a negative option as well as ''Not Applicable''. Selecting an option completes the task.&lt;br /&gt;
&lt;br /&gt;
The labels for the positive and negative outcomes can be configured. Selecting the negative outcome displays the configured false label.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Selected inspection result&lt;br /&gt;
|-&lt;br /&gt;
| LABEL_TRUE || {{String}} || Label for the positive outcome&lt;br /&gt;
|-&lt;br /&gt;
| LABEL_FALSE || {{String}} || Label for the negative outcome&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Finished Inspection Task UWP.png|Finished Inspection Task (WinX)&lt;br /&gt;
File:Inspection task android.jpg|Finished Inspection Task (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Interface Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''INTERFACE_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_CHECK_TASK]]&lt;br /&gt;
&lt;br /&gt;
An Interface Task waits for another software system to provide its completion value. The task is complete when its Boolean '''VALUE''' becomes true. If the client is offline, the task waits until connectivity and synchronization are available again.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task completion supplied by the external software system&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Joint Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''JOINT_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_JOINTTASK]]&lt;br /&gt;
&lt;br /&gt;
A Joint Task documents the state of a linked joint location. The user selects one of the available Joint States.&lt;br /&gt;
&lt;br /&gt;
'''Relevant properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| LK_JOINT_LOCATION || Link to the associated joint location&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || Selected Joint State&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The available states are:&lt;br /&gt;
&lt;br /&gt;
* Closed&lt;br /&gt;
* Disconnected&lt;br /&gt;
* Open&lt;br /&gt;
* Planned&lt;br /&gt;
* Reconnected&lt;br /&gt;
* Torqued&lt;br /&gt;
* Undefined&lt;br /&gt;
* Verified&lt;br /&gt;
&lt;br /&gt;
The Joint Task is complete when its state is '''Planned''' or '''Closed'''.&lt;br /&gt;
&lt;br /&gt;
=== Measurement Task ===&lt;br /&gt;
&lt;br /&gt;
Technical classification name: '''MROCLS_MRO_MEASUREMENT_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_MEASUREMENT_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Measurement Task records a measured Double value, for example a value read from a pressure gauge. Selecting the displayed value opens an editor. If no value has been entered, the editor initially displays an empty value. Entering a value or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
An optional secondary value indicator can display a previously recorded value. Its behaviour has to be configured separately.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Double}} || Currently recorded measurement&lt;br /&gt;
|-&lt;br /&gt;
| PREVIOUS_VALUE || {{Double}} || Previously recorded measurement&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Measurment Task Empty UWP.png|Measurement Task without a recorded value (WinX)&lt;br /&gt;
File:Measurment Task Not Empty UWP.png|Measurement Task with a recorded value (WinX)&lt;br /&gt;
File:Measurment Task Empty Android.jpg|Measurement Task without a recorded value (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Numeric Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''NUMERIC_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_NUMERIC_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Numeric Task records a Double value, for example a value read from a temperature sensor. Entering a value or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
The value is compared against a configured acceptable range that cannot be edited on the client. A value outside the range produces visual feedback and sets the [[MRO Objects (Client)#Technical Status|technical status]] to indicate an issue. An invalid configured range, such as a minimum greater than the maximum, also produces an issue when a value is entered.&lt;br /&gt;
&lt;br /&gt;
A value unit can be configured for an individual task. When present, it overrides the standard unit configured on the [[MetaProperty#Unit_Item|MetaProperty]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Double}} || Recorded numeric value&lt;br /&gt;
|-&lt;br /&gt;
| VALUE_UNIT || {{String}} || Instance-specific value unit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Pick List Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PICKLIST_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_PICK_LIST_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Pick List Task allows the user to select one value from an [[UBIK Active Lists|Active List]] configured on the task instance. It behaves similarly to a standard Integer Task with a Selective List, but the selectable values are supplied by the Active List rather than being defined globally.&lt;br /&gt;
&lt;br /&gt;
Every list item has an Integer value. Selecting an item or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Integer}} || Value of the selected Active List item&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Picture Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PICTURE_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_PICTURE_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Picture Task is a Boolean task that can only be finished when it has at least one child document containing a valid file. Multiple child documents can be attached. Although pictures are the most common files, the child document can contain another file type.&lt;br /&gt;
&lt;br /&gt;
The clients display a file or photo button next to the task checkbox. The task cannot be completed through the checkbox until the file requirement is satisfied. Selecting ''Not Applicable'' is always possible and bypasses the child-document requirement.&lt;br /&gt;
&lt;br /&gt;
When the user attempts to finish the task while online, the client may first synchronize the task's child objects and download the files of its child documents. During synchronization, the checkbox is replaced by a wait indicator.&lt;br /&gt;
&lt;br /&gt;
* If no child document or no local file is available, the task remains unfinished and the user is informed.&lt;br /&gt;
* If at least one child document with a valid local file is available, the task is finished and the file or photo button is disabled.&lt;br /&gt;
&lt;br /&gt;
Child-count information can be configured but is not required. WinX can display the child documents in an expander. This is not shown by default on Mobile due to the available screen size, but it can be customized using [[Object_hierarchy_in_XAML:_NextLevel,_ParentLevel,_LinkedLevel#Show_NextLevel_Children.2FDocuments|Show NextLevel Children/Documents]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task completion&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Progress Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PROGRESS_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_PROGRESS_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Progress Task reports progress between 0% and 100%. The reported value contributes to the progress of the owning Work Package. Values below 100% represent partial progress; the task is finished only when the reported progress reaches 100%. It can alternatively be completed using ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Double}} || Currently reported progress&lt;br /&gt;
|-&lt;br /&gt;
| PREVIOUS_VALUE || {{Double}} || Previously reported progress&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
An [[MRO_PROGRESS_TASK_EDITOR|alternative editor]] is available for Progress Tasks.{{Version/WinXSince|2.5.4}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Progress Task UWP.png|Progress Task with reported progress (WinX)&lt;br /&gt;
File:Progress Task Android.jpg|Progress Task with current and previous progress (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Signature Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SIGNATURE_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_SIGNATURE_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Signature Task is completed by capturing a handwritten signature. Selecting the signature editor opens an in-app dialog in which the user can sign. Confirming the signature saves it and automatically completes the task.&lt;br /&gt;
&lt;br /&gt;
When signing while online, the server resolves and displays the signee and generates the validation timestamp. When signing offline, the signee is resolved and displayed once the client is online again. If the complete signee or validation timestamp cannot be displayed in the editor field, selecting the field opens a popup with the complete information.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || Signature || Captured signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Supervisor Check Task {{Version/XamarinSince|4.8}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SUPERVISOR_CHECK_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_SUPERVISOR_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Supervisor Check Task applies the four-eyes principle to a Boolean [[#Check Task|Check Task]] on one device. The worker hands the device to a supervisor. The supervisor scans an NFC tag and enters the supervisor PIN. After successful authentication, the checkbox is enabled and must still be selected to finish the task.&lt;br /&gt;
&lt;br /&gt;
Selecting ''Not Applicable'' does not require supervisor authentication.&lt;br /&gt;
&lt;br /&gt;
Successful supervisor authentication removes only the supervisor-related lock. The task can remain locked for another reason, such as sequential dependencies or user rights. If an incorrect PIN is entered three times, authentication is cancelled and the NFC tag has to be scanned again. A setting controls [[RFID tags#Choose which information to use from a tag|which tag information is used]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || [[#Check Task|Check Task]] completion&lt;br /&gt;
|-&lt;br /&gt;
| SUPERVISOR || {{Guid}} || Authenticated supervisor&lt;br /&gt;
|-&lt;br /&gt;
| PERMISSION || {{String}} || Required supervisor permission&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=300px heights=300px&amp;gt;&lt;br /&gt;
File:UI_Xamarin_Supervisor_Task_Before_Verification.jpg|Supervisor Check Task before verification&lt;br /&gt;
File:UI_Xamarin_Supervisor_Task_Enter_PIN.jpg|Supervisor PIN entry&lt;br /&gt;
File:UI_Xamarin_Supervisor_Task_After_Verification.jpg|Supervisor Check Task after verification&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Switch End Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SWITCH_END_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_SWITCH_END_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Switch End Task marks the point at which the two branches created by a [[#Switch Start Task|Switch Start Task]] merge again. It is linked to exactly one corresponding [[#Switch Start Task|Switch Start Task]]. It is not shown to the user and completes automatically after the selected branch has finished, allowing the common Procedure workflow to continue.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task completion&lt;br /&gt;
|-&lt;br /&gt;
| LK_SWITCH_START_TASK || {{Guid}} || Link to the corresponding [[#Switch Start Task|Switch Start Task]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
See also [[#Procedure Task Variants and Workflow Execution|Procedure Task Variants and Workflow Execution]].&lt;br /&gt;
&lt;br /&gt;
=== Switch Start Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SWITCH_START_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_SWITCH_START_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Switch Start Task is a sequential workflow-control task used in a Procedure Workpackage. It automatically evaluates a Boolean expression on the client and selects either the true or false branch. Each branch represents a different path of Tasks and must lead to a corresponding [[#Switch End Task|Switch End Task]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| EXPRESSION || {{String}} || Expression evaluated by the client&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Integer}} || Evaluation state: Undefined = 0, Pending = 10, Finished = 20, Error = 30&lt;br /&gt;
|-&lt;br /&gt;
| BRANCH_TRUE || {{Guid}} || Link to the Task or Task Owner that starts the true branch&lt;br /&gt;
|-&lt;br /&gt;
| BRANCH_FALSE || {{Guid}} || Link to the Task or Task Owner that starts the false branch&lt;br /&gt;
|-&lt;br /&gt;
| DISPLAYSTRING_TRUE || {{String}} || Display string for a true result&lt;br /&gt;
|-&lt;br /&gt;
| DISPLAYSTRING_FALSE || {{String}} || Display string for a false result&lt;br /&gt;
|-&lt;br /&gt;
| EVALUATION_RESULT || {{Boolean}} || Result of the evaluated expression&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
After evaluation, only the selected branch is executed. The other branch remains hidden and its Procedure Tasks are set to ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
See also [[#Procedure Task Variants and Workflow Execution|Procedure Task Variants and Workflow Execution]].&lt;br /&gt;
&lt;br /&gt;
=== Text Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''TEXT_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_TEXT_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Text Task allows the user to enter free-form text. Entering a value or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{String}} || Entered text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Supervisor Base Type {{Version/XamarinSince|4.8}} ==&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SUPERVISOR_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_SUPERVISOR_TASK]]&lt;br /&gt;
&lt;br /&gt;
Supervisor Task is a base type that provides supervisor authentication behaviour. It is not used as a standalone user task. The concrete task type using this behaviour is [[#Supervisor Check Task|Supervisor Check Task]].&lt;br /&gt;
&lt;br /&gt;
== Procedure Task Variants and Workflow Execution {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ==&lt;br /&gt;
&lt;br /&gt;
{{Hint|For the complete list of base task types and their task-specific behaviour, see [[#MRO Task Types|MRO Task Types]].}}&lt;br /&gt;
&lt;br /&gt;
Procedure variants are specialized versions of task types for use within Procedure Workpackages. They retain the behaviour of their corresponding task type and additionally implement the [[MROCLS_SEQUENTIALTASK|Sequential Task]] and [[MROCLS_GROUPEDTASK|Grouped Task]] classifications.&lt;br /&gt;
&lt;br /&gt;
Procedure variants are available for:&lt;br /&gt;
&lt;br /&gt;
* [[#Calculation Task|Calculation Task]]&lt;br /&gt;
* [[#Check Task|Check Task]]&lt;br /&gt;
* [[#Inspection Task|Inspection Task]]&lt;br /&gt;
* [[#Interface Task|Interface Task]]&lt;br /&gt;
* [[#Numeric Task|Numeric Task]]&lt;br /&gt;
* [[#Pick List Task|Pick List Task]]&lt;br /&gt;
* [[#Picture Task|Picture Task]]&lt;br /&gt;
* [[#Signature Task|Signature Task]]&lt;br /&gt;
* [[#Supervisor Check Task|Supervisor Check Task]]&lt;br /&gt;
* [[#Text Task|Text Task]]&lt;br /&gt;
&lt;br /&gt;
[[#Switch Start Task|Switch Start Tasks]], [[#Switch End Task|Switch End Tasks]], and [[#Calculation Task|Calculation Tasks]] provide automatic workflow-control behaviour in a Procedure Workpackage.&lt;br /&gt;
&lt;br /&gt;
For automatic [[#Calculation Task|Calculation Tasks]] and [[#Switch Start Task|Switch Start Tasks]], the clients display an evaluation indicator:&lt;br /&gt;
&lt;br /&gt;
* '''Finished:''' The Task was automatically evaluated successfully.&lt;br /&gt;
* '''Error:''' The Task was evaluated but resulted in an error.&lt;br /&gt;
* '''Pending:''' The Task has not yet been evaluated. No additional indicator is displayed for this state.&lt;br /&gt;
&lt;br /&gt;
When a predecessor [[#Switch Start Task|Switch Start Task]] has not yet finished, its follow-up Procedure Tasks are hidden because the relevant branch is not yet known. After evaluation, the selected branch becomes visible. The other branch remains hidden, is not executed, and its Procedure Tasks are set to ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
For example, several predecessor [[#Numeric Task|Numeric Tasks]] can record temperatures from different parts of an equipment. A subsequent [[#Calculation Task|Calculation Task]] can calculate their average. A [[#Switch Start Task|Switch Start Task]] can then select a branch based on whether the average exceeds a configured temperature. One branch can contain a Task for activating a cooling mechanism, while the other branch can lead directly to the [[#Switch End Task|Switch End Task]] or contain further [[#Switch Start Task|Switch Tasks]].&lt;br /&gt;
&lt;br /&gt;
Procedure Tasks are intended to execute automatically when their predecessors are finished. However, the completion of the predecessor has to be triggered by a user. If a predecessor becomes finished only because of a server update, the follow-up Procedure workflow is not triggered. This prevents a workflow from executing in the name of users who did not initiate or observe the completion.&lt;br /&gt;
&lt;br /&gt;
The general online and offline evaluation rules for sequential and grouped Tasks are documented in [[MRO Objects (Client)#Sequential Task|Sequential Task]] and [[MRO Objects (Client)#Grouped Task|Grouped Task]].&lt;br /&gt;
&lt;br /&gt;
== Supporting File Documents ==&lt;br /&gt;
&lt;br /&gt;
=== Procedure JSON File Document ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''FILEDOCUMENT_MRO_JSON'''&lt;br /&gt;
&lt;br /&gt;
This File Document stores the JSON definition of a [[#Procedure Workpackage|Procedure Workpackage]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| LK_PROCEDURE_WORKPACKAGE || {{Guid}} || Link to the associated [[#Procedure Workpackage|Procedure Workpackage]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Picture Task File Document ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''FILEDOCUMENT_MRO_PICTURE_TASK'''&lt;br /&gt;
&lt;br /&gt;
This is a dedicated File Document linked to a [[#Picture Task|Picture Task]]. A [[#Picture Task|Picture Task]] can also use another child-document type, provided that the child document contains a valid file.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| LK_PICTURE_TASK || {{Guid}} || Link to the associated [[#Picture Task|Picture Task]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[MRO Objects (Client)]]&lt;br /&gt;
* [[MROCLS_MRO_TASKOWNER]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_WORKPACKAGE]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_PROGRESS_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_MEASUREMENT_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_CHECK_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_INSPECTION_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_SEQUENTIALTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_GROUPEDTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_PROCEDURE]] (Classification)&lt;br /&gt;
* [[MROCLS_SWITCH_START_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_SWITCH_END_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_CALCULATION_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_PICK_LIST_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_PICTURE_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_BLINDINGTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_COMMISSIONINGCHECK]] (Classification)&lt;br /&gt;
* [[MROCLS_JOINTTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_SIGNATURE_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_TEXT_TASK]] (Classification)&lt;br /&gt;
&lt;br /&gt;
[[Category:Module|MRO (Plugin)]]&lt;br /&gt;
[[Category:Android|MRO (Plugin)]]&lt;br /&gt;
[[Category:Mobile|MRO (Plugin)]]&lt;br /&gt;
[[Category:Client|MRO (Plugin)]]&lt;br /&gt;
[[Category:WinX|MRO (Plugin)]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_Implemented_Objects&amp;diff=30456</id>
		<title>MRO Implemented Objects</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_Implemented_Objects&amp;diff=30456"/>
				<updated>2026-08-17T14:35:04Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: Redirected page to MRO (Plugin)#MRO Task Types&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[MRO (Plugin)#MRO Task Types]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Plugin|MRO Implemented Objects]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_Objects_(Client)&amp;diff=30455</id>
		<title>MRO Objects (Client)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_Objects_(Client)&amp;diff=30455"/>
				<updated>2026-08-17T14:31:15Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: /* Work Progress */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:MRO_WinX.png|thumb|alt=MRO Child List UI (WinX)|MRO UI (WinX)]]&lt;br /&gt;
[[File:MRO_MAUI1.jpeg|thumb|alt=MRO Child List UI (Mobile)|MRO UI (Mobile)]]&lt;br /&gt;
&lt;br /&gt;
The WinX and Mobile clients display MRO objects like other root or child objects, with additional MRO-specific indicators, controls, and evaluation logic.&lt;br /&gt;
&lt;br /&gt;
This page documents behaviour that is shared by multiple MRO objects in the clients. The MRO object model, task-specific behaviour, and relevant technical properties are documented on [[MRO (Plugin)]]. For the complete task-type catalog, see [[MRO (Plugin)#MRO Task Types|MRO Task Types]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Page !! Scope&lt;br /&gt;
|-&lt;br /&gt;
| [[MRO (Plugin)]] || MRO concepts, task types, task-specific behaviour, and relevant technical properties&lt;br /&gt;
|-&lt;br /&gt;
| '''MRO Objects (Client)''' || Common client presentation, status indicators, locking, and behaviour shared by multiple MRO objects&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Basic User Interface ==&lt;br /&gt;
&lt;br /&gt;
The MRO user interface provides status indicators and interactive controls. In the {{UBIK}} child list, an MRO object can display its accumulated technical status, organisational status, and overall work progress based on its underlying data branch. These indicators are shown next to the main icon on child, details, and documents pages as well as next to the icons of child-list items.&lt;br /&gt;
&lt;br /&gt;
=== Technical Status ===&lt;br /&gt;
&lt;br /&gt;
The technical status indicator is shown on objects that represent a technical state or receive the technical status from subsequent objects in the underlying data branch. For example, if an inventory object is reported as damaged, its parent objects display an exclamation-mark indicator to show that a problem was reported by a child object.&lt;br /&gt;
&lt;br /&gt;
[[File:TechStats_WinX.png|100px|Technical Status Indicator (WinX and Mobile)]]&lt;br /&gt;
&lt;br /&gt;
=== Organisational Status ===&lt;br /&gt;
&lt;br /&gt;
The organisational status represents the amount of confirmed work in the data branch. This includes confirmed Work Packages as well as Tasks that are locked by their owning Work Package. The indicator is shown on objects that represent an organisational state or receive the organisational status from subsequent objects.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:OrgaStatusIndicatorWinX.PNG|Organisational Status Indicator (WinX)&lt;br /&gt;
File:ConfirmedWP_WinX.png|Confirmed Work Package flag (WinX)&lt;br /&gt;
File:ConfirmedWP_MAUI.jpeg|Confirmed Work Package indicator (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Work Progress ===&lt;br /&gt;
&lt;br /&gt;
Work progress is calculated from the object's current progress and the progress accumulated from subsequent objects in the underlying data branch. The indicator shows the amount of work completed in that branch.&lt;br /&gt;
&lt;br /&gt;
{{Version/WinXSince|5.0}} {{Version/MobileSince|5.0}} By default, progress is displayed with no more than one decimal place. For example, 99.75% is displayed as 99.8%. The format string used for this is &amp;lt;code&amp;gt;{0:0.#}%&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For other numeric formats, see [https://learn.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings custom numeric format strings]. The template used to customize the presentation is '''UBIKMROProgressBadge''' in '''UBIKThemes'''.&lt;br /&gt;
&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Android|MRO Objects (UBIK WinX)]]&lt;br /&gt;
[[Category:Client|MRO Objects (Client)]]&lt;br /&gt;
[[Category:Mobile|MRO Objects (Client)]]&lt;br /&gt;
[[Category:Pages with broken file links|MRO Objects (Client)]]&lt;br /&gt;
[[Category:WinX|MRO Objects (UBIK WinX)]]&lt;br /&gt;
&lt;br /&gt;
== MRO Objects ==&lt;br /&gt;
&lt;br /&gt;
The MRO object model consists of Task Owners, Work Packages, Tasks, and specialized task types. For the object definitions and technical properties, see [[MRO (Plugin)#MRO Objects|MRO Objects]].&lt;br /&gt;
&lt;br /&gt;
=== Task Owner ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_TASKOWNER|Task Owner]] gives users an overview of the work in its underlying structure. The client displays the technical status, organisational status, and work progress accumulated from its subordinate Task Owners and Work Packages.&lt;br /&gt;
&lt;br /&gt;
For the Task Owner definition, see [[MRO (Plugin)#Task Owner|Task Owner]].&lt;br /&gt;
&lt;br /&gt;
=== Work Package ===&lt;br /&gt;
&lt;br /&gt;
The clients provide controls for confirming and revoking the confirmation of a [[MROCLS_MRO_WORKPACKAGE|Work Package]]. A Work Package can be confirmed when its related Tasks have reached the required progress and all subordinate Work Packages have been confirmed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:ConfirmingWP_WinX.png|Work Package confirmation button (WinX)&lt;br /&gt;
File:MRORevoke_WinX.png|Revoke Work Package confirmation (WinX)&lt;br /&gt;
File:ConfirmingWP_MAUI.jpeg|Work Package confirmation button (Mobile)&lt;br /&gt;
File:MRORevoke_MAUI.jpeg|Revoke Work Package confirmation (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the Work Package definition, see [[MRO (Plugin)#Work Package|Work Package]].&lt;br /&gt;
&lt;br /&gt;
=== Task ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_TASK|Task]] reports progress to its owning Work Package. All user-editable MRO Tasks support ''Not Applicable''. In both clients, a completed user-editable Task can be reset by selecting ''Not Applicable'' twice.&lt;br /&gt;
&lt;br /&gt;
For the common Task model and value-validation requirement, see [[MRO (Plugin)#Task|Task]].&lt;br /&gt;
&lt;br /&gt;
{{Hint|For the complete list of MRO task types, their properties, and their task-specific client behaviour, see [[MRO (Plugin)#MRO Task Types|MRO Task Types]]. For the available Procedure variants and their workflow execution, see [[MRO (Plugin)#Procedure Task Variants and Workflow Execution|Procedure Task Variants and Workflow Execution]].}}&lt;br /&gt;
&lt;br /&gt;
==== Sequential Task ====&lt;br /&gt;
&lt;br /&gt;
The [[MROCLS_SEQUENTIALTASK|Sequential Task classification]] defines an order in which Tasks are to be completed. One or more predecessor Tasks can be required to finish before a dependent Task becomes unlocked and editable. A Task can have any number of predecessors.&lt;br /&gt;
&lt;br /&gt;
A Task and its predecessors do not have to belong to the same Work Package. A predecessor can be located elsewhere in the object hierarchy.&lt;br /&gt;
&lt;br /&gt;
The state of a Sequential Task is evaluated both online and offline. This allows visible dependent Tasks to update immediately when their predecessors are finished. The server-side state takes precedence in the case described by the first step below.&lt;br /&gt;
&lt;br /&gt;
The state is evaluated as follows:&lt;br /&gt;
&lt;br /&gt;
# If the server-side state says that the Task is open, it is treated as open and no further local evaluation is performed.&lt;br /&gt;
# The client checks whether the Task has predecessors.&lt;br /&gt;
# The client attempts to load every predecessor Task.&lt;br /&gt;
#* If any predecessor cannot be loaded because it is not available offline, the Task is locked.&lt;br /&gt;
# If every predecessor is finished, the Task is open and editable. Otherwise, it is locked.&lt;br /&gt;
&lt;br /&gt;
The configured dependency graph must not contain cycles. Tasks within a dependency cycle could never become available for completion.&lt;br /&gt;
&lt;br /&gt;
'''Example'''&lt;br /&gt;
&lt;br /&gt;
See [[Media:Sequential_tasks_winx.mp4|this video]] for a demonstration. The Task relations are illustrated in [[Media:Task_relations.png|this image]]. Tasks A1 and A2 do not depend on other Tasks. The lines from left to right represent dependencies; for example, B2 has A1 and A2 as predecessors.&lt;br /&gt;
&lt;br /&gt;
==== Grouped Task {{Version/WinXSince|4.2}}{{Version/XamarinSince|4.2}} ====&lt;br /&gt;
&lt;br /&gt;
The [[MROCLS_GROUPEDTASK|Grouped Task classification]] is used when only a configured number of Tasks from a group have to be finished. The Tasks are siblings and share a server-configured threshold. When the number of finished Tasks reaches the threshold, the remaining Tasks in the group are considered no longer necessary. For the accumulated status of the owning objects, those Tasks are treated as if they were finished.&lt;br /&gt;
&lt;br /&gt;
{{Hint|The finished state and the no-longer-necessary state are independent. A Grouped Task that is no longer necessary can be either finished or unfinished. Users do not have to finish it, but they still can.}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|The precise status calculation requires information about all sibling Tasks. If some siblings are not available offline, the client cannot determine whether the threshold has been reached. In this situation, the local status calculation treats the available objects as regular Tasks.}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|The client uses the best available status. It uses the status calculated by the server when the client is online and there are no uncommitted local changes on the involved objects. Otherwise, it calculates the status locally based on the available information.}}&lt;br /&gt;
&lt;br /&gt;
A Task can be both grouped and sequential. In this case, the group threshold affects when a dependent Task becomes available.&lt;br /&gt;
&lt;br /&gt;
For example, Tasks A1, A2, and A3 can form a group in which only one Task has to be finished. If all three are predecessors of Task B, finishing one of them causes the group threshold to be reached. All three predecessors become no longer necessary and locked, and Task B becomes unlocked.&lt;br /&gt;
&lt;br /&gt;
==== Procedure Tasks {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ====&lt;br /&gt;
&lt;br /&gt;
Procedure Tasks are specialized [[#Sequential Task|Sequential Tasks]] that can also use [[#Grouped Task|Grouped Task]] behaviour and branching within a Procedure Workpackage. Their task-specific behaviour and workflow execution are documented on the Plugin page to avoid duplicating the canonical task documentation.&lt;br /&gt;
&lt;br /&gt;
{{Hint|For Procedure variants and workflow execution, see [[MRO (Plugin)#Procedure Task Variants and Workflow Execution|Procedure Tasks]]. For the complete list of base task types, see [[MRO (Plugin)#MRO Task Types|MRO Task Types]].}}&lt;br /&gt;
&lt;br /&gt;
=== MRO Objects with Project Information (WinX only) {{Version/WinXSince|2.5.4}} ===&lt;br /&gt;
&lt;br /&gt;
{{DeprecatedStartTag|parameter=Please refer to [[Main_Page]] for the most recent information.}}&lt;br /&gt;
&lt;br /&gt;
[[File:UI_WinX_MRO_ProjectInfo.png|thumb|MRO Object with Project Information (WinX)]]&lt;br /&gt;
&lt;br /&gt;
An MRO object other than a Task can contain [[MROCLS_PROJECTINFORMATION|project information]]. In this case, the project information and MRO progress are displayed in a bar chart. The start and end dates are displayed on the progress bar. Its length and position, together with the current-date marker, indicate the timeline.&lt;br /&gt;
&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
{{DeprecatedEndTag}}&lt;br /&gt;
&lt;br /&gt;
== Locking ==&lt;br /&gt;
&lt;br /&gt;
When an MRO object is locked, it cannot be edited. For further information, see [[Locked Objects|Locked Objects]].&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[MRO (Plugin)]]&lt;br /&gt;
* [[MROCLS_PROJECT]]&lt;br /&gt;
* [[MROCLS_PROJECTINFORMATION]]&lt;br /&gt;
* [[MROCLS_SEQUENTIALTASK]]&lt;br /&gt;
* [[MROCLS_GROUPEDTASK]]&lt;br /&gt;
* [[MRO (Plugin)#Procedure Task Variants and Workflow Execution|Procedure Tasks]]&lt;br /&gt;
* [[MROCLS_MRO_TASK]]&lt;br /&gt;
* [[MROCLS_MRO_TASKOWNER]]&lt;br /&gt;
* [[MROCLS_MRO_WORKPACKAGE]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Android|MRO Objects (UBIK WinX)]]&lt;br /&gt;
[[Category:Client|MRO Objects (Client)]]&lt;br /&gt;
[[Category:Mobile|MRO Objects (Client)]]&lt;br /&gt;
[[Category:Pages with broken file links|MRO Objects (Client)]]&lt;br /&gt;
[[Category:WinX|MRO Objects (UBIK WinX)]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_Objects_(Client)&amp;diff=30454</id>
		<title>MRO Objects (Client)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_Objects_(Client)&amp;diff=30454"/>
				<updated>2026-08-17T14:30:33Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:MRO_WinX.png|thumb|alt=MRO Child List UI (WinX)|MRO UI (WinX)]]&lt;br /&gt;
[[File:MRO_MAUI1.jpeg|thumb|alt=MRO Child List UI (Mobile)|MRO UI (Mobile)]]&lt;br /&gt;
&lt;br /&gt;
The WinX and Mobile clients display MRO objects like other root or child objects, with additional MRO-specific indicators, controls, and evaluation logic.&lt;br /&gt;
&lt;br /&gt;
This page documents behaviour that is shared by multiple MRO objects in the clients. The MRO object model, task-specific behaviour, and relevant technical properties are documented on [[MRO (Plugin)]]. For the complete task-type catalog, see [[MRO (Plugin)#MRO Task Types|MRO Task Types]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Page !! Scope&lt;br /&gt;
|-&lt;br /&gt;
| [[MRO (Plugin)]] || MRO concepts, task types, task-specific behaviour, and relevant technical properties&lt;br /&gt;
|-&lt;br /&gt;
| '''MRO Objects (Client)''' || Common client presentation, status indicators, locking, and behaviour shared by multiple MRO objects&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Basic User Interface ==&lt;br /&gt;
&lt;br /&gt;
The MRO user interface provides status indicators and interactive controls. In the {{UBIK}} child list, an MRO object can display its accumulated technical status, organisational status, and overall work progress based on its underlying data branch. These indicators are shown next to the main icon on child, details, and documents pages as well as next to the icons of child-list items.&lt;br /&gt;
&lt;br /&gt;
=== Technical Status ===&lt;br /&gt;
&lt;br /&gt;
The technical status indicator is shown on objects that represent a technical state or receive the technical status from subsequent objects in the underlying data branch. For example, if an inventory object is reported as damaged, its parent objects display an exclamation-mark indicator to show that a problem was reported by a child object.&lt;br /&gt;
&lt;br /&gt;
[[File:TechStats_WinX.png|100px|Technical Status Indicator (WinX and Mobile)]]&lt;br /&gt;
&lt;br /&gt;
=== Organisational Status ===&lt;br /&gt;
&lt;br /&gt;
The organisational status represents the amount of confirmed work in the data branch. This includes confirmed Work Packages as well as Tasks that are locked by their owning Work Package. The indicator is shown on objects that represent an organisational state or receive the organisational status from subsequent objects.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:OrgaStatusIndicatorWinX.PNG|Organisational Status Indicator (WinX)&lt;br /&gt;
File:ConfirmedWP_WinX.png|Confirmed Work Package flag (WinX)&lt;br /&gt;
File:ConfirmedWP_MAUI.jpeg|Confirmed Work Package indicator (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Work Progress ===&lt;br /&gt;
&lt;br /&gt;
Work progress is calculated from the object's current progress and the progress accumulated from subsequent objects in the underlying data branch. The indicator shows the amount of work completed in that branch.&lt;br /&gt;
&lt;br /&gt;
{{Version/WinXSince|5.0}} {{Version/MobileSince|5.0}} By default, progress is displayed with no more than one decimal place. For example, 99.75% is displayed as 99.8%. The format string used for this is ''{0:0.#}%''.&lt;br /&gt;
&lt;br /&gt;
For other numeric formats, see [https://learn.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings custom numeric format strings]. The template used to customize the presentation is '''UBIKMROProgressBadge''' in '''UBIKThemes'''.&lt;br /&gt;
&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
== MRO Objects ==&lt;br /&gt;
&lt;br /&gt;
The MRO object model consists of Task Owners, Work Packages, Tasks, and specialized task types. For the object definitions and technical properties, see [[MRO (Plugin)#MRO Objects|MRO Objects]].&lt;br /&gt;
&lt;br /&gt;
=== Task Owner ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_TASKOWNER|Task Owner]] gives users an overview of the work in its underlying structure. The client displays the technical status, organisational status, and work progress accumulated from its subordinate Task Owners and Work Packages.&lt;br /&gt;
&lt;br /&gt;
For the Task Owner definition, see [[MRO (Plugin)#Task Owner|Task Owner]].&lt;br /&gt;
&lt;br /&gt;
=== Work Package ===&lt;br /&gt;
&lt;br /&gt;
The clients provide controls for confirming and revoking the confirmation of a [[MROCLS_MRO_WORKPACKAGE|Work Package]]. A Work Package can be confirmed when its related Tasks have reached the required progress and all subordinate Work Packages have been confirmed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:ConfirmingWP_WinX.png|Work Package confirmation button (WinX)&lt;br /&gt;
File:MRORevoke_WinX.png|Revoke Work Package confirmation (WinX)&lt;br /&gt;
File:ConfirmingWP_MAUI.jpeg|Work Package confirmation button (Mobile)&lt;br /&gt;
File:MRORevoke_MAUI.jpeg|Revoke Work Package confirmation (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the Work Package definition, see [[MRO (Plugin)#Work Package|Work Package]].&lt;br /&gt;
&lt;br /&gt;
=== Task ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_TASK|Task]] reports progress to its owning Work Package. All user-editable MRO Tasks support ''Not Applicable''. In both clients, a completed user-editable Task can be reset by selecting ''Not Applicable'' twice.&lt;br /&gt;
&lt;br /&gt;
For the common Task model and value-validation requirement, see [[MRO (Plugin)#Task|Task]].&lt;br /&gt;
&lt;br /&gt;
{{Hint|For the complete list of MRO task types, their properties, and their task-specific client behaviour, see [[MRO (Plugin)#MRO Task Types|MRO Task Types]]. For the available Procedure variants and their workflow execution, see [[MRO (Plugin)#Procedure Task Variants and Workflow Execution|Procedure Task Variants and Workflow Execution]].}}&lt;br /&gt;
&lt;br /&gt;
==== Sequential Task ====&lt;br /&gt;
&lt;br /&gt;
The [[MROCLS_SEQUENTIALTASK|Sequential Task classification]] defines an order in which Tasks are to be completed. One or more predecessor Tasks can be required to finish before a dependent Task becomes unlocked and editable. A Task can have any number of predecessors.&lt;br /&gt;
&lt;br /&gt;
A Task and its predecessors do not have to belong to the same Work Package. A predecessor can be located elsewhere in the object hierarchy.&lt;br /&gt;
&lt;br /&gt;
The state of a Sequential Task is evaluated both online and offline. This allows visible dependent Tasks to update immediately when their predecessors are finished. The server-side state takes precedence in the case described by the first step below.&lt;br /&gt;
&lt;br /&gt;
The state is evaluated as follows:&lt;br /&gt;
&lt;br /&gt;
# If the server-side state says that the Task is open, it is treated as open and no further local evaluation is performed.&lt;br /&gt;
# The client checks whether the Task has predecessors.&lt;br /&gt;
# The client attempts to load every predecessor Task.&lt;br /&gt;
#* If any predecessor cannot be loaded because it is not available offline, the Task is locked.&lt;br /&gt;
# If every predecessor is finished, the Task is open and editable. Otherwise, it is locked.&lt;br /&gt;
&lt;br /&gt;
The configured dependency graph must not contain cycles. Tasks within a dependency cycle could never become available for completion.&lt;br /&gt;
&lt;br /&gt;
'''Example'''&lt;br /&gt;
&lt;br /&gt;
See [[Media:Sequential_tasks_winx.mp4|this video]] for a demonstration. The Task relations are illustrated in [[Media:Task_relations.png|this image]]. Tasks A1 and A2 do not depend on other Tasks. The lines from left to right represent dependencies; for example, B2 has A1 and A2 as predecessors.&lt;br /&gt;
&lt;br /&gt;
==== Grouped Task {{Version/WinXSince|4.2}}{{Version/XamarinSince|4.2}} ====&lt;br /&gt;
&lt;br /&gt;
The [[MROCLS_GROUPEDTASK|Grouped Task classification]] is used when only a configured number of Tasks from a group have to be finished. The Tasks are siblings and share a server-configured threshold. When the number of finished Tasks reaches the threshold, the remaining Tasks in the group are considered no longer necessary. For the accumulated status of the owning objects, those Tasks are treated as if they were finished.&lt;br /&gt;
&lt;br /&gt;
{{Hint|The finished state and the no-longer-necessary state are independent. A Grouped Task that is no longer necessary can be either finished or unfinished. Users do not have to finish it, but they still can.}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|The precise status calculation requires information about all sibling Tasks. If some siblings are not available offline, the client cannot determine whether the threshold has been reached. In this situation, the local status calculation treats the available objects as regular Tasks.}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|The client uses the best available status. It uses the status calculated by the server when the client is online and there are no uncommitted local changes on the involved objects. Otherwise, it calculates the status locally based on the available information.}}&lt;br /&gt;
&lt;br /&gt;
A Task can be both grouped and sequential. In this case, the group threshold affects when a dependent Task becomes available.&lt;br /&gt;
&lt;br /&gt;
For example, Tasks A1, A2, and A3 can form a group in which only one Task has to be finished. If all three are predecessors of Task B, finishing one of them causes the group threshold to be reached. All three predecessors become no longer necessary and locked, and Task B becomes unlocked.&lt;br /&gt;
&lt;br /&gt;
==== Procedure Tasks {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ====&lt;br /&gt;
&lt;br /&gt;
Procedure Tasks are specialized [[#Sequential Task|Sequential Tasks]] that can also use [[#Grouped Task|Grouped Task]] behaviour and branching within a Procedure Workpackage. Their task-specific behaviour and workflow execution are documented on the Plugin page to avoid duplicating the canonical task documentation.&lt;br /&gt;
&lt;br /&gt;
{{Hint|For Procedure variants and workflow execution, see [[MRO (Plugin)#Procedure Task Variants and Workflow Execution|Procedure Tasks]]. For the complete list of base task types, see [[MRO (Plugin)#MRO Task Types|MRO Task Types]].}}&lt;br /&gt;
&lt;br /&gt;
=== MRO Objects with Project Information (WinX only) {{Version/WinXSince|2.5.4}} ===&lt;br /&gt;
&lt;br /&gt;
{{DeprecatedStartTag|parameter=Please refer to [[Main_Page]] for the most recent information.}}&lt;br /&gt;
&lt;br /&gt;
[[File:UI_WinX_MRO_ProjectInfo.png|thumb|MRO Object with Project Information (WinX)]]&lt;br /&gt;
&lt;br /&gt;
An MRO object other than a Task can contain [[MROCLS_PROJECTINFORMATION|project information]]. In this case, the project information and MRO progress are displayed in a bar chart. The start and end dates are displayed on the progress bar. Its length and position, together with the current-date marker, indicate the timeline.&lt;br /&gt;
&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
{{DeprecatedEndTag}}&lt;br /&gt;
&lt;br /&gt;
== Locking ==&lt;br /&gt;
&lt;br /&gt;
When an MRO object is locked, it cannot be edited. For further information, see [[Locked Objects|Locked Objects]].&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[MRO (Plugin)]]&lt;br /&gt;
* [[MROCLS_PROJECT]]&lt;br /&gt;
* [[MROCLS_PROJECTINFORMATION]]&lt;br /&gt;
* [[MROCLS_SEQUENTIALTASK]]&lt;br /&gt;
* [[MROCLS_GROUPEDTASK]]&lt;br /&gt;
* [[MRO (Plugin)#Procedure Task Variants and Workflow Execution|Procedure Tasks]]&lt;br /&gt;
* [[MROCLS_MRO_TASK]]&lt;br /&gt;
* [[MROCLS_MRO_TASKOWNER]]&lt;br /&gt;
* [[MROCLS_MRO_WORKPACKAGE]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Android|MRO Objects (UBIK WinX)]]&lt;br /&gt;
[[Category:Client|MRO Objects (Client)]]&lt;br /&gt;
[[Category:Mobile|MRO Objects (Client)]]&lt;br /&gt;
[[Category:Pages with broken file links|MRO Objects (Client)]]&lt;br /&gt;
[[Category:WinX|MRO Objects (UBIK WinX)]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_Objects_(Client)&amp;diff=30453</id>
		<title>MRO Objects (Client)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_Objects_(Client)&amp;diff=30453"/>
				<updated>2026-08-17T14:24:10Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:MRO_WinX.png|thumb|alt=MRO Child List UI (WinX)|MRO UI (WinX)]]&lt;br /&gt;
[[File:MRO_MAUI1.jpeg|thumb|alt=MRO Child List UI (Mobile)|MRO UI (Mobile)]]&lt;br /&gt;
&lt;br /&gt;
The WinX and Mobile clients display MRO objects like other root or child objects, with additional MRO-specific indicators, controls, and evaluation logic.&lt;br /&gt;
&lt;br /&gt;
This page documents behaviour that is shared by multiple MRO objects in the clients. The MRO object model, task-specific behaviour, and relevant technical properties are documented on [[MRO (Plugin)]]. For the complete task-type catalog, see [[MRO (Plugin)#MRO Task Types|MRO Task Types]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Page !! Scope&lt;br /&gt;
|-&lt;br /&gt;
| [[MRO (Plugin)]] || MRO concepts, task types, task-specific behaviour, and relevant technical properties&lt;br /&gt;
|-&lt;br /&gt;
| '''MRO Objects (Client)''' || Common client presentation, status indicators, locking, and behaviour shared by multiple MRO objects&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Hint|For the complete list of MRO task types and their task-specific behaviour, see [[MRO (Plugin)#MRO Task Types|MRO Task Types]].}}&lt;br /&gt;
&lt;br /&gt;
== Basic User Interface ==&lt;br /&gt;
&lt;br /&gt;
The MRO user interface provides status indicators and interactive controls. In the {{UBIK}} child list, an MRO object can display its accumulated technical status, organisational status, and overall work progress based on its underlying data branch. These indicators are shown next to the main icon on child, details, and documents pages as well as next to the icons of child-list items.&lt;br /&gt;
&lt;br /&gt;
=== Technical Status ===&lt;br /&gt;
&lt;br /&gt;
The technical status indicator is shown on objects that represent a technical state or receive the technical status from subsequent objects in the underlying data branch. For example, if an inventory object is reported as damaged, its parent objects display an exclamation-mark indicator to show that a problem was reported by a child object.&lt;br /&gt;
&lt;br /&gt;
[[File:TechStats_WinX.png|100px|Technical Status Indicator (WinX and Mobile)]]&lt;br /&gt;
&lt;br /&gt;
=== Organisational Status ===&lt;br /&gt;
&lt;br /&gt;
The organisational status represents the amount of confirmed work in the data branch. This includes confirmed Work Packages as well as Tasks that are locked by their owning Work Package. The indicator is shown on objects that represent an organisational state or receive the organisational status from subsequent objects.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:OrgaStatusIndicatorWinX.PNG|Organisational Status Indicator (WinX)&lt;br /&gt;
File:ConfirmedWP_WinX.png|Confirmed Work Package flag (WinX)&lt;br /&gt;
File:ConfirmedWP_MAUI.jpeg|Confirmed Work Package indicator (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Work Progress ===&lt;br /&gt;
&lt;br /&gt;
Work progress is calculated from the object's current progress and the progress accumulated from subsequent objects in the underlying data branch. The indicator shows the amount of work completed in that branch.&lt;br /&gt;
&lt;br /&gt;
{{Version/WinXSince|5.0}} {{Version/MobileSince|5.0}} By default, progress is displayed with no more than one decimal place. For example, 99.75% is displayed as 99.8%. The format string used for this is ''{0:0.#}%''.&lt;br /&gt;
&lt;br /&gt;
For other numeric formats, see [https://learn.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings custom numeric format strings]. The template used to customize the presentation is '''UBIKMROProgressBadge''' in '''UBIKThemes'''.&lt;br /&gt;
&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
== MRO Objects ==&lt;br /&gt;
&lt;br /&gt;
The MRO object model consists of Task Owners, Work Packages, Tasks, and specialized task types. For the object definitions and technical properties, see [[MRO (Plugin)#MRO Objects|MRO Objects]].&lt;br /&gt;
&lt;br /&gt;
=== Task Owner ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_TASKOWNER|Task Owner]] gives users an overview of the work in its underlying structure. The client displays the technical status, organisational status, and work progress accumulated from its subordinate Task Owners and Work Packages.&lt;br /&gt;
&lt;br /&gt;
For the Task Owner definition, see [[MRO (Plugin)#Task Owner|Task Owner]].&lt;br /&gt;
&lt;br /&gt;
=== Work Package ===&lt;br /&gt;
&lt;br /&gt;
The clients provide controls for confirming and revoking the confirmation of a [[MROCLS_MRO_WORKPACKAGE|Work Package]]. A Work Package can be confirmed when its related Tasks have reached the required progress and all subordinate Work Packages have been confirmed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:ConfirmingWP_WinX.png|Work Package confirmation button (WinX)&lt;br /&gt;
File:MRORevoke_WinX.png|Revoke Work Package confirmation (WinX)&lt;br /&gt;
File:ConfirmingWP_MAUI.jpeg|Work Package confirmation button (Mobile)&lt;br /&gt;
File:MRORevoke_MAUI.jpeg|Revoke Work Package confirmation (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the Work Package definition, see [[MRO (Plugin)#Work Package|Work Package]].&lt;br /&gt;
&lt;br /&gt;
=== Task ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_TASK|Task]] reports progress to its owning Work Package. All user-editable MRO Tasks support ''Not Applicable''. In both clients, a completed user-editable Task can be reset by selecting ''Not Applicable'' twice.&lt;br /&gt;
&lt;br /&gt;
For the common Task model and value-validation requirement, see [[MRO (Plugin)#Task|Task]].&lt;br /&gt;
&lt;br /&gt;
{{Hint|For the complete list of MRO task types, their properties, and their task-specific client behaviour, see [[MRO (Plugin)#MRO Task Types|MRO Task Types]].}}&lt;br /&gt;
&lt;br /&gt;
==== Sequential Task ====&lt;br /&gt;
&lt;br /&gt;
The [[MROCLS_SEQUENTIALTASK|Sequential Task classification]] defines an order in which Tasks are to be completed. One or more predecessor Tasks can be required to finish before a dependent Task becomes unlocked and editable. A Task can have any number of predecessors.&lt;br /&gt;
&lt;br /&gt;
A Task and its predecessors do not have to belong to the same Work Package. A predecessor can be located elsewhere in the object hierarchy.&lt;br /&gt;
&lt;br /&gt;
The state of a Sequential Task is evaluated both online and offline. This allows visible dependent Tasks to update immediately when their predecessors are finished. The server-side state takes precedence in the case described by the first step below.&lt;br /&gt;
&lt;br /&gt;
The state is evaluated as follows:&lt;br /&gt;
&lt;br /&gt;
# If the server-side state says that the Task is open, it is treated as open and no further local evaluation is performed.&lt;br /&gt;
# The client checks whether the Task has predecessors.&lt;br /&gt;
# The client attempts to load every predecessor Task.&lt;br /&gt;
#* If any predecessor cannot be loaded because it is not available offline, the Task is locked.&lt;br /&gt;
# If every predecessor is finished, the Task is open and editable. Otherwise, it is locked.&lt;br /&gt;
&lt;br /&gt;
The configured dependency graph must not contain cycles. Tasks within a dependency cycle could never become available for completion.&lt;br /&gt;
&lt;br /&gt;
'''Example'''&lt;br /&gt;
&lt;br /&gt;
See [[Media:Sequential_tasks_winx.mp4|this video]] for a demonstration. The Task relations are illustrated in [[Media:Task_relations.png|this image]]. Tasks A1 and A2 do not depend on other Tasks. The lines from left to right represent dependencies; for example, B2 has A1 and A2 as predecessors.&lt;br /&gt;
&lt;br /&gt;
==== Grouped Task {{Version/WinXSince|4.2}}{{Version/XamarinSince|4.2}} ====&lt;br /&gt;
&lt;br /&gt;
The [[MROCLS_GROUPEDTASK|Grouped Task classification]] is used when only a configured number of Tasks from a group have to be finished. The Tasks are siblings and share a server-configured threshold. When the number of finished Tasks reaches the threshold, the remaining Tasks in the group are considered no longer necessary. For the accumulated status of the owning objects, those Tasks are treated as if they were finished.&lt;br /&gt;
&lt;br /&gt;
{{Hint|The finished state and the no-longer-necessary state are independent. A Grouped Task that is no longer necessary can be either finished or unfinished. Users do not have to finish it, but they still can.}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|The precise status calculation requires information about all sibling Tasks. If some siblings are not available offline, the client cannot determine whether the threshold has been reached. In this situation, the local status calculation treats the available objects as regular Tasks.}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|The client uses the best available status. It uses the status calculated by the server when the client is online and there are no uncommitted local changes on the involved objects. Otherwise, it calculates the status locally based on the available information.}}&lt;br /&gt;
&lt;br /&gt;
A Task can be both grouped and sequential. In this case, the group threshold affects when a dependent Task becomes available.&lt;br /&gt;
&lt;br /&gt;
For example, Tasks A1, A2, and A3 can form a group in which only one Task has to be finished. If all three are predecessors of Task B, finishing one of them causes the group threshold to be reached. All three predecessors become no longer necessary and locked, and Task B becomes unlocked.&lt;br /&gt;
&lt;br /&gt;
==== Procedure Tasks {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ====&lt;br /&gt;
&lt;br /&gt;
Procedure Tasks are specialized [[#Sequential Task|Sequential Tasks]] that can also use [[#Grouped Task|Grouped Task]] behaviour and branching within a Procedure Workpackage. Their task-specific behaviour and workflow execution are documented on the Plugin page to avoid duplicating the canonical task documentation.&lt;br /&gt;
&lt;br /&gt;
{{Hint|For Procedure variants and workflow execution, see [[MRO (Plugin)#Procedure Task Variants and Workflow Execution|Procedure Tasks]]. For the complete list of base task types, see [[MRO (Plugin)#MRO Task Types|MRO Task Types]].}}&lt;br /&gt;
&lt;br /&gt;
=== MRO Objects with Project Information (WinX only) {{Version/WinXSince|2.5.4}} ===&lt;br /&gt;
&lt;br /&gt;
{{DeprecatedStartTag|parameter=Please refer to [[Main_Page]] for the most recent information.}}&lt;br /&gt;
&lt;br /&gt;
[[File:UI_WinX_MRO_ProjectInfo.png|thumb|MRO Object with Project Information (WinX)]]&lt;br /&gt;
&lt;br /&gt;
An MRO object other than a Task can contain [[MROCLS_PROJECTINFORMATION|project information]]. In this case, the project information and MRO progress are displayed in a bar chart. The start and end dates are displayed on the progress bar. Its length and position, together with the current-date marker, indicate the timeline.&lt;br /&gt;
&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
{{DeprecatedEndTag}}&lt;br /&gt;
&lt;br /&gt;
== Locking ==&lt;br /&gt;
&lt;br /&gt;
When an MRO object is locked, it cannot be edited. For further information, see [[Locked Objects|Locked Objects]].&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[MRO (Plugin)]]&lt;br /&gt;
* [[MROCLS_PROJECT]]&lt;br /&gt;
* [[MROCLS_PROJECTINFORMATION]]&lt;br /&gt;
* [[MROCLS_SEQUENTIALTASK]]&lt;br /&gt;
* [[MROCLS_GROUPEDTASK]]&lt;br /&gt;
* [[MRO (Plugin)#Procedure Task Variants and Workflow Execution|Procedure Tasks]]&lt;br /&gt;
* [[MROCLS_MRO_TASK]]&lt;br /&gt;
* [[MROCLS_MRO_TASKOWNER]]&lt;br /&gt;
* [[MROCLS_MRO_WORKPACKAGE]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Android|MRO Objects (UBIK WinX)]]&lt;br /&gt;
[[Category:Client|MRO Objects (Client)]]&lt;br /&gt;
[[Category:Mobile|MRO Objects (Client)]]&lt;br /&gt;
[[Category:Pages with broken file links|MRO Objects (Client)]]&lt;br /&gt;
[[Category:WinX|MRO Objects (UBIK WinX)]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_(Plugin)&amp;diff=30452</id>
		<title>MRO (Plugin)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_(Plugin)&amp;diff=30452"/>
				<updated>2026-08-17T14:22:51Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: /* Signature Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The MRO plugin provides a set of {{UBIK}} objects for representing and documenting maintenance, repair and operations work. The MRO features are available in the supported Mobile and {{UBIK WinX}} clients.&lt;br /&gt;
&lt;br /&gt;
This page is the main documentation for the MRO object model and its task types. Common client behaviour, such as status indicators, locking, and the general evaluation of sequential and grouped tasks, is documented in [[MRO Objects (Client)]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Page !! Scope&lt;br /&gt;
|-&lt;br /&gt;
| '''MRO (Plugin)''' || MRO concepts, task types, task-specific behaviour, and relevant technical properties&lt;br /&gt;
|-&lt;br /&gt;
| [[MRO Objects (Client)]] || Common client presentation, status indicators, locking, and behaviour shared by multiple MRO objects&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Basic Features ==&lt;br /&gt;
&lt;br /&gt;
Objects classified as MRO objects generally provide a technical and organisational status as well as an overall work progress based on their underlying data branch.&lt;br /&gt;
&lt;br /&gt;
=== Technical Status ===&lt;br /&gt;
&lt;br /&gt;
For detailed information, see [[MRO Objects (Client)#Technical Status|Technical Status]].&lt;br /&gt;
&lt;br /&gt;
=== Organisational Status ===&lt;br /&gt;
&lt;br /&gt;
For detailed information, see [[MRO Objects (Client)#Organisational Status|Organisational Status]].&lt;br /&gt;
&lt;br /&gt;
=== Work Progress ===&lt;br /&gt;
&lt;br /&gt;
For detailed information, see [[MRO Objects (Client)#Work Progress|Work Progress]].&lt;br /&gt;
&lt;br /&gt;
== MRO Objects ==&lt;br /&gt;
&lt;br /&gt;
MRO uses Task Owners, Work Packages, Tasks, and Procedure Workpackages to represent maintenance workflows.&lt;br /&gt;
&lt;br /&gt;
=== Task Owner ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_TASKOWNER|Task Owner]] is an object with an underlying structure of work to be performed. It can contain other Task Owners or Work Packages. Their technical status, organisational status, and work progress are accumulated and reported to the Task Owner.&lt;br /&gt;
&lt;br /&gt;
=== Work Package ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_WORKPACKAGE|Work Package]] collects and summarizes Task Owners, other Work Packages, or Tasks. A Work Package can be confirmed when all associated Tasks have reached the required progress and all subordinate Work Packages have been confirmed.&lt;br /&gt;
&lt;br /&gt;
For Work Package presentation and confirmation in the clients, see [[MRO Objects (Client)#Work Package|Work Package]].&lt;br /&gt;
&lt;br /&gt;
=== Task ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_TASK|Task]] reports work progress to its owning Work Package. The available task types provide different input, validation, or automatic workflow behaviour.&lt;br /&gt;
&lt;br /&gt;
MRO task values must be validated for work progress to be calculated. A MetaAttribute providing a validation timestamp must therefore be attached to the relevant MetaProperty.&lt;br /&gt;
&lt;br /&gt;
{{Attention|A task value property has to use [[Attributes]] so that its value can be validated. Otherwise, work progress cannot be calculated.}}&lt;br /&gt;
&lt;br /&gt;
All user-editable MRO task types can be set to ''Not Applicable''. In the clients, a completed user-editable task can be reset by selecting ''Not Applicable'' twice. General client behaviour is documented in [[MRO Objects (Client)#Task|Task]].&lt;br /&gt;
&lt;br /&gt;
=== Procedure Workpackage ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PROCEDURE_WORKPACKAGE'''&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_PROCEDURE|Procedure Workpackage]] is a specialized Work Package for structured workflows. Its structure is defined in JSON using a workflow editor and can contain Tasks as well as subordinate Procedure Workpackages. Depending on its state, the corresponding objects are created or updated.&lt;br /&gt;
&lt;br /&gt;
Procedure Workpackages can use [[MRO Objects (Client)#Sequential Task|sequential execution]], [[MRO Objects (Client)#Grouped Task|grouped Tasks]], [[#Switch Start Task|branching]], [[#Calculation Task|calculations]], and references to linked data. Their workflows support online and offline use. Steps that require data exchange wait until connectivity is available.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| PROCEDURE_STATUS || {{Integer}} || Current state: Draft = 10, ReadyToUse = 20, Published = 30, Open = 40, Executing = 50, Completed = 60, Approved = 70, Rejected = 80&lt;br /&gt;
|-&lt;br /&gt;
| JSON || {{String}} || JSON representation of the Procedure Workpackage&lt;br /&gt;
|-&lt;br /&gt;
| ISTEMPLATE || {{Boolean}} || Indicates whether the Procedure Workpackage is a template&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MRO Task Types ==&lt;br /&gt;
&lt;br /&gt;
The following task types are available in MRO. The technical object names are included to make the task types discoverable through the wiki search.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Task type !! Technical object name !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| [[#Blinding Task|Blinding Task]] || BLINDING_TASK || Documents a blinding or deblinding operation&lt;br /&gt;
|-&lt;br /&gt;
| [[#Calculation Task|Calculation Task]] || CALCULATION_TASK || Evaluates an expression and writes its result to a target property&lt;br /&gt;
|-&lt;br /&gt;
| [[#Check Task|Check Task]] || CHECK_TASK || Confirms a Boolean task using a checkbox&lt;br /&gt;
|-&lt;br /&gt;
| [[#Commissioning Task|Commissioning Task]] || COMMISSIONING_TASK || Represents a task in an MRO commissioning workflow&lt;br /&gt;
|-&lt;br /&gt;
| [[#Inspection Task|Inspection Task]] || INSPECTION_TASK || Records a Boolean inspection result with configurable labels&lt;br /&gt;
|-&lt;br /&gt;
| [[#Interface Task|Interface Task]] || INTERFACE_TASK || Waits for completion information from another software system&lt;br /&gt;
|-&lt;br /&gt;
| [[#Joint Task|Joint Task]] || JOINT_TASK || Documents the state of a joint location&lt;br /&gt;
|-&lt;br /&gt;
| [[#Measurement Task|Measurement Task]] || MROCLS_MRO_MEASUREMENT_TASK || Records a measured Double value&lt;br /&gt;
|-&lt;br /&gt;
| [[#Numeric Task|Numeric Task]] || NUMERIC_TASK || Records a numeric value and evaluates it against a configured range&lt;br /&gt;
|-&lt;br /&gt;
| [[#Pick List Task|Pick List Task]] || PICKLIST_TASK || Selects one integer value from an instance-specific Active List&lt;br /&gt;
|-&lt;br /&gt;
| [[#Picture Task|Picture Task]] || PICTURE_TASK || Requires at least one child document containing a valid file&lt;br /&gt;
|-&lt;br /&gt;
| [[#Progress Task|Progress Task]] || PROGRESS_TASK || Reports progress between 0% and 100%&lt;br /&gt;
|-&lt;br /&gt;
| [[#Signature Task|Signature Task]] || SIGNATURE_TASK || Captures a handwritten signature&lt;br /&gt;
|-&lt;br /&gt;
| [[#Supervisor Check Task|Supervisor Check Task]] || SUPERVISOR_CHECK_TASK || Applies the four-eyes principle to a [[#Check Task|Check Task]]&lt;br /&gt;
|-&lt;br /&gt;
| [[#Switch End Task|Switch End Task]] || SWITCH_END_TASK || Rejoins the branches of a Procedure workflow&lt;br /&gt;
|-&lt;br /&gt;
| [[#Switch Start Task|Switch Start Task]] || SWITCH_START_TASK || Selects a Procedure branch by evaluating a Boolean expression&lt;br /&gt;
|-&lt;br /&gt;
| [[#Text Task|Text Task]] || TEXT_TASK || Records free-form text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Hint|For the available Procedure variants and their workflow execution, see [[#Procedure Task Variants and Workflow Execution|Procedure Tasks]].}}&lt;br /&gt;
&lt;br /&gt;
=== Blinding Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''BLINDING_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_BLINDINGTASK]]&lt;br /&gt;
&lt;br /&gt;
A Blinding Task documents either a blinding or deblinding operation at a linked blinding location. The configured operation type determines the state that must be reported to complete the task.&lt;br /&gt;
&lt;br /&gt;
'''Relevant properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| BLINDING_TYPE || Configured operation type: Blinding or DeBlinding&lt;br /&gt;
|-&lt;br /&gt;
| LK_BLINDING_LOCATION || Link to the associated blinding location&lt;br /&gt;
|-&lt;br /&gt;
| LK_PREVIOUS_TASK || Link to the preceding Blinding Task&lt;br /&gt;
|-&lt;br /&gt;
| LOCKED || Prevents the task from being edited&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || Reported blinding state&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The task is complete only when '''VALUE''' matches the configured '''BLINDING_TYPE'''.&lt;br /&gt;
&lt;br /&gt;
=== Calculation Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''CALCULATION_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_CALCULATION_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Calculation Task automatically evaluates a predefined expression on the client and writes the result to a configured property on its owner. No user input is required.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| EXPRESSION || {{String}} || Expression evaluated by the client&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Integer}} || Evaluation state: Undefined = 0, Pending = 10, Finished = 20, Error = 30&lt;br /&gt;
|-&lt;br /&gt;
| TARGET_PROPERTY_NAME || {{String}} || Name of the target property on the owner&lt;br /&gt;
|-&lt;br /&gt;
| TARGET_PROPERTY_TYPE || {{Integer}} || Target type: Undefined = 0, Boolean = 1, Integer = 3, Double = 4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The task is automatically finished after successful evaluation. The clients display an indicator for a successful evaluation or an evaluation error. A Pending state does not receive an additional indicator.&lt;br /&gt;
&lt;br /&gt;
See also [[#Procedure Task Variants and Workflow Execution|Procedure Task Variants and Workflow Execution]].&lt;br /&gt;
&lt;br /&gt;
=== Check Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''CHECK_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_CHECK_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Check Task is a simple Boolean task represented by a checkbox. Clicking the checkbox sets its value and completes the task. It can alternatively be completed using ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task value and completion&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Check Task finished UWP.png|Check Task (WinX)&lt;br /&gt;
File:Check Task android.jpg|Not Applicable Check Task (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Commissioning Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''COMMISSIONING_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_COMMISSIONINGCHECK]]&lt;br /&gt;
&lt;br /&gt;
A Commissioning Task is a specialized task type used in MRO commissioning workflows.&lt;br /&gt;
&lt;br /&gt;
'''Relevant property'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| NOTAPPLICABLE || {{Boolean}} || Not Applicable state&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Inspection Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''INSPECTION_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_INSPECTION_TASK]]&lt;br /&gt;
&lt;br /&gt;
An Inspection Task captures a Boolean inspection result. The client presents a positive and a negative option as well as ''Not Applicable''. Selecting an option completes the task.&lt;br /&gt;
&lt;br /&gt;
The labels for the positive and negative outcomes can be configured. Selecting the negative outcome displays the configured false label.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Selected inspection result&lt;br /&gt;
|-&lt;br /&gt;
| LABEL_TRUE || {{String}} || Label for the positive outcome&lt;br /&gt;
|-&lt;br /&gt;
| LABEL_FALSE || {{String}} || Label for the negative outcome&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Finished Inspection Task UWP.png|Finished Inspection Task (WinX)&lt;br /&gt;
File:Inspection task android.jpg|Finished Inspection Task (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Interface Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''INTERFACE_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_CHECK_TASK]]&lt;br /&gt;
&lt;br /&gt;
An Interface Task waits for another software system to provide its completion value. The task is complete when its Boolean '''VALUE''' becomes true. If the client is offline, the task waits until connectivity and synchronization are available again.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task completion supplied by the external software system&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Joint Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''JOINT_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_JOINTTASK]]&lt;br /&gt;
&lt;br /&gt;
A Joint Task documents the state of a linked joint location. The user selects one of the available Joint States.&lt;br /&gt;
&lt;br /&gt;
'''Relevant properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| LK_JOINT_LOCATION || Link to the associated joint location&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || Selected Joint State&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The available states are:&lt;br /&gt;
&lt;br /&gt;
* Closed&lt;br /&gt;
* Disconnected&lt;br /&gt;
* Open&lt;br /&gt;
* Planned&lt;br /&gt;
* Reconnected&lt;br /&gt;
* Torqued&lt;br /&gt;
* Undefined&lt;br /&gt;
* Verified&lt;br /&gt;
&lt;br /&gt;
The Joint Task is complete when its state is '''Planned''' or '''Closed'''.&lt;br /&gt;
&lt;br /&gt;
=== Measurement Task ===&lt;br /&gt;
&lt;br /&gt;
Technical classification name: '''MROCLS_MRO_MEASUREMENT_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_MEASUREMENT_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Measurement Task records a measured Double value, for example a value read from a pressure gauge. Selecting the displayed value opens an editor. If no value has been entered, the editor initially displays an empty value. Entering a value or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
An optional secondary value indicator can display a previously recorded value. Its behaviour has to be configured separately.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Double}} || Currently recorded measurement&lt;br /&gt;
|-&lt;br /&gt;
| PREVIOUS_VALUE || {{Double}} || Previously recorded measurement&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Measurment Task Empty UWP.png|Measurement Task without a recorded value (WinX)&lt;br /&gt;
File:Measurment Task Not Empty UWP.png|Measurement Task with a recorded value (WinX)&lt;br /&gt;
File:Measurment Task Empty Android.jpg|Measurement Task without a recorded value (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Numeric Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''NUMERIC_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_NUMERIC_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Numeric Task records a Double value, for example a value read from a temperature sensor. Entering a value or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
The value is compared against a configured acceptable range that cannot be edited on the client. A value outside the range produces visual feedback and sets the [[MRO Objects (Client)#Technical Status|technical status]] to indicate an issue. An invalid configured range, such as a minimum greater than the maximum, also produces an issue when a value is entered.&lt;br /&gt;
&lt;br /&gt;
A value unit can be configured for an individual task. When present, it overrides the standard unit configured on the [[MetaProperty#Unit_Item|MetaProperty]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Double}} || Recorded numeric value&lt;br /&gt;
|-&lt;br /&gt;
| VALUE_UNIT || {{String}} || Instance-specific value unit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Pick List Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PICKLIST_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_PICK_LIST_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Pick List Task allows the user to select one value from an [[UBIK Active Lists|Active List]] configured on the task instance. It behaves similarly to a standard Integer Task with a Selective List, but the selectable values are supplied by the Active List rather than being defined globally.&lt;br /&gt;
&lt;br /&gt;
Every list item has an Integer value. Selecting an item or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Integer}} || Value of the selected Active List item&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Picture Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PICTURE_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_PICTURE_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Picture Task is a Boolean task that can only be finished when it has at least one child document containing a valid file. Multiple child documents can be attached. Although pictures are the most common files, the child document can contain another file type.&lt;br /&gt;
&lt;br /&gt;
The clients display a file or photo button next to the task checkbox. The task cannot be completed through the checkbox until the file requirement is satisfied. Selecting ''Not Applicable'' is always possible and bypasses the child-document requirement.&lt;br /&gt;
&lt;br /&gt;
When the user attempts to finish the task while online, the client may first synchronize the task's child objects and download the files of its child documents. During synchronization, the checkbox is replaced by a wait indicator.&lt;br /&gt;
&lt;br /&gt;
* If no child document or no local file is available, the task remains unfinished and the user is informed.&lt;br /&gt;
* If at least one child document with a valid local file is available, the task is finished and the file or photo button is disabled.&lt;br /&gt;
&lt;br /&gt;
Child-count information can be configured but is not required. WinX can display the child documents in an expander. This is not shown by default on Mobile due to the available screen size, but it can be customized using [[Object_hierarchy_in_XAML:_NextLevel,_ParentLevel,_LinkedLevel#Show_NextLevel_Children.2FDocuments|Show NextLevel Children/Documents]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task completion&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Progress Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PROGRESS_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_PROGRESS_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Progress Task reports progress between 0% and 100%. The reported value contributes to the progress of the owning Work Package. Values below 100% represent partial progress; the task is finished only when the reported progress reaches 100%. It can alternatively be completed using ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Double}} || Currently reported progress&lt;br /&gt;
|-&lt;br /&gt;
| PREVIOUS_VALUE || {{Double}} || Previously reported progress&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
An [[MRO_PROGRESS_TASK_EDITOR|alternative editor]] is available for Progress Tasks.{{Version/WinXSince|2.5.4}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Progress Task UWP.png|Progress Task with reported progress (WinX)&lt;br /&gt;
File:Progress Task Android.jpg|Progress Task with current and previous progress (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Signature Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SIGNATURE_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_SIGNATURE_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Signature Task is completed by capturing a handwritten signature. Selecting the signature editor opens an in-app dialog in which the user can sign. Confirming the signature saves it and automatically completes the task.&lt;br /&gt;
&lt;br /&gt;
When signing while online, the server resolves and displays the signee and generates the validation timestamp. When signing offline, the signee is resolved and displayed once the client is online again. If the complete signee or validation timestamp cannot be displayed in the editor field, selecting the field opens a popup with the complete information.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || Signature || Captured signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Module|MRO (Plugin)]]&lt;br /&gt;
&lt;br /&gt;
=== Supervisor Check Task {{Version/XamarinSince|4.8}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SUPERVISOR_CHECK_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_SUPERVISOR_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Supervisor Check Task applies the four-eyes principle to a Boolean [[#Check Task|Check Task]] on one device. The worker hands the device to a supervisor. The supervisor scans an NFC tag and enters the supervisor PIN. After successful authentication, the checkbox is enabled and must still be selected to finish the task.&lt;br /&gt;
&lt;br /&gt;
Selecting ''Not Applicable'' does not require supervisor authentication.&lt;br /&gt;
&lt;br /&gt;
Successful supervisor authentication removes only the supervisor-related lock. The task can remain locked for another reason, such as sequential dependencies or user rights. If an incorrect PIN is entered three times, authentication is cancelled and the NFC tag has to be scanned again. A setting controls [[RFID tags#Choose which information to use from a tag|which tag information is used]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || [[#Check Task|Check Task]] completion&lt;br /&gt;
|-&lt;br /&gt;
| SUPERVISOR || {{Guid}} || Authenticated supervisor&lt;br /&gt;
|-&lt;br /&gt;
| PERMISSION || {{String}} || Required supervisor permission&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=300px heights=300px&amp;gt;&lt;br /&gt;
File:UI_Xamarin_Supervisor_Task_Before_Verification.jpg|Supervisor Check Task before verification&lt;br /&gt;
File:UI_Xamarin_Supervisor_Task_Enter_PIN.jpg|Supervisor PIN entry&lt;br /&gt;
File:UI_Xamarin_Supervisor_Task_After_Verification.jpg|Supervisor Check Task after verification&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Switch End Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SWITCH_END_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_SWITCH_END_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Switch End Task marks the point at which the two branches created by a [[#Switch Start Task|Switch Start Task]] merge again. It is linked to exactly one corresponding [[#Switch Start Task|Switch Start Task]]. It is not shown to the user and completes automatically after the selected branch has finished, allowing the common Procedure workflow to continue.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task completion&lt;br /&gt;
|-&lt;br /&gt;
| LK_SWITCH_START_TASK || {{Guid}} || Link to the corresponding [[#Switch Start Task|Switch Start Task]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
See also [[#Procedure Task Variants and Workflow Execution|Procedure Task Variants and Workflow Execution]].&lt;br /&gt;
&lt;br /&gt;
=== Switch Start Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SWITCH_START_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_SWITCH_START_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Switch Start Task is a sequential workflow-control task used in a Procedure Workpackage. It automatically evaluates a Boolean expression on the client and selects either the true or false branch. Each branch represents a different path of Tasks and must lead to a corresponding [[#Switch End Task|Switch End Task]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| EXPRESSION || {{String}} || Expression evaluated by the client&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Integer}} || Evaluation state: Undefined = 0, Pending = 10, Finished = 20, Error = 30&lt;br /&gt;
|-&lt;br /&gt;
| BRANCH_TRUE || {{Guid}} || Link to the Task or Task Owner that starts the true branch&lt;br /&gt;
|-&lt;br /&gt;
| BRANCH_FALSE || {{Guid}} || Link to the Task or Task Owner that starts the false branch&lt;br /&gt;
|-&lt;br /&gt;
| DISPLAYSTRING_TRUE || {{String}} || Display string for a true result&lt;br /&gt;
|-&lt;br /&gt;
| DISPLAYSTRING_FALSE || {{String}} || Display string for a false result&lt;br /&gt;
|-&lt;br /&gt;
| EVALUATION_RESULT || {{Boolean}} || Result of the evaluated expression&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
After evaluation, only the selected branch is executed. The other branch remains hidden and its Procedure Tasks are set to ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
See also [[#Procedure Task Variants and Workflow Execution|Procedure Task Variants and Workflow Execution]].&lt;br /&gt;
&lt;br /&gt;
=== Text Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''TEXT_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_TEXT_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Text Task allows the user to enter free-form text. Entering a value or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{String}} || Entered text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Supervisor Base Type {{Version/XamarinSince|4.8}} ==&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SUPERVISOR_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_SUPERVISOR_TASK]]&lt;br /&gt;
&lt;br /&gt;
Supervisor Task is a base type that provides supervisor authentication behaviour. It is not used as a standalone user task. The concrete task type using this behaviour is [[#Supervisor Check Task|Supervisor Check Task]].&lt;br /&gt;
&lt;br /&gt;
== Procedure Task Variants and Workflow Execution {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ==&lt;br /&gt;
&lt;br /&gt;
{{Hint|For the complete list of base task types and their task-specific behaviour, see [[#MRO Task Types|MRO Task Types]].}}&lt;br /&gt;
&lt;br /&gt;
Procedure variants are specialized versions of task types for use within Procedure Workpackages. They retain the behaviour of their corresponding task type and additionally implement the [[MROCLS_SEQUENTIALTASK|Sequential Task]] and [[MROCLS_GROUPEDTASK|Grouped Task]] classifications.&lt;br /&gt;
&lt;br /&gt;
Procedure variants are available for:&lt;br /&gt;
&lt;br /&gt;
* [[#Calculation Task|Calculation Task]]&lt;br /&gt;
* [[#Check Task|Check Task]]&lt;br /&gt;
* [[#Inspection Task|Inspection Task]]&lt;br /&gt;
* [[#Interface Task|Interface Task]]&lt;br /&gt;
* [[#Numeric Task|Numeric Task]]&lt;br /&gt;
* [[#Pick List Task|Pick List Task]]&lt;br /&gt;
* [[#Picture Task|Picture Task]]&lt;br /&gt;
* [[#Signature Task|Signature Task]]&lt;br /&gt;
* [[#Supervisor Check Task|Supervisor Check Task]]&lt;br /&gt;
* [[#Text Task|Text Task]]&lt;br /&gt;
&lt;br /&gt;
[[#Switch Start Task|Switch Start Tasks]], [[#Switch End Task|Switch End Tasks]], and [[#Calculation Task|Calculation Tasks]] provide automatic workflow-control behaviour in a Procedure Workpackage.&lt;br /&gt;
&lt;br /&gt;
For automatic [[#Calculation Task|Calculation Tasks]] and [[#Switch Start Task|Switch Start Tasks]], the clients display an evaluation indicator:&lt;br /&gt;
&lt;br /&gt;
* '''Finished:''' The Task was automatically evaluated successfully.&lt;br /&gt;
* '''Error:''' The Task was evaluated but resulted in an error.&lt;br /&gt;
* '''Pending:''' The Task has not yet been evaluated. No additional indicator is displayed for this state.&lt;br /&gt;
&lt;br /&gt;
When a predecessor [[#Switch Start Task|Switch Start Task]] has not yet finished, its follow-up Procedure Tasks are hidden because the relevant branch is not yet known. After evaluation, the selected branch becomes visible. The other branch remains hidden, is not executed, and its Procedure Tasks are set to ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
For example, several predecessor [[#Numeric Task|Numeric Tasks]] can record temperatures from different parts of an equipment. A subsequent [[#Calculation Task|Calculation Task]] can calculate their average. A [[#Switch Start Task|Switch Start Task]] can then select a branch based on whether the average exceeds a configured temperature. One branch can contain a Task for activating a cooling mechanism, while the other branch can lead directly to the [[#Switch End Task|Switch End Task]] or contain further [[#Switch Start Task|Switch Tasks]].&lt;br /&gt;
&lt;br /&gt;
Procedure Tasks are intended to execute automatically when their predecessors are finished. However, the completion of the predecessor has to be triggered by a user. If a predecessor becomes finished only because of a server update, the follow-up Procedure workflow is not triggered. This prevents a workflow from executing in the name of users who did not initiate or observe the completion.&lt;br /&gt;
&lt;br /&gt;
The general online and offline evaluation rules for sequential and grouped Tasks are documented in [[MRO Objects (Client)#Sequential Task|Sequential Task]] and [[MRO Objects (Client)#Grouped Task|Grouped Task]].&lt;br /&gt;
&lt;br /&gt;
== Supporting File Documents ==&lt;br /&gt;
&lt;br /&gt;
=== Procedure JSON File Document ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''FILEDOCUMENT_MRO_JSON'''&lt;br /&gt;
&lt;br /&gt;
This File Document stores the JSON definition of a [[#Procedure Workpackage|Procedure Workpackage]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| LK_PROCEDURE_WORKPACKAGE || {{Guid}} || Link to the associated [[#Procedure Workpackage|Procedure Workpackage]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Picture Task File Document ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''FILEDOCUMENT_MRO_PICTURE_TASK'''&lt;br /&gt;
&lt;br /&gt;
This is a dedicated File Document linked to a [[#Picture Task|Picture Task]]. A [[#Picture Task|Picture Task]] can also use another child-document type, provided that the child document contains a valid file.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| LK_PICTURE_TASK || {{Guid}} || Link to the associated [[#Picture Task|Picture Task]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[MRO Objects (Client)]]&lt;br /&gt;
* [[MROCLS_MRO_TASKOWNER]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_WORKPACKAGE]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_PROGRESS_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_MEASUREMENT_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_CHECK_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_INSPECTION_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_SEQUENTIALTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_GROUPEDTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_PROCEDURE]] (Classification)&lt;br /&gt;
* [[MROCLS_SWITCH_START_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_SWITCH_END_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_CALCULATION_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_PICK_LIST_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_PICTURE_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_BLINDINGTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_COMMISSIONINGCHECK]] (Classification)&lt;br /&gt;
* [[MROCLS_JOINTTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_SIGNATURE_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_TEXT_TASK]] (Classification)&lt;br /&gt;
&lt;br /&gt;
[[Category:Module|MRO (Plugin)]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_(Plugin)&amp;diff=30451</id>
		<title>MRO (Plugin)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_(Plugin)&amp;diff=30451"/>
				<updated>2026-08-17T14:21:47Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The MRO plugin provides a set of {{UBIK}} objects for representing and documenting maintenance, repair and operations work. The MRO features are available in the supported Mobile and {{UBIK WinX}} clients.&lt;br /&gt;
&lt;br /&gt;
This page is the main documentation for the MRO object model and its task types. Common client behaviour, such as status indicators, locking, and the general evaluation of sequential and grouped tasks, is documented in [[MRO Objects (Client)]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Page !! Scope&lt;br /&gt;
|-&lt;br /&gt;
| '''MRO (Plugin)''' || MRO concepts, task types, task-specific behaviour, and relevant technical properties&lt;br /&gt;
|-&lt;br /&gt;
| [[MRO Objects (Client)]] || Common client presentation, status indicators, locking, and behaviour shared by multiple MRO objects&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Basic Features ==&lt;br /&gt;
&lt;br /&gt;
Objects classified as MRO objects generally provide a technical and organisational status as well as an overall work progress based on their underlying data branch.&lt;br /&gt;
&lt;br /&gt;
=== Technical Status ===&lt;br /&gt;
&lt;br /&gt;
For detailed information, see [[MRO Objects (Client)#Technical Status|Technical Status]].&lt;br /&gt;
&lt;br /&gt;
=== Organisational Status ===&lt;br /&gt;
&lt;br /&gt;
For detailed information, see [[MRO Objects (Client)#Organisational Status|Organisational Status]].&lt;br /&gt;
&lt;br /&gt;
=== Work Progress ===&lt;br /&gt;
&lt;br /&gt;
For detailed information, see [[MRO Objects (Client)#Work Progress|Work Progress]].&lt;br /&gt;
&lt;br /&gt;
== MRO Objects ==&lt;br /&gt;
&lt;br /&gt;
MRO uses Task Owners, Work Packages, Tasks, and Procedure Workpackages to represent maintenance workflows.&lt;br /&gt;
&lt;br /&gt;
=== Task Owner ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_TASKOWNER|Task Owner]] is an object with an underlying structure of work to be performed. It can contain other Task Owners or Work Packages. Their technical status, organisational status, and work progress are accumulated and reported to the Task Owner.&lt;br /&gt;
&lt;br /&gt;
=== Work Package ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_WORKPACKAGE|Work Package]] collects and summarizes Task Owners, other Work Packages, or Tasks. A Work Package can be confirmed when all associated Tasks have reached the required progress and all subordinate Work Packages have been confirmed.&lt;br /&gt;
&lt;br /&gt;
For Work Package presentation and confirmation in the clients, see [[MRO Objects (Client)#Work Package|Work Package]].&lt;br /&gt;
&lt;br /&gt;
=== Task ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_TASK|Task]] reports work progress to its owning Work Package. The available task types provide different input, validation, or automatic workflow behaviour.&lt;br /&gt;
&lt;br /&gt;
MRO task values must be validated for work progress to be calculated. A MetaAttribute providing a validation timestamp must therefore be attached to the relevant MetaProperty.&lt;br /&gt;
&lt;br /&gt;
{{Attention|A task value property has to use [[Attributes]] so that its value can be validated. Otherwise, work progress cannot be calculated.}}&lt;br /&gt;
&lt;br /&gt;
All user-editable MRO task types can be set to ''Not Applicable''. In the clients, a completed user-editable task can be reset by selecting ''Not Applicable'' twice. General client behaviour is documented in [[MRO Objects (Client)#Task|Task]].&lt;br /&gt;
&lt;br /&gt;
=== Procedure Workpackage ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PROCEDURE_WORKPACKAGE'''&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_PROCEDURE|Procedure Workpackage]] is a specialized Work Package for structured workflows. Its structure is defined in JSON using a workflow editor and can contain Tasks as well as subordinate Procedure Workpackages. Depending on its state, the corresponding objects are created or updated.&lt;br /&gt;
&lt;br /&gt;
Procedure Workpackages can use [[MRO Objects (Client)#Sequential Task|sequential execution]], [[MRO Objects (Client)#Grouped Task|grouped Tasks]], [[#Switch Start Task|branching]], [[#Calculation Task|calculations]], and references to linked data. Their workflows support online and offline use. Steps that require data exchange wait until connectivity is available.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| PROCEDURE_STATUS || {{Integer}} || Current state: Draft = 10, ReadyToUse = 20, Published = 30, Open = 40, Executing = 50, Completed = 60, Approved = 70, Rejected = 80&lt;br /&gt;
|-&lt;br /&gt;
| JSON || {{String}} || JSON representation of the Procedure Workpackage&lt;br /&gt;
|-&lt;br /&gt;
| ISTEMPLATE || {{Boolean}} || Indicates whether the Procedure Workpackage is a template&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MRO Task Types ==&lt;br /&gt;
&lt;br /&gt;
The following task types are available in MRO. The technical object names are included to make the task types discoverable through the wiki search.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Task type !! Technical object name !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| [[#Blinding Task|Blinding Task]] || BLINDING_TASK || Documents a blinding or deblinding operation&lt;br /&gt;
|-&lt;br /&gt;
| [[#Calculation Task|Calculation Task]] || CALCULATION_TASK || Evaluates an expression and writes its result to a target property&lt;br /&gt;
|-&lt;br /&gt;
| [[#Check Task|Check Task]] || CHECK_TASK || Confirms a Boolean task using a checkbox&lt;br /&gt;
|-&lt;br /&gt;
| [[#Commissioning Task|Commissioning Task]] || COMMISSIONING_TASK || Represents a task in an MRO commissioning workflow&lt;br /&gt;
|-&lt;br /&gt;
| [[#Inspection Task|Inspection Task]] || INSPECTION_TASK || Records a Boolean inspection result with configurable labels&lt;br /&gt;
|-&lt;br /&gt;
| [[#Interface Task|Interface Task]] || INTERFACE_TASK || Waits for completion information from another software system&lt;br /&gt;
|-&lt;br /&gt;
| [[#Joint Task|Joint Task]] || JOINT_TASK || Documents the state of a joint location&lt;br /&gt;
|-&lt;br /&gt;
| [[#Measurement Task|Measurement Task]] || MROCLS_MRO_MEASUREMENT_TASK || Records a measured Double value&lt;br /&gt;
|-&lt;br /&gt;
| [[#Numeric Task|Numeric Task]] || NUMERIC_TASK || Records a numeric value and evaluates it against a configured range&lt;br /&gt;
|-&lt;br /&gt;
| [[#Pick List Task|Pick List Task]] || PICKLIST_TASK || Selects one integer value from an instance-specific Active List&lt;br /&gt;
|-&lt;br /&gt;
| [[#Picture Task|Picture Task]] || PICTURE_TASK || Requires at least one child document containing a valid file&lt;br /&gt;
|-&lt;br /&gt;
| [[#Progress Task|Progress Task]] || PROGRESS_TASK || Reports progress between 0% and 100%&lt;br /&gt;
|-&lt;br /&gt;
| [[#Signature Task|Signature Task]] || SIGNATURE_TASK || Captures a handwritten signature&lt;br /&gt;
|-&lt;br /&gt;
| [[#Supervisor Check Task|Supervisor Check Task]] || SUPERVISOR_CHECK_TASK || Applies the four-eyes principle to a [[#Check Task|Check Task]]&lt;br /&gt;
|-&lt;br /&gt;
| [[#Switch End Task|Switch End Task]] || SWITCH_END_TASK || Rejoins the branches of a Procedure workflow&lt;br /&gt;
|-&lt;br /&gt;
| [[#Switch Start Task|Switch Start Task]] || SWITCH_START_TASK || Selects a Procedure branch by evaluating a Boolean expression&lt;br /&gt;
|-&lt;br /&gt;
| [[#Text Task|Text Task]] || TEXT_TASK || Records free-form text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Hint|For the available Procedure variants and their workflow execution, see [[#Procedure Task Variants and Workflow Execution|Procedure Tasks]].}}&lt;br /&gt;
&lt;br /&gt;
=== Blinding Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''BLINDING_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_BLINDINGTASK]]&lt;br /&gt;
&lt;br /&gt;
A Blinding Task documents either a blinding or deblinding operation at a linked blinding location. The configured operation type determines the state that must be reported to complete the task.&lt;br /&gt;
&lt;br /&gt;
'''Relevant properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| BLINDING_TYPE || Configured operation type: Blinding or DeBlinding&lt;br /&gt;
|-&lt;br /&gt;
| LK_BLINDING_LOCATION || Link to the associated blinding location&lt;br /&gt;
|-&lt;br /&gt;
| LK_PREVIOUS_TASK || Link to the preceding Blinding Task&lt;br /&gt;
|-&lt;br /&gt;
| LOCKED || Prevents the task from being edited&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || Reported blinding state&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The task is complete only when '''VALUE''' matches the configured '''BLINDING_TYPE'''.&lt;br /&gt;
&lt;br /&gt;
=== Calculation Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''CALCULATION_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_CALCULATION_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Calculation Task automatically evaluates a predefined expression on the client and writes the result to a configured property on its owner. No user input is required.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| EXPRESSION || {{String}} || Expression evaluated by the client&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Integer}} || Evaluation state: Undefined = 0, Pending = 10, Finished = 20, Error = 30&lt;br /&gt;
|-&lt;br /&gt;
| TARGET_PROPERTY_NAME || {{String}} || Name of the target property on the owner&lt;br /&gt;
|-&lt;br /&gt;
| TARGET_PROPERTY_TYPE || {{Integer}} || Target type: Undefined = 0, Boolean = 1, Integer = 3, Double = 4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The task is automatically finished after successful evaluation. The clients display an indicator for a successful evaluation or an evaluation error. A Pending state does not receive an additional indicator.&lt;br /&gt;
&lt;br /&gt;
See also [[#Procedure Task Variants and Workflow Execution|Procedure Task Variants and Workflow Execution]].&lt;br /&gt;
&lt;br /&gt;
=== Check Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''CHECK_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_CHECK_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Check Task is a simple Boolean task represented by a checkbox. Clicking the checkbox sets its value and completes the task. It can alternatively be completed using ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task value and completion&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Check Task finished UWP.png|Check Task (WinX)&lt;br /&gt;
File:Check Task android.jpg|Not Applicable Check Task (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Commissioning Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''COMMISSIONING_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_COMMISSIONINGCHECK]]&lt;br /&gt;
&lt;br /&gt;
A Commissioning Task is a specialized task type used in MRO commissioning workflows.&lt;br /&gt;
&lt;br /&gt;
'''Relevant property'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| NOTAPPLICABLE || {{Boolean}} || Not Applicable state&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Inspection Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''INSPECTION_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_INSPECTION_TASK]]&lt;br /&gt;
&lt;br /&gt;
An Inspection Task captures a Boolean inspection result. The client presents a positive and a negative option as well as ''Not Applicable''. Selecting an option completes the task.&lt;br /&gt;
&lt;br /&gt;
The labels for the positive and negative outcomes can be configured. Selecting the negative outcome displays the configured false label.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Selected inspection result&lt;br /&gt;
|-&lt;br /&gt;
| LABEL_TRUE || {{String}} || Label for the positive outcome&lt;br /&gt;
|-&lt;br /&gt;
| LABEL_FALSE || {{String}} || Label for the negative outcome&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Finished Inspection Task UWP.png|Finished Inspection Task (WinX)&lt;br /&gt;
File:Inspection task android.jpg|Finished Inspection Task (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Interface Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''INTERFACE_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_CHECK_TASK]]&lt;br /&gt;
&lt;br /&gt;
An Interface Task waits for another software system to provide its completion value. The task is complete when its Boolean '''VALUE''' becomes true. If the client is offline, the task waits until connectivity and synchronization are available again.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task completion supplied by the external software system&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Joint Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''JOINT_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_JOINTTASK]]&lt;br /&gt;
&lt;br /&gt;
A Joint Task documents the state of a linked joint location. The user selects one of the available Joint States.&lt;br /&gt;
&lt;br /&gt;
'''Relevant properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| LK_JOINT_LOCATION || Link to the associated joint location&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || Selected Joint State&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The available states are:&lt;br /&gt;
&lt;br /&gt;
* Closed&lt;br /&gt;
* Disconnected&lt;br /&gt;
* Open&lt;br /&gt;
* Planned&lt;br /&gt;
* Reconnected&lt;br /&gt;
* Torqued&lt;br /&gt;
* Undefined&lt;br /&gt;
* Verified&lt;br /&gt;
&lt;br /&gt;
The Joint Task is complete when its state is '''Planned''' or '''Closed'''.&lt;br /&gt;
&lt;br /&gt;
=== Measurement Task ===&lt;br /&gt;
&lt;br /&gt;
Technical classification name: '''MROCLS_MRO_MEASUREMENT_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_MEASUREMENT_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Measurement Task records a measured Double value, for example a value read from a pressure gauge. Selecting the displayed value opens an editor. If no value has been entered, the editor initially displays an empty value. Entering a value or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
An optional secondary value indicator can display a previously recorded value. Its behaviour has to be configured separately.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Double}} || Currently recorded measurement&lt;br /&gt;
|-&lt;br /&gt;
| PREVIOUS_VALUE || {{Double}} || Previously recorded measurement&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Measurment Task Empty UWP.png|Measurement Task without a recorded value (WinX)&lt;br /&gt;
File:Measurment Task Not Empty UWP.png|Measurement Task with a recorded value (WinX)&lt;br /&gt;
File:Measurment Task Empty Android.jpg|Measurement Task without a recorded value (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Numeric Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''NUMERIC_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_NUMERIC_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Numeric Task records a Double value, for example a value read from a temperature sensor. Entering a value or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
The value is compared against a configured acceptable range that cannot be edited on the client. A value outside the range produces visual feedback and sets the [[MRO Objects (Client)#Technical Status|technical status]] to indicate an issue. An invalid configured range, such as a minimum greater than the maximum, also produces an issue when a value is entered.&lt;br /&gt;
&lt;br /&gt;
A value unit can be configured for an individual task. When present, it overrides the standard unit configured on the [[MetaProperty#Unit_Item|MetaProperty]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Double}} || Recorded numeric value&lt;br /&gt;
|-&lt;br /&gt;
| VALUE_UNIT || {{String}} || Instance-specific value unit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Pick List Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PICKLIST_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_PICK_LIST_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Pick List Task allows the user to select one value from an [[UBIK Active Lists|Active List]] configured on the task instance. It behaves similarly to a standard Integer Task with a Selective List, but the selectable values are supplied by the Active List rather than being defined globally.&lt;br /&gt;
&lt;br /&gt;
Every list item has an Integer value. Selecting an item or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Integer}} || Value of the selected Active List item&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Picture Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PICTURE_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_PICTURE_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Picture Task is a Boolean task that can only be finished when it has at least one child document containing a valid file. Multiple child documents can be attached. Although pictures are the most common files, the child document can contain another file type.&lt;br /&gt;
&lt;br /&gt;
The clients display a file or photo button next to the task checkbox. The task cannot be completed through the checkbox until the file requirement is satisfied. Selecting ''Not Applicable'' is always possible and bypasses the child-document requirement.&lt;br /&gt;
&lt;br /&gt;
When the user attempts to finish the task while online, the client may first synchronize the task's child objects and download the files of its child documents. During synchronization, the checkbox is replaced by a wait indicator.&lt;br /&gt;
&lt;br /&gt;
* If no child document or no local file is available, the task remains unfinished and the user is informed.&lt;br /&gt;
* If at least one child document with a valid local file is available, the task is finished and the file or photo button is disabled.&lt;br /&gt;
&lt;br /&gt;
Child-count information can be configured but is not required. WinX can display the child documents in an expander. This is not shown by default on Mobile due to the available screen size, but it can be customized using [[Object_hierarchy_in_XAML:_NextLevel,_ParentLevel,_LinkedLevel#Show_NextLevel_Children.2FDocuments|Show NextLevel Children/Documents]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task completion&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Progress Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PROGRESS_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_PROGRESS_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Progress Task reports progress between 0% and 100%. The reported value contributes to the progress of the owning Work Package. Values below 100% represent partial progress; the task is finished only when the reported progress reaches 100%. It can alternatively be completed using ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Double}} || Currently reported progress&lt;br /&gt;
|-&lt;br /&gt;
| PREVIOUS_VALUE || {{Double}} || Previously reported progress&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
An [[MRO_PROGRESS_TASK_EDITOR|alternative editor]] is available for Progress Tasks.{{Version/WinXSince|2.5.4}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Progress Task UWP.png|Progress Task with reported progress (WinX)&lt;br /&gt;
File:Progress Task Android.jpg|Progress Task with current and previous progress (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Signature Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SIGNATURE_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_SIGNATURE_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Signature Task is completed by capturing a handwritten signature. Selecting the signature editor opens an in-app dialog in which the user can sign. Confirming the signature saves it and automatically completes the task.&lt;br /&gt;
&lt;br /&gt;
When signing while online, the server resolves and displays the signee and generates the validation timestamp. When signing offline, the signee is resolved and displayed once the client is online again. If the complete signee or validation timestamp cannot be displayed in the editor field, selecting the field opens a popup with the complete information.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Signature}} || Captured signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Supervisor Check Task {{Version/XamarinSince|4.8}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SUPERVISOR_CHECK_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_SUPERVISOR_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Supervisor Check Task applies the four-eyes principle to a Boolean [[#Check Task|Check Task]] on one device. The worker hands the device to a supervisor. The supervisor scans an NFC tag and enters the supervisor PIN. After successful authentication, the checkbox is enabled and must still be selected to finish the task.&lt;br /&gt;
&lt;br /&gt;
Selecting ''Not Applicable'' does not require supervisor authentication.&lt;br /&gt;
&lt;br /&gt;
Successful supervisor authentication removes only the supervisor-related lock. The task can remain locked for another reason, such as sequential dependencies or user rights. If an incorrect PIN is entered three times, authentication is cancelled and the NFC tag has to be scanned again. A setting controls [[RFID tags#Choose which information to use from a tag|which tag information is used]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || [[#Check Task|Check Task]] completion&lt;br /&gt;
|-&lt;br /&gt;
| SUPERVISOR || {{Guid}} || Authenticated supervisor&lt;br /&gt;
|-&lt;br /&gt;
| PERMISSION || {{String}} || Required supervisor permission&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=300px heights=300px&amp;gt;&lt;br /&gt;
File:UI_Xamarin_Supervisor_Task_Before_Verification.jpg|Supervisor Check Task before verification&lt;br /&gt;
File:UI_Xamarin_Supervisor_Task_Enter_PIN.jpg|Supervisor PIN entry&lt;br /&gt;
File:UI_Xamarin_Supervisor_Task_After_Verification.jpg|Supervisor Check Task after verification&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Switch End Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SWITCH_END_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_SWITCH_END_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Switch End Task marks the point at which the two branches created by a [[#Switch Start Task|Switch Start Task]] merge again. It is linked to exactly one corresponding [[#Switch Start Task|Switch Start Task]]. It is not shown to the user and completes automatically after the selected branch has finished, allowing the common Procedure workflow to continue.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task completion&lt;br /&gt;
|-&lt;br /&gt;
| LK_SWITCH_START_TASK || {{Guid}} || Link to the corresponding [[#Switch Start Task|Switch Start Task]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
See also [[#Procedure Task Variants and Workflow Execution|Procedure Task Variants and Workflow Execution]].&lt;br /&gt;
&lt;br /&gt;
=== Switch Start Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SWITCH_START_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_SWITCH_START_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Switch Start Task is a sequential workflow-control task used in a Procedure Workpackage. It automatically evaluates a Boolean expression on the client and selects either the true or false branch. Each branch represents a different path of Tasks and must lead to a corresponding [[#Switch End Task|Switch End Task]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| EXPRESSION || {{String}} || Expression evaluated by the client&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Integer}} || Evaluation state: Undefined = 0, Pending = 10, Finished = 20, Error = 30&lt;br /&gt;
|-&lt;br /&gt;
| BRANCH_TRUE || {{Guid}} || Link to the Task or Task Owner that starts the true branch&lt;br /&gt;
|-&lt;br /&gt;
| BRANCH_FALSE || {{Guid}} || Link to the Task or Task Owner that starts the false branch&lt;br /&gt;
|-&lt;br /&gt;
| DISPLAYSTRING_TRUE || {{String}} || Display string for a true result&lt;br /&gt;
|-&lt;br /&gt;
| DISPLAYSTRING_FALSE || {{String}} || Display string for a false result&lt;br /&gt;
|-&lt;br /&gt;
| EVALUATION_RESULT || {{Boolean}} || Result of the evaluated expression&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
After evaluation, only the selected branch is executed. The other branch remains hidden and its Procedure Tasks are set to ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
See also [[#Procedure Task Variants and Workflow Execution|Procedure Task Variants and Workflow Execution]].&lt;br /&gt;
&lt;br /&gt;
=== Text Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''TEXT_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_TEXT_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Text Task allows the user to enter free-form text. Entering a value or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{String}} || Entered text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Supervisor Base Type {{Version/XamarinSince|4.8}} ==&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SUPERVISOR_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_SUPERVISOR_TASK]]&lt;br /&gt;
&lt;br /&gt;
Supervisor Task is a base type that provides supervisor authentication behaviour. It is not used as a standalone user task. The concrete task type using this behaviour is [[#Supervisor Check Task|Supervisor Check Task]].&lt;br /&gt;
&lt;br /&gt;
== Procedure Task Variants and Workflow Execution {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ==&lt;br /&gt;
&lt;br /&gt;
{{Hint|For the complete list of base task types and their task-specific behaviour, see [[#MRO Task Types|MRO Task Types]].}}&lt;br /&gt;
&lt;br /&gt;
Procedure variants are specialized versions of task types for use within Procedure Workpackages. They retain the behaviour of their corresponding task type and additionally implement the [[MROCLS_SEQUENTIALTASK|Sequential Task]] and [[MROCLS_GROUPEDTASK|Grouped Task]] classifications.&lt;br /&gt;
&lt;br /&gt;
Procedure variants are available for:&lt;br /&gt;
&lt;br /&gt;
* [[#Calculation Task|Calculation Task]]&lt;br /&gt;
* [[#Check Task|Check Task]]&lt;br /&gt;
* [[#Inspection Task|Inspection Task]]&lt;br /&gt;
* [[#Interface Task|Interface Task]]&lt;br /&gt;
* [[#Numeric Task|Numeric Task]]&lt;br /&gt;
* [[#Pick List Task|Pick List Task]]&lt;br /&gt;
* [[#Picture Task|Picture Task]]&lt;br /&gt;
* [[#Signature Task|Signature Task]]&lt;br /&gt;
* [[#Supervisor Check Task|Supervisor Check Task]]&lt;br /&gt;
* [[#Text Task|Text Task]]&lt;br /&gt;
&lt;br /&gt;
[[#Switch Start Task|Switch Start Tasks]], [[#Switch End Task|Switch End Tasks]], and [[#Calculation Task|Calculation Tasks]] provide automatic workflow-control behaviour in a Procedure Workpackage.&lt;br /&gt;
&lt;br /&gt;
For automatic [[#Calculation Task|Calculation Tasks]] and [[#Switch Start Task|Switch Start Tasks]], the clients display an evaluation indicator:&lt;br /&gt;
&lt;br /&gt;
* '''Finished:''' The Task was automatically evaluated successfully.&lt;br /&gt;
* '''Error:''' The Task was evaluated but resulted in an error.&lt;br /&gt;
* '''Pending:''' The Task has not yet been evaluated. No additional indicator is displayed for this state.&lt;br /&gt;
&lt;br /&gt;
When a predecessor [[#Switch Start Task|Switch Start Task]] has not yet finished, its follow-up Procedure Tasks are hidden because the relevant branch is not yet known. After evaluation, the selected branch becomes visible. The other branch remains hidden, is not executed, and its Procedure Tasks are set to ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
For example, several predecessor [[#Numeric Task|Numeric Tasks]] can record temperatures from different parts of an equipment. A subsequent [[#Calculation Task|Calculation Task]] can calculate their average. A [[#Switch Start Task|Switch Start Task]] can then select a branch based on whether the average exceeds a configured temperature. One branch can contain a Task for activating a cooling mechanism, while the other branch can lead directly to the [[#Switch End Task|Switch End Task]] or contain further [[#Switch Start Task|Switch Tasks]].&lt;br /&gt;
&lt;br /&gt;
Procedure Tasks are intended to execute automatically when their predecessors are finished. However, the completion of the predecessor has to be triggered by a user. If a predecessor becomes finished only because of a server update, the follow-up Procedure workflow is not triggered. This prevents a workflow from executing in the name of users who did not initiate or observe the completion.&lt;br /&gt;
&lt;br /&gt;
The general online and offline evaluation rules for sequential and grouped Tasks are documented in [[MRO Objects (Client)#Sequential Task|Sequential Task]] and [[MRO Objects (Client)#Grouped Task|Grouped Task]].&lt;br /&gt;
&lt;br /&gt;
== Supporting File Documents ==&lt;br /&gt;
&lt;br /&gt;
=== Procedure JSON File Document ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''FILEDOCUMENT_MRO_JSON'''&lt;br /&gt;
&lt;br /&gt;
This File Document stores the JSON definition of a [[#Procedure Workpackage|Procedure Workpackage]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| LK_PROCEDURE_WORKPACKAGE || {{Guid}} || Link to the associated [[#Procedure Workpackage|Procedure Workpackage]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Picture Task File Document ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''FILEDOCUMENT_MRO_PICTURE_TASK'''&lt;br /&gt;
&lt;br /&gt;
This is a dedicated File Document linked to a [[#Picture Task|Picture Task]]. A [[#Picture Task|Picture Task]] can also use another child-document type, provided that the child document contains a valid file.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| LK_PICTURE_TASK || {{Guid}} || Link to the associated [[#Picture Task|Picture Task]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[MRO Objects (Client)]]&lt;br /&gt;
* [[MROCLS_MRO_TASKOWNER]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_WORKPACKAGE]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_PROGRESS_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_MEASUREMENT_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_CHECK_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_INSPECTION_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_SEQUENTIALTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_GROUPEDTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_PROCEDURE]] (Classification)&lt;br /&gt;
* [[MROCLS_SWITCH_START_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_SWITCH_END_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_CALCULATION_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_PICK_LIST_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_PICTURE_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_BLINDINGTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_COMMISSIONINGCHECK]] (Classification)&lt;br /&gt;
* [[MROCLS_JOINTTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_SIGNATURE_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_TEXT_TASK]] (Classification)&lt;br /&gt;
&lt;br /&gt;
[[Category:Module|MRO (Plugin)]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_(Plugin)&amp;diff=30450</id>
		<title>MRO (Plugin)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_(Plugin)&amp;diff=30450"/>
				<updated>2026-08-17T14:15:58Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The MRO plugin provides a set of {{UBIK}} objects for representing and documenting maintenance, repair and operations work. The MRO features are available in the supported Mobile and {{UBIK WinX}} clients.&lt;br /&gt;
&lt;br /&gt;
This page is the main documentation for the MRO object model and its task types. Common client behaviour, such as status indicators, locking, and the general evaluation of sequential and grouped tasks, is documented in [[MRO Objects (Client)]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Page !! Scope&lt;br /&gt;
|-&lt;br /&gt;
| '''MRO (Plugin)''' || MRO concepts, task types, task-specific behaviour, and relevant technical properties&lt;br /&gt;
|-&lt;br /&gt;
| [[MRO Objects (Client)]] || Common client presentation, status indicators, locking, and behaviour shared by multiple MRO objects&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Basic Features ==&lt;br /&gt;
&lt;br /&gt;
Objects classified as MRO objects generally provide a technical and organisational status as well as an overall work progress based on their underlying data branch.&lt;br /&gt;
&lt;br /&gt;
=== Technical Status ===&lt;br /&gt;
&lt;br /&gt;
For detailed information, see [[MRO Objects (Client)#Technical Status|Technical Status]].&lt;br /&gt;
&lt;br /&gt;
=== Organisational Status ===&lt;br /&gt;
&lt;br /&gt;
For detailed information, see [[MRO Objects (Client)#Organisational Status|Organisational Status]].&lt;br /&gt;
&lt;br /&gt;
=== Work Progress ===&lt;br /&gt;
&lt;br /&gt;
For detailed information, see [[MRO Objects (Client)#Work Progress|Work Progress]].&lt;br /&gt;
&lt;br /&gt;
== MRO Objects ==&lt;br /&gt;
&lt;br /&gt;
MRO uses Task Owners, Work Packages, Tasks, and Procedure Workpackages to represent maintenance workflows.&lt;br /&gt;
&lt;br /&gt;
=== Task Owner ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_TASKOWNER|Task Owner]] is an object with an underlying structure of work to be performed. It can contain other Task Owners or Work Packages. Their technical status, organisational status, and work progress are accumulated and reported to the Task Owner.&lt;br /&gt;
&lt;br /&gt;
=== Work Package ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_WORKPACKAGE|Work Package]] collects and summarizes Task Owners, other Work Packages, or Tasks. A Work Package can be confirmed when all associated Tasks have reached the required progress and all subordinate Work Packages have been confirmed.&lt;br /&gt;
&lt;br /&gt;
For Work Package presentation and confirmation in the clients, see [[MRO Objects (Client)#Work Package|Work Package]].&lt;br /&gt;
&lt;br /&gt;
=== Task ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_TASK|Task]] reports work progress to its owning Work Package. The available task types provide different input, validation, or automatic workflow behaviour.&lt;br /&gt;
&lt;br /&gt;
MRO task values must be validated for work progress to be calculated. A MetaAttribute providing a validation timestamp must therefore be attached to the relevant MetaProperty.&lt;br /&gt;
&lt;br /&gt;
{{Attention|A task value property has to use [[Attributes]] so that its value can be validated. Otherwise, work progress cannot be calculated.}}&lt;br /&gt;
&lt;br /&gt;
All user-editable MRO task types can be set to ''Not Applicable''. In the clients, a completed user-editable task can be reset by selecting ''Not Applicable'' twice. General client behaviour is documented in [[MRO Objects (Client)#Task|Task]].&lt;br /&gt;
&lt;br /&gt;
=== Procedure Workpackage ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PROCEDURE_WORKPACKAGE'''&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_PROCEDURE|Procedure Workpackage]] is a specialized Work Package for structured workflows. Its structure is defined in JSON using a workflow editor and can contain Tasks as well as subordinate Procedure Workpackages. Depending on its state, the corresponding objects are created or updated.&lt;br /&gt;
&lt;br /&gt;
Procedure Workpackages can use [[MRO Objects (Client)#Sequential Task|sequential execution]], [[MRO Objects (Client)#Grouped Task|grouped Tasks]], [[#Switch Start Task|branching]], [[#Calculation Task|calculations]], and references to linked data. Their workflows support online and offline use. Steps that require data exchange wait until connectivity is available.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| PROCEDURE_STATUS || {{Integer}} || Current state: Draft = 10, ReadyToUse = 20, Published = 30, Open = 40, Executing = 50, Completed = 60, Approved = 70, Rejected = 80&lt;br /&gt;
|-&lt;br /&gt;
| JSON || {{String}} || JSON representation of the Procedure Workpackage&lt;br /&gt;
|-&lt;br /&gt;
| ISTEMPLATE || {{Boolean}} || Indicates whether the Procedure Workpackage is a template&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MRO Task Types ==&lt;br /&gt;
&lt;br /&gt;
The following task types are available in MRO. The technical object names are included to make the task types discoverable through the wiki search.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Task type !! Technical object name !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| [[#Blinding Task|Blinding Task]] || BLINDING_TASK || Documents a blinding or deblinding operation&lt;br /&gt;
|-&lt;br /&gt;
| [[#Calculation Task|Calculation Task]] || CALCULATION_TASK || Evaluates an expression and writes its result to a target property&lt;br /&gt;
|-&lt;br /&gt;
| [[#Check Task|Check Task]] || CHECK_TASK || Confirms a Boolean task using a checkbox&lt;br /&gt;
|-&lt;br /&gt;
| [[#Commissioning Task|Commissioning Task]] || COMMISSIONING_TASK || Represents a task in an MRO commissioning workflow&lt;br /&gt;
|-&lt;br /&gt;
| [[#Inspection Task|Inspection Task]] || INSPECTION_TASK || Records a Boolean inspection result with configurable labels&lt;br /&gt;
|-&lt;br /&gt;
| [[#Interface Task|Interface Task]] || INTERFACE_TASK || Waits for completion information from another software system&lt;br /&gt;
|-&lt;br /&gt;
| [[#Joint Task|Joint Task]] || JOINT_TASK || Documents the state of a joint location&lt;br /&gt;
|-&lt;br /&gt;
| [[#Measurement Task|Measurement Task]] || MROCLS_MRO_MEASUREMENT_TASK || Records a measured Double value&lt;br /&gt;
|-&lt;br /&gt;
| [[#Numeric Task|Numeric Task]] || NUMERIC_TASK || Records a numeric value and evaluates it against a configured range&lt;br /&gt;
|-&lt;br /&gt;
| [[#Pick List Task|Pick List Task]] || PICKLIST_TASK || Selects one integer value from an instance-specific Active List&lt;br /&gt;
|-&lt;br /&gt;
| [[#Picture Task|Picture Task]] || PICTURE_TASK || Requires at least one child document containing a valid file&lt;br /&gt;
|-&lt;br /&gt;
| [[#Progress Task|Progress Task]] || PROGRESS_TASK || Reports progress between 0% and 100%&lt;br /&gt;
|-&lt;br /&gt;
| [[#Signature Task|Signature Task]] || SIGNATURE_TASK || Captures a handwritten signature&lt;br /&gt;
|-&lt;br /&gt;
| [[#Supervisor Check Task|Supervisor Check Task]] || SUPERVISOR_CHECK_TASK || Applies the four-eyes principle to a [[#Check Task|Check Task]]&lt;br /&gt;
|-&lt;br /&gt;
| [[#Switch End Task|Switch End Task]] || SWITCH_END_TASK || Rejoins the branches of a Procedure workflow&lt;br /&gt;
|-&lt;br /&gt;
| [[#Switch Start Task|Switch Start Task]] || SWITCH_START_TASK || Selects a Procedure branch by evaluating a Boolean expression&lt;br /&gt;
|-&lt;br /&gt;
| [[#Text Task|Text Task]] || TEXT_TASK || Records free-form text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Hint|For the available Procedure variants and their workflow execution, see [[#Procedure Task Variants and Workflow Execution|Procedure Tasks]].}}&lt;br /&gt;
&lt;br /&gt;
=== Blinding Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''BLINDING_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_BLINDINGTASK]]&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_BLINDINGTASK|Blinding Task]] documents either a blinding or deblinding operation at a linked blinding location. The configured operation type determines the state that must be reported to complete the task.&lt;br /&gt;
&lt;br /&gt;
'''Relevant properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| BLINDING_TYPE || Configured operation type: Blinding or DeBlinding&lt;br /&gt;
|-&lt;br /&gt;
| LK_BLINDING_LOCATION || Link to the associated blinding location&lt;br /&gt;
|-&lt;br /&gt;
| LK_PREVIOUS_TASK || Link to the preceding [[#Blinding Task|Blinding Task]]&lt;br /&gt;
|-&lt;br /&gt;
| LOCKED || Prevents the task from being edited&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || Reported blinding state&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The task is complete only when '''VALUE''' matches the configured '''BLINDING_TYPE'''.&lt;br /&gt;
&lt;br /&gt;
=== Calculation Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''CALCULATION_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_CALCULATION_TASK]]&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_CALCULATION_TASK|Calculation Task]] automatically evaluates a predefined expression on the client and writes the result to a configured property on its owner. No user input is required.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| EXPRESSION || {{String}} || Expression evaluated by the client&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Integer}} || Evaluation state: Undefined = 0, Pending = 10, Finished = 20, Error = 30&lt;br /&gt;
|-&lt;br /&gt;
| TARGET_PROPERTY_NAME || {{String}} || Name of the target property on the owner&lt;br /&gt;
|-&lt;br /&gt;
| TARGET_PROPERTY_TYPE || {{Integer}} || Target type: Undefined = 0, Boolean = 1, Integer = 3, Double = 4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The task is automatically finished after successful evaluation. The clients display an indicator for a successful evaluation or an evaluation error. A Pending state does not receive an additional indicator.&lt;br /&gt;
&lt;br /&gt;
See also [[#Procedure Task Variants and Workflow Execution|Procedure Task Variants and Workflow Execution]].&lt;br /&gt;
&lt;br /&gt;
=== Check Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''CHECK_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_CHECK_TASK]]&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_CHECK_TASK|Check Task]] is a simple Boolean task represented by a checkbox. Clicking the checkbox sets its value and completes the task. It can alternatively be completed using ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task value and completion&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Check Task finished UWP.png|Check Task (WinX)&lt;br /&gt;
File:Check Task android.jpg|Not Applicable Check Task (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Commissioning Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''COMMISSIONING_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_COMMISSIONINGCHECK]]&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_COMMISSIONINGCHECK|Commissioning Task]] is a specialized task type used in MRO commissioning workflows.&lt;br /&gt;
&lt;br /&gt;
'''Relevant property'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| NOTAPPLICABLE || {{Boolean}} || Not Applicable state&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Inspection Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''INSPECTION_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_INSPECTION_TASK]]&lt;br /&gt;
&lt;br /&gt;
An [[MROCLS_MRO_INSPECTION_TASK|Inspection Task]] captures a Boolean inspection result. The client presents a positive and a negative option as well as ''Not Applicable''. Selecting an option completes the task.&lt;br /&gt;
&lt;br /&gt;
The labels for the positive and negative outcomes can be configured. Selecting the negative outcome displays the configured false label.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Selected inspection result&lt;br /&gt;
|-&lt;br /&gt;
| LABEL_TRUE || {{String}} || Label for the positive outcome&lt;br /&gt;
|-&lt;br /&gt;
| LABEL_FALSE || {{String}} || Label for the negative outcome&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Finished Inspection Task UWP.png|Finished Inspection Task (WinX)&lt;br /&gt;
File:Inspection task android.jpg|Finished Inspection Task (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Interface Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''INTERFACE_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_CHECK_TASK]]&lt;br /&gt;
&lt;br /&gt;
An [[MROCLS_MRO_CHECK_TASK|Interface Task]] waits for another software system to provide its completion value. The task is complete when its Boolean '''VALUE''' becomes true. If the client is offline, the task waits until connectivity and synchronization are available again.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task completion supplied by the external software system&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Joint Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''JOINT_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_JOINTTASK]]&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_JOINTTASK|Joint Task]] documents the state of a linked joint location. The user selects one of the available Joint States.&lt;br /&gt;
&lt;br /&gt;
'''Relevant properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| LK_JOINT_LOCATION || Link to the associated joint location&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || Selected Joint State&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The available states are:&lt;br /&gt;
&lt;br /&gt;
* Closed&lt;br /&gt;
* Disconnected&lt;br /&gt;
* Open&lt;br /&gt;
* Planned&lt;br /&gt;
* Reconnected&lt;br /&gt;
* Torqued&lt;br /&gt;
* Undefined&lt;br /&gt;
* Verified&lt;br /&gt;
&lt;br /&gt;
The [[#Joint Task|Joint Task]] is complete when its state is '''Planned''' or '''Closed'''.&lt;br /&gt;
&lt;br /&gt;
=== Measurement Task ===&lt;br /&gt;
&lt;br /&gt;
Technical classification name: '''MROCLS_MRO_MEASUREMENT_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_MEASUREMENT_TASK]]&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_MEASUREMENT_TASK|Measurement Task]] records a measured Double value, for example a value read from a pressure gauge. Selecting the displayed value opens an editor. If no value has been entered, the editor initially displays an empty value. Entering a value or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
An optional secondary value indicator can display a previously recorded value. Its behaviour has to be configured separately.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Double}} || Currently recorded measurement&lt;br /&gt;
|-&lt;br /&gt;
| PREVIOUS_VALUE || {{Double}} || Previously recorded measurement&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Measurment Task Empty UWP.png|Measurement Task without a recorded value (WinX)&lt;br /&gt;
File:Measurment Task Not Empty UWP.png|Measurement Task with a recorded value (WinX)&lt;br /&gt;
File:Measurment Task Empty Android.jpg|Measurement Task without a recorded value (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Numeric Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''NUMERIC_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_NUMERIC_TASK]]&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_NUMERIC_TASK|Numeric Task]] records a Double value, for example a value read from a temperature sensor. Entering a value or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
The value is compared against a configured acceptable range that cannot be edited on the client. A value outside the range produces visual feedback and sets the [[MRO Objects (Client)#Technical Status|technical status]] to indicate an issue. An invalid configured range, such as a minimum greater than the maximum, also produces an issue when a value is entered.&lt;br /&gt;
&lt;br /&gt;
A value unit can be configured for an individual task. When present, it overrides the standard unit configured on the [[MetaProperty#Unit_Item|MetaProperty]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Double}} || Recorded numeric value&lt;br /&gt;
|-&lt;br /&gt;
| VALUE_UNIT || {{String}} || Instance-specific value unit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Pick List Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PICKLIST_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_PICK_LIST_TASK]]&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_PICK_LIST_TASK|Pick List Task]] allows the user to select one value from an [[UBIK Active Lists|Active List]] configured on the task instance. It behaves similarly to a standard Integer Task with a Selective List, but the selectable values are supplied by the Active List rather than being defined globally.&lt;br /&gt;
&lt;br /&gt;
Every list item has an Integer value. Selecting an item or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Integer}} || Value of the selected Active List item&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Picture Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PICTURE_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_PICTURE_TASK]]&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_PICTURE_TASK|Picture Task]] is a Boolean task that can only be finished when it has at least one child document containing a valid file. Multiple child documents can be attached. Although pictures are the most common files, the child document can contain another file type.&lt;br /&gt;
&lt;br /&gt;
The clients display a file or photo button next to the task checkbox. The task cannot be completed through the checkbox until the file requirement is satisfied. Selecting ''Not Applicable'' is always possible and bypasses the child-document requirement.&lt;br /&gt;
&lt;br /&gt;
When the user attempts to finish the task while online, the client may first synchronize the task's child objects and download the files of its child documents. During synchronization, the checkbox is replaced by a wait indicator.&lt;br /&gt;
&lt;br /&gt;
* If no child document or no local file is available, the task remains unfinished and the user is informed.&lt;br /&gt;
* If at least one child document with a valid local file is available, the task is finished and the file or photo button is disabled.&lt;br /&gt;
&lt;br /&gt;
Child-count information can be configured but is not required. WinX can display the child documents in an expander. This is not shown by default on Mobile due to the available screen size, but it can be customized using [[Object_hierarchy_in_XAML:_NextLevel,_ParentLevel,_LinkedLevel#Show_NextLevel_Children.2FDocuments|Show NextLevel Children/Documents]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task completion&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Progress Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PROGRESS_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_PROGRESS_TASK]]&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_PROGRESS_TASK|Progress Task]] reports progress between 0% and 100%. The reported value contributes to the progress of the owning Work Package. Values below 100% represent partial progress; the task is finished only when the reported progress reaches 100%. It can alternatively be completed using ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Double}} || Currently reported progress&lt;br /&gt;
|-&lt;br /&gt;
| PREVIOUS_VALUE || {{Double}} || Previously reported progress&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
An [[MRO_PROGRESS_TASK_EDITOR|alternative editor]] is available for [[#Progress Task|Progress Tasks]].{{Version/WinXSince|2.5.4}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Progress Task UWP.png|Progress Task with reported progress (WinX)&lt;br /&gt;
File:Progress Task Android.jpg|Progress Task with current and previous progress (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Signature Task {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SIGNATURE_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_SIGNATURE_TASK]]&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_SIGNATURE_TASK|Signature Task]] is completed by capturing a handwritten signature. Selecting the signature editor opens an in-app dialog in which the user can sign. Confirming the signature saves it and automatically completes the task.&lt;br /&gt;
&lt;br /&gt;
When signing while online, the server resolves and displays the signee and generates the validation timestamp. When signing offline, the signee is resolved and displayed once the client is online again. If the complete signee or validation timestamp cannot be displayed in the editor field, selecting the field opens a popup with the complete information.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Signature}} || Captured signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Supervisor Check Task {{Version/XamarinSince|4.8}} ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SUPERVISOR_CHECK_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_SUPERVISOR_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Supervisor Check Task applies the four-eyes principle to a Boolean [[#Check Task|Check Task]] on one device. The worker hands the device to a supervisor. The supervisor scans an NFC tag and enters the supervisor PIN. After successful authentication, the checkbox is enabled and must still be selected to finish the task.&lt;br /&gt;
&lt;br /&gt;
Selecting ''Not Applicable'' does not require supervisor authentication.&lt;br /&gt;
&lt;br /&gt;
Successful supervisor authentication removes only the supervisor-related lock. The task can remain locked for another reason, such as sequential dependencies or user rights. If an incorrect PIN is entered three times, authentication is cancelled and the NFC tag has to be scanned again. A setting controls [[RFID tags#Choose which information to use from a tag|which tag information is used]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || [[#Check Task|Check Task]] completion&lt;br /&gt;
|-&lt;br /&gt;
| SUPERVISOR || {{Guid}} || Authenticated supervisor&lt;br /&gt;
|-&lt;br /&gt;
| PERMISSION || {{String}} || Required supervisor permission&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=300px heights=300px&amp;gt;&lt;br /&gt;
File:UI_Xamarin_Supervisor_Task_Before_Verification.jpg|Supervisor Check Task before verification&lt;br /&gt;
File:UI_Xamarin_Supervisor_Task_Enter_PIN.jpg|Supervisor PIN entry&lt;br /&gt;
File:UI_Xamarin_Supervisor_Task_After_Verification.jpg|Supervisor Check Task after verification&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Switch End Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SWITCH_END_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_SWITCH_END_TASK]]&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_SWITCH_END_TASK|Switch End Task]] marks the point at which the two branches created by a [[#Switch Start Task|Switch Start Task]] merge again. It is linked to exactly one corresponding [[#Switch Start Task|Switch Start Task]]. It is not shown to the user and completes automatically after the selected branch has finished, allowing the common Procedure workflow to continue.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task completion&lt;br /&gt;
|-&lt;br /&gt;
| LK_SWITCH_START_TASK || {{Guid}} || Link to the corresponding [[#Switch Start Task|Switch Start Task]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
See also [[#Procedure Task Variants and Workflow Execution|Procedure Task Variants and Workflow Execution]].&lt;br /&gt;
&lt;br /&gt;
=== Switch Start Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SWITCH_START_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_SWITCH_START_TASK]]&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_SWITCH_START_TASK|Switch Start Task]] is a sequential workflow-control task used in a Procedure Workpackage. It automatically evaluates a Boolean expression on the client and selects either the true or false branch. Each branch represents a different path of Tasks and must lead to a corresponding [[#Switch End Task|Switch End Task]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| EXPRESSION || {{String}} || Expression evaluated by the client&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Integer}} || Evaluation state: Undefined = 0, Pending = 10, Finished = 20, Error = 30&lt;br /&gt;
|-&lt;br /&gt;
| BRANCH_TRUE || {{Guid}} || Link to the Task or Task Owner that starts the true branch&lt;br /&gt;
|-&lt;br /&gt;
| BRANCH_FALSE || {{Guid}} || Link to the Task or Task Owner that starts the false branch&lt;br /&gt;
|-&lt;br /&gt;
| DISPLAYSTRING_TRUE || {{String}} || Display string for a true result&lt;br /&gt;
|-&lt;br /&gt;
| DISPLAYSTRING_FALSE || {{String}} || Display string for a false result&lt;br /&gt;
|-&lt;br /&gt;
| EVALUATION_RESULT || {{Boolean}} || Result of the evaluated expression&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
After evaluation, only the selected branch is executed. The other branch remains hidden and its Procedure Tasks are set to ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
See also [[#Procedure Task Variants and Workflow Execution|Procedure Task Variants and Workflow Execution]].&lt;br /&gt;
&lt;br /&gt;
=== Text Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''TEXT_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_TEXT_TASK]]&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_TEXT_TASK|Text Task]] allows the user to enter free-form text. Entering a value or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{String}} || Entered text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Supervisor Base Type {{Version/XamarinSince|4.8}} ==&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SUPERVISOR_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_SUPERVISOR_TASK]]&lt;br /&gt;
&lt;br /&gt;
[[MROCLS_MRO_SUPERVISOR_TASK|Supervisor Task]] is a base type that provides supervisor authentication behaviour. It is not used as a standalone user task. The concrete task type using this behaviour is [[#Supervisor Check Task|Supervisor Check Task]].&lt;br /&gt;
&lt;br /&gt;
== Procedure Task Variants and Workflow Execution {{Version/MobileSince|5.1}}{{Version/WinXSince|5.1}} ==&lt;br /&gt;
&lt;br /&gt;
{{Hint|For the complete list of base task types and their task-specific behaviour, see [[#MRO Task Types|MRO Task Types]].}}&lt;br /&gt;
&lt;br /&gt;
Procedure variants are specialized versions of task types for use within Procedure Workpackages. They retain the behaviour of their corresponding task type and additionally implement the [[MROCLS_SEQUENTIALTASK|Sequential Task]] and [[MROCLS_GROUPEDTASK|Grouped Task]] classifications.&lt;br /&gt;
&lt;br /&gt;
Procedure variants are available for:&lt;br /&gt;
&lt;br /&gt;
* [[#Calculation Task|Calculation Task]]&lt;br /&gt;
* [[#Check Task|Check Task]]&lt;br /&gt;
* [[#Inspection Task|Inspection Task]]&lt;br /&gt;
* [[#Interface Task|Interface Task]]&lt;br /&gt;
* [[#Numeric Task|Numeric Task]]&lt;br /&gt;
* [[#Pick List Task|Pick List Task]]&lt;br /&gt;
* [[#Picture Task|Picture Task]]&lt;br /&gt;
* [[#Signature Task|Signature Task]]&lt;br /&gt;
* [[#Supervisor Check Task|Supervisor Check Task]]&lt;br /&gt;
* [[#Text Task|Text Task]]&lt;br /&gt;
&lt;br /&gt;
[[#Switch Start Task|Switch Start Tasks]], [[#Switch End Task|Switch End Tasks]], and [[#Calculation Task|Calculation Tasks]] provide automatic workflow-control behaviour in a Procedure Workpackage.&lt;br /&gt;
&lt;br /&gt;
For automatic [[#Calculation Task|Calculation Tasks]] and [[#Switch Start Task|Switch Start Tasks]], the clients display an evaluation indicator:&lt;br /&gt;
&lt;br /&gt;
* '''Finished:''' The Task was automatically evaluated successfully.&lt;br /&gt;
* '''Error:''' The Task was evaluated but resulted in an error.&lt;br /&gt;
* '''Pending:''' The Task has not yet been evaluated. No additional indicator is displayed for this state.&lt;br /&gt;
&lt;br /&gt;
When a predecessor [[#Switch Start Task|Switch Start Task]] has not yet finished, its follow-up Procedure Tasks are hidden because the relevant branch is not yet known. After evaluation, the selected branch becomes visible. The other branch remains hidden, is not executed, and its Procedure Tasks are set to ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
For example, several predecessor [[#Numeric Task|Numeric Tasks]] can record temperatures from different parts of an equipment. A subsequent [[#Calculation Task|Calculation Task]] can calculate their average. A [[#Switch Start Task|Switch Start Task]] can then select a branch based on whether the average exceeds a configured temperature. One branch can contain a Task for activating a cooling mechanism, while the other branch can lead directly to the [[#Switch End Task|Switch End Task]] or contain further [[#Switch Start Task|Switch Tasks]].&lt;br /&gt;
&lt;br /&gt;
Procedure Tasks are intended to execute automatically when their predecessors are finished. However, the completion of the predecessor has to be triggered by a user. If a predecessor becomes finished only because of a server update, the follow-up Procedure workflow is not triggered. This prevents a workflow from executing in the name of users who did not initiate or observe the completion.&lt;br /&gt;
&lt;br /&gt;
The general online and offline evaluation rules for sequential and grouped Tasks are documented in [[MRO Objects (Client)#Sequential Task|Sequential Task]] and [[MRO Objects (Client)#Grouped Task|Grouped Task]].&lt;br /&gt;
&lt;br /&gt;
== Supporting File Documents ==&lt;br /&gt;
&lt;br /&gt;
=== Procedure JSON File Document ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''FILEDOCUMENT_MRO_JSON'''&lt;br /&gt;
&lt;br /&gt;
This File Document stores the JSON definition of a [[#Procedure Workpackage|Procedure Workpackage]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| LK_PROCEDURE_WORKPACKAGE || {{Guid}} || Link to the associated [[#Procedure Workpackage|Procedure Workpackage]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Picture Task File Document ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''FILEDOCUMENT_MRO_PICTURE_TASK'''&lt;br /&gt;
&lt;br /&gt;
This is a dedicated File Document linked to a [[#Picture Task|Picture Task]]. A [[#Picture Task|Picture Task]] can also use another child-document type, provided that the child document contains a valid file.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| LK_PICTURE_TASK || {{Guid}} || Link to the associated [[#Picture Task|Picture Task]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[MRO Objects (Client)]]&lt;br /&gt;
* [[MROCLS_MRO_TASKOWNER]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_WORKPACKAGE]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_PROGRESS_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_MEASUREMENT_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_CHECK_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_INSPECTION_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_SEQUENTIALTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_GROUPEDTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_PROCEDURE]] (Classification)&lt;br /&gt;
* [[MROCLS_SWITCH_START_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_SWITCH_END_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_CALCULATION_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_PICK_LIST_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_PICTURE_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_BLINDINGTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_COMMISSIONINGCHECK]] (Classification)&lt;br /&gt;
* [[MROCLS_JOINTTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_SIGNATURE_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_TEXT_TASK]] (Classification)&lt;br /&gt;
&lt;br /&gt;
[[Category:Module|MRO (Plugin)]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_Objects_(Client)&amp;diff=30449</id>
		<title>MRO Objects (Client)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_Objects_(Client)&amp;diff=30449"/>
				<updated>2026-08-17T13:56:26Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: /* Work Progress */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:MRO_WinX.png|thumb|alt=MRO Child List UI (WinX)|MRO UI (WinX)]]&lt;br /&gt;
[[File:MRO_MAUI1.jpeg|thumb|alt=MRO Child List UI (Mobile)|MRO UI (Mobile)]]&lt;br /&gt;
&lt;br /&gt;
The WinX and Mobile clients display MRO objects like other root or child objects, with additional MRO-specific indicators, controls, and evaluation logic.&lt;br /&gt;
&lt;br /&gt;
This page documents behaviour that is shared by multiple MRO objects in the clients. The MRO object model, task-specific behaviour, and relevant technical properties are documented on [[MRO (Plugin)]]. For the complete task-type catalog, see [[MRO (Plugin)#MRO Task Types|MRO Task Types]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Page !! Scope&lt;br /&gt;
|-&lt;br /&gt;
| [[MRO (Plugin)]] || MRO concepts, task types, task-specific behaviour, and relevant technical properties&lt;br /&gt;
|-&lt;br /&gt;
| '''MRO Objects (Client)''' || Common client presentation, status indicators, locking, and behaviour shared by multiple MRO objects&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Basic User Interface ==&lt;br /&gt;
&lt;br /&gt;
The MRO user interface provides status indicators and interactive controls. In the {{UBIK}} child list, an MRO object can display its accumulated technical status, organisational status, and overall work progress based on its underlying data branch. These indicators are shown next to the main icon on child, details, and documents pages as well as next to the icons of child-list items.&lt;br /&gt;
&lt;br /&gt;
=== Technical Status ===&lt;br /&gt;
&lt;br /&gt;
The technical status indicator is shown on objects that represent a technical state or receive the technical status from subsequent objects in the underlying data branch. For example, if an inventory object is reported as damaged, its parent objects display an exclamation-mark indicator to show that a problem was reported by a child object.&lt;br /&gt;
&lt;br /&gt;
[[File:TechStats_WinX.png|100px|Technical Status Indicator (WinX and Mobile)]]&lt;br /&gt;
&lt;br /&gt;
=== Organisational Status ===&lt;br /&gt;
&lt;br /&gt;
The organisational status represents the amount of confirmed work in the data branch. This includes confirmed Work Packages as well as Tasks that are locked by their owning Work Package. The indicator is shown on objects that represent an organisational state or receive the organisational status from subsequent objects.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:OrgaStatusIndicatorWinX.PNG|Organisational Status Indicator (WinX)&lt;br /&gt;
File:ConfirmedWP_WinX.png|Confirmed Work Package flag (WinX)&lt;br /&gt;
File:ConfirmedWP_MAUI.jpeg|Confirmed Work Package indicator (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Work Progress ===&lt;br /&gt;
&lt;br /&gt;
Work progress is calculated from the object's current progress and the progress accumulated from subsequent objects in the underlying data branch. The indicator shows the amount of work completed in that branch.&lt;br /&gt;
&lt;br /&gt;
{{Version/WinXSince|5.0}} {{Version/MobileSince|5.0}} By default, progress is displayed with no more than one decimal place. For example, 99.75% is displayed as 99.8%. The format string used for this is &amp;lt;code&amp;gt;{0:0.#}%&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For other numeric formats, see [https://learn.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings custom numeric format strings]. The template used to customize the presentation is '''UBIKMROProgressBadge''' in '''UBIKThemes'''.&lt;br /&gt;
&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Android|MRO Objects (UBIK WinX)]]&lt;br /&gt;
[[Category:Client|MRO Objects (Client)]]&lt;br /&gt;
[[Category:Mobile|MRO Objects (Client)]]&lt;br /&gt;
[[Category:Pages with broken file links|MRO Objects (Client)]]&lt;br /&gt;
[[Category:WinX|MRO Objects (UBIK WinX)]]&lt;br /&gt;
&lt;br /&gt;
== MRO Objects ==&lt;br /&gt;
&lt;br /&gt;
The MRO object model consists of Task Owners, Work Packages, Tasks, and specialized task types. For the object definitions and technical properties, see [[MRO (Plugin)#MRO Objects|MRO Objects]].&lt;br /&gt;
&lt;br /&gt;
=== Task Owner ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_TASKOWNER|Task Owner]] gives users an overview of the work in its underlying structure. The client displays the technical status, organisational status, and work progress accumulated from its subordinate Task Owners and Work Packages.&lt;br /&gt;
&lt;br /&gt;
For the Task Owner definition, see [[MRO (Plugin)#Task Owner|Task Owner]].&lt;br /&gt;
&lt;br /&gt;
=== Work Package ===&lt;br /&gt;
&lt;br /&gt;
The clients provide controls for confirming and revoking the confirmation of a [[MROCLS_MRO_WORKPACKAGE|Work Package]]. A Work Package can be confirmed when its related Tasks have reached the required progress and all subordinate Work Packages have been confirmed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:ConfirmingWP_WinX.png|Work Package confirmation button (WinX)&lt;br /&gt;
File:MRORevoke_WinX.png|Revoke Work Package confirmation (WinX)&lt;br /&gt;
File:ConfirmingWP_MAUI.jpeg|Work Package confirmation button (Mobile)&lt;br /&gt;
File:MRORevoke_MAUI.jpeg|Revoke Work Package confirmation (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the Work Package definition, see [[MRO (Plugin)#Work Package|Work Package]].&lt;br /&gt;
&lt;br /&gt;
=== Task ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_TASK|Task]] reports progress to its owning Work Package. All user-editable MRO Tasks support ''Not Applicable''. In both clients, a completed user-editable Task can be reset by selecting ''Not Applicable'' twice.&lt;br /&gt;
&lt;br /&gt;
For the common Task model and value-validation requirement, see [[MRO (Plugin)#Task|Task]].&lt;br /&gt;
&lt;br /&gt;
{{Hint|For the complete list of MRO task types, their properties, and their task-specific client behaviour, see [[MRO (Plugin)#MRO Task Types|MRO Task Types]].}}&lt;br /&gt;
&lt;br /&gt;
==== Sequential Task ====&lt;br /&gt;
&lt;br /&gt;
The [[MROCLS_SEQUENTIALTASK|Sequential Task classification]] defines an order in which Tasks are to be completed. One or more predecessor Tasks can be required to finish before a dependent Task becomes unlocked and editable. A Task can have any number of predecessors.&lt;br /&gt;
&lt;br /&gt;
A Task and its predecessors do not have to belong to the same Work Package. A predecessor can be located elsewhere in the object hierarchy.&lt;br /&gt;
&lt;br /&gt;
The state of a Sequential Task is evaluated both online and offline. This allows visible dependent Tasks to update immediately when their predecessors are finished. The server-side state takes precedence in the case described by the first step below.&lt;br /&gt;
&lt;br /&gt;
The state is evaluated as follows:&lt;br /&gt;
&lt;br /&gt;
# If the server-side state says that the Task is open, it is treated as open and no further local evaluation is performed.&lt;br /&gt;
# The client checks whether the Task has predecessors.&lt;br /&gt;
# The client attempts to load every predecessor Task.&lt;br /&gt;
#* If any predecessor cannot be loaded because it is not available offline, the Task is locked.&lt;br /&gt;
# If every predecessor is finished, the Task is open and editable. Otherwise, it is locked.&lt;br /&gt;
&lt;br /&gt;
The configured dependency graph must not contain cycles. Tasks within a dependency cycle could never become available for completion.&lt;br /&gt;
&lt;br /&gt;
'''Example'''&lt;br /&gt;
&lt;br /&gt;
See [[Media:Sequential_tasks_winx.mp4|this video]] for a demonstration. The Task relations are illustrated in [[Media:Task_relations.png|this image]]. Tasks A1 and A2 do not depend on other Tasks. The lines from left to right represent dependencies; for example, B2 has A1 and A2 as predecessors.&lt;br /&gt;
&lt;br /&gt;
==== Grouped Task {{Version/WinXSince|4.2}}{{Version/XamarinSince|4.2}} ====&lt;br /&gt;
&lt;br /&gt;
The [[MROCLS_GROUPEDTASK|Grouped Task classification]] is used when only a configured number of Tasks from a group have to be finished. The Tasks are siblings and share a server-configured threshold. When the number of finished Tasks reaches the threshold, the remaining Tasks in the group are considered no longer necessary. For the accumulated status of the owning objects, those Tasks are treated as if they were finished.&lt;br /&gt;
&lt;br /&gt;
{{Hint|The finished state and the no-longer-necessary state are independent. A Grouped Task that is no longer necessary can be either finished or unfinished. Users do not have to finish it, but they still can.}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|The precise status calculation requires information about all sibling Tasks. If some siblings are not available offline, the client cannot determine whether the threshold has been reached. In this situation, the local status calculation treats the available objects as regular Tasks.}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|The client uses the best available status. It uses the status calculated by the server when the client is online and there are no uncommitted local changes on the involved objects. Otherwise, it calculates the status locally based on the available information.}}&lt;br /&gt;
&lt;br /&gt;
A Task can be both grouped and sequential. In this case, the group threshold affects when a dependent Task becomes available.&lt;br /&gt;
&lt;br /&gt;
For example, Tasks A1, A2, and A3 can form a group in which only one Task has to be finished. If all three are predecessors of Task B, finishing one of them causes the group threshold to be reached. All three predecessors become no longer necessary and locked, and Task B becomes unlocked.&lt;br /&gt;
&lt;br /&gt;
=== MRO Objects with Project Information (WinX only) {{Version/WinXSince|2.5.4}} ===&lt;br /&gt;
&lt;br /&gt;
{{DeprecatedStartTag|parameter=Please refer to [[Main_Page]] for the most recent information.}}&lt;br /&gt;
&lt;br /&gt;
[[File:UI_WinX_MRO_ProjectInfo.png|thumb|MRO Object with Project Information (WinX)]]&lt;br /&gt;
&lt;br /&gt;
An MRO object other than a Task can contain [[MROCLS_PROJECTINFORMATION|project information]]. In this case, the project information and MRO progress are displayed in a bar chart. The start and end dates are displayed on the progress bar. Its length and position, together with the current-date marker, indicate the timeline.&lt;br /&gt;
&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
{{DeprecatedEndTag}}&lt;br /&gt;
&lt;br /&gt;
== Locking ==&lt;br /&gt;
&lt;br /&gt;
When an MRO object is locked, it cannot be edited. For further information, see [[Locked Objects|Locked Objects]].&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[MRO (Plugin)]]&lt;br /&gt;
* [[MROCLS_PROJECT]]&lt;br /&gt;
* [[MROCLS_PROJECTINFORMATION]]&lt;br /&gt;
* [[MROCLS_SEQUENTIALTASK]]&lt;br /&gt;
* [[MROCLS_GROUPEDTASK]]&lt;br /&gt;
* [[MROCLS_MRO_TASK]]&lt;br /&gt;
* [[MROCLS_MRO_TASKOWNER]]&lt;br /&gt;
* [[MROCLS_MRO_WORKPACKAGE]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Android|MRO Objects (UBIK WinX)]]&lt;br /&gt;
[[Category:Client|MRO Objects (Client)]]&lt;br /&gt;
[[Category:Mobile|MRO Objects (Client)]]&lt;br /&gt;
[[Category:Pages with broken file links|MRO Objects (Client)]]&lt;br /&gt;
[[Category:WinX|MRO Objects (UBIK WinX)]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_Objects_(Client)&amp;diff=30448</id>
		<title>MRO Objects (Client)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_Objects_(Client)&amp;diff=30448"/>
				<updated>2026-08-17T13:34:42Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:MRO_WinX.png|thumb|alt=MRO Child List UI (WinX)|MRO UI (WinX)]]&lt;br /&gt;
[[File:MRO_MAUI1.jpeg|thumb|alt=MRO Child List UI (Mobile)|MRO UI (Mobile)]]&lt;br /&gt;
&lt;br /&gt;
The WinX and Mobile clients display MRO objects like other root or child objects, with additional MRO-specific indicators, controls, and evaluation logic.&lt;br /&gt;
&lt;br /&gt;
This page documents behaviour that is shared by multiple MRO objects in the clients. The MRO object model, task-specific behaviour, and relevant technical properties are documented on [[MRO (Plugin)]]. For the complete task-type catalog, see [[MRO (Plugin)#MRO Task Types|MRO Task Types]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Page !! Scope&lt;br /&gt;
|-&lt;br /&gt;
| [[MRO (Plugin)]] || MRO concepts, task types, task-specific behaviour, and relevant technical properties&lt;br /&gt;
|-&lt;br /&gt;
| '''MRO Objects (Client)''' || Common client presentation, status indicators, locking, and behaviour shared by multiple MRO objects&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Basic User Interface ==&lt;br /&gt;
&lt;br /&gt;
The MRO user interface provides status indicators and interactive controls. In the {{UBIK}} child list, an MRO object can display its accumulated technical status, organisational status, and overall work progress based on its underlying data branch. These indicators are shown next to the main icon on child, details, and documents pages as well as next to the icons of child-list items.&lt;br /&gt;
&lt;br /&gt;
=== Technical Status ===&lt;br /&gt;
&lt;br /&gt;
The technical status indicator is shown on objects that represent a technical state or receive the technical status from subsequent objects in the underlying data branch. For example, if an inventory object is reported as damaged, its parent objects display an exclamation-mark indicator to show that a problem was reported by a child object.&lt;br /&gt;
&lt;br /&gt;
[[File:TechStats_WinX.png|100px|Technical Status Indicator (WinX and Mobile)]]&lt;br /&gt;
&lt;br /&gt;
=== Organisational Status ===&lt;br /&gt;
&lt;br /&gt;
The organisational status represents the amount of confirmed work in the data branch. This includes confirmed Work Packages as well as Tasks that are locked by their owning Work Package. The indicator is shown on objects that represent an organisational state or receive the organisational status from subsequent objects.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:OrgaStatusIndicatorWinX.PNG|Organisational Status Indicator (WinX)&lt;br /&gt;
File:ConfirmedWP_WinX.png|Confirmed Work Package flag (WinX)&lt;br /&gt;
File:ConfirmedWP_MAUI.jpeg|Confirmed Work Package indicator (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Work Progress ===&lt;br /&gt;
&lt;br /&gt;
Work progress is calculated from the object's current progress and the progress accumulated from subsequent objects in the underlying data branch. The indicator shows the amount of work completed in that branch.&lt;br /&gt;
&lt;br /&gt;
{{Version/WinXSince|5.0}} {{Version/MobileSince|5.0}} By default, progress is displayed with no more than one decimal place. For example, 99.75% is displayed as 99.8%. The format string used for this is ''{0:0.#}%''.&lt;br /&gt;
&lt;br /&gt;
For other numeric formats, see [https://learn.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings custom numeric format strings]. The template used to customize the presentation is '''UBIKMROProgressBadge''' in '''UBIKThemes'''.&lt;br /&gt;
&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
== MRO Objects ==&lt;br /&gt;
&lt;br /&gt;
The MRO object model consists of Task Owners, Work Packages, Tasks, and specialized task types. For the object definitions and technical properties, see [[MRO (Plugin)#MRO Objects|MRO Objects]].&lt;br /&gt;
&lt;br /&gt;
=== Task Owner ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_TASKOWNER|Task Owner]] gives users an overview of the work in its underlying structure. The client displays the technical status, organisational status, and work progress accumulated from its subordinate Task Owners and Work Packages.&lt;br /&gt;
&lt;br /&gt;
For the Task Owner definition, see [[MRO (Plugin)#Task Owner|Task Owner]].&lt;br /&gt;
&lt;br /&gt;
=== Work Package ===&lt;br /&gt;
&lt;br /&gt;
The clients provide controls for confirming and revoking the confirmation of a [[MROCLS_MRO_WORKPACKAGE|Work Package]]. A Work Package can be confirmed when its related Tasks have reached the required progress and all subordinate Work Packages have been confirmed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:ConfirmingWP_WinX.png|Work Package confirmation button (WinX)&lt;br /&gt;
File:MRORevoke_WinX.png|Revoke Work Package confirmation (WinX)&lt;br /&gt;
File:ConfirmingWP_MAUI.jpeg|Work Package confirmation button (Mobile)&lt;br /&gt;
File:MRORevoke_MAUI.jpeg|Revoke Work Package confirmation (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the Work Package definition, see [[MRO (Plugin)#Work Package|Work Package]].&lt;br /&gt;
&lt;br /&gt;
=== Task ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_TASK|Task]] reports progress to its owning Work Package. All user-editable MRO Tasks support ''Not Applicable''. In both clients, a completed user-editable Task can be reset by selecting ''Not Applicable'' twice.&lt;br /&gt;
&lt;br /&gt;
For the common Task model and value-validation requirement, see [[MRO (Plugin)#Task|Task]].&lt;br /&gt;
&lt;br /&gt;
{{Hint|For the complete list of MRO task types, their properties, and their task-specific client behaviour, see [[MRO (Plugin)#MRO Task Types|MRO Task Types]].}}&lt;br /&gt;
&lt;br /&gt;
==== Sequential Task ====&lt;br /&gt;
&lt;br /&gt;
The [[MROCLS_SEQUENTIALTASK|Sequential Task classification]] defines an order in which Tasks are to be completed. One or more predecessor Tasks can be required to finish before a dependent Task becomes unlocked and editable. A Task can have any number of predecessors.&lt;br /&gt;
&lt;br /&gt;
A Task and its predecessors do not have to belong to the same Work Package. A predecessor can be located elsewhere in the object hierarchy.&lt;br /&gt;
&lt;br /&gt;
The state of a Sequential Task is evaluated both online and offline. This allows visible dependent Tasks to update immediately when their predecessors are finished. The server-side state takes precedence in the case described by the first step below.&lt;br /&gt;
&lt;br /&gt;
The state is evaluated as follows:&lt;br /&gt;
&lt;br /&gt;
# If the server-side state says that the Task is open, it is treated as open and no further local evaluation is performed.&lt;br /&gt;
# The client checks whether the Task has predecessors.&lt;br /&gt;
# The client attempts to load every predecessor Task.&lt;br /&gt;
#* If any predecessor cannot be loaded because it is not available offline, the Task is locked.&lt;br /&gt;
# If every predecessor is finished, the Task is open and editable. Otherwise, it is locked.&lt;br /&gt;
&lt;br /&gt;
The configured dependency graph must not contain cycles. Tasks within a dependency cycle could never become available for completion.&lt;br /&gt;
&lt;br /&gt;
'''Example'''&lt;br /&gt;
&lt;br /&gt;
See [[Media:Sequential_tasks_winx.mp4|this video]] for a demonstration. The Task relations are illustrated in [[Media:Task_relations.png|this image]]. Tasks A1 and A2 do not depend on other Tasks. The lines from left to right represent dependencies; for example, B2 has A1 and A2 as predecessors.&lt;br /&gt;
&lt;br /&gt;
==== Grouped Task {{Version/WinXSince|4.2}}{{Version/XamarinSince|4.2}} ====&lt;br /&gt;
&lt;br /&gt;
The [[MROCLS_GROUPEDTASK|Grouped Task classification]] is used when only a configured number of Tasks from a group have to be finished. The Tasks are siblings and share a server-configured threshold. When the number of finished Tasks reaches the threshold, the remaining Tasks in the group are considered no longer necessary. For the accumulated status of the owning objects, those Tasks are treated as if they were finished.&lt;br /&gt;
&lt;br /&gt;
{{Hint|The finished state and the no-longer-necessary state are independent. A Grouped Task that is no longer necessary can be either finished or unfinished. Users do not have to finish it, but they still can.}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|The precise status calculation requires information about all sibling Tasks. If some siblings are not available offline, the client cannot determine whether the threshold has been reached. In this situation, the local status calculation treats the available objects as regular Tasks.}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|The client uses the best available status. It uses the status calculated by the server when the client is online and there are no uncommitted local changes on the involved objects. Otherwise, it calculates the status locally based on the available information.}}&lt;br /&gt;
&lt;br /&gt;
A Task can be both grouped and sequential. In this case, the group threshold affects when a dependent Task becomes available.&lt;br /&gt;
&lt;br /&gt;
For example, Tasks A1, A2, and A3 can form a group in which only one Task has to be finished. If all three are predecessors of Task B, finishing one of them causes the group threshold to be reached. All three predecessors become no longer necessary and locked, and Task B becomes unlocked.&lt;br /&gt;
&lt;br /&gt;
=== MRO Objects with Project Information (WinX only) {{Version/WinXSince|2.5.4}} ===&lt;br /&gt;
&lt;br /&gt;
{{DeprecatedStartTag|parameter=Please refer to [[Main_Page]] for the most recent information.}}&lt;br /&gt;
&lt;br /&gt;
[[File:UI_WinX_MRO_ProjectInfo.png|thumb|MRO Object with Project Information (WinX)]]&lt;br /&gt;
&lt;br /&gt;
An MRO object other than a Task can contain [[MROCLS_PROJECTINFORMATION|project information]]. In this case, the project information and MRO progress are displayed in a bar chart. The start and end dates are displayed on the progress bar. Its length and position, together with the current-date marker, indicate the timeline.&lt;br /&gt;
&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
{{DeprecatedEndTag}}&lt;br /&gt;
&lt;br /&gt;
== Locking ==&lt;br /&gt;
&lt;br /&gt;
When an MRO object is locked, it cannot be edited. For further information, see [[Locked Objects|Locked Objects]].&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[MRO (Plugin)]]&lt;br /&gt;
* [[MROCLS_PROJECT]]&lt;br /&gt;
* [[MROCLS_PROJECTINFORMATION]]&lt;br /&gt;
* [[MROCLS_SEQUENTIALTASK]]&lt;br /&gt;
* [[MROCLS_GROUPEDTASK]]&lt;br /&gt;
* [[MROCLS_MRO_TASK]]&lt;br /&gt;
* [[MROCLS_MRO_TASKOWNER]]&lt;br /&gt;
* [[MROCLS_MRO_WORKPACKAGE]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Android|MRO Objects (UBIK WinX)]]&lt;br /&gt;
[[Category:Client|MRO Objects (Client)]]&lt;br /&gt;
[[Category:Mobile|MRO Objects (Client)]]&lt;br /&gt;
[[Category:Pages with broken file links|MRO Objects (Client)]]&lt;br /&gt;
[[Category:WinX|MRO Objects (UBIK WinX)]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_(Plugin)&amp;diff=30447</id>
		<title>MRO (Plugin)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_(Plugin)&amp;diff=30447"/>
				<updated>2026-08-17T13:29:13Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The MRO plugin provides a set of {{UBIK}} objects for representing and documenting maintenance, repair and operations work. The MRO features are available in the supported Mobile and {{UBIK WinX}} clients.&lt;br /&gt;
&lt;br /&gt;
This page is the main documentation for the MRO object model and its task types. Common client behaviour, such as status indicators, locking, and the general evaluation of sequential and grouped tasks, is documented in [[MRO Objects (Client)]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Page !! Scope&lt;br /&gt;
|-&lt;br /&gt;
| '''MRO (Plugin)''' || MRO concepts, task types, task-specific behaviour, and relevant technical properties&lt;br /&gt;
|-&lt;br /&gt;
| [[MRO Objects (Client)]] || Common client presentation, status indicators, locking, and behaviour shared by multiple MRO objects&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Basic Features ==&lt;br /&gt;
&lt;br /&gt;
Objects classified as MRO objects generally provide a technical and organisational status as well as an overall work progress based on their underlying data branch.&lt;br /&gt;
&lt;br /&gt;
=== Technical Status ===&lt;br /&gt;
&lt;br /&gt;
For detailed information, see [[MRO Objects (Client)#Technical Status|Technical Status]].&lt;br /&gt;
&lt;br /&gt;
=== Organisational Status ===&lt;br /&gt;
&lt;br /&gt;
For detailed information, see [[MRO Objects (Client)#Organisational Status|Organisational Status]].&lt;br /&gt;
&lt;br /&gt;
=== Work Progress ===&lt;br /&gt;
&lt;br /&gt;
For detailed information, see [[MRO Objects (Client)#Work Progress|Work Progress]].&lt;br /&gt;
&lt;br /&gt;
== MRO Objects ==&lt;br /&gt;
&lt;br /&gt;
MRO uses Task Owners, Work Packages, Tasks, and Procedure Workpackages to represent maintenance workflows.&lt;br /&gt;
&lt;br /&gt;
=== Task Owner ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_TASKOWNER|Task Owner]] is an object with an underlying structure of work to be performed. It can contain other Task Owners or Work Packages. Their technical status, organisational status, and work progress are accumulated and reported to the Task Owner.&lt;br /&gt;
&lt;br /&gt;
=== Work Package ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_WORKPACKAGE|Work Package]] collects and summarizes Task Owners, other Work Packages, or Tasks. A Work Package can be confirmed when all associated Tasks have reached the required progress and all subordinate Work Packages have been confirmed.&lt;br /&gt;
&lt;br /&gt;
For Work Package presentation and confirmation in the clients, see [[MRO Objects (Client)#Work Package|Work Package]].&lt;br /&gt;
&lt;br /&gt;
=== Task ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_TASK|Task]] reports work progress to its owning Work Package. The available task types provide different input, validation, or automatic workflow behaviour.&lt;br /&gt;
&lt;br /&gt;
MRO task values must be validated for work progress to be calculated. A MetaAttribute providing a validation timestamp must therefore be attached to the relevant MetaProperty.&lt;br /&gt;
&lt;br /&gt;
{{Attention|A task value property has to use [[Attributes]] so that its value can be validated. Otherwise, work progress cannot be calculated.}}&lt;br /&gt;
&lt;br /&gt;
All user-editable MRO task types can be set to ''Not Applicable''. In the clients, a completed user-editable task can be reset by selecting ''Not Applicable'' twice. General client behaviour is documented in [[MRO Objects (Client)#Task|Task]].&lt;br /&gt;
&lt;br /&gt;
=== Procedure Workpackage ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PROCEDURE_WORKPACKAGE'''&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_PROCEDURE|Procedure Workpackage]] is a specialized Work Package for structured workflows. Its structure is defined in JSON using a workflow editor and can contain Tasks as well as subordinate Procedure Workpackages. Depending on its state, the corresponding objects are created or updated.&lt;br /&gt;
&lt;br /&gt;
Procedure Workpackages can use sequential execution, grouped Tasks, branching, calculations, and references to linked data. Their workflows support online and offline use. Steps that require data exchange wait until connectivity is available.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| PROCEDURE_STATUS || {{Integer}} || Current state: Draft = 10, ReadyToUse = 20, Published = 30, Open = 40, Executing = 50, Completed = 60, Approved = 70, Rejected = 80&lt;br /&gt;
|-&lt;br /&gt;
| JSON || {{String}} || JSON representation of the Procedure Workpackage&lt;br /&gt;
|-&lt;br /&gt;
| ISTEMPLATE || {{Boolean}} || Indicates whether the Procedure Workpackage is a template&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MRO Task Types ==&lt;br /&gt;
&lt;br /&gt;
The following task types are available in MRO. The technical object names are included to make the task types discoverable through the wiki search.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Task type !! Technical object name !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| [[#Blinding Task|Blinding Task]] || BLINDING_TASK || Documents a blinding or deblinding operation&lt;br /&gt;
|-&lt;br /&gt;
| [[#Calculation Task|Calculation Task]] || CALCULATION_TASK || Evaluates an expression and writes its result to a target property&lt;br /&gt;
|-&lt;br /&gt;
| [[#Check Task|Check Task]] || CHECK_TASK || Confirms a Boolean task using a checkbox&lt;br /&gt;
|-&lt;br /&gt;
| [[#Commissioning Task|Commissioning Task]] || COMMISSIONING_TASK || Represents a task in an MRO commissioning workflow&lt;br /&gt;
|-&lt;br /&gt;
| [[#Inspection Task|Inspection Task]] || INSPECTION_TASK || Records a Boolean inspection result with configurable labels&lt;br /&gt;
|-&lt;br /&gt;
| [[#Interface Task|Interface Task]] || INTERFACE_TASK || Waits for completion information from another software system&lt;br /&gt;
|-&lt;br /&gt;
| [[#Joint Task|Joint Task]] || JOINT_TASK || Documents the state of a joint location&lt;br /&gt;
|-&lt;br /&gt;
| [[#Measurement Task|Measurement Task]] || MROCLS_MRO_MEASUREMENT_TASK || Records a measured Double value&lt;br /&gt;
|-&lt;br /&gt;
| [[#Numeric Task|Numeric Task]] || NUMERIC_TASK || Records a numeric value and evaluates it against a configured range&lt;br /&gt;
|-&lt;br /&gt;
| [[#Pick List Task|Pick List Task]] || PICKLIST_TASK || Selects one integer value from an instance-specific Active List&lt;br /&gt;
|-&lt;br /&gt;
| [[#Picture Task|Picture Task]] || PICTURE_TASK || Requires at least one child document containing a valid file&lt;br /&gt;
|-&lt;br /&gt;
| [[#Progress Task|Progress Task]] || PROGRESS_TASK || Reports progress between 0% and 100%&lt;br /&gt;
|-&lt;br /&gt;
| [[#Signature Task|Signature Task]] || SIGNATURE_TASK || Captures a handwritten signature&lt;br /&gt;
|-&lt;br /&gt;
| [[#Supervisor Check Task|Supervisor Check Task]] || SUPERVISOR_CHECK_TASK || Applies the four-eyes principle to a Check Task&lt;br /&gt;
|-&lt;br /&gt;
| [[#Switch End Task|Switch End Task]] || SWITCH_END_TASK || Rejoins the branches of a Procedure workflow&lt;br /&gt;
|-&lt;br /&gt;
| [[#Switch Start Task|Switch Start Task]] || SWITCH_START_TASK || Selects a Procedure branch by evaluating a Boolean expression&lt;br /&gt;
|-&lt;br /&gt;
| [[#Text Task|Text Task]] || TEXT_TASK || Records free-form text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Blinding Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''BLINDING_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_BLINDINGTASK]]&lt;br /&gt;
&lt;br /&gt;
A Blinding Task documents either a blinding or deblinding operation at a linked blinding location. The configured operation type determines the state that must be reported to complete the task.&lt;br /&gt;
&lt;br /&gt;
'''Relevant properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| BLINDING_TYPE || Configured operation type: Blinding or DeBlinding&lt;br /&gt;
|-&lt;br /&gt;
| LK_BLINDING_LOCATION || Link to the associated blinding location&lt;br /&gt;
|-&lt;br /&gt;
| LK_PREVIOUS_TASK || Link to the preceding Blinding Task&lt;br /&gt;
|-&lt;br /&gt;
| LOCKED || Prevents the task from being edited&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || Reported blinding state&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The task is complete only when '''VALUE''' matches the configured '''BLINDING_TYPE'''.&lt;br /&gt;
&lt;br /&gt;
=== Calculation Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''CALCULATION_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_CALCULATION_TASK]]&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_CALCULATION_TASK|Calculation Task]] automatically evaluates a predefined expression on the client and writes the result to a configured property on its owner. No user input is required.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| EXPRESSION || {{String}} || Expression evaluated by the client&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Integer}} || Evaluation state: Undefined = 0, Pending = 10, Finished = 20, Error = 30&lt;br /&gt;
|-&lt;br /&gt;
| TARGET_PROPERTY_NAME || {{String}} || Name of the target property on the owner&lt;br /&gt;
|-&lt;br /&gt;
| TARGET_PROPERTY_TYPE || {{Integer}} || Target type: Undefined = 0, Boolean = 1, Integer = 3, Double = 4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The task is automatically finished after successful evaluation. The clients display an indicator for a successful evaluation or an evaluation error. A Pending state does not receive an additional indicator.&lt;br /&gt;
&lt;br /&gt;
See also [[#Procedure Task Variants and Workflow Execution|Procedure Task Variants and Workflow Execution]].&lt;br /&gt;
&lt;br /&gt;
=== Check Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''CHECK_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_CHECK_TASK]]&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_CHECK_TASK|Check Task]] is a simple Boolean task represented by a checkbox. Clicking the checkbox sets its value and completes the task. It can alternatively be completed using ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task value and completion&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Check Task finished UWP.png|Check Task (WinX)&lt;br /&gt;
File:Check Task android.jpg|Not Applicable Check Task (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Commissioning Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''COMMISSIONING_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_COMMISSIONINGCHECK]]&lt;br /&gt;
&lt;br /&gt;
A Commissioning Task is a specialized task type used in MRO commissioning workflows.&lt;br /&gt;
&lt;br /&gt;
'''Relevant property'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| NOTAPPLICABLE || {{Boolean}} || Not Applicable state&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Inspection Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''INSPECTION_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_INSPECTION_TASK]]&lt;br /&gt;
&lt;br /&gt;
An [[MROCLS_MRO_INSPECTION_TASK|Inspection Task]] captures a Boolean inspection result. The client presents a positive and a negative option as well as ''Not Applicable''. Selecting an option completes the task.&lt;br /&gt;
&lt;br /&gt;
The labels for the positive and negative outcomes can be configured. Selecting the negative outcome displays the configured false label.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Selected inspection result&lt;br /&gt;
|-&lt;br /&gt;
| LABEL_TRUE || {{String}} || Label for the positive outcome&lt;br /&gt;
|-&lt;br /&gt;
| LABEL_FALSE || {{String}} || Label for the negative outcome&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Finished Inspection Task UWP.png|Finished Inspection Task (WinX)&lt;br /&gt;
File:Inspection task android.jpg|Finished Inspection Task (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Interface Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''INTERFACE_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_CHECK_TASK]]&lt;br /&gt;
&lt;br /&gt;
An Interface Task waits for another software system to provide its completion value. The task is complete when its Boolean '''VALUE''' becomes true. If the client is offline, the task waits until connectivity and synchronization are available again.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task completion supplied by the external software system&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Joint Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''JOINT_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_JOINTTASK]]&lt;br /&gt;
&lt;br /&gt;
A Joint Task documents the state of a linked joint location. The user selects one of the available Joint States.&lt;br /&gt;
&lt;br /&gt;
'''Relevant properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| LK_JOINT_LOCATION || Link to the associated joint location&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || Selected Joint State&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The available states are:&lt;br /&gt;
&lt;br /&gt;
* Closed&lt;br /&gt;
* Disconnected&lt;br /&gt;
* Open&lt;br /&gt;
* Planned&lt;br /&gt;
* Reconnected&lt;br /&gt;
* Torqued&lt;br /&gt;
* Undefined&lt;br /&gt;
* Verified&lt;br /&gt;
&lt;br /&gt;
The Joint Task is complete when its state is '''Planned''' or '''Closed'''.&lt;br /&gt;
&lt;br /&gt;
=== Measurement Task ===&lt;br /&gt;
&lt;br /&gt;
Technical classification name: '''MROCLS_MRO_MEASUREMENT_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_MEASUREMENT_TASK]]&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_MEASUREMENT_TASK|Measurement Task]] records a measured Double value, for example a value read from a pressure gauge. Selecting the displayed value opens an editor. If no value has been entered, the editor initially displays an empty value. Entering a value or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
An optional secondary value indicator can display a previously recorded value. Its behaviour has to be configured separately.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Double}} || Currently recorded measurement&lt;br /&gt;
|-&lt;br /&gt;
| PREVIOUS_VALUE || {{Double}} || Previously recorded measurement&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Measurment Task Empty UWP.png|Measurement Task without a recorded value (WinX)&lt;br /&gt;
File:Measurment Task Not Empty UWP.png|Measurement Task with a recorded value (WinX)&lt;br /&gt;
File:Measurment Task Empty Android.jpg|Measurement Task without a recorded value (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Numeric Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''NUMERIC_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_NUMERIC_TASK]]&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_NUMERIC_TASK|Numeric Task]] records a Double value, for example a value read from a temperature sensor. Entering a value or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
The value is compared against a configured acceptable range that cannot be edited on the client. A value outside the range produces visual feedback and sets the technical status to indicate an issue. An invalid configured range, such as a minimum greater than the maximum, also produces an issue when a value is entered.&lt;br /&gt;
&lt;br /&gt;
A value unit can be configured for an individual task. When present, it overrides the standard unit configured on the [[MetaProperty#Unit_Item|MetaProperty]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Double}} || Recorded numeric value&lt;br /&gt;
|-&lt;br /&gt;
| VALUE_UNIT || {{String}} || Instance-specific value unit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Pick List Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PICKLIST_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_PICK_LIST_TASK]]&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_PICK_LIST_TASK|Pick List Task]] allows the user to select one value from an [[UBIK Active Lists|Active List]] configured on the task instance. It behaves similarly to a standard Integer Task with a Selective List, but the selectable values are supplied by the Active List rather than being defined globally.&lt;br /&gt;
&lt;br /&gt;
Every list item has an Integer value. Selecting an item or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Integer}} || Value of the selected Active List item&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Picture Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PICTURE_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_PICTURE_TASK]]&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_PICTURE_TASK|Picture Task]] is a Boolean task that can only be finished when it has at least one child document containing a valid file. Multiple child documents can be attached. Although pictures are the most common files, the child document can contain another file type.&lt;br /&gt;
&lt;br /&gt;
The clients display a file or photo button next to the task checkbox. The task cannot be completed through the checkbox until the file requirement is satisfied. Selecting ''Not Applicable'' is always possible and bypasses the child-document requirement.&lt;br /&gt;
&lt;br /&gt;
When the user attempts to finish the task while online, the client may first synchronize the task's child objects and download the files of its child documents. During synchronization, the checkbox is replaced by a wait indicator.&lt;br /&gt;
&lt;br /&gt;
* If no child document or no local file is available, the task remains unfinished and the user is informed.&lt;br /&gt;
* If at least one child document with a valid local file is available, the task is finished and the file or photo button is disabled.&lt;br /&gt;
&lt;br /&gt;
Child-count information can be configured but is not required. WinX can display the child documents in an expander. This is not shown by default on Mobile due to the available screen size, but it can be customized using [[Object_hierarchy_in_XAML:_NextLevel,_ParentLevel,_LinkedLevel#Show_NextLevel_Children.2FDocuments|Show NextLevel Children/Documents]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task completion&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Progress Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PROGRESS_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_PROGRESS_TASK]]&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_PROGRESS_TASK|Progress Task]] reports progress between 0% and 100%. The reported value contributes to the progress of the owning Work Package. Values below 100% represent partial progress; the task is finished only when the reported progress reaches 100%. It can alternatively be completed using ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Double}} || Currently reported progress&lt;br /&gt;
|-&lt;br /&gt;
| PREVIOUS_VALUE || {{Double}} || Previously reported progress&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
An [[MRO_PROGRESS_TASK_EDITOR|alternative editor]] is available for Progress Tasks.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Progress Task UWP.png|Progress Task with reported progress (WinX)&lt;br /&gt;
File:Progress Task Android.jpg|Progress Task with current and previous progress (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Signature Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SIGNATURE_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_SIGNATURE_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Signature Task is completed by capturing a handwritten signature. Selecting the signature editor opens an in-app dialog in which the user can sign. Confirming the signature saves it and automatically completes the task.&lt;br /&gt;
&lt;br /&gt;
When signing while online, the server resolves and displays the signee and generates the validation timestamp. When signing offline, the signee is resolved and displayed once the client is online again. If the complete signee or validation timestamp cannot be displayed in the editor field, selecting the field opens a popup with the complete information.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Signature}} || Captured signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Supervisor Check Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SUPERVISOR_CHECK_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_SUPERVISOR_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Supervisor Check Task applies the four-eyes principle to a Boolean Check Task on one device. The worker hands the device to a supervisor. The supervisor scans an NFC tag and enters the supervisor PIN. After successful authentication, the checkbox is enabled and must still be selected to finish the task.&lt;br /&gt;
&lt;br /&gt;
Selecting ''Not Applicable'' does not require supervisor authentication.&lt;br /&gt;
&lt;br /&gt;
Successful supervisor authentication removes only the supervisor-related lock. The task can remain locked for another reason, such as sequential dependencies or user rights. If an incorrect PIN is entered three times, authentication is cancelled and the NFC tag has to be scanned again. A setting controls [[RFID tags#Choose which information to use from a tag|which tag information is used]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Check Task completion&lt;br /&gt;
|-&lt;br /&gt;
| SUPERVISOR || {{Guid}} || Authenticated supervisor&lt;br /&gt;
|-&lt;br /&gt;
| PERMISSION || {{String}} || Required supervisor permission&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=300px heights=300px&amp;gt;&lt;br /&gt;
File:UI_Xamarin_Supervisor_Task_Before_Verification.jpg|Supervisor Check Task before verification&lt;br /&gt;
File:UI_Xamarin_Supervisor_Task_Enter_PIN.jpg|Supervisor PIN entry&lt;br /&gt;
File:UI_Xamarin_Supervisor_Task_After_Verification.jpg|Supervisor Check Task after verification&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Switch End Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SWITCH_END_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_SWITCH_END_TASK]]&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_SWITCH_END_TASK|Switch End Task]] marks the point at which the two branches created by a Switch Start Task merge again. It is linked to exactly one corresponding Switch Start Task. It is not shown to the user and completes automatically after the selected branch has finished, allowing the common Procedure workflow to continue.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task completion&lt;br /&gt;
|-&lt;br /&gt;
| LK_SWITCH_START_TASK || {{Guid}} || Link to the corresponding Switch Start Task&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
See also [[#Procedure Task Variants and Workflow Execution|Procedure Task Variants and Workflow Execution]].&lt;br /&gt;
&lt;br /&gt;
=== Switch Start Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SWITCH_START_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_SWITCH_START_TASK]]&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_SWITCH_START_TASK|Switch Start Task]] is a sequential workflow-control task used in a Procedure Workpackage. It automatically evaluates a Boolean expression on the client and selects either the true or false branch. Each branch represents a different path of Tasks and must lead to a corresponding Switch End Task.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| EXPRESSION || {{String}} || Expression evaluated by the client&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Integer}} || Evaluation state: Undefined = 0, Pending = 10, Finished = 20, Error = 30&lt;br /&gt;
|-&lt;br /&gt;
| BRANCH_TRUE || {{Guid}} || Link to the Task or Task Owner that starts the true branch&lt;br /&gt;
|-&lt;br /&gt;
| BRANCH_FALSE || {{Guid}} || Link to the Task or Task Owner that starts the false branch&lt;br /&gt;
|-&lt;br /&gt;
| DISPLAYSTRING_TRUE || {{String}} || Display string for a true result&lt;br /&gt;
|-&lt;br /&gt;
| DISPLAYSTRING_FALSE || {{String}} || Display string for a false result&lt;br /&gt;
|-&lt;br /&gt;
| EVALUATION_RESULT || {{Boolean}} || Result of the evaluated expression&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
After evaluation, only the selected branch is executed. The other branch remains hidden and its Procedure Tasks are set to ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
See also [[#Procedure Task Variants and Workflow Execution|Procedure Task Variants and Workflow Execution]].&lt;br /&gt;
&lt;br /&gt;
=== Text Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''TEXT_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_TEXT_TASK]]&lt;br /&gt;
&lt;br /&gt;
A Text Task allows the user to enter free-form text. Entering a value or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{String}} || Entered text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Supervisor Base Type ==&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SUPERVISOR_TASK'''&lt;br /&gt;
&lt;br /&gt;
Classification: [[MROCLS_MRO_SUPERVISOR_TASK]]&lt;br /&gt;
&lt;br /&gt;
Supervisor Task is a base type that provides supervisor authentication behaviour. It is not used as a standalone user task. The concrete task type using this behaviour is [[#Supervisor Check Task|Supervisor Check Task]].&lt;br /&gt;
&lt;br /&gt;
== Procedure Task Variants and Workflow Execution ==&lt;br /&gt;
&lt;br /&gt;
Procedure variants are specialized versions of task types for use within Procedure Workpackages. They retain the behaviour of their corresponding task type and additionally implement the [[MROCLS_SEQUENTIALTASK|Sequential Task]] and [[MROCLS_GROUPEDTASK|Grouped Task]] classifications.&lt;br /&gt;
&lt;br /&gt;
Procedure variants are available for:&lt;br /&gt;
&lt;br /&gt;
* Calculation Task&lt;br /&gt;
* Check Task&lt;br /&gt;
* Inspection Task&lt;br /&gt;
* Interface Task&lt;br /&gt;
* Numeric Task&lt;br /&gt;
* Pick List Task&lt;br /&gt;
* Picture Task&lt;br /&gt;
* Signature Task&lt;br /&gt;
* Supervisor Check Task&lt;br /&gt;
* Text Task&lt;br /&gt;
&lt;br /&gt;
Switch Start Tasks, Switch End Tasks, and Calculation Tasks provide automatic workflow-control behaviour in a Procedure Workpackage.&lt;br /&gt;
&lt;br /&gt;
For automatic Calculation and Switch Start Tasks, the clients display an evaluation indicator:&lt;br /&gt;
&lt;br /&gt;
* '''Finished:''' The Task was automatically evaluated successfully.&lt;br /&gt;
* '''Error:''' The Task was evaluated but resulted in an error.&lt;br /&gt;
* '''Pending:''' The Task has not yet been evaluated. No additional indicator is displayed for this state.&lt;br /&gt;
&lt;br /&gt;
When a predecessor Switch Start Task has not yet finished, its follow-up Procedure Tasks are hidden because the relevant branch is not yet known. After evaluation, the selected branch becomes visible. The other branch remains hidden, is not executed, and its Procedure Tasks are set to ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
For example, several predecessor Numeric Tasks can record temperatures from different parts of an equipment. A subsequent Calculation Task can calculate their average. A Switch Start Task can then select a branch based on whether the average exceeds a configured temperature. One branch can contain a Task for activating a cooling mechanism, while the other branch can lead directly to the Switch End Task or contain further Switch Tasks.&lt;br /&gt;
&lt;br /&gt;
Procedure Tasks are intended to execute automatically when their predecessors are finished. However, the completion of the predecessor has to be triggered by a user. If a predecessor becomes finished only because of a server update, the follow-up Procedure workflow is not triggered. This prevents a workflow from executing in the name of users who did not initiate or observe the completion.&lt;br /&gt;
&lt;br /&gt;
The general online and offline evaluation rules for sequential and grouped Tasks are documented in [[MRO Objects (Client)#Sequential Task|Sequential Task]] and [[MRO Objects (Client)#Grouped Task|Grouped Task]].&lt;br /&gt;
&lt;br /&gt;
== Supporting File Documents ==&lt;br /&gt;
&lt;br /&gt;
=== Procedure JSON File Document ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''FILEDOCUMENT_MRO_JSON'''&lt;br /&gt;
&lt;br /&gt;
This File Document stores the JSON definition of a Procedure Workpackage.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| LK_PROCEDURE_WORKPACKAGE || {{Guid}} || Link to the associated Procedure Workpackage&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Picture Task File Document ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''FILEDOCUMENT_MRO_PICTURE_TASK'''&lt;br /&gt;
&lt;br /&gt;
This is a dedicated File Document linked to a Picture Task. A Picture Task can also use another child-document type, provided that the child document contains a valid file.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| LK_PICTURE_TASK || {{Guid}} || Link to the associated Picture Task&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[MRO Objects (Client)]]&lt;br /&gt;
* [[MROCLS_MRO_TASKOWNER]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_WORKPACKAGE]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_PROGRESS_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_MEASUREMENT_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_CHECK_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_INSPECTION_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_SEQUENTIALTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_GROUPEDTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_PROCEDURE]] (Classification)&lt;br /&gt;
* [[MROCLS_SWITCH_START_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_SWITCH_END_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_CALCULATION_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_PICK_LIST_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_PICTURE_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_BLINDINGTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_COMMISSIONINGCHECK]] (Classification)&lt;br /&gt;
* [[MROCLS_JOINTTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_SIGNATURE_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_TEXT_TASK]] (Classification)&lt;br /&gt;
&lt;br /&gt;
[[Category:Module|MRO (Plugin)]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_Objects_(Client)&amp;diff=30446</id>
		<title>MRO Objects (Client)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_Objects_(Client)&amp;diff=30446"/>
				<updated>2026-08-17T11:31:50Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:MRO_WinX.png|thumb|alt=MRO Child List UI (WinX)|MRO UI (WinX)]]&lt;br /&gt;
[[File:MRO_MAUI1.jpeg|thumb|alt=MRO Child List UI (Mobile)|MRO UI (Mobile)]]&lt;br /&gt;
&lt;br /&gt;
The WinX and Mobile clients display MRO objects like other root or child objects, with additional MRO-specific indicators, controls, and evaluation logic.&lt;br /&gt;
&lt;br /&gt;
This page documents behaviour that is shared by multiple MRO objects in the clients. The MRO object model, task-specific behaviour, and relevant technical properties are documented on [[MRO (Plugin)]]. For the complete task-type catalog, see [[MRO (Plugin)#MRO Task Types|MRO Task Types]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Page !! Scope&lt;br /&gt;
|-&lt;br /&gt;
| [[MRO (Plugin)]] || MRO concepts, task types, task-specific behaviour, and relevant technical properties&lt;br /&gt;
|-&lt;br /&gt;
| '''MRO Objects (Client)''' || Common client presentation, status indicators, locking, and behaviour shared by multiple MRO objects&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Hint|For the complete list of MRO task types and their task-specific behaviour, see [[MRO (Plugin)#MRO Task Types|MRO Task Types]].}}&lt;br /&gt;
&lt;br /&gt;
== Basic User Interface ==&lt;br /&gt;
&lt;br /&gt;
The MRO user interface provides status indicators and interactive controls. In the {{UBIK}} child list, an MRO object can display its accumulated technical status, organisational status, and overall work progress based on its underlying data branch. These indicators are shown next to the main icon on child, details, and documents pages as well as next to the icons of child-list items.&lt;br /&gt;
&lt;br /&gt;
=== Technical Status ===&lt;br /&gt;
&lt;br /&gt;
The technical status indicator is shown on objects that represent a technical state or receive the technical status from subsequent objects in the underlying data branch. For example, if an inventory object is reported as damaged, its parent objects display an exclamation-mark indicator to show that a problem was reported by a child object.&lt;br /&gt;
&lt;br /&gt;
[[File:TechStats_WinX.png|100px|Technical Status Indicator (WinX and Mobile)]]&lt;br /&gt;
&lt;br /&gt;
=== Organisational Status ===&lt;br /&gt;
&lt;br /&gt;
The organisational status represents the amount of confirmed work in the data branch. This includes confirmed Work Packages as well as Tasks that are locked by their owning Work Package. The indicator is shown on objects that represent an organisational state or receive the organisational status from subsequent objects.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:OrgaStatusIndicatorWinX.PNG|Organisational Status Indicator (WinX)&lt;br /&gt;
File:ConfirmedWP_WinX.png|Confirmed Work Package flag (WinX)&lt;br /&gt;
File:ConfirmedWP_MAUI.jpeg|Confirmed Work Package indicator (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Work Progress ===&lt;br /&gt;
&lt;br /&gt;
Work progress is calculated from the object's current progress and the progress accumulated from subsequent objects in the underlying data branch. The indicator shows the amount of work completed in that branch.&lt;br /&gt;
&lt;br /&gt;
{{Version/WinXSince|5.0}} {{Version/MobileSince|5.0}} By default, progress is displayed with no more than one decimal place. For example, 99.75% is displayed as 99.8%. The format string used for this is ''{0:0.#}%''.&lt;br /&gt;
&lt;br /&gt;
For other numeric formats, see [https://learn.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings custom numeric format strings]. The template used to customize the presentation is '''UBIKMROProgressBadge''' in '''UBIKThemes'''.&lt;br /&gt;
&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
== MRO Objects ==&lt;br /&gt;
&lt;br /&gt;
The MRO object model consists of Task Owners, Work Packages, Tasks, and specialized task types. For the object definitions and technical properties, see [[MRO (Plugin)#MRO Objects|MRO Objects]].&lt;br /&gt;
&lt;br /&gt;
=== Task Owner ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_TASKOWNER|Task Owner]] gives users an overview of the work in its underlying structure. The client displays the technical status, organisational status, and work progress accumulated from its subordinate Task Owners and Work Packages.&lt;br /&gt;
&lt;br /&gt;
For the Task Owner definition, see [[MRO (Plugin)#Task Owner|Task Owner]].&lt;br /&gt;
&lt;br /&gt;
=== Work Package ===&lt;br /&gt;
&lt;br /&gt;
The clients provide controls for confirming and revoking the confirmation of a [[MROCLS_MRO_WORKPACKAGE|Work Package]]. A Work Package can be confirmed when its related Tasks have reached the required progress and all subordinate Work Packages have been confirmed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:ConfirmingWP_WinX.png|Work Package confirmation button (WinX)&lt;br /&gt;
File:MRORevoke_WinX.png|Revoke Work Package confirmation (WinX)&lt;br /&gt;
File:ConfirmingWP_MAUI.jpeg|Work Package confirmation button (Mobile)&lt;br /&gt;
File:MRORevoke_MAUI.jpeg|Revoke Work Package confirmation (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the Work Package definition, see [[MRO (Plugin)#Work Package|Work Package]].&lt;br /&gt;
&lt;br /&gt;
=== Task ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_TASK|Task]] reports progress to its owning Work Package. All user-editable MRO Tasks support ''Not Applicable''. In both clients, a completed user-editable Task can be reset by selecting ''Not Applicable'' twice.&lt;br /&gt;
&lt;br /&gt;
For the common Task model and value-validation requirement, see [[MRO (Plugin)#Task|Task]].&lt;br /&gt;
&lt;br /&gt;
{{Hint|For the complete list of MRO task types, their properties, and their task-specific client behaviour, see [[MRO (Plugin)#MRO Task Types|MRO Task Types]].}}&lt;br /&gt;
&lt;br /&gt;
==== Sequential Task ====&lt;br /&gt;
&lt;br /&gt;
The [[MROCLS_SEQUENTIALTASK|Sequential Task classification]] defines an order in which Tasks are to be completed. One or more predecessor Tasks can be required to finish before a dependent Task becomes unlocked and editable. A Task can have any number of predecessors.&lt;br /&gt;
&lt;br /&gt;
A Task and its predecessors do not have to belong to the same Work Package. A predecessor can be located elsewhere in the object hierarchy.&lt;br /&gt;
&lt;br /&gt;
The state of a Sequential Task is evaluated both online and offline. This allows visible dependent Tasks to update immediately when their predecessors are finished. The server-side state takes precedence in the case described by the first step below.&lt;br /&gt;
&lt;br /&gt;
The state is evaluated as follows:&lt;br /&gt;
&lt;br /&gt;
# If the server-side state says that the Task is open, it is treated as open and no further local evaluation is performed.&lt;br /&gt;
# The client checks whether the Task has predecessors.&lt;br /&gt;
# The client attempts to load every predecessor Task.&lt;br /&gt;
#* If any predecessor cannot be loaded because it is not available offline, the Task is locked.&lt;br /&gt;
# If every predecessor is finished, the Task is open and editable. Otherwise, it is locked.&lt;br /&gt;
&lt;br /&gt;
The configured dependency graph must not contain cycles. Tasks within a dependency cycle could never become available for completion.&lt;br /&gt;
&lt;br /&gt;
'''Example'''&lt;br /&gt;
&lt;br /&gt;
See [[Media:Sequential_tasks_winx.mp4|this video]] for a demonstration. The Task relations are illustrated in [[Media:Task_relations.png|this image]]. Tasks A1 and A2 do not depend on other Tasks. The lines from left to right represent dependencies; for example, B2 has A1 and A2 as predecessors.&lt;br /&gt;
&lt;br /&gt;
==== Grouped Task {{Version/WinXSince|4.2}}{{Version/XamarinSince|4.2}} ====&lt;br /&gt;
&lt;br /&gt;
The [[MROCLS_GROUPEDTASK|Grouped Task classification]] is used when only a configured number of Tasks from a group have to be finished. The Tasks are siblings and share a server-configured threshold. When the number of finished Tasks reaches the threshold, the remaining Tasks in the group are considered no longer necessary. For the accumulated status of the owning objects, those Tasks are treated as if they were finished.&lt;br /&gt;
&lt;br /&gt;
{{Hint|The finished state and the no-longer-necessary state are independent. A Grouped Task that is no longer necessary can be either finished or unfinished. Users do not have to finish it, but they still can.}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|The precise status calculation requires information about all sibling Tasks. If some siblings are not available offline, the client cannot determine whether the threshold has been reached. In this situation, the local status calculation treats the available objects as regular Tasks.}}&lt;br /&gt;
&lt;br /&gt;
{{Hint|The client uses the best available status. It uses the status calculated by the server when the client is online and there are no uncommitted local changes on the involved objects. Otherwise, it calculates the status locally based on the available information.}}&lt;br /&gt;
&lt;br /&gt;
A Task can be both grouped and sequential. In this case, the group threshold affects when a dependent Task becomes available.&lt;br /&gt;
&lt;br /&gt;
For example, Tasks A1, A2, and A3 can form a group in which only one Task has to be finished. If all three are predecessors of Task B, finishing one of them causes the group threshold to be reached. All three predecessors become no longer necessary and locked, and Task B becomes unlocked.&lt;br /&gt;
&lt;br /&gt;
=== MRO Objects with Project Information (WinX only) {{Version/WinXSince|2.5.4}} ===&lt;br /&gt;
&lt;br /&gt;
{{DeprecatedStartTag|parameter=Please refer to [[Main_Page]] for the most recent information.}}&lt;br /&gt;
&lt;br /&gt;
[[File:UI_WinX_MRO_ProjectInfo.png|thumb|MRO Object with Project Information (WinX)]]&lt;br /&gt;
&lt;br /&gt;
An MRO object other than a Task can contain [[MROCLS_PROJECTINFORMATION|project information]]. In this case, the project information and MRO progress are displayed in a bar chart. The start and end dates are displayed on the progress bar. Its length and position, together with the current-date marker, indicate the timeline.&lt;br /&gt;
&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
{{DeprecatedEndTag}}&lt;br /&gt;
&lt;br /&gt;
== Locking ==&lt;br /&gt;
&lt;br /&gt;
When an MRO object is locked, it cannot be edited. For further information, see [[Locked Objects|Locked Objects]].&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[MRO (Plugin)]]&lt;br /&gt;
* [[MROCLS_PROJECT]]&lt;br /&gt;
* [[MROCLS_PROJECTINFORMATION]]&lt;br /&gt;
* [[MROCLS_SEQUENTIALTASK]]&lt;br /&gt;
* [[MROCLS_GROUPEDTASK]]&lt;br /&gt;
* [[MROCLS_MRO_TASK]]&lt;br /&gt;
* [[MROCLS_MRO_TASKOWNER]]&lt;br /&gt;
* [[MROCLS_MRO_WORKPACKAGE]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Android|MRO Objects (UBIK WinX)]]&lt;br /&gt;
[[Category:Client|MRO Objects (Client)]]&lt;br /&gt;
[[Category:Mobile|MRO Objects (Client)]]&lt;br /&gt;
[[Category:Pages with broken file links|MRO Objects (Client)]]&lt;br /&gt;
[[Category:WinX|MRO Objects (UBIK WinX)]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_(Plugin)&amp;diff=30445</id>
		<title>MRO (Plugin)</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_(Plugin)&amp;diff=30445"/>
				<updated>2026-08-17T11:08:40Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The MRO plugin provides a set of {{UBIK}} objects for representing and documenting maintenance, repair and operations work. The MRO features are available in the supported Mobile and {{UBIK WinX}} clients.&lt;br /&gt;
&lt;br /&gt;
This page is the main documentation for the MRO object model and its task types. Common client behaviour, such as status indicators, locking, and the general evaluation of sequential and grouped tasks, is documented in [[MRO Objects (Client)]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Page !! Scope&lt;br /&gt;
|-&lt;br /&gt;
| '''MRO (Plugin)''' || MRO concepts, task types, task-specific behaviour, and relevant technical properties&lt;br /&gt;
|-&lt;br /&gt;
| [[MRO Objects (Client)]] || Common client presentation, status indicators, locking, and behaviour shared by multiple MRO objects&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Basic Features ==&lt;br /&gt;
&lt;br /&gt;
Objects classified as MRO objects generally provide a technical and organisational status as well as an overall work progress based on their underlying data branch.&lt;br /&gt;
&lt;br /&gt;
=== Technical Status ===&lt;br /&gt;
&lt;br /&gt;
For detailed information, see [[MRO Objects (Client)#Technical Status|Technical Status]].&lt;br /&gt;
&lt;br /&gt;
=== Organisational Status ===&lt;br /&gt;
&lt;br /&gt;
For detailed information, see [[MRO Objects (Client)#Organisational Status|Organisational Status]].&lt;br /&gt;
&lt;br /&gt;
=== Work Progress ===&lt;br /&gt;
&lt;br /&gt;
For detailed information, see [[MRO Objects (Client)#Work Progress|Work Progress]].&lt;br /&gt;
&lt;br /&gt;
== MRO Objects ==&lt;br /&gt;
&lt;br /&gt;
MRO uses Task Owners, Work Packages, Tasks, and Procedure Workpackages to represent maintenance workflows.&lt;br /&gt;
&lt;br /&gt;
=== Task Owner ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_TASKOWNER|Task Owner]] is an object with an underlying structure of work to be performed. It can contain other Task Owners or Work Packages. Their technical status, organisational status, and work progress are accumulated and reported to the Task Owner.&lt;br /&gt;
&lt;br /&gt;
=== Work Package ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_WORKPACKAGE|Work Package]] collects and summarizes Task Owners, other Work Packages, or Tasks. A Work Package can be confirmed when all associated Tasks have reached the required progress and all subordinate Work Packages have been confirmed.&lt;br /&gt;
&lt;br /&gt;
For Work Package presentation and confirmation in the clients, see [[MRO Objects (Client)#Work Package|Work Package]].&lt;br /&gt;
&lt;br /&gt;
=== Task ===&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_TASK|Task]] reports work progress to its owning Work Package. The available task types provide different input, validation, or automatic workflow behaviour.&lt;br /&gt;
&lt;br /&gt;
MRO task values must be validated for work progress to be calculated. A MetaAttribute providing a validation timestamp must therefore be attached to the relevant MetaProperty.&lt;br /&gt;
&lt;br /&gt;
{{Attention|A task value property has to use [[Attributes]] so that its value can be validated. Otherwise, work progress cannot be calculated.}}&lt;br /&gt;
&lt;br /&gt;
All user-editable MRO task types can be set to ''Not Applicable''. In the clients, a completed user-editable task can be reset by selecting ''Not Applicable'' twice. General client behaviour is documented in [[MRO Objects (Client)#Task|Task]].&lt;br /&gt;
&lt;br /&gt;
=== Procedure Workpackage ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PROCEDURE_WORKPACKAGE'''&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_PROCEDURE|Procedure Workpackage]] is a specialized Work Package for structured workflows. Its structure is defined in JSON using a workflow editor and can contain Tasks as well as subordinate Procedure Workpackages. Depending on its state, the corresponding objects are created or updated.&lt;br /&gt;
&lt;br /&gt;
Procedure Workpackages can use sequential execution, grouped Tasks, branching, calculations, and references to linked data. Their workflows support online and offline use. Steps that require data exchange wait until connectivity is available.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| PROCEDURE_STATUS || {{Integer}} || Current state: Draft = 10, ReadyToUse = 20, Published = 30, Open = 40, Executing = 50, Completed = 60, Approved = 70, Rejected = 80&lt;br /&gt;
|-&lt;br /&gt;
| JSON || {{String}} || JSON representation of the Procedure Workpackage&lt;br /&gt;
|-&lt;br /&gt;
| ISTEMPLATE || {{Boolean}} || Indicates whether the Procedure Workpackage is a template&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MRO Task Types ==&lt;br /&gt;
&lt;br /&gt;
The following task types are available in MRO. The technical object names are included to make the task types discoverable through the wiki search.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Task type !! Technical object name !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| [[#Blinding Task|Blinding Task]] || BLINDING_TASK || Documents a blinding or deblinding operation&lt;br /&gt;
|-&lt;br /&gt;
| [[#Calculation Task|Calculation Task]] || CALCULATION_TASK || Evaluates an expression and writes its result to a target property&lt;br /&gt;
|-&lt;br /&gt;
| [[#Check Task|Check Task]] || CHECK_TASK || Confirms a Boolean task using a checkbox&lt;br /&gt;
|-&lt;br /&gt;
| [[#Commissioning Task|Commissioning Task]] || COMMISSIONING_TASK || Represents a task in an MRO commissioning workflow&lt;br /&gt;
|-&lt;br /&gt;
| [[#Inspection Task|Inspection Task]] || INSPECTION_TASK || Records a Boolean inspection result with configurable labels&lt;br /&gt;
|-&lt;br /&gt;
| [[#Interface Task|Interface Task]] || INTERFACE_TASK || Waits for completion information from another software system&lt;br /&gt;
|-&lt;br /&gt;
| [[#Joint Task|Joint Task]] || JOINT_TASK || Documents the state of a joint location&lt;br /&gt;
|-&lt;br /&gt;
| [[#Numeric Task|Numeric Task]] || NUMERIC_TASK || Records a numeric value and evaluates it against a configured range&lt;br /&gt;
|-&lt;br /&gt;
| [[#Pick List Task|Pick List Task]] || PICKLIST_TASK || Selects one integer value from an instance-specific Active List&lt;br /&gt;
|-&lt;br /&gt;
| [[#Picture Task|Picture Task]] || PICTURE_TASK || Requires at least one child document containing a valid file&lt;br /&gt;
|-&lt;br /&gt;
| [[#Progress Task|Progress Task]] || PROGRESS_TASK || Reports progress between 0% and 100%&lt;br /&gt;
|-&lt;br /&gt;
| [[#Signature Task|Signature Task]] || SIGNATURE_TASK || Captures a handwritten signature&lt;br /&gt;
|-&lt;br /&gt;
| [[#Supervisor Check Task|Supervisor Check Task]] || SUPERVISOR_CHECK_TASK || Applies the four-eyes principle to a Check Task&lt;br /&gt;
|-&lt;br /&gt;
| [[#Switch End Task|Switch End Task]] || SWITCH_END_TASK || Rejoins the branches of a Procedure workflow&lt;br /&gt;
|-&lt;br /&gt;
| [[#Switch Start Task|Switch Start Task]] || SWITCH_START_TASK || Selects a Procedure branch by evaluating a Boolean expression&lt;br /&gt;
|-&lt;br /&gt;
| [[#Text Task|Text Task]] || TEXT_TASK || Records free-form text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Blinding Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''BLINDING_TASK'''&lt;br /&gt;
&lt;br /&gt;
A Blinding Task documents either a blinding or deblinding operation at a linked blinding location. The configured operation type determines the state that must be reported to complete the task.&lt;br /&gt;
&lt;br /&gt;
'''Relevant properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| BLINDING_TYPE || Configured operation type: Blinding or DeBlinding&lt;br /&gt;
|-&lt;br /&gt;
| LK_BLINDING_LOCATION || Link to the associated blinding location&lt;br /&gt;
|-&lt;br /&gt;
| LK_PREVIOUS_TASK || Link to the preceding Blinding Task&lt;br /&gt;
|-&lt;br /&gt;
| LOCKED || Prevents the task from being edited&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || Reported blinding state&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The task is complete only when '''VALUE''' matches the configured '''BLINDING_TYPE'''.&lt;br /&gt;
&lt;br /&gt;
=== Calculation Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''CALCULATION_TASK'''&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_CALCULATION_TASK|Calculation Task]] automatically evaluates a predefined expression on the client and writes the result to a configured property on its owner. No user input is required.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| EXPRESSION || {{String}} || Expression evaluated by the client&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Integer}} || Evaluation state: Undefined = 0, Pending = 10, Finished = 20, Error = 30&lt;br /&gt;
|-&lt;br /&gt;
| TARGET_PROPERTY_NAME || {{String}} || Name of the target property on the owner&lt;br /&gt;
|-&lt;br /&gt;
| TARGET_PROPERTY_TYPE || {{Integer}} || Target type: Undefined = 0, Boolean = 1, Integer = 3, Double = 4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The task is automatically finished after successful evaluation. The clients display an indicator for a successful evaluation or an evaluation error. A Pending state does not receive an additional indicator.&lt;br /&gt;
&lt;br /&gt;
See also [[#Procedure Task Variants and Workflow Execution|Procedure Task Variants and Workflow Execution]].&lt;br /&gt;
&lt;br /&gt;
=== Check Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''CHECK_TASK'''&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_CHECK_TASK|Check Task]] is a simple Boolean task represented by a checkbox. Clicking the checkbox sets its value and completes the task. It can alternatively be completed using ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task value and completion&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Check Task finished UWP.png|Check Task (WinX)&lt;br /&gt;
File:Check Task android.jpg|Not Applicable Check Task (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Commissioning Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''COMMISSIONING_TASK'''&lt;br /&gt;
&lt;br /&gt;
A Commissioning Task is a specialized task type used in MRO commissioning workflows.&lt;br /&gt;
&lt;br /&gt;
'''Relevant property'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| NOTAPPLICABLE || {{Boolean}} || Not Applicable state&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Inspection Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''INSPECTION_TASK'''&lt;br /&gt;
&lt;br /&gt;
An [[MROCLS_MRO_INSPECTION_TASK|Inspection Task]] captures a Boolean inspection result. The client presents a positive and a negative option as well as ''Not Applicable''. Selecting an option completes the task.&lt;br /&gt;
&lt;br /&gt;
The labels for the positive and negative outcomes can be configured. Selecting the negative outcome displays the configured false label.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Selected inspection result&lt;br /&gt;
|-&lt;br /&gt;
| LABEL_TRUE || {{String}} || Label for the positive outcome&lt;br /&gt;
|-&lt;br /&gt;
| LABEL_FALSE || {{String}} || Label for the negative outcome&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Finished Inspection Task UWP.png|Finished Inspection Task (WinX)&lt;br /&gt;
File:Inspection task android.jpg|Finished Inspection Task (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Interface Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''INTERFACE_TASK'''&lt;br /&gt;
&lt;br /&gt;
An Interface Task waits for another software system to provide its completion value. The task is complete when its Boolean '''VALUE''' becomes true. If the client is offline, the task waits until connectivity and synchronization are available again.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task completion supplied by the external software system&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Joint Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''JOINT_TASK'''&lt;br /&gt;
&lt;br /&gt;
A Joint Task documents the state of a linked joint location. The user selects one of the available Joint States.&lt;br /&gt;
&lt;br /&gt;
'''Relevant properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| LK_JOINT_LOCATION || Link to the associated joint location&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || Selected Joint State&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The available states are:&lt;br /&gt;
&lt;br /&gt;
* Closed&lt;br /&gt;
* Disconnected&lt;br /&gt;
* Open&lt;br /&gt;
* Planned&lt;br /&gt;
* Reconnected&lt;br /&gt;
* Torqued&lt;br /&gt;
* Undefined&lt;br /&gt;
* Verified&lt;br /&gt;
&lt;br /&gt;
The Joint Task is complete when its state is '''Planned''' or '''Closed'''.&lt;br /&gt;
&lt;br /&gt;
=== Numeric Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''NUMERIC_TASK'''&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_NUMERIC_TASK|Numeric Task]] records a Double value, for example a value read from a temperature sensor. Entering a value or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
The value is compared against a configured acceptable range that cannot be edited on the client. A value outside the range produces visual feedback and sets the technical status to indicate an issue. An invalid configured range, such as a minimum greater than the maximum, also produces an issue when a value is entered.&lt;br /&gt;
&lt;br /&gt;
A value unit can be configured for an individual task. When present, it overrides the standard unit configured on the [[MetaProperty#Unit_Item|MetaProperty]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Double}} || Recorded numeric value&lt;br /&gt;
|-&lt;br /&gt;
| VALUE_UNIT || {{String}} || Instance-specific value unit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Pick List Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PICKLIST_TASK'''&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_PICK_LIST_TASK|Pick List Task]] allows the user to select one value from an [[UBIK Active Lists|Active List]] configured on the task instance. It behaves similarly to a standard Integer Task with a Selective List, but the selectable values are supplied by the Active List rather than being defined globally.&lt;br /&gt;
&lt;br /&gt;
Every list item has an Integer value. Selecting an item or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Integer}} || Value of the selected Active List item&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Picture Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PICTURE_TASK'''&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_PICTURE_TASK|Picture Task]] is a Boolean task that can only be finished when it has at least one child document containing a valid file. Multiple child documents can be attached. Although pictures are the most common files, the child document can contain another file type.&lt;br /&gt;
&lt;br /&gt;
The clients display a file or photo button next to the task checkbox. The task cannot be completed through the checkbox until the file requirement is satisfied. Selecting ''Not Applicable'' is always possible and bypasses the child-document requirement.&lt;br /&gt;
&lt;br /&gt;
When the user attempts to finish the task while online, the client may first synchronize the task's child objects and download the files of its child documents. During synchronization, the checkbox is replaced by a wait indicator.&lt;br /&gt;
&lt;br /&gt;
* If no child document or no local file is available, the task remains unfinished and the user is informed.&lt;br /&gt;
* If at least one child document with a valid local file is available, the task is finished and the file or photo button is disabled.&lt;br /&gt;
&lt;br /&gt;
Child-count information can be configured but is not required. WinX can display the child documents in an expander. This is not shown by default on Mobile due to the available screen size, but it can be customized using [[Object_hierarchy_in_XAML:_NextLevel,_ParentLevel,_LinkedLevel#Show_NextLevel_Children.2FDocuments|Show NextLevel Children/Documents]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task completion&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Progress Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''PROGRESS_TASK'''&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_MRO_PROGRESS_TASK|Progress Task]] reports progress between 0% and 100%. The reported value contributes to the progress of the owning Work Package. Values below 100% represent partial progress; the task is finished only when the reported progress reaches 100%. It can alternatively be completed using ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Double}} || Currently reported progress&lt;br /&gt;
|-&lt;br /&gt;
| PREVIOUS_VALUE || {{Double}} || Previously reported progress&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
An [[MRO_PROGRESS_TASK_EDITOR|alternative editor]] is available for Progress Tasks.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=497px heights=69px&amp;gt;&lt;br /&gt;
File:Progress Task UWP.png|Progress Task with reported progress (WinX)&lt;br /&gt;
File:Progress Task Android.jpg|Progress Task with current and previous progress (Mobile)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Signature Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SIGNATURE_TASK'''&lt;br /&gt;
&lt;br /&gt;
A Signature Task is completed by capturing a handwritten signature. Selecting the signature editor opens an in-app dialog in which the user can sign. Confirming the signature saves it and automatically completes the task.&lt;br /&gt;
&lt;br /&gt;
When signing while online, the server resolves and displays the signee and generates the validation timestamp. When signing offline, the signee is resolved and displayed once the client is online again. If the complete signee or validation timestamp cannot be displayed in the editor field, selecting the field opens a popup with the complete information.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Signature}} || Captured signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Supervisor Check Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SUPERVISOR_CHECK_TASK'''&lt;br /&gt;
&lt;br /&gt;
A Supervisor Check Task applies the four-eyes principle to a Boolean Check Task on one device. The worker hands the device to a supervisor. The supervisor scans an NFC tag and enters the supervisor PIN. After successful authentication, the checkbox is enabled and must still be selected to finish the task.&lt;br /&gt;
&lt;br /&gt;
Selecting ''Not Applicable'' does not require supervisor authentication.&lt;br /&gt;
&lt;br /&gt;
Successful supervisor authentication removes only the supervisor-related lock. The task can remain locked for another reason, such as sequential dependencies or user rights. If an incorrect PIN is entered three times, authentication is cancelled and the NFC tag has to be scanned again. A setting controls [[RFID tags#Choose which information to use from a tag|which tag information is used]].&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Check Task completion&lt;br /&gt;
|-&lt;br /&gt;
| SUPERVISOR || {{Guid}} || Authenticated supervisor&lt;br /&gt;
|-&lt;br /&gt;
| PERMISSION || {{String}} || Required supervisor permission&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=300px heights=300px&amp;gt;&lt;br /&gt;
File:UI_Xamarin_Supervisor_Task_Before_Verification.jpg|Supervisor Check Task before verification&lt;br /&gt;
File:UI_Xamarin_Supervisor_Task_Enter_PIN.jpg|Supervisor PIN entry&lt;br /&gt;
File:UI_Xamarin_Supervisor_Task_After_Verification.jpg|Supervisor Check Task after verification&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Switch End Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SWITCH_END_TASK'''&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_SWITCH_END_TASK|Switch End Task]] marks the point at which the two branches created by a Switch Start Task merge again. It is linked to exactly one corresponding Switch Start Task. It is not shown to the user and completes automatically after the selected branch has finished, allowing the common Procedure workflow to continue.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Boolean}} || Task completion&lt;br /&gt;
|-&lt;br /&gt;
| LK_SWITCH_START_TASK || {{Guid}} || Link to the corresponding Switch Start Task&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
See also [[#Procedure Task Variants and Workflow Execution|Procedure Task Variants and Workflow Execution]].&lt;br /&gt;
&lt;br /&gt;
=== Switch Start Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SWITCH_START_TASK'''&lt;br /&gt;
&lt;br /&gt;
A [[MROCLS_SWITCH_START_TASK|Switch Start Task]] is a sequential workflow-control task used in a Procedure Workpackage. It automatically evaluates a Boolean expression on the client and selects either the true or false branch. Each branch represents a different path of Tasks and must lead to a corresponding Switch End Task.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| EXPRESSION || {{String}} || Expression evaluated by the client&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{Integer}} || Evaluation state: Undefined = 0, Pending = 10, Finished = 20, Error = 30&lt;br /&gt;
|-&lt;br /&gt;
| BRANCH_TRUE || {{Guid}} || Link to the Task or Task Owner that starts the true branch&lt;br /&gt;
|-&lt;br /&gt;
| BRANCH_FALSE || {{Guid}} || Link to the Task or Task Owner that starts the false branch&lt;br /&gt;
|-&lt;br /&gt;
| DISPLAYSTRING_TRUE || {{String}} || Display string for a true result&lt;br /&gt;
|-&lt;br /&gt;
| DISPLAYSTRING_FALSE || {{String}} || Display string for a false result&lt;br /&gt;
|-&lt;br /&gt;
| EVALUATION_RESULT || {{Boolean}} || Result of the evaluated expression&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
After evaluation, only the selected branch is executed. The other branch remains hidden and its Procedure Tasks are set to ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
See also [[#Procedure Task Variants and Workflow Execution|Procedure Task Variants and Workflow Execution]].&lt;br /&gt;
&lt;br /&gt;
=== Text Task ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''TEXT_TASK'''&lt;br /&gt;
&lt;br /&gt;
A Text Task allows the user to enter free-form text. Entering a value or selecting ''Not Applicable'' completes the task.&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || {{String}} || Entered text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Supervisor Base Type ==&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''SUPERVISOR_TASK'''&lt;br /&gt;
&lt;br /&gt;
Supervisor Task is a base type that provides supervisor authentication behaviour. It is not used as a standalone user task. The concrete task type using this behaviour is [[#Supervisor Check Task|Supervisor Check Task]].&lt;br /&gt;
&lt;br /&gt;
== Procedure Task Variants and Workflow Execution ==&lt;br /&gt;
&lt;br /&gt;
Procedure variants are specialized versions of task types for use within Procedure Workpackages. They retain the behaviour of their corresponding task type and additionally implement the [[MROCLS_SEQUENTIALTASK|Sequential Task]] and [[MROCLS_GROUPEDTASK|Grouped Task]] classifications.&lt;br /&gt;
&lt;br /&gt;
Procedure variants are available for:&lt;br /&gt;
&lt;br /&gt;
* Calculation Task&lt;br /&gt;
* Check Task&lt;br /&gt;
* Inspection Task&lt;br /&gt;
* Interface Task&lt;br /&gt;
* Numeric Task&lt;br /&gt;
* Pick List Task&lt;br /&gt;
* Picture Task&lt;br /&gt;
* Signature Task&lt;br /&gt;
* Supervisor Check Task&lt;br /&gt;
* Text Task&lt;br /&gt;
&lt;br /&gt;
Switch Start Tasks, Switch End Tasks, and Calculation Tasks provide automatic workflow-control behaviour in a Procedure Workpackage.&lt;br /&gt;
&lt;br /&gt;
For automatic Calculation and Switch Start Tasks, the clients display an evaluation indicator:&lt;br /&gt;
&lt;br /&gt;
* '''Finished:''' The Task was automatically evaluated successfully.&lt;br /&gt;
* '''Error:''' The Task was evaluated but resulted in an error.&lt;br /&gt;
* '''Pending:''' The Task has not yet been evaluated. No additional indicator is displayed for this state.&lt;br /&gt;
&lt;br /&gt;
When a predecessor Switch Start Task has not yet finished, its follow-up Procedure Tasks are hidden because the relevant branch is not yet known. After evaluation, the selected branch becomes visible. The other branch remains hidden, is not executed, and its Procedure Tasks are set to ''Not Applicable''.&lt;br /&gt;
&lt;br /&gt;
For example, several predecessor Numeric Tasks can record temperatures from different parts of an equipment. A subsequent Calculation Task can calculate their average. A Switch Start Task can then select a branch based on whether the average exceeds a configured temperature. One branch can contain a Task for activating a cooling mechanism, while the other branch can lead directly to the Switch End Task or contain further Switch Tasks.&lt;br /&gt;
&lt;br /&gt;
Procedure Tasks are intended to execute automatically when their predecessors are finished. However, the completion of the predecessor has to be triggered by a user. If a predecessor becomes finished only because of a server update, the follow-up Procedure workflow is not triggered. This prevents a workflow from executing in the name of users who did not initiate or observe the completion.&lt;br /&gt;
&lt;br /&gt;
The general online and offline evaluation rules for sequential and grouped Tasks are documented in [[MRO Objects (Client)#Sequential Task|Sequential Task]] and [[MRO Objects (Client)#Grouped Task|Grouped Task]].&lt;br /&gt;
&lt;br /&gt;
== Supporting File Documents ==&lt;br /&gt;
&lt;br /&gt;
=== Procedure JSON File Document ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''FILEDOCUMENT_MRO_JSON'''&lt;br /&gt;
&lt;br /&gt;
This File Document stores the JSON definition of a Procedure Workpackage.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| LK_PROCEDURE_WORKPACKAGE || {{Guid}} || Link to the associated Procedure Workpackage&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Picture Task File Document ===&lt;br /&gt;
&lt;br /&gt;
Technical object name: '''FILEDOCUMENT_MRO_PICTURE_TASK'''&lt;br /&gt;
&lt;br /&gt;
This is a dedicated File Document linked to a Picture Task. A Picture Task can also use another child-document type, provided that the child document contains a valid file.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;70%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| LK_PICTURE_TASK || {{Guid}} || Link to the associated Picture Task&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[MRO Objects (Client)]]&lt;br /&gt;
* [[MROCLS_MRO_TASKOWNER]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_WORKPACKAGE]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_PROGRESS_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_CHECK_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_MRO_INSPECTION_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_SEQUENTIALTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_GROUPEDTASK]] (Classification)&lt;br /&gt;
* [[MROCLS_PROCEDURE]] (Classification)&lt;br /&gt;
* [[MROCLS_SWITCH_START_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_SWITCH_END_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_CALCULATION_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_PICK_LIST_TASK]] (Classification)&lt;br /&gt;
* [[MROCLS_PICTURE_TASK]] (Classification)&lt;br /&gt;
&lt;br /&gt;
[[Category:Module|MRO (Plugin)]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_Material_Management&amp;diff=30017</id>
		<title>MRO Material Management</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_Material_Management&amp;diff=30017"/>
				<updated>2026-06-23T13:42:35Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== MRO Material Management ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''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 &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;, and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;. Materials are linked to master data and storage locations. Reservations are created manually by users and link materials to tasks.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MRO material management is used to support maintenance work with required spare parts, consumables, tools, or other material items.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Basic concept ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Object&lt;br /&gt;
! Type&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;&lt;br /&gt;
| Master data&lt;br /&gt;
| Defines the catalogue entry for a material, including item number, unit, packaging, manufacturer data, and material type.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Quantity-bearing MRO object&lt;br /&gt;
| 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.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Workflow object&lt;br /&gt;
| Represents a manually created material reservation for a task. It links a material to a task and stores planned and actual quantities.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;&lt;br /&gt;
| Technical base class&lt;br /&gt;
| Provides the common &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property used by both materials and reservations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Related storage object&lt;br /&gt;
| Represents a physical storage location for materials.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Core idea:''' &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt; defines what the material is. &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; represents the material in stock or material context. &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; links a material to a task and reserves a planned quantity for maintenance execution.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MaterialMaster ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt; represents the material master or catalogue entry.&lt;br /&gt;
&lt;br /&gt;
It stores item-level master data that can be referenced by material instances in MRO.&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ITEM_NUMBER&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Item number or material number.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PACKAGING_UNIT&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Packaging unit.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PACKAGING_SIZE&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Packaging size.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ACTIVE&amp;lt;/span&amp;gt;&lt;br /&gt;
| bool&lt;br /&gt;
| Defines whether the material master is active.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UNIT_OF_MEASURE&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Unit of measure.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_TYPE&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| Material type.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MANUFACTURER_COMPANY_NAME&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Manufacturer company name.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MANUFACTURER_PRODUCT_TAG&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Manufacturer product tag or product identifier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Material type ===&lt;br /&gt;
&lt;br /&gt;
Values of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt; are:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SpareParts&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Consumables&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Tools&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Material ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; represents a material instance or stock entry in MRO.&lt;br /&gt;
&lt;br /&gt;
It inherits from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt; and therefore uses the inherited &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property as its material quantity.&lt;br /&gt;
&lt;br /&gt;
A material links to:&lt;br /&gt;
&lt;br /&gt;
* a material master via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
* a storage location via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
! Stored or calculated&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the material master data.&lt;br /&gt;
| Stored link&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the storage location where the material is located.&lt;br /&gt;
| Stored link&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Material quantity. Inherited from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Stored property&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Sum of planned quantities of confirmed reservations for this material.&lt;br /&gt;
| Calculated property&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_STATUS&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialStatus&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| Material status.&lt;br /&gt;
| User/admin managed property&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Material status ===&lt;br /&gt;
&lt;br /&gt;
The material status is stored in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_STATUS&amp;lt;/span&amp;gt; and exposed through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialStatus&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The property is managed by the user or administrator. The system does not change it automatically.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Numeric value&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Undefined&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
| No specific material status is defined.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Inactive&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
| Material is inactive and should not be used for new reservations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Active&amp;lt;/span&amp;gt;&lt;br /&gt;
| 20&lt;br /&gt;
| Material is active and can be used for reservations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Reserved quantity ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt; is calculated at read time.&lt;br /&gt;
&lt;br /&gt;
The calculation uses reservations where:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; points to the current material&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STATUS&amp;lt;/span&amp;gt; is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus.Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The calculated value is the sum of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; of these confirmed reservations.&lt;br /&gt;
&lt;br /&gt;
=== Available quantity ===&lt;br /&gt;
&lt;br /&gt;
The available material quantity is calculated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 8px 10px; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
AvailableQuantity = QUANTITY - RESERVED_QUANTITY&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Delete behavior ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.InternalDeleteAllowed()&amp;lt;/span&amp;gt; prevents deleting a material if it still has quantity or active reservations.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #d33; background-color: #fff5f5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Restriction:''' A &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; cannot be deleted while it has a quantity greater than 0 or active reservations.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reservation ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; represents a manually created material reservation for a task.&lt;br /&gt;
&lt;br /&gt;
It links:&lt;br /&gt;
&lt;br /&gt;
* a task via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
* a material via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It stores the planned reservation quantity in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; and the actually issued or consumed quantity in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
! Important behavior&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Task&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the task for which the material is reserved.&lt;br /&gt;
| Setter is blocked when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the material being reserved.&lt;br /&gt;
| Setter is blocked when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STATUS&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| Reservation status.&lt;br /&gt;
| Changes are validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Planned quantity for the reservation.&lt;br /&gt;
| Setter validates through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Actually issued or consumed quantity. Overrides &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement.QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Setter validates through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Reservation status ===&lt;br /&gt;
&lt;br /&gt;
Values of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus&amp;lt;/span&amp;gt; are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Status&lt;br /&gt;
! Numeric value&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
| Reservation is planned.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
| Reservation is confirmed and contributes to the material's reserved quantity.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
| 20&lt;br /&gt;
| Material has been physically issued.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Cancelled&amp;lt;/span&amp;gt;&lt;br /&gt;
| 30&lt;br /&gt;
| Reservation was cancelled.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Expired&amp;lt;/span&amp;gt;&lt;br /&gt;
| 50&lt;br /&gt;
| Reservation has expired.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Status change rules ===&lt;br /&gt;
&lt;br /&gt;
Status changes are controlled by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The following rules are applied:&lt;br /&gt;
&lt;br /&gt;
* no status change is allowed when the current status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
* changing from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt; back to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; is not allowed&lt;br /&gt;
* other status changes are allowed by this method&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #d33; background-color: #fff5f5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Restriction:''' Once a reservation has status &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;, its status can no longer be changed by the normal status setter logic.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Planned quantity validation ===&lt;br /&gt;
&lt;br /&gt;
The setter of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; validates changes through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A new planned quantity is only allowed if:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt; is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus.Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; is assigned&lt;br /&gt;
* the new quantity is greater than 0&lt;br /&gt;
* the new quantity is lower than or equal to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Quantity rule:''' A planned reservation quantity can only be set while the reservation is still &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; and only if the selected material has enough available quantity.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Actual quantity validation ===&lt;br /&gt;
&lt;br /&gt;
The overridden &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; setter validates changes through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A new actual quantity is only allowed if:&lt;br /&gt;
&lt;br /&gt;
* the new quantity is greater than 0&lt;br /&gt;
* the status is either &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Link editing rules ===&lt;br /&gt;
&lt;br /&gt;
The setters of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; are guarded by reservation status.&lt;br /&gt;
&lt;br /&gt;
The links cannot be changed when the reservation is:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== StorageLocation ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt; is a related object used to represent a physical storage location.&lt;br /&gt;
&lt;br /&gt;
A material can reference a storage location via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Important properties and values ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Values / meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STORAGE_TYPE&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageType&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Floor&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Shelf&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Rack&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Bin&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Pallet&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Container&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ACCESS_TYPE&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AccessType&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Manual&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Forklift&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Crane&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Automated&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OCCUPANCY_STATUS&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OccupancyStatus&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Empty&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Partial&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Full&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reserved&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Blocked&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OutOfService&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STORAGE_LABEL&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Label of the storage location.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEVEL&amp;lt;/span&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| Level of the storage location.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;POSITION&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Position identifier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GoodsMovement ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt; is a technical base class.&lt;br /&gt;
&lt;br /&gt;
It provides the common &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property for material-related objects such as &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Quantity concepts ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Quantity&lt;br /&gt;
! Property / method&lt;br /&gt;
! Object&lt;br /&gt;
! Stored or calculated&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| Material quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Inherited from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Reserved quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Calculated&lt;br /&gt;
| Sum of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; of confirmed reservations for the material.&lt;br /&gt;
|-&lt;br /&gt;
| Available quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Calculated&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; minus &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Actually issued or consumed quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Overrides &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement.QUANTITY&amp;lt;/span&amp;gt; and is validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Reservation workflow ==&lt;br /&gt;
&lt;br /&gt;
=== Creating or editing a reservation ===&lt;br /&gt;
&lt;br /&gt;
Reservations are created manually by the user.&lt;br /&gt;
&lt;br /&gt;
A reservation links a material to a task.&lt;br /&gt;
&lt;br /&gt;
For a reservation to define its planned quantity correctly:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; must be set.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; must point to the task requiring the material.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt; must still be &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must not exceed &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Confirmed reservations ===&lt;br /&gt;
&lt;br /&gt;
When a reservation is confirmed, it contributes to the material's reserved quantity.&lt;br /&gt;
&lt;br /&gt;
This affects the available quantity of the material.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 8px 10px; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
AvailableQuantity = QUANTITY - sum(QTY_PLANNED of confirmed reservations)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Finishing a task ===&lt;br /&gt;
&lt;br /&gt;
When a task is finished, the task logic calls &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CloseReservations()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Workflow effect:''' Finishing a task closes its reservations. Confirmed reservations become &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;; other active reservations become &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Cancelled&amp;lt;/span&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Usage in tasks ==&lt;br /&gt;
&lt;br /&gt;
Reservations are the central link between material handling and task execution.&lt;br /&gt;
&lt;br /&gt;
A reservation connects:&lt;br /&gt;
&lt;br /&gt;
* the required material through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
* the task through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
* the planned quantity through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
* the actually issued or consumed quantity through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
* the reservation state through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This means that material usage is tracked at task level.&lt;br /&gt;
&lt;br /&gt;
== Example workflow ==&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Material master exists ===&lt;br /&gt;
&lt;br /&gt;
A spare part is defined as a &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ITEM_NUMBER&amp;lt;/span&amp;gt;&lt;br /&gt;
| OF-10045&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UNIT_OF_MEASURE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Piece&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SpareParts&amp;lt;/span&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Material exists in a storage location ===&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; object references the material master and a storage location.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
| Oil Filter Type A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
| Storage Shelf A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
| 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Reservation is created for a task ===&lt;br /&gt;
&lt;br /&gt;
A user manually creates a &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; and links the material to the task.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
| Replace oil filter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
| Oil Filter Type A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 4: Reservation is confirmed ===&lt;br /&gt;
&lt;br /&gt;
The reservation status is changed to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
After confirmation, the material's reserved quantity includes the reservation's planned quantity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Quantity&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
| 9&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 5: Actual quantity is entered ===&lt;br /&gt;
&lt;br /&gt;
The actually issued or consumed quantity is stored in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation.QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation.QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 6: Task is finished ===&lt;br /&gt;
&lt;br /&gt;
When the task is finished, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CloseReservations()&amp;lt;/span&amp;gt; is called.&lt;br /&gt;
&lt;br /&gt;
The confirmed reservation is changed to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Validation and business rules ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Area&lt;br /&gt;
! Rule&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; can only be changed while the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must not exceed &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Actual issued or consumed quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
|-&lt;br /&gt;
| Actual issued or consumed quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; can only be changed while the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Reservation status&lt;br /&gt;
| Status cannot be changed once the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Reservation status&lt;br /&gt;
| A reservation cannot be changed from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt; back to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Reservation links&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; cannot be changed when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Material deletion&lt;br /&gt;
| Material cannot be deleted while &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; is greater than 0.&lt;br /&gt;
|-&lt;br /&gt;
| Material deletion&lt;br /&gt;
| Material cannot be deleted while active reservations exist.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[MRO (Plugin)]]&lt;br /&gt;
* [[MRO_Objects_(Client)]]&lt;br /&gt;
* [[MRO_Implemented_Objects]]&lt;br /&gt;
* [[MROMaintenancePlans]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_Material_Management&amp;diff=29997</id>
		<title>MRO Material Management</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_Material_Management&amp;diff=29997"/>
				<updated>2026-06-23T09:27:08Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: /* Validation and business rules */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UnderConstructionStart}}&lt;br /&gt;
== MRO Material Management ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''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 &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;, and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;. Materials are linked to master data and storage locations. Reservations are created manually by users and link materials to tasks.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MRO material management is used to support maintenance work with required spare parts, consumables, tools, or other material items.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Basic concept ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Object&lt;br /&gt;
! Type&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;&lt;br /&gt;
| Master data&lt;br /&gt;
| Defines the catalogue entry for a material, including item number, unit, packaging, manufacturer data, and material type.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Quantity-bearing MRO object&lt;br /&gt;
| 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.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Workflow object&lt;br /&gt;
| Represents a manually created material reservation for a task. It links a material to a task and stores planned and actual quantities.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;&lt;br /&gt;
| Technical base class&lt;br /&gt;
| Provides the common &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property used by both materials and reservations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Related storage object&lt;br /&gt;
| Represents a physical storage location for materials.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Core idea:''' &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt; defines what the material is. &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; represents the material in stock or material context. &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; links a material to a task and reserves a planned quantity for maintenance execution.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MaterialMaster ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt; represents the material master or catalogue entry.&lt;br /&gt;
&lt;br /&gt;
It stores item-level master data that can be referenced by material instances in MRO.&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ITEM_NUMBER&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Item number or material number.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PACKAGING_UNIT&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Packaging unit.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PACKAGING_SIZE&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Packaging size.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ACTIVE&amp;lt;/span&amp;gt;&lt;br /&gt;
| bool&lt;br /&gt;
| Defines whether the material master is active.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UNIT_OF_MEASURE&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Unit of measure.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_TYPE&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| Material type.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MANUFACTURER_COMPANY_NAME&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Manufacturer company name.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MANUFACTURER_PRODUCT_TAG&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Manufacturer product tag or product identifier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Material type ===&lt;br /&gt;
&lt;br /&gt;
Values of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt; are:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SpareParts&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Consumables&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Tools&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Material ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; represents a material instance or stock entry in MRO.&lt;br /&gt;
&lt;br /&gt;
It inherits from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt; and therefore uses the inherited &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property as its material quantity.&lt;br /&gt;
&lt;br /&gt;
A material links to:&lt;br /&gt;
&lt;br /&gt;
* a material master via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
* a storage location via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
! Stored or calculated&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the material master data.&lt;br /&gt;
| Stored link&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the storage location where the material is located.&lt;br /&gt;
| Stored link&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Material quantity. Inherited from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Stored property&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Sum of planned quantities of confirmed reservations for this material.&lt;br /&gt;
| Calculated property&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_STATUS&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialStatus&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| Material status.&lt;br /&gt;
| User/admin managed property&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Material status ===&lt;br /&gt;
&lt;br /&gt;
The material status is stored in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_STATUS&amp;lt;/span&amp;gt; and exposed through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialStatus&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The property is managed by the user or administrator. The system does not change it automatically.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Numeric value&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Undefined&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
| No specific material status is defined.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Inactive&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
| Material is inactive and should not be used for new reservations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Active&amp;lt;/span&amp;gt;&lt;br /&gt;
| 20&lt;br /&gt;
| Material is active and can be used for reservations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Reserved quantity ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt; is calculated at read time.&lt;br /&gt;
&lt;br /&gt;
The calculation uses reservations where:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; points to the current material&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STATUS&amp;lt;/span&amp;gt; is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus.Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The calculated value is the sum of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; of these confirmed reservations.&lt;br /&gt;
&lt;br /&gt;
=== Available quantity ===&lt;br /&gt;
&lt;br /&gt;
The available material quantity is calculated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 8px 10px; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
AvailableQuantity = QUANTITY - RESERVED_QUANTITY&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Delete behavior ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.InternalDeleteAllowed()&amp;lt;/span&amp;gt; prevents deleting a material if it still has quantity or active reservations.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #d33; background-color: #fff5f5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Restriction:''' A &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; cannot be deleted while it has a quantity greater than 0 or active reservations.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reservation ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; represents a manually created material reservation for a task.&lt;br /&gt;
&lt;br /&gt;
It links:&lt;br /&gt;
&lt;br /&gt;
* a task via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
* a material via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It stores the planned reservation quantity in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; and the actually issued or consumed quantity in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
! Important behavior&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Task&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the task for which the material is reserved.&lt;br /&gt;
| Setter is blocked when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the material being reserved.&lt;br /&gt;
| Setter is blocked when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STATUS&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| Reservation status.&lt;br /&gt;
| Changes are validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Planned quantity for the reservation.&lt;br /&gt;
| Setter validates through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Actually issued or consumed quantity. Overrides &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement.QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Setter validates through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Reservation status ===&lt;br /&gt;
&lt;br /&gt;
Values of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus&amp;lt;/span&amp;gt; are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Status&lt;br /&gt;
! Numeric value&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
| Reservation is planned.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
| Reservation is confirmed and contributes to the material's reserved quantity.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
| 20&lt;br /&gt;
| Material has been physically issued.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Cancelled&amp;lt;/span&amp;gt;&lt;br /&gt;
| 30&lt;br /&gt;
| Reservation was cancelled.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Expired&amp;lt;/span&amp;gt;&lt;br /&gt;
| 50&lt;br /&gt;
| Reservation has expired.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Status change rules ===&lt;br /&gt;
&lt;br /&gt;
Status changes are controlled by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The following rules are applied:&lt;br /&gt;
&lt;br /&gt;
* no status change is allowed when the current status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
* changing from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt; back to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; is not allowed&lt;br /&gt;
* other status changes are allowed by this method&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #d33; background-color: #fff5f5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Restriction:''' Once a reservation has status &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;, its status can no longer be changed by the normal status setter logic.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Planned quantity validation ===&lt;br /&gt;
&lt;br /&gt;
The setter of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; validates changes through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A new planned quantity is only allowed if:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt; is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus.Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; is assigned&lt;br /&gt;
* the new quantity is greater than 0&lt;br /&gt;
* the new quantity is lower than or equal to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Quantity rule:''' A planned reservation quantity can only be set while the reservation is still &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; and only if the selected material has enough available quantity.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Actual quantity validation ===&lt;br /&gt;
&lt;br /&gt;
The overridden &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; setter validates changes through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A new actual quantity is only allowed if:&lt;br /&gt;
&lt;br /&gt;
* the new quantity is greater than 0&lt;br /&gt;
* the status is either &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Link editing rules ===&lt;br /&gt;
&lt;br /&gt;
The setters of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; are guarded by reservation status.&lt;br /&gt;
&lt;br /&gt;
The links cannot be changed when the reservation is:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== StorageLocation ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt; is a related object used to represent a physical storage location.&lt;br /&gt;
&lt;br /&gt;
A material can reference a storage location via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Important properties and values ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Values / meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STORAGE_TYPE&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageType&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Floor&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Shelf&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Rack&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Bin&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Pallet&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Container&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ACCESS_TYPE&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AccessType&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Manual&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Forklift&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Crane&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Automated&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OCCUPANCY_STATUS&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OccupancyStatus&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Empty&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Partial&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Full&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reserved&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Blocked&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OutOfService&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STORAGE_LABEL&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Label of the storage location.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEVEL&amp;lt;/span&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| Level of the storage location.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;POSITION&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Position identifier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GoodsMovement ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt; is a technical base class.&lt;br /&gt;
&lt;br /&gt;
It provides the common &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property for material-related objects such as &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Quantity concepts ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Quantity&lt;br /&gt;
! Property / method&lt;br /&gt;
! Object&lt;br /&gt;
! Stored or calculated&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| Material quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Inherited from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Reserved quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Calculated&lt;br /&gt;
| Sum of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; of confirmed reservations for the material.&lt;br /&gt;
|-&lt;br /&gt;
| Available quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Calculated&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; minus &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Actually issued or consumed quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Overrides &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement.QUANTITY&amp;lt;/span&amp;gt; and is validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Reservation workflow ==&lt;br /&gt;
&lt;br /&gt;
=== Creating or editing a reservation ===&lt;br /&gt;
&lt;br /&gt;
Reservations are created manually by the user.&lt;br /&gt;
&lt;br /&gt;
A reservation links a material to a task.&lt;br /&gt;
&lt;br /&gt;
For a reservation to define its planned quantity correctly:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; must be set.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; must point to the task requiring the material.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt; must still be &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must not exceed &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Confirmed reservations ===&lt;br /&gt;
&lt;br /&gt;
When a reservation is confirmed, it contributes to the material's reserved quantity.&lt;br /&gt;
&lt;br /&gt;
This affects the available quantity of the material.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 8px 10px; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
AvailableQuantity = QUANTITY - sum(QTY_PLANNED of confirmed reservations)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Finishing a task ===&lt;br /&gt;
&lt;br /&gt;
When a task is finished, the task logic calls &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CloseReservations()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Workflow effect:''' Finishing a task closes its reservations. Confirmed reservations become &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;; other active reservations become &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Cancelled&amp;lt;/span&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Usage in tasks ==&lt;br /&gt;
&lt;br /&gt;
Reservations are the central link between material handling and task execution.&lt;br /&gt;
&lt;br /&gt;
A reservation connects:&lt;br /&gt;
&lt;br /&gt;
* the required material through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
* the task through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
* the planned quantity through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
* the actually issued or consumed quantity through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
* the reservation state through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This means that material usage is tracked at task level.&lt;br /&gt;
&lt;br /&gt;
== Example workflow ==&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Material master exists ===&lt;br /&gt;
&lt;br /&gt;
A spare part is defined as a &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ITEM_NUMBER&amp;lt;/span&amp;gt;&lt;br /&gt;
| OF-10045&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UNIT_OF_MEASURE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Piece&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SpareParts&amp;lt;/span&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Material exists in a storage location ===&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; object references the material master and a storage location.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
| Oil Filter Type A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
| Storage Shelf A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
| 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Reservation is created for a task ===&lt;br /&gt;
&lt;br /&gt;
A user manually creates a &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; and links the material to the task.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
| Replace oil filter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
| Oil Filter Type A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 4: Reservation is confirmed ===&lt;br /&gt;
&lt;br /&gt;
The reservation status is changed to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
After confirmation, the material's reserved quantity includes the reservation's planned quantity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Quantity&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
| 9&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 5: Actual quantity is entered ===&lt;br /&gt;
&lt;br /&gt;
The actually issued or consumed quantity is stored in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation.QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation.QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 6: Task is finished ===&lt;br /&gt;
&lt;br /&gt;
When the task is finished, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CloseReservations()&amp;lt;/span&amp;gt; is called.&lt;br /&gt;
&lt;br /&gt;
The confirmed reservation is changed to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Validation and business rules ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Area&lt;br /&gt;
! Rule&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; can only be changed while the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must not exceed &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Actual issued or consumed quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
|-&lt;br /&gt;
| Actual issued or consumed quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; can only be changed while the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Reservation status&lt;br /&gt;
| Status cannot be changed once the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Reservation status&lt;br /&gt;
| A reservation cannot be changed from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt; back to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Reservation links&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; cannot be changed when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Material deletion&lt;br /&gt;
| Material cannot be deleted while &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; is greater than 0.&lt;br /&gt;
|-&lt;br /&gt;
| Material deletion&lt;br /&gt;
| Material cannot be deleted while active reservations exist.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[MRO (Plugin)]]&lt;br /&gt;
* [[MRO_Objects_(Client)]]&lt;br /&gt;
* [[MRO_Implemented_Objects]]&lt;br /&gt;
* [[MROMaintenancePlans]]&lt;br /&gt;
{{UnderConstructionEnd}}&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_Material_Management&amp;diff=29996</id>
		<title>MRO Material Management</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_Material_Management&amp;diff=29996"/>
				<updated>2026-06-23T09:19:18Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: /* Finishing a task */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UnderConstructionStart}}&lt;br /&gt;
== MRO Material Management ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''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 &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;, and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;. Materials are linked to master data and storage locations. Reservations are created manually by users and link materials to tasks.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MRO material management is used to support maintenance work with required spare parts, consumables, tools, or other material items.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Basic concept ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Object&lt;br /&gt;
! Type&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;&lt;br /&gt;
| Master data&lt;br /&gt;
| Defines the catalogue entry for a material, including item number, unit, packaging, manufacturer data, and material type.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Quantity-bearing MRO object&lt;br /&gt;
| 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.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Workflow object&lt;br /&gt;
| Represents a manually created material reservation for a task. It links a material to a task and stores planned and actual quantities.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;&lt;br /&gt;
| Technical base class&lt;br /&gt;
| Provides the common &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property used by both materials and reservations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Related storage object&lt;br /&gt;
| Represents a physical storage location for materials.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Core idea:''' &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt; defines what the material is. &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; represents the material in stock or material context. &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; links a material to a task and reserves a planned quantity for maintenance execution.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MaterialMaster ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt; represents the material master or catalogue entry.&lt;br /&gt;
&lt;br /&gt;
It stores item-level master data that can be referenced by material instances in MRO.&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ITEM_NUMBER&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Item number or material number.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PACKAGING_UNIT&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Packaging unit.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PACKAGING_SIZE&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Packaging size.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ACTIVE&amp;lt;/span&amp;gt;&lt;br /&gt;
| bool&lt;br /&gt;
| Defines whether the material master is active.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UNIT_OF_MEASURE&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Unit of measure.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_TYPE&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| Material type.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MANUFACTURER_COMPANY_NAME&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Manufacturer company name.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MANUFACTURER_PRODUCT_TAG&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Manufacturer product tag or product identifier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Material type ===&lt;br /&gt;
&lt;br /&gt;
Values of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt; are:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SpareParts&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Consumables&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Tools&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Material ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; represents a material instance or stock entry in MRO.&lt;br /&gt;
&lt;br /&gt;
It inherits from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt; and therefore uses the inherited &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property as its material quantity.&lt;br /&gt;
&lt;br /&gt;
A material links to:&lt;br /&gt;
&lt;br /&gt;
* a material master via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
* a storage location via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
! Stored or calculated&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the material master data.&lt;br /&gt;
| Stored link&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the storage location where the material is located.&lt;br /&gt;
| Stored link&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Material quantity. Inherited from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Stored property&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Sum of planned quantities of confirmed reservations for this material.&lt;br /&gt;
| Calculated property&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_STATUS&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialStatus&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| Material status.&lt;br /&gt;
| User/admin managed property&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Material status ===&lt;br /&gt;
&lt;br /&gt;
The material status is stored in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_STATUS&amp;lt;/span&amp;gt; and exposed through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialStatus&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The property is managed by the user or administrator. The system does not change it automatically.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Numeric value&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Undefined&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
| No specific material status is defined.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Inactive&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
| Material is inactive and should not be used for new reservations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Active&amp;lt;/span&amp;gt;&lt;br /&gt;
| 20&lt;br /&gt;
| Material is active and can be used for reservations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Reserved quantity ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt; is calculated at read time.&lt;br /&gt;
&lt;br /&gt;
The calculation uses reservations where:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; points to the current material&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STATUS&amp;lt;/span&amp;gt; is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus.Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The calculated value is the sum of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; of these confirmed reservations.&lt;br /&gt;
&lt;br /&gt;
=== Available quantity ===&lt;br /&gt;
&lt;br /&gt;
The available material quantity is calculated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 8px 10px; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
AvailableQuantity = QUANTITY - RESERVED_QUANTITY&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Delete behavior ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.InternalDeleteAllowed()&amp;lt;/span&amp;gt; prevents deleting a material if it still has quantity or active reservations.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #d33; background-color: #fff5f5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Restriction:''' A &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; cannot be deleted while it has a quantity greater than 0 or active reservations.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reservation ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; represents a manually created material reservation for a task.&lt;br /&gt;
&lt;br /&gt;
It links:&lt;br /&gt;
&lt;br /&gt;
* a task via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
* a material via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It stores the planned reservation quantity in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; and the actually issued or consumed quantity in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
! Important behavior&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Task&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the task for which the material is reserved.&lt;br /&gt;
| Setter is blocked when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the material being reserved.&lt;br /&gt;
| Setter is blocked when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STATUS&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| Reservation status.&lt;br /&gt;
| Changes are validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Planned quantity for the reservation.&lt;br /&gt;
| Setter validates through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Actually issued or consumed quantity. Overrides &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement.QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Setter validates through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Reservation status ===&lt;br /&gt;
&lt;br /&gt;
Values of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus&amp;lt;/span&amp;gt; are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Status&lt;br /&gt;
! Numeric value&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
| Reservation is planned.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
| Reservation is confirmed and contributes to the material's reserved quantity.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
| 20&lt;br /&gt;
| Material has been physically issued.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Cancelled&amp;lt;/span&amp;gt;&lt;br /&gt;
| 30&lt;br /&gt;
| Reservation was cancelled.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Expired&amp;lt;/span&amp;gt;&lt;br /&gt;
| 50&lt;br /&gt;
| Reservation has expired.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Status change rules ===&lt;br /&gt;
&lt;br /&gt;
Status changes are controlled by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The following rules are applied:&lt;br /&gt;
&lt;br /&gt;
* no status change is allowed when the current status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
* changing from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt; back to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; is not allowed&lt;br /&gt;
* other status changes are allowed by this method&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #d33; background-color: #fff5f5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Restriction:''' Once a reservation has status &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;, its status can no longer be changed by the normal status setter logic.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Planned quantity validation ===&lt;br /&gt;
&lt;br /&gt;
The setter of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; validates changes through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A new planned quantity is only allowed if:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt; is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus.Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; is assigned&lt;br /&gt;
* the new quantity is greater than 0&lt;br /&gt;
* the new quantity is lower than or equal to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Quantity rule:''' A planned reservation quantity can only be set while the reservation is still &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; and only if the selected material has enough available quantity.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Actual quantity validation ===&lt;br /&gt;
&lt;br /&gt;
The overridden &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; setter validates changes through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A new actual quantity is only allowed if:&lt;br /&gt;
&lt;br /&gt;
* the new quantity is greater than 0&lt;br /&gt;
* the status is either &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Link editing rules ===&lt;br /&gt;
&lt;br /&gt;
The setters of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; are guarded by reservation status.&lt;br /&gt;
&lt;br /&gt;
The links cannot be changed when the reservation is:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== StorageLocation ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt; is a related object used to represent a physical storage location.&lt;br /&gt;
&lt;br /&gt;
A material can reference a storage location via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Important properties and values ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Values / meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STORAGE_TYPE&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageType&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Floor&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Shelf&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Rack&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Bin&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Pallet&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Container&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ACCESS_TYPE&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AccessType&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Manual&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Forklift&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Crane&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Automated&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OCCUPANCY_STATUS&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OccupancyStatus&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Empty&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Partial&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Full&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reserved&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Blocked&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OutOfService&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STORAGE_LABEL&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Label of the storage location.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEVEL&amp;lt;/span&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| Level of the storage location.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;POSITION&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Position identifier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GoodsMovement ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt; is a technical base class.&lt;br /&gt;
&lt;br /&gt;
It provides the common &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property for material-related objects such as &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Quantity concepts ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Quantity&lt;br /&gt;
! Property / method&lt;br /&gt;
! Object&lt;br /&gt;
! Stored or calculated&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| Material quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Inherited from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Reserved quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Calculated&lt;br /&gt;
| Sum of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; of confirmed reservations for the material.&lt;br /&gt;
|-&lt;br /&gt;
| Available quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Calculated&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; minus &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Actually issued or consumed quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Overrides &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement.QUANTITY&amp;lt;/span&amp;gt; and is validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Reservation workflow ==&lt;br /&gt;
&lt;br /&gt;
=== Creating or editing a reservation ===&lt;br /&gt;
&lt;br /&gt;
Reservations are created manually by the user.&lt;br /&gt;
&lt;br /&gt;
A reservation links a material to a task.&lt;br /&gt;
&lt;br /&gt;
For a reservation to define its planned quantity correctly:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; must be set.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; must point to the task requiring the material.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt; must still be &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must not exceed &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Confirmed reservations ===&lt;br /&gt;
&lt;br /&gt;
When a reservation is confirmed, it contributes to the material's reserved quantity.&lt;br /&gt;
&lt;br /&gt;
This affects the available quantity of the material.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 8px 10px; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
AvailableQuantity = QUANTITY - sum(QTY_PLANNED of confirmed reservations)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Finishing a task ===&lt;br /&gt;
&lt;br /&gt;
When a task is finished, the task logic calls &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CloseReservations()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Workflow effect:''' Finishing a task closes its reservations. Confirmed reservations become &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;; other active reservations become &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Cancelled&amp;lt;/span&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Usage in tasks ==&lt;br /&gt;
&lt;br /&gt;
Reservations are the central link between material handling and task execution.&lt;br /&gt;
&lt;br /&gt;
A reservation connects:&lt;br /&gt;
&lt;br /&gt;
* the required material through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
* the task through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
* the planned quantity through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
* the actually issued or consumed quantity through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
* the reservation state through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This means that material usage is tracked at task level.&lt;br /&gt;
&lt;br /&gt;
== Example workflow ==&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Material master exists ===&lt;br /&gt;
&lt;br /&gt;
A spare part is defined as a &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ITEM_NUMBER&amp;lt;/span&amp;gt;&lt;br /&gt;
| OF-10045&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UNIT_OF_MEASURE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Piece&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SpareParts&amp;lt;/span&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Material exists in a storage location ===&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; object references the material master and a storage location.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
| Oil Filter Type A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
| Storage Shelf A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
| 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Reservation is created for a task ===&lt;br /&gt;
&lt;br /&gt;
A user manually creates a &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; and links the material to the task.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
| Replace oil filter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
| Oil Filter Type A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 4: Reservation is confirmed ===&lt;br /&gt;
&lt;br /&gt;
The reservation status is changed to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
After confirmation, the material's reserved quantity includes the reservation's planned quantity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Quantity&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
| 9&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 5: Actual quantity is entered ===&lt;br /&gt;
&lt;br /&gt;
The actually issued or consumed quantity is stored in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation.QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation.QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 6: Task is finished ===&lt;br /&gt;
&lt;br /&gt;
When the task is finished, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CloseReservations()&amp;lt;/span&amp;gt; is called.&lt;br /&gt;
&lt;br /&gt;
The confirmed reservation is changed to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Validation and business rules ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Area&lt;br /&gt;
! Rule&lt;br /&gt;
! Implemented by&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; can only be changed while the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must not exceed &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Actual issued or consumed quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Actual issued or consumed quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; can only be changed while the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Reservation status&lt;br /&gt;
| Status cannot be changed once the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Reservation status&lt;br /&gt;
| A reservation cannot be changed from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt; back to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Reservation links&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; cannot be changed when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Property setters&lt;br /&gt;
|-&lt;br /&gt;
| Material deletion&lt;br /&gt;
| Material cannot be deleted while &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; is greater than 0.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;InternalDeleteAllowed()&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| Material deletion&lt;br /&gt;
| Material cannot be deleted while active reservations exist.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;InternalDeleteAllowed()&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;HasActiveReservation()&amp;lt;/span&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[MRO (Plugin)]]&lt;br /&gt;
* [[MRO_Objects_(Client)]]&lt;br /&gt;
* [[MRO_Implemented_Objects]]&lt;br /&gt;
* [[MROMaintenancePlans]]&lt;br /&gt;
{{UnderConstructionEnd}}&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_Material_Management&amp;diff=29995</id>
		<title>MRO Material Management</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_Material_Management&amp;diff=29995"/>
				<updated>2026-06-23T09:17:06Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: /* Delete behavior */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UnderConstructionStart}}&lt;br /&gt;
== MRO Material Management ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''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 &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;, and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;. Materials are linked to master data and storage locations. Reservations are created manually by users and link materials to tasks.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MRO material management is used to support maintenance work with required spare parts, consumables, tools, or other material items.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Basic concept ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Object&lt;br /&gt;
! Type&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;&lt;br /&gt;
| Master data&lt;br /&gt;
| Defines the catalogue entry for a material, including item number, unit, packaging, manufacturer data, and material type.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Quantity-bearing MRO object&lt;br /&gt;
| 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.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Workflow object&lt;br /&gt;
| Represents a manually created material reservation for a task. It links a material to a task and stores planned and actual quantities.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;&lt;br /&gt;
| Technical base class&lt;br /&gt;
| Provides the common &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property used by both materials and reservations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Related storage object&lt;br /&gt;
| Represents a physical storage location for materials.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Core idea:''' &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt; defines what the material is. &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; represents the material in stock or material context. &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; links a material to a task and reserves a planned quantity for maintenance execution.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MaterialMaster ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt; represents the material master or catalogue entry.&lt;br /&gt;
&lt;br /&gt;
It stores item-level master data that can be referenced by material instances in MRO.&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ITEM_NUMBER&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Item number or material number.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PACKAGING_UNIT&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Packaging unit.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PACKAGING_SIZE&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Packaging size.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ACTIVE&amp;lt;/span&amp;gt;&lt;br /&gt;
| bool&lt;br /&gt;
| Defines whether the material master is active.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UNIT_OF_MEASURE&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Unit of measure.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_TYPE&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| Material type.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MANUFACTURER_COMPANY_NAME&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Manufacturer company name.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MANUFACTURER_PRODUCT_TAG&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Manufacturer product tag or product identifier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Material type ===&lt;br /&gt;
&lt;br /&gt;
Values of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt; are:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SpareParts&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Consumables&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Tools&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Material ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; represents a material instance or stock entry in MRO.&lt;br /&gt;
&lt;br /&gt;
It inherits from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt; and therefore uses the inherited &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property as its material quantity.&lt;br /&gt;
&lt;br /&gt;
A material links to:&lt;br /&gt;
&lt;br /&gt;
* a material master via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
* a storage location via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
! Stored or calculated&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the material master data.&lt;br /&gt;
| Stored link&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the storage location where the material is located.&lt;br /&gt;
| Stored link&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Material quantity. Inherited from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Stored property&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Sum of planned quantities of confirmed reservations for this material.&lt;br /&gt;
| Calculated property&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_STATUS&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialStatus&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| Material status.&lt;br /&gt;
| User/admin managed property&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Material status ===&lt;br /&gt;
&lt;br /&gt;
The material status is stored in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_STATUS&amp;lt;/span&amp;gt; and exposed through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialStatus&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The property is managed by the user or administrator. The system does not change it automatically.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Numeric value&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Undefined&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
| No specific material status is defined.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Inactive&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
| Material is inactive and should not be used for new reservations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Active&amp;lt;/span&amp;gt;&lt;br /&gt;
| 20&lt;br /&gt;
| Material is active and can be used for reservations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Reserved quantity ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt; is calculated at read time.&lt;br /&gt;
&lt;br /&gt;
The calculation uses reservations where:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; points to the current material&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STATUS&amp;lt;/span&amp;gt; is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus.Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The calculated value is the sum of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; of these confirmed reservations.&lt;br /&gt;
&lt;br /&gt;
=== Available quantity ===&lt;br /&gt;
&lt;br /&gt;
The available material quantity is calculated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 8px 10px; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
AvailableQuantity = QUANTITY - RESERVED_QUANTITY&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Delete behavior ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.InternalDeleteAllowed()&amp;lt;/span&amp;gt; prevents deleting a material if it still has quantity or active reservations.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #d33; background-color: #fff5f5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Restriction:''' A &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; cannot be deleted while it has a quantity greater than 0 or active reservations.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reservation ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; represents a manually created material reservation for a task.&lt;br /&gt;
&lt;br /&gt;
It links:&lt;br /&gt;
&lt;br /&gt;
* a task via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
* a material via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It stores the planned reservation quantity in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; and the actually issued or consumed quantity in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
! Important behavior&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Task&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the task for which the material is reserved.&lt;br /&gt;
| Setter is blocked when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the material being reserved.&lt;br /&gt;
| Setter is blocked when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STATUS&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| Reservation status.&lt;br /&gt;
| Changes are validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Planned quantity for the reservation.&lt;br /&gt;
| Setter validates through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Actually issued or consumed quantity. Overrides &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement.QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Setter validates through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Reservation status ===&lt;br /&gt;
&lt;br /&gt;
Values of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus&amp;lt;/span&amp;gt; are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Status&lt;br /&gt;
! Numeric value&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
| Reservation is planned.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
| Reservation is confirmed and contributes to the material's reserved quantity.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
| 20&lt;br /&gt;
| Material has been physically issued.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Cancelled&amp;lt;/span&amp;gt;&lt;br /&gt;
| 30&lt;br /&gt;
| Reservation was cancelled.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Expired&amp;lt;/span&amp;gt;&lt;br /&gt;
| 50&lt;br /&gt;
| Reservation has expired.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Status change rules ===&lt;br /&gt;
&lt;br /&gt;
Status changes are controlled by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The following rules are applied:&lt;br /&gt;
&lt;br /&gt;
* no status change is allowed when the current status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
* changing from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt; back to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; is not allowed&lt;br /&gt;
* other status changes are allowed by this method&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #d33; background-color: #fff5f5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Restriction:''' Once a reservation has status &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;, its status can no longer be changed by the normal status setter logic.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Planned quantity validation ===&lt;br /&gt;
&lt;br /&gt;
The setter of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; validates changes through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A new planned quantity is only allowed if:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt; is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus.Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; is assigned&lt;br /&gt;
* the new quantity is greater than 0&lt;br /&gt;
* the new quantity is lower than or equal to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Quantity rule:''' A planned reservation quantity can only be set while the reservation is still &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; and only if the selected material has enough available quantity.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Actual quantity validation ===&lt;br /&gt;
&lt;br /&gt;
The overridden &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; setter validates changes through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A new actual quantity is only allowed if:&lt;br /&gt;
&lt;br /&gt;
* the new quantity is greater than 0&lt;br /&gt;
* the status is either &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Link editing rules ===&lt;br /&gt;
&lt;br /&gt;
The setters of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; are guarded by reservation status.&lt;br /&gt;
&lt;br /&gt;
The links cannot be changed when the reservation is:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== StorageLocation ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt; is a related object used to represent a physical storage location.&lt;br /&gt;
&lt;br /&gt;
A material can reference a storage location via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Important properties and values ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Values / meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STORAGE_TYPE&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageType&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Floor&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Shelf&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Rack&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Bin&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Pallet&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Container&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ACCESS_TYPE&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AccessType&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Manual&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Forklift&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Crane&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Automated&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OCCUPANCY_STATUS&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OccupancyStatus&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Empty&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Partial&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Full&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reserved&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Blocked&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OutOfService&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STORAGE_LABEL&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Label of the storage location.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEVEL&amp;lt;/span&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| Level of the storage location.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;POSITION&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Position identifier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GoodsMovement ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt; is a technical base class.&lt;br /&gt;
&lt;br /&gt;
It provides the common &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property for material-related objects such as &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Quantity concepts ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Quantity&lt;br /&gt;
! Property / method&lt;br /&gt;
! Object&lt;br /&gt;
! Stored or calculated&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| Material quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Inherited from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Reserved quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Calculated&lt;br /&gt;
| Sum of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; of confirmed reservations for the material.&lt;br /&gt;
|-&lt;br /&gt;
| Available quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Calculated&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; minus &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Actually issued or consumed quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Overrides &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement.QUANTITY&amp;lt;/span&amp;gt; and is validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Reservation workflow ==&lt;br /&gt;
&lt;br /&gt;
=== Creating or editing a reservation ===&lt;br /&gt;
&lt;br /&gt;
Reservations are created manually by the user.&lt;br /&gt;
&lt;br /&gt;
A reservation links a material to a task.&lt;br /&gt;
&lt;br /&gt;
For a reservation to define its planned quantity correctly:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; must be set.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; must point to the task requiring the material.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt; must still be &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must not exceed &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Confirmed reservations ===&lt;br /&gt;
&lt;br /&gt;
When a reservation is confirmed, it contributes to the material's reserved quantity.&lt;br /&gt;
&lt;br /&gt;
This affects the available quantity of the material.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 8px 10px; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
AvailableQuantity = QUANTITY - sum(QTY_PLANNED of confirmed reservations)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Finishing a task ===&lt;br /&gt;
&lt;br /&gt;
When a task is finished, the task logic calls &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CloseReservations()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The method processes active reservations for the task:&lt;br /&gt;
&lt;br /&gt;
* if a reservation has status &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;, it is set to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
* otherwise, it is set to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Cancelled&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Workflow effect:''' Finishing a task closes its reservations. Confirmed reservations become &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;; other active reservations become &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Cancelled&amp;lt;/span&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usage in tasks ==&lt;br /&gt;
&lt;br /&gt;
Reservations are the central link between material handling and task execution.&lt;br /&gt;
&lt;br /&gt;
A reservation connects:&lt;br /&gt;
&lt;br /&gt;
* the required material through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
* the task through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
* the planned quantity through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
* the actually issued or consumed quantity through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
* the reservation state through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This means that material usage is tracked at task level.&lt;br /&gt;
&lt;br /&gt;
== Example workflow ==&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Material master exists ===&lt;br /&gt;
&lt;br /&gt;
A spare part is defined as a &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ITEM_NUMBER&amp;lt;/span&amp;gt;&lt;br /&gt;
| OF-10045&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UNIT_OF_MEASURE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Piece&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SpareParts&amp;lt;/span&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Material exists in a storage location ===&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; object references the material master and a storage location.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
| Oil Filter Type A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
| Storage Shelf A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
| 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Reservation is created for a task ===&lt;br /&gt;
&lt;br /&gt;
A user manually creates a &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; and links the material to the task.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
| Replace oil filter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
| Oil Filter Type A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 4: Reservation is confirmed ===&lt;br /&gt;
&lt;br /&gt;
The reservation status is changed to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
After confirmation, the material's reserved quantity includes the reservation's planned quantity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Quantity&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
| 9&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 5: Actual quantity is entered ===&lt;br /&gt;
&lt;br /&gt;
The actually issued or consumed quantity is stored in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation.QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation.QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 6: Task is finished ===&lt;br /&gt;
&lt;br /&gt;
When the task is finished, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CloseReservations()&amp;lt;/span&amp;gt; is called.&lt;br /&gt;
&lt;br /&gt;
The confirmed reservation is changed to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Validation and business rules ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Area&lt;br /&gt;
! Rule&lt;br /&gt;
! Implemented by&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; can only be changed while the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must not exceed &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Actual issued or consumed quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Actual issued or consumed quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; can only be changed while the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Reservation status&lt;br /&gt;
| Status cannot be changed once the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Reservation status&lt;br /&gt;
| A reservation cannot be changed from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt; back to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Reservation links&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; cannot be changed when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Property setters&lt;br /&gt;
|-&lt;br /&gt;
| Material deletion&lt;br /&gt;
| Material cannot be deleted while &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; is greater than 0.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;InternalDeleteAllowed()&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| Material deletion&lt;br /&gt;
| Material cannot be deleted while active reservations exist.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;InternalDeleteAllowed()&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;HasActiveReservation()&amp;lt;/span&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[MRO (Plugin)]]&lt;br /&gt;
* [[MRO_Objects_(Client)]]&lt;br /&gt;
* [[MRO_Implemented_Objects]]&lt;br /&gt;
* [[MROMaintenancePlans]]&lt;br /&gt;
{{UnderConstructionEnd}}&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_Material_Management&amp;diff=29994</id>
		<title>MRO Material Management</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_Material_Management&amp;diff=29994"/>
				<updated>2026-06-23T09:14:50Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: /* Object overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UnderConstructionStart}}&lt;br /&gt;
== MRO Material Management ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''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 &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;, and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;. Materials are linked to master data and storage locations. Reservations are created manually by users and link materials to tasks.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MRO material management is used to support maintenance work with required spare parts, consumables, tools, or other material items.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Basic concept ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Object&lt;br /&gt;
! Type&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;&lt;br /&gt;
| Master data&lt;br /&gt;
| Defines the catalogue entry for a material, including item number, unit, packaging, manufacturer data, and material type.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Quantity-bearing MRO object&lt;br /&gt;
| 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.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Workflow object&lt;br /&gt;
| Represents a manually created material reservation for a task. It links a material to a task and stores planned and actual quantities.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;&lt;br /&gt;
| Technical base class&lt;br /&gt;
| Provides the common &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property used by both materials and reservations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Related storage object&lt;br /&gt;
| Represents a physical storage location for materials.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Core idea:''' &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt; defines what the material is. &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; represents the material in stock or material context. &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; links a material to a task and reserves a planned quantity for maintenance execution.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MaterialMaster ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt; represents the material master or catalogue entry.&lt;br /&gt;
&lt;br /&gt;
It stores item-level master data that can be referenced by material instances in MRO.&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ITEM_NUMBER&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Item number or material number.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PACKAGING_UNIT&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Packaging unit.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PACKAGING_SIZE&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Packaging size.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ACTIVE&amp;lt;/span&amp;gt;&lt;br /&gt;
| bool&lt;br /&gt;
| Defines whether the material master is active.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UNIT_OF_MEASURE&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Unit of measure.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_TYPE&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| Material type.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MANUFACTURER_COMPANY_NAME&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Manufacturer company name.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MANUFACTURER_PRODUCT_TAG&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Manufacturer product tag or product identifier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Material type ===&lt;br /&gt;
&lt;br /&gt;
Values of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt; are:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SpareParts&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Consumables&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Tools&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Material ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; represents a material instance or stock entry in MRO.&lt;br /&gt;
&lt;br /&gt;
It inherits from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt; and therefore uses the inherited &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property as its material quantity.&lt;br /&gt;
&lt;br /&gt;
A material links to:&lt;br /&gt;
&lt;br /&gt;
* a material master via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
* a storage location via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
! Stored or calculated&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the material master data.&lt;br /&gt;
| Stored link&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the storage location where the material is located.&lt;br /&gt;
| Stored link&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Material quantity. Inherited from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Stored property&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Sum of planned quantities of confirmed reservations for this material.&lt;br /&gt;
| Calculated property&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_STATUS&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialStatus&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| Material status.&lt;br /&gt;
| User/admin managed property&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Material status ===&lt;br /&gt;
&lt;br /&gt;
The material status is stored in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_STATUS&amp;lt;/span&amp;gt; and exposed through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialStatus&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The property is managed by the user or administrator. The system does not change it automatically.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Numeric value&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Undefined&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
| No specific material status is defined.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Inactive&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
| Material is inactive and should not be used for new reservations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Active&amp;lt;/span&amp;gt;&lt;br /&gt;
| 20&lt;br /&gt;
| Material is active and can be used for reservations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Reserved quantity ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt; is calculated at read time.&lt;br /&gt;
&lt;br /&gt;
The calculation uses reservations where:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; points to the current material&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STATUS&amp;lt;/span&amp;gt; is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus.Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The calculated value is the sum of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; of these confirmed reservations.&lt;br /&gt;
&lt;br /&gt;
=== Available quantity ===&lt;br /&gt;
&lt;br /&gt;
The available material quantity is calculated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 8px 10px; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
AvailableQuantity = QUANTITY - RESERVED_QUANTITY&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Delete behavior ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.InternalDeleteAllowed()&amp;lt;/span&amp;gt; prevents deleting a material if it still has quantity or active reservations.&lt;br /&gt;
&lt;br /&gt;
Deletion is only allowed if:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; is lower than or equal to 0&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;HasActiveReservation()&amp;lt;/span&amp;gt; returns false&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #d33; background-color: #fff5f5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Restriction:''' A &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; cannot be deleted while it has a quantity greater than 0 or active reservations.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reservation ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; represents a manually created material reservation for a task.&lt;br /&gt;
&lt;br /&gt;
It links:&lt;br /&gt;
&lt;br /&gt;
* a task via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
* a material via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It stores the planned reservation quantity in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; and the actually issued or consumed quantity in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
! Important behavior&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Task&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the task for which the material is reserved.&lt;br /&gt;
| Setter is blocked when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the material being reserved.&lt;br /&gt;
| Setter is blocked when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STATUS&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| Reservation status.&lt;br /&gt;
| Changes are validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Planned quantity for the reservation.&lt;br /&gt;
| Setter validates through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Actually issued or consumed quantity. Overrides &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement.QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Setter validates through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Reservation status ===&lt;br /&gt;
&lt;br /&gt;
Values of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus&amp;lt;/span&amp;gt; are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Status&lt;br /&gt;
! Numeric value&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
| Reservation is planned.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
| Reservation is confirmed and contributes to the material's reserved quantity.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
| 20&lt;br /&gt;
| Material has been physically issued.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Cancelled&amp;lt;/span&amp;gt;&lt;br /&gt;
| 30&lt;br /&gt;
| Reservation was cancelled.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Expired&amp;lt;/span&amp;gt;&lt;br /&gt;
| 50&lt;br /&gt;
| Reservation has expired.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Status change rules ===&lt;br /&gt;
&lt;br /&gt;
Status changes are controlled by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The following rules are applied:&lt;br /&gt;
&lt;br /&gt;
* no status change is allowed when the current status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
* changing from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt; back to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; is not allowed&lt;br /&gt;
* other status changes are allowed by this method&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #d33; background-color: #fff5f5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Restriction:''' Once a reservation has status &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;, its status can no longer be changed by the normal status setter logic.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Planned quantity validation ===&lt;br /&gt;
&lt;br /&gt;
The setter of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; validates changes through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A new planned quantity is only allowed if:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt; is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus.Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; is assigned&lt;br /&gt;
* the new quantity is greater than 0&lt;br /&gt;
* the new quantity is lower than or equal to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Quantity rule:''' A planned reservation quantity can only be set while the reservation is still &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; and only if the selected material has enough available quantity.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Actual quantity validation ===&lt;br /&gt;
&lt;br /&gt;
The overridden &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; setter validates changes through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A new actual quantity is only allowed if:&lt;br /&gt;
&lt;br /&gt;
* the new quantity is greater than 0&lt;br /&gt;
* the status is either &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Link editing rules ===&lt;br /&gt;
&lt;br /&gt;
The setters of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; are guarded by reservation status.&lt;br /&gt;
&lt;br /&gt;
The links cannot be changed when the reservation is:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== StorageLocation ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt; is a related object used to represent a physical storage location.&lt;br /&gt;
&lt;br /&gt;
A material can reference a storage location via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Important properties and values ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Values / meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STORAGE_TYPE&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageType&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Floor&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Shelf&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Rack&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Bin&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Pallet&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Container&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ACCESS_TYPE&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AccessType&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Manual&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Forklift&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Crane&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Automated&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OCCUPANCY_STATUS&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OccupancyStatus&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Empty&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Partial&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Full&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reserved&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Blocked&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OutOfService&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STORAGE_LABEL&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Label of the storage location.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEVEL&amp;lt;/span&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| Level of the storage location.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;POSITION&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Position identifier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GoodsMovement ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt; is a technical base class.&lt;br /&gt;
&lt;br /&gt;
It provides the common &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property for material-related objects such as &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Quantity concepts ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Quantity&lt;br /&gt;
! Property / method&lt;br /&gt;
! Object&lt;br /&gt;
! Stored or calculated&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| Material quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Inherited from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Reserved quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Calculated&lt;br /&gt;
| Sum of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; of confirmed reservations for the material.&lt;br /&gt;
|-&lt;br /&gt;
| Available quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Calculated&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; minus &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Actually issued or consumed quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Overrides &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement.QUANTITY&amp;lt;/span&amp;gt; and is validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Reservation workflow ==&lt;br /&gt;
&lt;br /&gt;
=== Creating or editing a reservation ===&lt;br /&gt;
&lt;br /&gt;
Reservations are created manually by the user.&lt;br /&gt;
&lt;br /&gt;
A reservation links a material to a task.&lt;br /&gt;
&lt;br /&gt;
For a reservation to define its planned quantity correctly:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; must be set.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; must point to the task requiring the material.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt; must still be &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must not exceed &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Confirmed reservations ===&lt;br /&gt;
&lt;br /&gt;
When a reservation is confirmed, it contributes to the material's reserved quantity.&lt;br /&gt;
&lt;br /&gt;
This affects the available quantity of the material.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 8px 10px; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
AvailableQuantity = QUANTITY - sum(QTY_PLANNED of confirmed reservations)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Finishing a task ===&lt;br /&gt;
&lt;br /&gt;
When a task is finished, the task logic calls &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CloseReservations()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The method processes active reservations for the task:&lt;br /&gt;
&lt;br /&gt;
* if a reservation has status &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;, it is set to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
* otherwise, it is set to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Cancelled&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Workflow effect:''' Finishing a task closes its reservations. Confirmed reservations become &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;; other active reservations become &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Cancelled&amp;lt;/span&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usage in tasks ==&lt;br /&gt;
&lt;br /&gt;
Reservations are the central link between material handling and task execution.&lt;br /&gt;
&lt;br /&gt;
A reservation connects:&lt;br /&gt;
&lt;br /&gt;
* the required material through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
* the task through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
* the planned quantity through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
* the actually issued or consumed quantity through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
* the reservation state through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This means that material usage is tracked at task level.&lt;br /&gt;
&lt;br /&gt;
== Example workflow ==&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Material master exists ===&lt;br /&gt;
&lt;br /&gt;
A spare part is defined as a &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ITEM_NUMBER&amp;lt;/span&amp;gt;&lt;br /&gt;
| OF-10045&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UNIT_OF_MEASURE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Piece&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SpareParts&amp;lt;/span&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Material exists in a storage location ===&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; object references the material master and a storage location.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
| Oil Filter Type A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
| Storage Shelf A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
| 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Reservation is created for a task ===&lt;br /&gt;
&lt;br /&gt;
A user manually creates a &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; and links the material to the task.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
| Replace oil filter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
| Oil Filter Type A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 4: Reservation is confirmed ===&lt;br /&gt;
&lt;br /&gt;
The reservation status is changed to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
After confirmation, the material's reserved quantity includes the reservation's planned quantity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Quantity&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
| 9&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 5: Actual quantity is entered ===&lt;br /&gt;
&lt;br /&gt;
The actually issued or consumed quantity is stored in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation.QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation.QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 6: Task is finished ===&lt;br /&gt;
&lt;br /&gt;
When the task is finished, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CloseReservations()&amp;lt;/span&amp;gt; is called.&lt;br /&gt;
&lt;br /&gt;
The confirmed reservation is changed to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Validation and business rules ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Area&lt;br /&gt;
! Rule&lt;br /&gt;
! Implemented by&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; can only be changed while the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must not exceed &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Actual issued or consumed quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Actual issued or consumed quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; can only be changed while the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Reservation status&lt;br /&gt;
| Status cannot be changed once the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Reservation status&lt;br /&gt;
| A reservation cannot be changed from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt; back to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Reservation links&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; cannot be changed when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Property setters&lt;br /&gt;
|-&lt;br /&gt;
| Material deletion&lt;br /&gt;
| Material cannot be deleted while &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; is greater than 0.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;InternalDeleteAllowed()&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| Material deletion&lt;br /&gt;
| Material cannot be deleted while active reservations exist.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;InternalDeleteAllowed()&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;HasActiveReservation()&amp;lt;/span&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[MRO (Plugin)]]&lt;br /&gt;
* [[MRO_Objects_(Client)]]&lt;br /&gt;
* [[MRO_Implemented_Objects]]&lt;br /&gt;
* [[MROMaintenancePlans]]&lt;br /&gt;
{{UnderConstructionEnd}}&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MROMaintenancePlans&amp;diff=29993</id>
		<title>MROMaintenancePlans</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MROMaintenancePlans&amp;diff=29993"/>
				<updated>2026-06-19T06:42:49Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: /* See also */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= MRO Maintenance Planning =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Summary:''' The Maintenance Planning feature in MRO is used to plan recurring maintenance work and automatically generate work packages from maintenance plans. The maintenance plan defines the rules. The generated work package is used by users to execute and complete the actual maintenance work.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
A maintenance plan defines the rules for creating work packages. These rules include:&lt;br /&gt;
&lt;br /&gt;
* when a work package should be created&lt;br /&gt;
* which asset the work package belongs to&lt;br /&gt;
* which template work package is used&lt;br /&gt;
* how the template work package is copied&lt;br /&gt;
* how many days before the planned execution date the work package may be generated&lt;br /&gt;
* how future planning dates are calculated&lt;br /&gt;
&lt;br /&gt;
The actual maintenance work is not executed by the maintenance plan itself. The maintenance plan creates work packages. These generated work packages are then used by users to execute and complete the maintenance work.&lt;br /&gt;
&lt;br /&gt;
In MRO, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaintenancePlan&amp;lt;/span&amp;gt; is the abstract base class for maintenance planning. It provides the common foundation for maintenance plans, but it is not intended to be used directly.&lt;br /&gt;
&lt;br /&gt;
The fully implemented maintenance plan types in standard MRO are:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CyclicMaintenancePlan&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RoundMaintenancePlan&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Custom maintenance plan types can be implemented by deriving from the abstract &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaintenancePlan&amp;lt;/span&amp;gt; base class. However, the standard MRO maintenance planning feature is based on cyclic maintenance plans and round maintenance plans.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Important:''' &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CyclicMaintenancePlan&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RoundMaintenancePlan&amp;lt;/span&amp;gt; support recurrence-based scheduling. This includes planned execution dates, automatic work package generation, calendar-based scheduling, completion-based scheduling, automatic recalculation of scheduling dates, and generation based on due dates.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RoundMaintenancePlan&amp;lt;/span&amp;gt; additionally supports maintenance rounds. A round maintenance plan creates one main work package for the round. It can also create additional work packages from child maintenance plans linked via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt;. These additional work packages are assigned to the main round work package.&lt;br /&gt;
&lt;br /&gt;
== Basic Concept ==&lt;br /&gt;
&lt;br /&gt;
The maintenance planning feature is built around four main parts:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Part&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaintenancePlan&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines the rules for creating generated work packages.&lt;br /&gt;
|-&lt;br /&gt;
| Template work package&lt;br /&gt;
| Defines what the generated work package should look like.&lt;br /&gt;
|-&lt;br /&gt;
| Replication configuration&lt;br /&gt;
| Defines how the template work package is copied.&lt;br /&gt;
|-&lt;br /&gt;
| Generated work package&lt;br /&gt;
| The actual work package created by the maintenance plan.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Maintenance Plan ===&lt;br /&gt;
&lt;br /&gt;
The maintenance plan defines the rules for creating work packages.&lt;br /&gt;
&lt;br /&gt;
This includes, for example:&lt;br /&gt;
&lt;br /&gt;
* when a work package should be created&lt;br /&gt;
* which asset the work package should belong to&lt;br /&gt;
* how many days before the planned execution date the work package may be created&lt;br /&gt;
* which template work package should be used&lt;br /&gt;
* which recurrence pattern should be used&lt;br /&gt;
* whether future dates are calculated calendar-based or completion-based&lt;br /&gt;
&lt;br /&gt;
=== Template Work Package ===&lt;br /&gt;
&lt;br /&gt;
The template work package defines what the generated work package should look like.&lt;br /&gt;
&lt;br /&gt;
It is the source work package that is copied when the maintenance plan creates a new work package.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Rule:''' Only work packages with &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ISTEMPLATE&amp;lt;/span&amp;gt; set can be used as template work packages.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Replication Configuration ===&lt;br /&gt;
&lt;br /&gt;
The replication configuration defines how the template work package is copied.&lt;br /&gt;
&lt;br /&gt;
This includes, for example:&lt;br /&gt;
&lt;br /&gt;
* which properties are copied&lt;br /&gt;
* how referenced objects are handled&lt;br /&gt;
* what the target meta class of the generated work package should be&lt;br /&gt;
&lt;br /&gt;
=== Generated Work Package ===&lt;br /&gt;
&lt;br /&gt;
The generated work package is the actual result created by the maintenance plan.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
# A pump has to be inspected every month.&lt;br /&gt;
# A cyclic maintenance plan is created for this pump.&lt;br /&gt;
# The plan is configured with a monthly recurrence, an assigned asset, a template work package, and a replication configuration.&lt;br /&gt;
# When the plan becomes due, the system uses a replication job to create a new work package from the configured template work package.&lt;br /&gt;
# The generated work package is linked back to the maintenance plan via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MAINTENANCE_PLAN&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
This link allows the maintenance plan to react when the generated work package is planned or completed.&lt;br /&gt;
&lt;br /&gt;
== MaintenancePlan Base Class ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaintenancePlan&amp;lt;/span&amp;gt; is the abstract base class for maintenance planning in MRO.&lt;br /&gt;
&lt;br /&gt;
It provides the common properties and logic required by maintenance plan implementations.&lt;br /&gt;
&lt;br /&gt;
Because &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaintenancePlan&amp;lt;/span&amp;gt; is abstract, users do not create or use this base class directly in the standard MRO feature. Instead, the concrete maintenance plan types are used:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CyclicMaintenancePlan&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RoundMaintenancePlan&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Developers can derive from the abstract base class if a project requires a custom maintenance plan type. In that case, the custom implementation must provide the missing plan-specific behavior.&lt;br /&gt;
&lt;br /&gt;
=== Base Class Properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Purpose&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt;&lt;br /&gt;
| Links the maintenance plan to the asset that requires maintenance.&lt;br /&gt;
| Required for a valid cyclic maintenance plan.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt;&lt;br /&gt;
| Links the maintenance plan to the template work package.&lt;br /&gt;
| The linked work package must have &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ISTEMPLATE&amp;lt;/span&amp;gt; set.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_REPLICATION_CONFIG&amp;lt;/span&amp;gt;&lt;br /&gt;
| Links the maintenance plan to the replication configuration.&lt;br /&gt;
| Required for work package generation.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines the planned execution date of the next maintenance activity.&lt;br /&gt;
| Used as &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt; on generated work packages.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines how many days before &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; the system may create the work package.&lt;br /&gt;
| Does not define the recurrence interval.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines the earliest date on which the maintenance plan may create a work package.&lt;br /&gt;
| Calculated by the system.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_STATUS&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines whether the maintenance plan is active or inactive.&lt;br /&gt;
| Only active plans are considered for automatic generation.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AUTO_CREATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines whether the system is allowed to automatically create work packages.&lt;br /&gt;
| If disabled, the plan does not automatically create work packages.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LAST_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stores the most recent completion date of a generated work package linked to the maintenance plan.&lt;br /&gt;
| Especially relevant for completion-based scheduling.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PRIORITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| Numeric value that can be used to sort maintenance plans.&lt;br /&gt;
| For round maintenance plans, see also &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_SELECTION_RULE&amp;lt;/span&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt; is the link to the asset that requires maintenance.&lt;br /&gt;
&lt;br /&gt;
This can be, for example:&lt;br /&gt;
&lt;br /&gt;
* equipment&lt;br /&gt;
* a functional location&lt;br /&gt;
* another customized maintainable object deriving from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Asset&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The generated work package is linked to the same asset.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #f0ad4e; background-color: #fff8e5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Requirement:''' A cyclic maintenance plan requires &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt; to be assigned in order to be valid.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt; is the link to the template work package.&lt;br /&gt;
&lt;br /&gt;
The template work package defines what the generated work package should look like.&lt;br /&gt;
&lt;br /&gt;
When the maintenance plan creates a work package, the system copies the work package referenced by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The linked work package must be a template work package. This means its &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ISTEMPLATE&amp;lt;/span&amp;gt; property must be set.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #f0ad4e; background-color: #fff8e5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Requirement:''' &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt; must be configured before the maintenance plan can create a work package.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_REPLICATION_CONFIG&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_REPLICATION_CONFIG&amp;lt;/span&amp;gt; is the link to the replication configuration.&lt;br /&gt;
&lt;br /&gt;
The replication configuration defines how the template work package is copied into a generated work package.&lt;br /&gt;
&lt;br /&gt;
It can define, for example:&lt;br /&gt;
&lt;br /&gt;
* which properties are copied&lt;br /&gt;
* how references are copied&lt;br /&gt;
* what the target meta class of the generated work package should be&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #f0ad4e; background-color: #fff8e5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Requirement:''' &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_REPLICATION_CONFIG&amp;lt;/span&amp;gt; must be configured before the maintenance plan can create a work package.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; defines the planned execution date of the next maintenance activity.&lt;br /&gt;
&lt;br /&gt;
It answers the question: '''When should the next maintenance work be performed?'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is not necessarily the date on which the work package is created.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 15 March&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt;&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 12 March&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In this example, the system may create the work package on 12 March, but the generated work package is planned for 15 March.&lt;br /&gt;
&lt;br /&gt;
When a work package is generated, the generated work package receives the maintenance plan’s &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; as its &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt; defines how many days before &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; the system may create the work package.&lt;br /&gt;
&lt;br /&gt;
This is used to create work packages before the actual planned execution date.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 15 March&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt;&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| Resulting &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 12 March&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Note:''' &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt; does not define the recurrence interval. It only defines how early the work package may be generated before the planned execution date.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt; is calculated by the system.&lt;br /&gt;
&lt;br /&gt;
It defines the earliest date on which the maintenance plan may create a work package.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EARLIEST_GENERATION_DATE = NEXT_DATE - LEAD_DAYS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 15 March&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt;&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 12 March&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The maintenance planning orchestrator searches for active plans where &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt; has been reached.&lt;br /&gt;
&lt;br /&gt;
A plan can be considered for automatic work package generation when:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EARLIEST_GENERATION_DATE &amp;lt;= current date&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt; has not yet been reached, no work package is created.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_STATUS&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_STATUS&amp;lt;/span&amp;gt; defines whether the maintenance plan is active or inactive.&lt;br /&gt;
&lt;br /&gt;
Only active plans are considered for automatic work package generation. Inactive plans are ignored by the maintenance planning process.&lt;br /&gt;
&lt;br /&gt;
Typical values are:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Inactive&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Active&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This allows users to temporarily disable a maintenance plan without deleting it.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AUTO_CREATE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AUTO_CREATE&amp;lt;/span&amp;gt; defines whether the system is allowed to automatically create work packages from the maintenance plan.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AUTO_CREATE&amp;lt;/span&amp;gt; is enabled, the maintenance planning orchestrator can create work packages once the plan is due.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AUTO_CREATE&amp;lt;/span&amp;gt; is disabled, the plan does not automatically create work packages.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LAST_DATE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LAST_DATE&amp;lt;/span&amp;gt; stores the date when the most recent generated work package linked to the maintenance plan was completed.&lt;br /&gt;
&lt;br /&gt;
This property is especially important for completion-based scheduling.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| Previous generated work package completed&lt;br /&gt;
| 20 March&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Completion-Based&lt;br /&gt;
|-&lt;br /&gt;
| Next date is calculated from&lt;br /&gt;
| 20 March&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The system updates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LAST_DATE&amp;lt;/span&amp;gt; when a generated work package is completed.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PRIORITY&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PRIORITY&amp;lt;/span&amp;gt; is a numeric value that can be used to sort maintenance plans.&lt;br /&gt;
&lt;br /&gt;
For round maintenance plans, there is also a property called &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_SELECTION_RULE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #f0ad4e; background-color: #fff8e5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Open point:''' The exact effect of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_SELECTION_RULE&amp;lt;/span&amp;gt; should only be documented after the implementation behavior has been verified.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Work Package Properties Used by Maintenance Planning ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Used on&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MAINTENANCE_PLAN&amp;lt;/span&amp;gt;&lt;br /&gt;
| Generated work package&lt;br /&gt;
| Links the generated work package back to the maintenance plan that triggered its creation.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt;&lt;br /&gt;
| Generated work package&lt;br /&gt;
| Stores the template work package that was used to create the generated work package.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt;&lt;br /&gt;
| Generated work package&lt;br /&gt;
| Stores the asset for which the work package was created.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt;&lt;br /&gt;
| Generated work package&lt;br /&gt;
| Stores the planned start date of the generated work package.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ORGA_STATUS&amp;lt;/span&amp;gt;&lt;br /&gt;
| Generated work package&lt;br /&gt;
| Used to determine whether a generated work package is finished.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;TASK_OWNER&amp;lt;/span&amp;gt;&lt;br /&gt;
| Additional round work package&lt;br /&gt;
| Assigns additional generated work packages to the main round work package.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ORDERID&amp;lt;/span&amp;gt;&lt;br /&gt;
| Additional round work package&lt;br /&gt;
| Can be copied from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt; to structure or order round work packages.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GROUPID&amp;lt;/span&amp;gt;&lt;br /&gt;
| Additional round work package&lt;br /&gt;
| Can be copied from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt; to group round work packages.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MAINTENANCE_PLAN&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MAINTENANCE_PLAN&amp;lt;/span&amp;gt; is set on generated work packages.&lt;br /&gt;
&lt;br /&gt;
It stores the maintenance plan that triggered the creation of the work package.&lt;br /&gt;
&lt;br /&gt;
This is important because the maintenance plan itself does not directly store a list of generated work packages. Instead, generated work packages reference their source maintenance plan via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MAINTENANCE_PLAN&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
This link allows the system to find work packages created from a maintenance plan and to update the maintenance plan when a generated work package is planned or completed.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
On a generated work package, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt; stores the template work package that was used to create the generated work package.&lt;br /&gt;
&lt;br /&gt;
This allows users and the system to see which template was used as the source.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
On a generated work package, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt; stores the asset for which the work package was created.&lt;br /&gt;
&lt;br /&gt;
This is usually copied or assigned based on the maintenance plan’s &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt; stores the planned start date of the generated work package.&lt;br /&gt;
&lt;br /&gt;
When a maintenance plan generates a work package, the system sets:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
generated WorkPackage.PLANNED_START = MaintenancePlan.NEXT_DATE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ORGA_STATUS&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ORGA_STATUS&amp;lt;/span&amp;gt; is used to determine whether a generated work package is finished.&lt;br /&gt;
&lt;br /&gt;
A work package is considered finished when:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ORGA_STATUS == 100&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open work packages are generated work packages linked to the maintenance plan where:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ORGA_STATUS != 100&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #f0ad4e; background-color: #fff8e5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Generation rule:''' A maintenance plan does not create another work package while it still has an open generated work package.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;TASK_OWNER&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;TASK_OWNER&amp;lt;/span&amp;gt; is used in round maintenance scenarios.&lt;br /&gt;
&lt;br /&gt;
When a round maintenance plan creates a main work package and additional work packages from linked child plans, the additional work packages are assigned to the main round work package via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;TASK_OWNER&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ORDERID&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GROUPID&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ORDERID&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GROUPID&amp;lt;/span&amp;gt; can be copied from the &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt; relation to generated work packages in a round maintenance scenario.&lt;br /&gt;
&lt;br /&gt;
They can be used to order or group the additional work packages that belong to the generated round work package.&lt;br /&gt;
&lt;br /&gt;
== CyclicMaintenancePlan ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CyclicMaintenancePlan&amp;lt;/span&amp;gt; is used for recurring maintenance work on an asset.&lt;br /&gt;
&lt;br /&gt;
It is the standard maintenance plan type for maintenance activities that repeat according to a defined recurrence pattern.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
* inspect a pump every month&lt;br /&gt;
* service a machine every 6 months&lt;br /&gt;
* check safety equipment every Monday&lt;br /&gt;
* replace a filter every 30 days&lt;br /&gt;
* perform annual maintenance on a functional location&lt;br /&gt;
&lt;br /&gt;
A cyclic maintenance plan uses &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; to define the recurrence. It also uses &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt; to define how future dates are calculated.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Key concept:''' &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt; defines whether the plan follows fixed calendar dates or whether the next date depends on the actual completion date of the previous generated work package.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The supported scheduling modes are:&lt;br /&gt;
&lt;br /&gt;
* Calendar-Based&lt;br /&gt;
* Completion-Based&lt;br /&gt;
&lt;br /&gt;
== CyclicMaintenancePlan Properties ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Purpose&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines the recurrence pattern.&lt;br /&gt;
| Must be valid and parseable.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_START_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines when the recurrence pattern starts.&lt;br /&gt;
| Used as the start point for recurrence calculation.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_UNTIL_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Optional end date for the recurrence.&lt;br /&gt;
| No further occurrences are generated after this date.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_COUNT&amp;lt;/span&amp;gt;&lt;br /&gt;
| Limits how many work packages can be created from the plan.&lt;br /&gt;
| Further occurrences stop once the count is reached.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines how &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is calculated.&lt;br /&gt;
| Supports Calendar-Based and Completion-Based scheduling.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; defines the recurrence pattern of a cyclic maintenance plan.&lt;br /&gt;
&lt;br /&gt;
It describes how often the maintenance should occur.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FREQ=DAILY&lt;br /&gt;
FREQ=WEEKLY;BYDAY=MO,WE,FR&lt;br /&gt;
FREQ=MONTHLY;BYMONTHDAY=15&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The system uses &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; to calculate future planned execution dates.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #d33; background-color: #fff5f5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Problem:''' If &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; is invalid and cannot be parsed, the cyclic maintenance plan is not valid and cannot create work packages.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_START_DATE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_START_DATE&amp;lt;/span&amp;gt; defines when the recurrence pattern starts.&lt;br /&gt;
&lt;br /&gt;
The recurrence rule is calculated from this date forward.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_START_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 01 January&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Monthly on the 15th&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The system uses these values to determine valid planned execution dates.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_UNTIL_DATE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_UNTIL_DATE&amp;lt;/span&amp;gt; is an optional end date for the recurrence.&lt;br /&gt;
&lt;br /&gt;
If this date is configured, no further occurrences are generated after this date.&lt;br /&gt;
&lt;br /&gt;
This can be used for maintenance plans that should only run until a certain date.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_COUNT&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_COUNT&amp;lt;/span&amp;gt; limits how many work packages can be created from the plan.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_COUNT&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When the number of related generated work packages reaches &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_COUNT&amp;lt;/span&amp;gt;, the system no longer calculates new occurrences for the plan.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt; defines how &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is calculated for a cyclic maintenance plan.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt; is only relevant for concrete maintenance plan types that use recurrence logic, such as &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CyclicMaintenancePlan&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RoundMaintenancePlan&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The supported scheduling modes are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Scheduling mode&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Calendar-Based&lt;br /&gt;
| Future dates follow the recurrence pattern defined by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Completion-Based&lt;br /&gt;
| Future dates are calculated from the actual completion date of the previous generated work package.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This property is one of the most important settings because it defines whether future dates follow the calendar or depend on the actual completion of the previous generated work package.&lt;br /&gt;
&lt;br /&gt;
== Calendar-Based Scheduling ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
Calendar-based scheduling is used when maintenance should follow fixed calendar occurrences.&lt;br /&gt;
&lt;br /&gt;
The next planned execution date is calculated according to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; and the calendar recurrence.&lt;br /&gt;
&lt;br /&gt;
This means that delays in completing a work package do not automatically shift the whole future schedule.&lt;br /&gt;
&lt;br /&gt;
Use calendar-based scheduling when the maintenance should happen on fixed dates or fixed calendar intervals.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
* inspection every 15th day of the month&lt;br /&gt;
* safety check every Monday&lt;br /&gt;
* yearly inspection every January&lt;br /&gt;
* quarterly maintenance in fixed maintenance windows&lt;br /&gt;
&lt;br /&gt;
=== How Calendar-Based Scheduling Works ===&lt;br /&gt;
&lt;br /&gt;
In calendar-based scheduling, the system calculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; based on the recurrence rule and the relevant dates of existing generated work packages.&lt;br /&gt;
&lt;br /&gt;
The system determines the highest relevant planned or finished date of generated work packages linked to the maintenance plan. Then it uses the recurrence rule to calculate the next valid occurrence after that date.&lt;br /&gt;
&lt;br /&gt;
This means the schedule continues according to the recurrence pattern.&lt;br /&gt;
&lt;br /&gt;
If a work package is completed later than planned, the future schedule does not necessarily move with that completion date.&lt;br /&gt;
&lt;br /&gt;
=== Example: Calendar-Based Scheduling ===&lt;br /&gt;
&lt;br /&gt;
A pump must be inspected on the 15th of every month.&lt;br /&gt;
&lt;br /&gt;
==== Configuration ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| Plan type&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CyclicMaintenancePlan&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt;&lt;br /&gt;
| Pump 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt;&lt;br /&gt;
| Pump Inspection Template&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_REPLICATION_CONFIG&amp;lt;/span&amp;gt;&lt;br /&gt;
| Pump Inspection Replication&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Calendar-Based&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Monthly on the 15th&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_START_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 01 January&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 15 March&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt;&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_STATUS&amp;lt;/span&amp;gt;&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AUTO_CREATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Enabled&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Result ====&lt;br /&gt;
&lt;br /&gt;
The system calculates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EARLIEST_GENERATION_DATE = 12 March&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On or after 12 March, the system can create the work package.&lt;br /&gt;
&lt;br /&gt;
Generated work package:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt;&lt;br /&gt;
| 15 March&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
After the work package is planned, the system can calculate the next occurrence:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NEXT_DATE = 15 April&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the March work package is completed on 20 March, the next date still follows the monthly recurrence. The next planned execution date remains 15 April.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Result:''' The late completion does not shift the future schedule to 20 April.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Completion-Based Scheduling ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
Completion-based scheduling is used when the next maintenance date should depend on the actual completion date of the previous generated work package.&lt;br /&gt;
&lt;br /&gt;
This means that the interval starts after the work has actually been completed.&lt;br /&gt;
&lt;br /&gt;
Use completion-based scheduling when the maintenance should repeat based on the time since the last completed maintenance activity.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
* service every 30 days after the last service&lt;br /&gt;
* inspection 6 months after the previous inspection was completed&lt;br /&gt;
* replacement 90 days after the previous replacement&lt;br /&gt;
* maintenance where a delay should also delay the next cycle&lt;br /&gt;
&lt;br /&gt;
=== How Completion-Based Scheduling Works ===&lt;br /&gt;
&lt;br /&gt;
In completion-based scheduling, the system recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; after a generated work package is completed.&lt;br /&gt;
&lt;br /&gt;
The completion date becomes the basis for the next occurrence.&lt;br /&gt;
&lt;br /&gt;
Planning changes alone do not define the next recurrence in the same way as calendar-based scheduling.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Important:''' The plan waits for the generated work package to be completed. Then the system calculates the next date from the completion date.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example: Completion-Based Scheduling ===&lt;br /&gt;
&lt;br /&gt;
A machine must be serviced every 30 days after the previous service was completed.&lt;br /&gt;
&lt;br /&gt;
==== Configuration ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Setting&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| Plan type&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CyclicMaintenancePlan&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt;&lt;br /&gt;
| Machine 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt;&lt;br /&gt;
| Machine Service Template&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_REPLICATION_CONFIG&amp;lt;/span&amp;gt;&lt;br /&gt;
| Machine Service Replication&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Completion-Based&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Every 30 days&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_START_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 01 March&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| 15 March&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt;&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_STATUS&amp;lt;/span&amp;gt;&lt;br /&gt;
| Active&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AUTO_CREATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Enabled&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Result ====&lt;br /&gt;
&lt;br /&gt;
The system calculates:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EARLIEST_GENERATION_DATE = 12 March&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On or after 12 March, the system can create the work package.&lt;br /&gt;
&lt;br /&gt;
Generated work package:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt;&lt;br /&gt;
| 15 March&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The work package is completed on 20 March.&lt;br /&gt;
&lt;br /&gt;
Because the plan is completion-based, the system calculates the next date from 20 March.&lt;br /&gt;
&lt;br /&gt;
If the recurrence is every 30 days:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| around 19 April&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt;&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| around 16 April&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Result:''' In this mode, the delay from 15 March to 20 March shifts the future schedule.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calendar-Based vs Completion-Based Scheduling ==&lt;br /&gt;
&lt;br /&gt;
The difference is the date that is used as the basis for calculating &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Aspect&lt;br /&gt;
! Calendar-Based&lt;br /&gt;
! Completion-Based&lt;br /&gt;
|-&lt;br /&gt;
| Basis for &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Recurrence defined by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Actual completion date of the previous generated work package&lt;br /&gt;
|-&lt;br /&gt;
| Effect of late completion&lt;br /&gt;
| Future dates are not automatically shifted&lt;br /&gt;
| Future dates move with the completion date&lt;br /&gt;
|-&lt;br /&gt;
| Typical use case&lt;br /&gt;
| Fixed maintenance windows, fixed calendar intervals, legal or organizational inspection dates&lt;br /&gt;
| Service intervals that depend on the actual last maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Example&lt;br /&gt;
| Planned: 15 March&amp;lt;br /&amp;gt;Completed: 20 March&amp;lt;br /&amp;gt;Next date: 15 April&lt;br /&gt;
| Planned: 15 March&amp;lt;br /&amp;gt;Completed: 20 March&amp;lt;br /&amp;gt;Interval: 30 days&amp;lt;br /&amp;gt;Next date: around 19 April&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Calendar-Based ===&lt;br /&gt;
&lt;br /&gt;
Calendar-based scheduling should be used when the maintenance must follow fixed planned dates.&lt;br /&gt;
&lt;br /&gt;
Characteristics:&lt;br /&gt;
&lt;br /&gt;
* The plan follows the &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; calendar pattern.&lt;br /&gt;
* Future dates are not automatically shifted just because a work package was completed late.&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; can be recalculated after planning updates.&lt;br /&gt;
* It is useful for fixed maintenance windows and legally or organizationally fixed inspection dates.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Event&lt;br /&gt;
! Date&lt;br /&gt;
|-&lt;br /&gt;
| Planned inspection&lt;br /&gt;
| 15 March&lt;br /&gt;
|-&lt;br /&gt;
| Completed&lt;br /&gt;
| 20 March&lt;br /&gt;
|-&lt;br /&gt;
| Next date&lt;br /&gt;
| 15 April&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The future date stays aligned with the calendar recurrence.&lt;br /&gt;
&lt;br /&gt;
=== Completion-Based ===&lt;br /&gt;
&lt;br /&gt;
Completion-based scheduling should be used when the next maintenance interval starts after the previous work was completed.&lt;br /&gt;
&lt;br /&gt;
Characteristics:&lt;br /&gt;
&lt;br /&gt;
* The plan waits for completion.&lt;br /&gt;
* The completion date is used as the basis for &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
* If the work is completed late, the future schedule moves.&lt;br /&gt;
* It is useful for service intervals that depend on the actual last maintenance.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Event&lt;br /&gt;
! Date&lt;br /&gt;
|-&lt;br /&gt;
| Planned service&lt;br /&gt;
| 15 March&lt;br /&gt;
|-&lt;br /&gt;
| Completed&lt;br /&gt;
| 20 March&lt;br /&gt;
|-&lt;br /&gt;
| Interval&lt;br /&gt;
| 30 days&lt;br /&gt;
|-&lt;br /&gt;
| Next date&lt;br /&gt;
| around 19 April&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The future date shifts because the work was completed later.&lt;br /&gt;
&lt;br /&gt;
== RoundMaintenancePlan ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RoundMaintenancePlan&amp;lt;/span&amp;gt; is used for recurring maintenance rounds.&lt;br /&gt;
&lt;br /&gt;
It is a specialized type of cyclic maintenance plan. This means that it also uses &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In addition to the cyclic scheduling logic, a round maintenance plan includes child maintenance plans linked via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
When the round maintenance plan is due, the system creates the main work package for the round. Then it creates additional work packages from the child maintenance plans linked via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #f0ad4e; background-color: #fff8e5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Important for child plans:''' For the child plans, the system does not care whether they are due, active, auto-created, or whether they have a valid &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt;. The round maintenance plan uses the child plans as configuration for the additional work packages that should be created as part of the round.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The important configuration on the child plans is their work package generation setup, especially the configured template work package and replication setup.&lt;br /&gt;
&lt;br /&gt;
=== Generated Result ===&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Element&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| Round maintenance plan&lt;br /&gt;
| Machine Room Round&lt;br /&gt;
|-&lt;br /&gt;
| Linked child plan 1&lt;br /&gt;
| Pump 1 Inspection&lt;br /&gt;
|-&lt;br /&gt;
| Linked child plan 2&lt;br /&gt;
| Pump 2 Inspection&lt;br /&gt;
|-&lt;br /&gt;
| Linked child plan 3&lt;br /&gt;
| Pump 3 Inspection&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Generated main work package:&lt;br /&gt;
&lt;br /&gt;
* Machine Room Round&lt;br /&gt;
&lt;br /&gt;
Additional generated work packages inside the main round work package:&lt;br /&gt;
&lt;br /&gt;
* Pump 1 Inspection&lt;br /&gt;
* Pump 2 Inspection&lt;br /&gt;
* Pump 3 Inspection&lt;br /&gt;
&lt;br /&gt;
The additional work packages are assigned to the main round work package. This allows the result of the round maintenance plan to be structured as one complete maintenance round.&lt;br /&gt;
&lt;br /&gt;
== RoundMaintenancePlan Properties and Relations ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Property / relation&lt;br /&gt;
! Purpose&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt;&lt;br /&gt;
| Links the round maintenance plan to its child maintenance plans.&lt;br /&gt;
| Child plans define additional work packages created as part of the round.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_SELECTION_RULE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Exists on &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RoundMaintenancePlan&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Runtime behavior must be verified before documenting further effects.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ORDERID&amp;lt;/span&amp;gt;&lt;br /&gt;
| Can exist on the relation between the round plan and a child plan.&lt;br /&gt;
| Can be copied to generated work packages.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GROUPID&amp;lt;/span&amp;gt;&lt;br /&gt;
| Can exist on the relation between the round plan and a child plan.&lt;br /&gt;
| Can be copied to generated work packages.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt; links the round maintenance plan to its child maintenance plans.&lt;br /&gt;
&lt;br /&gt;
The linked child plans define which additional work packages should be generated when the round maintenance plan is due.&lt;br /&gt;
&lt;br /&gt;
When the round plan generates work packages, the system creates:&lt;br /&gt;
&lt;br /&gt;
* one main work package from the round plan’s own &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt;&lt;br /&gt;
* one additional work package for each child maintenance plan linked via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The child maintenance plans do not need to be due themselves for the round maintenance plan to use them during round generation.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_SELECTION_RULE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_SELECTION_RULE&amp;lt;/span&amp;gt; exists on &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RoundMaintenancePlan&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #f0ad4e; background-color: #fff8e5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Open point:''' The exact runtime effect of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_SELECTION_RULE&amp;lt;/span&amp;gt; should be documented after the implementation behavior has been verified. Until that behavior is confirmed, the wiki should not claim that &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_SELECTION_RULE&amp;lt;/span&amp;gt; filters child plans by due date, asset, or priority.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ORDERID&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GROUPID&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
The relation between the round maintenance plan and a linked child maintenance plan can contain &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ORDERID&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GROUPID&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
When the system creates an additional work package from a linked child maintenance plan, these values can be copied to the generated work package.&lt;br /&gt;
&lt;br /&gt;
This can be used to structure, order, or group the additional work packages in the generated round.&lt;br /&gt;
&lt;br /&gt;
== Properties Calculated or Updated by the System ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Property / link&lt;br /&gt;
! System behavior&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Calculated from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Calculated or recalculated for &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CyclicMaintenancePlan&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RoundMaintenancePlan&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LAST_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Updated when a generated work package is completed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt;&lt;br /&gt;
| Set on generated work packages from the maintenance plan’s &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Links on generated work packages&lt;br /&gt;
| Required links are set automatically during generation.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt; is calculated by the system from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EARLIEST_GENERATION_DATE = NEXT_DATE - LEAD_DAYS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This value is recalculated when:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; changes&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt; changes&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is recalculated after planning or completion&lt;br /&gt;
* recurrence settings cause a new &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; to be calculated&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
For &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CyclicMaintenancePlan&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RoundMaintenancePlan&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; can be calculated or recalculated by the system.&lt;br /&gt;
&lt;br /&gt;
The calculation depends on:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_START_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_UNTIL_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_COUNT&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;&lt;br /&gt;
* related generated work packages&lt;br /&gt;
* planning events&lt;br /&gt;
* completion events&lt;br /&gt;
&lt;br /&gt;
For calendar-based scheduling, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is calculated from the recurrence pattern and the highest relevant planned or finished date of related generated work packages.&lt;br /&gt;
&lt;br /&gt;
For completion-based scheduling, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is calculated from the completion date of the previous generated work package.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LAST_DATE&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LAST_DATE&amp;lt;/span&amp;gt; is updated by the system when a generated work package is completed.&lt;br /&gt;
&lt;br /&gt;
It stores the latest completion date of a generated work package related to the maintenance plan.&lt;br /&gt;
&lt;br /&gt;
This value is especially relevant for completion-based scheduling.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt; on Generated Work Packages ===&lt;br /&gt;
&lt;br /&gt;
When the system generates a work package from a maintenance plan, it sets the generated work package’s &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt; to the maintenance plan’s &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MaintenancePlan.NEXT_DATE: 15 March&lt;br /&gt;
Generated WorkPackage.PLANNED_START: 15 March&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Links on Generated Work Packages ===&lt;br /&gt;
&lt;br /&gt;
When the system generates a work package, it automatically sets the required links on the generated work package.&lt;br /&gt;
&lt;br /&gt;
The generated work package is linked to:&lt;br /&gt;
&lt;br /&gt;
* the source maintenance plan via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MAINTENANCE_PLAN&amp;lt;/span&amp;gt;&lt;br /&gt;
* the template work package via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt;&lt;br /&gt;
* the assigned asset via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For round maintenance plans, additional generated work packages from linked child maintenance plans are assigned to the main round work package via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;TASK_OWNER&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Properties and Events That Trigger Recalculation ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Trigger&lt;br /&gt;
! Recalculation behavior&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; changed&lt;br /&gt;
| Recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt; changed&lt;br /&gt;
| Recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; changed&lt;br /&gt;
| Recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; based on the new recurrence rule and selected &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_START_DATE&amp;lt;/span&amp;gt; changed&lt;br /&gt;
| Recalculates the schedule and may change &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_UNTIL_DATE&amp;lt;/span&amp;gt; changed&lt;br /&gt;
| Checks whether future occurrences are still available.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_COUNT&amp;lt;/span&amp;gt; changed&lt;br /&gt;
| Checks whether the maximum number of generated work packages has already been reached.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt; changed&lt;br /&gt;
| Recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; according to the selected scheduling mode.&lt;br /&gt;
|-&lt;br /&gt;
| Generated work package &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt; changed&lt;br /&gt;
| Notifies the linked maintenance plan and may trigger date recalculation.&lt;br /&gt;
|-&lt;br /&gt;
| Generated work package completed&lt;br /&gt;
| Updates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LAST_DATE&amp;lt;/span&amp;gt; and recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; according to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; Changed ===&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; changes, the system recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EARLIEST_GENERATION_DATE = NEXT_DATE - LEAD_DAYS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt; Changed ===&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEAD_DAYS&amp;lt;/span&amp;gt; changes, the system recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EARLIEST_GENERATION_DATE = NEXT_DATE - LEAD_DAYS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; Changed ===&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt; changes, the recurrence pattern changes.&lt;br /&gt;
&lt;br /&gt;
The system recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; based on the new recurrence rule and the selected &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
After &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is recalculated, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt; is recalculated as well.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_START_DATE&amp;lt;/span&amp;gt; Changed ===&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_START_DATE&amp;lt;/span&amp;gt; changes, the start point of the recurrence changes.&lt;br /&gt;
&lt;br /&gt;
The system recalculates the schedule. This can change &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; changes, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt; is recalculated as well.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_UNTIL_DATE&amp;lt;/span&amp;gt; Changed ===&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_UNTIL_DATE&amp;lt;/span&amp;gt; changes, the end boundary of the recurrence changes.&lt;br /&gt;
&lt;br /&gt;
The system checks whether future occurrences are still available.&lt;br /&gt;
&lt;br /&gt;
If no further occurrence is possible because of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_UNTIL_DATE&amp;lt;/span&amp;gt;, the system cannot calculate a new &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_COUNT&amp;lt;/span&amp;gt; Changed ===&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_COUNT&amp;lt;/span&amp;gt; changes, the system checks whether the maximum number of generated work packages has already been reached.&lt;br /&gt;
&lt;br /&gt;
If the number of related generated work packages is greater than or equal to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE_COUNT&amp;lt;/span&amp;gt;, the system does not calculate further occurrences.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt; Changed ===&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt; changes, the logic for calculating future dates changes.&lt;br /&gt;
&lt;br /&gt;
Changing to Calendar-Based means that the plan follows the calendar recurrence.&lt;br /&gt;
&lt;br /&gt;
Changing to Completion-Based means that the plan calculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; from the completion of the previous generated work package.&lt;br /&gt;
&lt;br /&gt;
Because this changes the calculation logic, the system recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; according to the selected &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; changes, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt; is recalculated as well.&lt;br /&gt;
&lt;br /&gt;
=== Generated Work Package &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt; Changed ===&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt; of a generated work package is set or changed, the work package notifies the linked maintenance plan.&lt;br /&gt;
&lt;br /&gt;
For calendar-based cyclic maintenance plans, this can trigger recalculation of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;. The system uses the planning information to continue the calendar-based recurrence.&lt;br /&gt;
&lt;br /&gt;
For completion-based cyclic maintenance plans, a &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLANNED_START&amp;lt;/span&amp;gt; change does not drive the recurrence in the same way. &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is mainly calculated after the work package is completed.&lt;br /&gt;
&lt;br /&gt;
=== Generated Work Package Completed ===&lt;br /&gt;
&lt;br /&gt;
When a generated work package is completed, the work package notifies the linked maintenance plan.&lt;br /&gt;
&lt;br /&gt;
A work package is considered completed when:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ORGA_STATUS == 100&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The system updates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LAST_DATE&amp;lt;/span&amp;gt;. Then the system recalculates &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; according to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SCHEDULING_MODE&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For calendar-based scheduling:&lt;br /&gt;
&lt;br /&gt;
* the system continues according to the calendar recurrence&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is calculated from the recurrence pattern and relevant planned or finished dates&lt;br /&gt;
&lt;br /&gt;
For completion-based scheduling:&lt;br /&gt;
&lt;br /&gt;
* the completion date becomes the basis for the next occurrence&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is calculated from the completion date&lt;br /&gt;
&lt;br /&gt;
After &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt; is updated, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt; is recalculated.&lt;br /&gt;
&lt;br /&gt;
== Work Package Generation Logic ==&lt;br /&gt;
&lt;br /&gt;
=== When Is a Plan Ready to Create a Work Package? ===&lt;br /&gt;
&lt;br /&gt;
A cyclic or round maintenance plan can create a work package only if all required conditions are fulfilled.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Requirement&lt;br /&gt;
! Condition&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| Plan validity&lt;br /&gt;
| The plan must be valid.&lt;br /&gt;
| For cyclic maintenance plans, this requires a valid &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt;, assigned &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_ASSET&amp;lt;/span&amp;gt;, and available &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Plan status&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_STATUS == Active&amp;lt;/span&amp;gt;&lt;br /&gt;
| Inactive plans are ignored.&lt;br /&gt;
|-&lt;br /&gt;
| Automatic generation&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AUTO_CREATE&amp;lt;/span&amp;gt; must be enabled.&lt;br /&gt;
| If disabled, the plan does not automatically create work packages.&lt;br /&gt;
|-&lt;br /&gt;
| Template work package&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_WP_TMPL&amp;lt;/span&amp;gt; must be set.&lt;br /&gt;
| The linked work package must be a template work package.&lt;br /&gt;
|-&lt;br /&gt;
| Replication configuration&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_REPLICATION_CONFIG&amp;lt;/span&amp;gt; must be set.&lt;br /&gt;
| Required to copy the template work package.&lt;br /&gt;
|-&lt;br /&gt;
| Earliest generation date&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE &amp;lt;= current date&amp;lt;/span&amp;gt;&lt;br /&gt;
| The plan may only generate once the earliest generation date has been reached.&lt;br /&gt;
|-&lt;br /&gt;
| Open work packages&lt;br /&gt;
| No open generated work package may exist for the plan.&lt;br /&gt;
| There must be no generated work package linked via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MAINTENANCE_PLAN&amp;lt;/span&amp;gt; where &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ORGA_STATUS != 100&amp;lt;/span&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #f0ad4e; background-color: #fff8e5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Generation rule:''' The open work package check prevents the system from creating multiple open work packages for the same maintenance plan.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Round Work Package Generation ==&lt;br /&gt;
&lt;br /&gt;
A round maintenance plan creates a main work package for the round.&lt;br /&gt;
&lt;br /&gt;
After the main work package has been created, the system processes the maintenance plans linked via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SYSREL_ROUND_RELATION&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For each linked child maintenance plan, the system creates an additional work package.&lt;br /&gt;
&lt;br /&gt;
These additional generated work packages are assigned to the main round work package via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;TASK_OWNER&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For child plans used in a round, the system does not care whether the child plan:&lt;br /&gt;
&lt;br /&gt;
* has &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PLAN_STATUS == Active&amp;lt;/span&amp;gt;&lt;br /&gt;
* has &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AUTO_CREATE == true&amp;lt;/span&amp;gt;&lt;br /&gt;
* has a valid &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RRULE&amp;lt;/span&amp;gt;&lt;br /&gt;
* has a valid &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;NEXT_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
* is due based on its own &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;EARLIEST_GENERATION_DATE&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Rule:''' The round plan controls the timing. The child plans define what additional work packages should be created as part of the round.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[MRO (Plugin)]]&lt;br /&gt;
* [[MRO_Objects_(Client)]]&lt;br /&gt;
* [[MRO_Implemented_Objects]]&lt;br /&gt;
* [[MRO_Material_Management]]&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_Material_Management&amp;diff=29992</id>
		<title>MRO Material Management</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_Material_Management&amp;diff=29992"/>
				<updated>2026-06-19T06:41:12Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: /* Relations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UnderConstructionStart}}&lt;br /&gt;
== MRO Material Management ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''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 &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;, and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;. Materials are linked to master data and storage locations. Reservations are created manually by users and link materials to tasks.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MRO material management is used to support maintenance work with required spare parts, consumables, tools, or other material items.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Basic concept ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Object&lt;br /&gt;
! Type&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;&lt;br /&gt;
| Master data&lt;br /&gt;
| Defines the catalogue entry for a material, including item number, unit, packaging, manufacturer data, and material type.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Quantity-bearing MRO object&lt;br /&gt;
| 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.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Workflow object&lt;br /&gt;
| Represents a manually created material reservation for a task. It links a material to a task and stores planned and actual quantities.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;&lt;br /&gt;
| Technical base class&lt;br /&gt;
| Provides the common &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property used by both materials and reservations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Related storage object&lt;br /&gt;
| Represents a physical storage location for materials.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Core idea:''' &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt; defines what the material is. &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; represents the material in stock or material context. &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; links a material to a task and reserves a planned quantity for maintenance execution.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Object overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Object&lt;br /&gt;
! Class name&lt;br /&gt;
! Base / inheritance&lt;br /&gt;
! Main relations&lt;br /&gt;
|-&lt;br /&gt;
| Material&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UBIK.MRO.Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Inherits from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Material Master&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UBIK.MRO.MaterialMaster&amp;lt;/span&amp;gt;&lt;br /&gt;
| Master data class&lt;br /&gt;
| Referenced by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Reservation&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UBIK.MRO.Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Inherits from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Goods Movement&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UBIK.MRO.GoodsMovement&amp;lt;/span&amp;gt;&lt;br /&gt;
| Technical base class&lt;br /&gt;
| Provides &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; to derived objects&lt;br /&gt;
|-&lt;br /&gt;
| Storage Location&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UBIK.MRO.StorageLocation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Functional location specialization&lt;br /&gt;
| Referenced by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MaterialMaster ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt; represents the material master or catalogue entry.&lt;br /&gt;
&lt;br /&gt;
It stores item-level master data that can be referenced by material instances in MRO.&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ITEM_NUMBER&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Item number or material number.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PACKAGING_UNIT&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Packaging unit.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PACKAGING_SIZE&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Packaging size.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ACTIVE&amp;lt;/span&amp;gt;&lt;br /&gt;
| bool&lt;br /&gt;
| Defines whether the material master is active.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UNIT_OF_MEASURE&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Unit of measure.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_TYPE&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| Material type.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MANUFACTURER_COMPANY_NAME&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Manufacturer company name.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MANUFACTURER_PRODUCT_TAG&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Manufacturer product tag or product identifier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Material type ===&lt;br /&gt;
&lt;br /&gt;
Values of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt; are:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SpareParts&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Consumables&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Tools&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Material ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; represents a material instance or stock entry in MRO.&lt;br /&gt;
&lt;br /&gt;
It inherits from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt; and therefore uses the inherited &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property as its material quantity.&lt;br /&gt;
&lt;br /&gt;
A material links to:&lt;br /&gt;
&lt;br /&gt;
* a material master via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
* a storage location via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
! Stored or calculated&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the material master data.&lt;br /&gt;
| Stored link&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the storage location where the material is located.&lt;br /&gt;
| Stored link&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Material quantity. Inherited from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Stored property&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Sum of planned quantities of confirmed reservations for this material.&lt;br /&gt;
| Calculated property&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_STATUS&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialStatus&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| Material status.&lt;br /&gt;
| User/admin managed property&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Material status ===&lt;br /&gt;
&lt;br /&gt;
The material status is stored in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_STATUS&amp;lt;/span&amp;gt; and exposed through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialStatus&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The property is managed by the user or administrator. The system does not change it automatically.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Numeric value&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Undefined&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
| No specific material status is defined.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Inactive&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
| Material is inactive and should not be used for new reservations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Active&amp;lt;/span&amp;gt;&lt;br /&gt;
| 20&lt;br /&gt;
| Material is active and can be used for reservations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Reserved quantity ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt; is calculated at read time.&lt;br /&gt;
&lt;br /&gt;
The calculation uses reservations where:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; points to the current material&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STATUS&amp;lt;/span&amp;gt; is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus.Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The calculated value is the sum of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; of these confirmed reservations.&lt;br /&gt;
&lt;br /&gt;
=== Available quantity ===&lt;br /&gt;
&lt;br /&gt;
The available material quantity is calculated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 8px 10px; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
AvailableQuantity = QUANTITY - RESERVED_QUANTITY&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Delete behavior ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.InternalDeleteAllowed()&amp;lt;/span&amp;gt; prevents deleting a material if it still has quantity or active reservations.&lt;br /&gt;
&lt;br /&gt;
Deletion is only allowed if:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; is lower than or equal to 0&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;HasActiveReservation()&amp;lt;/span&amp;gt; returns false&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #d33; background-color: #fff5f5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Restriction:''' A &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; cannot be deleted while it has a quantity greater than 0 or active reservations.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reservation ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; represents a manually created material reservation for a task.&lt;br /&gt;
&lt;br /&gt;
It links:&lt;br /&gt;
&lt;br /&gt;
* a task via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
* a material via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It stores the planned reservation quantity in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; and the actually issued or consumed quantity in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
! Important behavior&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Task&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the task for which the material is reserved.&lt;br /&gt;
| Setter is blocked when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the material being reserved.&lt;br /&gt;
| Setter is blocked when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STATUS&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| Reservation status.&lt;br /&gt;
| Changes are validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Planned quantity for the reservation.&lt;br /&gt;
| Setter validates through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Actually issued or consumed quantity. Overrides &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement.QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Setter validates through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Reservation status ===&lt;br /&gt;
&lt;br /&gt;
Values of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus&amp;lt;/span&amp;gt; are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Status&lt;br /&gt;
! Numeric value&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
| Reservation is planned.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
| Reservation is confirmed and contributes to the material's reserved quantity.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
| 20&lt;br /&gt;
| Material has been physically issued.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Cancelled&amp;lt;/span&amp;gt;&lt;br /&gt;
| 30&lt;br /&gt;
| Reservation was cancelled.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Expired&amp;lt;/span&amp;gt;&lt;br /&gt;
| 50&lt;br /&gt;
| Reservation has expired.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Status change rules ===&lt;br /&gt;
&lt;br /&gt;
Status changes are controlled by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The following rules are applied:&lt;br /&gt;
&lt;br /&gt;
* no status change is allowed when the current status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
* changing from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt; back to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; is not allowed&lt;br /&gt;
* other status changes are allowed by this method&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #d33; background-color: #fff5f5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Restriction:''' Once a reservation has status &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;, its status can no longer be changed by the normal status setter logic.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Planned quantity validation ===&lt;br /&gt;
&lt;br /&gt;
The setter of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; validates changes through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A new planned quantity is only allowed if:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt; is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus.Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; is assigned&lt;br /&gt;
* the new quantity is greater than 0&lt;br /&gt;
* the new quantity is lower than or equal to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Quantity rule:''' A planned reservation quantity can only be set while the reservation is still &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; and only if the selected material has enough available quantity.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Actual quantity validation ===&lt;br /&gt;
&lt;br /&gt;
The overridden &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; setter validates changes through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A new actual quantity is only allowed if:&lt;br /&gt;
&lt;br /&gt;
* the new quantity is greater than 0&lt;br /&gt;
* the status is either &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Link editing rules ===&lt;br /&gt;
&lt;br /&gt;
The setters of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; are guarded by reservation status.&lt;br /&gt;
&lt;br /&gt;
The links cannot be changed when the reservation is:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== StorageLocation ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt; is a related object used to represent a physical storage location.&lt;br /&gt;
&lt;br /&gt;
A material can reference a storage location via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Important properties and values ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Values / meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STORAGE_TYPE&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageType&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Floor&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Shelf&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Rack&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Bin&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Pallet&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Container&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ACCESS_TYPE&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AccessType&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Manual&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Forklift&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Crane&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Automated&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OCCUPANCY_STATUS&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OccupancyStatus&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Empty&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Partial&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Full&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reserved&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Blocked&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OutOfService&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STORAGE_LABEL&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Label of the storage location.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEVEL&amp;lt;/span&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| Level of the storage location.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;POSITION&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Position identifier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GoodsMovement ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt; is a technical base class.&lt;br /&gt;
&lt;br /&gt;
It provides the common &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property for material-related objects such as &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Quantity concepts ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Quantity&lt;br /&gt;
! Property / method&lt;br /&gt;
! Object&lt;br /&gt;
! Stored or calculated&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| Material quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Inherited from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Reserved quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Calculated&lt;br /&gt;
| Sum of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; of confirmed reservations for the material.&lt;br /&gt;
|-&lt;br /&gt;
| Available quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Calculated&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; minus &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Actually issued or consumed quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Overrides &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement.QUANTITY&amp;lt;/span&amp;gt; and is validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Reservation workflow ==&lt;br /&gt;
&lt;br /&gt;
=== Creating or editing a reservation ===&lt;br /&gt;
&lt;br /&gt;
Reservations are created manually by the user.&lt;br /&gt;
&lt;br /&gt;
A reservation links a material to a task.&lt;br /&gt;
&lt;br /&gt;
For a reservation to define its planned quantity correctly:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; must be set.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; must point to the task requiring the material.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt; must still be &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must not exceed &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Confirmed reservations ===&lt;br /&gt;
&lt;br /&gt;
When a reservation is confirmed, it contributes to the material's reserved quantity.&lt;br /&gt;
&lt;br /&gt;
This affects the available quantity of the material.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 8px 10px; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
AvailableQuantity = QUANTITY - sum(QTY_PLANNED of confirmed reservations)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Finishing a task ===&lt;br /&gt;
&lt;br /&gt;
When a task is finished, the task logic calls &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CloseReservations()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The method processes active reservations for the task:&lt;br /&gt;
&lt;br /&gt;
* if a reservation has status &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;, it is set to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
* otherwise, it is set to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Cancelled&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Workflow effect:''' Finishing a task closes its reservations. Confirmed reservations become &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;; other active reservations become &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Cancelled&amp;lt;/span&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usage in tasks ==&lt;br /&gt;
&lt;br /&gt;
Reservations are the central link between material handling and task execution.&lt;br /&gt;
&lt;br /&gt;
A reservation connects:&lt;br /&gt;
&lt;br /&gt;
* the required material through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
* the task through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
* the planned quantity through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
* the actually issued or consumed quantity through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
* the reservation state through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This means that material usage is tracked at task level.&lt;br /&gt;
&lt;br /&gt;
== Example workflow ==&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Material master exists ===&lt;br /&gt;
&lt;br /&gt;
A spare part is defined as a &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ITEM_NUMBER&amp;lt;/span&amp;gt;&lt;br /&gt;
| OF-10045&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UNIT_OF_MEASURE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Piece&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SpareParts&amp;lt;/span&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Material exists in a storage location ===&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; object references the material master and a storage location.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
| Oil Filter Type A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
| Storage Shelf A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
| 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Reservation is created for a task ===&lt;br /&gt;
&lt;br /&gt;
A user manually creates a &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; and links the material to the task.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
| Replace oil filter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
| Oil Filter Type A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 4: Reservation is confirmed ===&lt;br /&gt;
&lt;br /&gt;
The reservation status is changed to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
After confirmation, the material's reserved quantity includes the reservation's planned quantity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Quantity&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
| 9&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 5: Actual quantity is entered ===&lt;br /&gt;
&lt;br /&gt;
The actually issued or consumed quantity is stored in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation.QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation.QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 6: Task is finished ===&lt;br /&gt;
&lt;br /&gt;
When the task is finished, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CloseReservations()&amp;lt;/span&amp;gt; is called.&lt;br /&gt;
&lt;br /&gt;
The confirmed reservation is changed to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Validation and business rules ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Area&lt;br /&gt;
! Rule&lt;br /&gt;
! Implemented by&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; can only be changed while the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must not exceed &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Actual issued or consumed quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Actual issued or consumed quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; can only be changed while the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Reservation status&lt;br /&gt;
| Status cannot be changed once the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Reservation status&lt;br /&gt;
| A reservation cannot be changed from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt; back to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Reservation links&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; cannot be changed when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Property setters&lt;br /&gt;
|-&lt;br /&gt;
| Material deletion&lt;br /&gt;
| Material cannot be deleted while &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; is greater than 0.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;InternalDeleteAllowed()&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| Material deletion&lt;br /&gt;
| Material cannot be deleted while active reservations exist.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;InternalDeleteAllowed()&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;HasActiveReservation()&amp;lt;/span&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[MRO (Plugin)]]&lt;br /&gt;
* [[MRO_Objects_(Client)]]&lt;br /&gt;
* [[MRO_Implemented_Objects]]&lt;br /&gt;
* [[MROMaintenancePlans]]&lt;br /&gt;
{{UnderConstructionEnd}}&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_Material_Management&amp;diff=29991</id>
		<title>MRO Material Management</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_Material_Management&amp;diff=29991"/>
				<updated>2026-06-19T06:40:02Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: /* Reservation status */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UnderConstructionStart}}&lt;br /&gt;
== MRO Material Management ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''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 &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;, and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;. Materials are linked to master data and storage locations. Reservations are created manually by users and link materials to tasks.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MRO material management is used to support maintenance work with required spare parts, consumables, tools, or other material items.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Basic concept ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Object&lt;br /&gt;
! Type&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;&lt;br /&gt;
| Master data&lt;br /&gt;
| Defines the catalogue entry for a material, including item number, unit, packaging, manufacturer data, and material type.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Quantity-bearing MRO object&lt;br /&gt;
| 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.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Workflow object&lt;br /&gt;
| Represents a manually created material reservation for a task. It links a material to a task and stores planned and actual quantities.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;&lt;br /&gt;
| Technical base class&lt;br /&gt;
| Provides the common &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property used by both materials and reservations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Related storage object&lt;br /&gt;
| Represents a physical storage location for materials.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Core idea:''' &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt; defines what the material is. &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; represents the material in stock or material context. &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; links a material to a task and reserves a planned quantity for maintenance execution.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Object overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Object&lt;br /&gt;
! Class name&lt;br /&gt;
! Base / inheritance&lt;br /&gt;
! Main relations&lt;br /&gt;
|-&lt;br /&gt;
| Material&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UBIK.MRO.Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Inherits from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Material Master&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UBIK.MRO.MaterialMaster&amp;lt;/span&amp;gt;&lt;br /&gt;
| Master data class&lt;br /&gt;
| Referenced by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Reservation&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UBIK.MRO.Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Inherits from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Goods Movement&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UBIK.MRO.GoodsMovement&amp;lt;/span&amp;gt;&lt;br /&gt;
| Technical base class&lt;br /&gt;
| Provides &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; to derived objects&lt;br /&gt;
|-&lt;br /&gt;
| Storage Location&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UBIK.MRO.StorageLocation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Functional location specialization&lt;br /&gt;
| Referenced by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MaterialMaster ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt; represents the material master or catalogue entry.&lt;br /&gt;
&lt;br /&gt;
It stores item-level master data that can be referenced by material instances in MRO.&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ITEM_NUMBER&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Item number or material number.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PACKAGING_UNIT&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Packaging unit.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PACKAGING_SIZE&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Packaging size.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ACTIVE&amp;lt;/span&amp;gt;&lt;br /&gt;
| bool&lt;br /&gt;
| Defines whether the material master is active.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UNIT_OF_MEASURE&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Unit of measure.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_TYPE&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| Material type.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MANUFACTURER_COMPANY_NAME&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Manufacturer company name.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MANUFACTURER_PRODUCT_TAG&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Manufacturer product tag or product identifier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Material type ===&lt;br /&gt;
&lt;br /&gt;
Values of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt; are:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SpareParts&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Consumables&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Tools&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Material ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; represents a material instance or stock entry in MRO.&lt;br /&gt;
&lt;br /&gt;
It inherits from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt; and therefore uses the inherited &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property as its material quantity.&lt;br /&gt;
&lt;br /&gt;
A material links to:&lt;br /&gt;
&lt;br /&gt;
* a material master via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
* a storage location via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
! Stored or calculated&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the material master data.&lt;br /&gt;
| Stored link&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the storage location where the material is located.&lt;br /&gt;
| Stored link&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Material quantity. Inherited from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Stored property&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Sum of planned quantities of confirmed reservations for this material.&lt;br /&gt;
| Calculated property&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_STATUS&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialStatus&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| Material status.&lt;br /&gt;
| User/admin managed property&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Material status ===&lt;br /&gt;
&lt;br /&gt;
The material status is stored in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_STATUS&amp;lt;/span&amp;gt; and exposed through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialStatus&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The property is managed by the user or administrator. The system does not change it automatically.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Numeric value&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Undefined&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
| No specific material status is defined.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Inactive&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
| Material is inactive and should not be used for new reservations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Active&amp;lt;/span&amp;gt;&lt;br /&gt;
| 20&lt;br /&gt;
| Material is active and can be used for reservations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Reserved quantity ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt; is calculated at read time.&lt;br /&gt;
&lt;br /&gt;
The calculation uses reservations where:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; points to the current material&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STATUS&amp;lt;/span&amp;gt; is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus.Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The calculated value is the sum of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; of these confirmed reservations.&lt;br /&gt;
&lt;br /&gt;
=== Available quantity ===&lt;br /&gt;
&lt;br /&gt;
The available material quantity is calculated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 8px 10px; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
AvailableQuantity = QUANTITY - RESERVED_QUANTITY&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Delete behavior ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.InternalDeleteAllowed()&amp;lt;/span&amp;gt; prevents deleting a material if it still has quantity or active reservations.&lt;br /&gt;
&lt;br /&gt;
Deletion is only allowed if:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; is lower than or equal to 0&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;HasActiveReservation()&amp;lt;/span&amp;gt; returns false&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #d33; background-color: #fff5f5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Restriction:''' A &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; cannot be deleted while it has a quantity greater than 0 or active reservations.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reservation ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; represents a manually created material reservation for a task.&lt;br /&gt;
&lt;br /&gt;
It links:&lt;br /&gt;
&lt;br /&gt;
* a task via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
* a material via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It stores the planned reservation quantity in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; and the actually issued or consumed quantity in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
! Important behavior&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Task&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the task for which the material is reserved.&lt;br /&gt;
| Setter is blocked when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the material being reserved.&lt;br /&gt;
| Setter is blocked when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STATUS&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| Reservation status.&lt;br /&gt;
| Changes are validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Planned quantity for the reservation.&lt;br /&gt;
| Setter validates through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Actually issued or consumed quantity. Overrides &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement.QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Setter validates through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Reservation status ===&lt;br /&gt;
&lt;br /&gt;
Values of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus&amp;lt;/span&amp;gt; are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Status&lt;br /&gt;
! Numeric value&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
| Reservation is planned.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
| Reservation is confirmed and contributes to the material's reserved quantity.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
| 20&lt;br /&gt;
| Material has been physically issued.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Cancelled&amp;lt;/span&amp;gt;&lt;br /&gt;
| 30&lt;br /&gt;
| Reservation was cancelled.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Expired&amp;lt;/span&amp;gt;&lt;br /&gt;
| 50&lt;br /&gt;
| Reservation has expired.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Status change rules ===&lt;br /&gt;
&lt;br /&gt;
Status changes are controlled by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The following rules are applied:&lt;br /&gt;
&lt;br /&gt;
* no status change is allowed when the current status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
* changing from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt; back to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; is not allowed&lt;br /&gt;
* other status changes are allowed by this method&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #d33; background-color: #fff5f5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Restriction:''' Once a reservation has status &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;, its status can no longer be changed by the normal status setter logic.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Planned quantity validation ===&lt;br /&gt;
&lt;br /&gt;
The setter of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; validates changes through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A new planned quantity is only allowed if:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt; is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus.Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; is assigned&lt;br /&gt;
* the new quantity is greater than 0&lt;br /&gt;
* the new quantity is lower than or equal to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Quantity rule:''' A planned reservation quantity can only be set while the reservation is still &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; and only if the selected material has enough available quantity.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Actual quantity validation ===&lt;br /&gt;
&lt;br /&gt;
The overridden &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; setter validates changes through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A new actual quantity is only allowed if:&lt;br /&gt;
&lt;br /&gt;
* the new quantity is greater than 0&lt;br /&gt;
* the status is either &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Link editing rules ===&lt;br /&gt;
&lt;br /&gt;
The setters of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; are guarded by reservation status.&lt;br /&gt;
&lt;br /&gt;
The links cannot be changed when the reservation is:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== StorageLocation ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt; is a related object used to represent a physical storage location.&lt;br /&gt;
&lt;br /&gt;
A material can reference a storage location via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Important properties and values ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Values / meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STORAGE_TYPE&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageType&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Floor&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Shelf&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Rack&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Bin&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Pallet&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Container&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ACCESS_TYPE&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AccessType&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Manual&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Forklift&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Crane&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Automated&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OCCUPANCY_STATUS&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OccupancyStatus&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Empty&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Partial&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Full&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reserved&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Blocked&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OutOfService&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STORAGE_LABEL&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Label of the storage location.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEVEL&amp;lt;/span&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| Level of the storage location.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;POSITION&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Position identifier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GoodsMovement ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt; is a technical base class.&lt;br /&gt;
&lt;br /&gt;
It provides the common &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property for material-related objects such as &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Relations ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Relation&lt;br /&gt;
! Source&lt;br /&gt;
! Target&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;&lt;br /&gt;
| Links a material instance to its master data.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines where the material is stored.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines which material is reserved.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Task&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines the task for which the material is reserved.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Quantity concepts ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Quantity&lt;br /&gt;
! Property / method&lt;br /&gt;
! Object&lt;br /&gt;
! Stored or calculated&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| Material quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Inherited from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Reserved quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Calculated&lt;br /&gt;
| Sum of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; of confirmed reservations for the material.&lt;br /&gt;
|-&lt;br /&gt;
| Available quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Calculated&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; minus &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Actually issued or consumed quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Overrides &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement.QUANTITY&amp;lt;/span&amp;gt; and is validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Reservation workflow ==&lt;br /&gt;
&lt;br /&gt;
=== Creating or editing a reservation ===&lt;br /&gt;
&lt;br /&gt;
Reservations are created manually by the user.&lt;br /&gt;
&lt;br /&gt;
A reservation links a material to a task.&lt;br /&gt;
&lt;br /&gt;
For a reservation to define its planned quantity correctly:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; must be set.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; must point to the task requiring the material.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt; must still be &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must not exceed &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Confirmed reservations ===&lt;br /&gt;
&lt;br /&gt;
When a reservation is confirmed, it contributes to the material's reserved quantity.&lt;br /&gt;
&lt;br /&gt;
This affects the available quantity of the material.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 8px 10px; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
AvailableQuantity = QUANTITY - sum(QTY_PLANNED of confirmed reservations)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Finishing a task ===&lt;br /&gt;
&lt;br /&gt;
When a task is finished, the task logic calls &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CloseReservations()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The method processes active reservations for the task:&lt;br /&gt;
&lt;br /&gt;
* if a reservation has status &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;, it is set to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
* otherwise, it is set to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Cancelled&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Workflow effect:''' Finishing a task closes its reservations. Confirmed reservations become &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;; other active reservations become &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Cancelled&amp;lt;/span&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usage in tasks ==&lt;br /&gt;
&lt;br /&gt;
Reservations are the central link between material handling and task execution.&lt;br /&gt;
&lt;br /&gt;
A reservation connects:&lt;br /&gt;
&lt;br /&gt;
* the required material through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
* the task through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
* the planned quantity through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
* the actually issued or consumed quantity through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
* the reservation state through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This means that material usage is tracked at task level.&lt;br /&gt;
&lt;br /&gt;
== Example workflow ==&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Material master exists ===&lt;br /&gt;
&lt;br /&gt;
A spare part is defined as a &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ITEM_NUMBER&amp;lt;/span&amp;gt;&lt;br /&gt;
| OF-10045&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UNIT_OF_MEASURE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Piece&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SpareParts&amp;lt;/span&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Material exists in a storage location ===&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; object references the material master and a storage location.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
| Oil Filter Type A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
| Storage Shelf A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
| 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Reservation is created for a task ===&lt;br /&gt;
&lt;br /&gt;
A user manually creates a &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; and links the material to the task.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
| Replace oil filter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
| Oil Filter Type A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 4: Reservation is confirmed ===&lt;br /&gt;
&lt;br /&gt;
The reservation status is changed to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
After confirmation, the material's reserved quantity includes the reservation's planned quantity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Quantity&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
| 9&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 5: Actual quantity is entered ===&lt;br /&gt;
&lt;br /&gt;
The actually issued or consumed quantity is stored in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation.QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation.QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 6: Task is finished ===&lt;br /&gt;
&lt;br /&gt;
When the task is finished, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CloseReservations()&amp;lt;/span&amp;gt; is called.&lt;br /&gt;
&lt;br /&gt;
The confirmed reservation is changed to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Validation and business rules ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Area&lt;br /&gt;
! Rule&lt;br /&gt;
! Implemented by&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; can only be changed while the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must not exceed &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Actual issued or consumed quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Actual issued or consumed quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; can only be changed while the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Reservation status&lt;br /&gt;
| Status cannot be changed once the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Reservation status&lt;br /&gt;
| A reservation cannot be changed from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt; back to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Reservation links&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; cannot be changed when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Property setters&lt;br /&gt;
|-&lt;br /&gt;
| Material deletion&lt;br /&gt;
| Material cannot be deleted while &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; is greater than 0.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;InternalDeleteAllowed()&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| Material deletion&lt;br /&gt;
| Material cannot be deleted while active reservations exist.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;InternalDeleteAllowed()&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;HasActiveReservation()&amp;lt;/span&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[MRO (Plugin)]]&lt;br /&gt;
* [[MRO_Objects_(Client)]]&lt;br /&gt;
* [[MRO_Implemented_Objects]]&lt;br /&gt;
* [[MROMaintenancePlans]]&lt;br /&gt;
{{UnderConstructionEnd}}&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_Material_Management&amp;diff=29990</id>
		<title>MRO Material Management</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_Material_Management&amp;diff=29990"/>
				<updated>2026-06-19T06:38:54Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: /* Material type */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UnderConstructionStart}}&lt;br /&gt;
== MRO Material Management ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''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 &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;, and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;. Materials are linked to master data and storage locations. Reservations are created manually by users and link materials to tasks.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MRO material management is used to support maintenance work with required spare parts, consumables, tools, or other material items.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Basic concept ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Object&lt;br /&gt;
! Type&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;&lt;br /&gt;
| Master data&lt;br /&gt;
| Defines the catalogue entry for a material, including item number, unit, packaging, manufacturer data, and material type.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Quantity-bearing MRO object&lt;br /&gt;
| 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.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Workflow object&lt;br /&gt;
| Represents a manually created material reservation for a task. It links a material to a task and stores planned and actual quantities.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;&lt;br /&gt;
| Technical base class&lt;br /&gt;
| Provides the common &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property used by both materials and reservations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Related storage object&lt;br /&gt;
| Represents a physical storage location for materials.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Core idea:''' &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt; defines what the material is. &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; represents the material in stock or material context. &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; links a material to a task and reserves a planned quantity for maintenance execution.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Object overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Object&lt;br /&gt;
! Class name&lt;br /&gt;
! Base / inheritance&lt;br /&gt;
! Main relations&lt;br /&gt;
|-&lt;br /&gt;
| Material&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UBIK.MRO.Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Inherits from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Material Master&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UBIK.MRO.MaterialMaster&amp;lt;/span&amp;gt;&lt;br /&gt;
| Master data class&lt;br /&gt;
| Referenced by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Reservation&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UBIK.MRO.Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Inherits from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Goods Movement&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UBIK.MRO.GoodsMovement&amp;lt;/span&amp;gt;&lt;br /&gt;
| Technical base class&lt;br /&gt;
| Provides &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; to derived objects&lt;br /&gt;
|-&lt;br /&gt;
| Storage Location&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UBIK.MRO.StorageLocation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Functional location specialization&lt;br /&gt;
| Referenced by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MaterialMaster ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt; represents the material master or catalogue entry.&lt;br /&gt;
&lt;br /&gt;
It stores item-level master data that can be referenced by material instances in MRO.&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ITEM_NUMBER&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Item number or material number.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PACKAGING_UNIT&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Packaging unit.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PACKAGING_SIZE&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Packaging size.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ACTIVE&amp;lt;/span&amp;gt;&lt;br /&gt;
| bool&lt;br /&gt;
| Defines whether the material master is active.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UNIT_OF_MEASURE&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Unit of measure.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_TYPE&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| Material type.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MANUFACTURER_COMPANY_NAME&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Manufacturer company name.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MANUFACTURER_PRODUCT_TAG&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Manufacturer product tag or product identifier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Material type ===&lt;br /&gt;
&lt;br /&gt;
Values of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt; are:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SpareParts&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Consumables&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Tools&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Material ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; represents a material instance or stock entry in MRO.&lt;br /&gt;
&lt;br /&gt;
It inherits from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt; and therefore uses the inherited &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property as its material quantity.&lt;br /&gt;
&lt;br /&gt;
A material links to:&lt;br /&gt;
&lt;br /&gt;
* a material master via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
* a storage location via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
! Stored or calculated&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the material master data.&lt;br /&gt;
| Stored link&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the storage location where the material is located.&lt;br /&gt;
| Stored link&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Material quantity. Inherited from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Stored property&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Sum of planned quantities of confirmed reservations for this material.&lt;br /&gt;
| Calculated property&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_STATUS&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialStatus&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| Material status.&lt;br /&gt;
| User/admin managed property&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Material status ===&lt;br /&gt;
&lt;br /&gt;
The material status is stored in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_STATUS&amp;lt;/span&amp;gt; and exposed through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialStatus&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The property is managed by the user or administrator. The system does not change it automatically.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Numeric value&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Undefined&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
| No specific material status is defined.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Inactive&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
| Material is inactive and should not be used for new reservations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Active&amp;lt;/span&amp;gt;&lt;br /&gt;
| 20&lt;br /&gt;
| Material is active and can be used for reservations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Reserved quantity ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt; is calculated at read time.&lt;br /&gt;
&lt;br /&gt;
The calculation uses reservations where:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; points to the current material&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STATUS&amp;lt;/span&amp;gt; is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus.Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The calculated value is the sum of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; of these confirmed reservations.&lt;br /&gt;
&lt;br /&gt;
=== Available quantity ===&lt;br /&gt;
&lt;br /&gt;
The available material quantity is calculated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 8px 10px; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
AvailableQuantity = QUANTITY - RESERVED_QUANTITY&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Delete behavior ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.InternalDeleteAllowed()&amp;lt;/span&amp;gt; prevents deleting a material if it still has quantity or active reservations.&lt;br /&gt;
&lt;br /&gt;
Deletion is only allowed if:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; is lower than or equal to 0&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;HasActiveReservation()&amp;lt;/span&amp;gt; returns false&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #d33; background-color: #fff5f5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Restriction:''' A &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; cannot be deleted while it has a quantity greater than 0 or active reservations.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reservation ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; represents a manually created material reservation for a task.&lt;br /&gt;
&lt;br /&gt;
It links:&lt;br /&gt;
&lt;br /&gt;
* a task via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
* a material via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It stores the planned reservation quantity in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; and the actually issued or consumed quantity in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
! Important behavior&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Task&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the task for which the material is reserved.&lt;br /&gt;
| Setter is blocked when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the material being reserved.&lt;br /&gt;
| Setter is blocked when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STATUS&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| Reservation status.&lt;br /&gt;
| Changes are validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Planned quantity for the reservation.&lt;br /&gt;
| Setter validates through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Actually issued or consumed quantity. Overrides &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement.QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Setter validates through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Reservation status ===&lt;br /&gt;
&lt;br /&gt;
Known values of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus&amp;lt;/span&amp;gt; are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Status&lt;br /&gt;
! Numeric value&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
| Reservation is planned.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
| Reservation is confirmed and contributes to the material's reserved quantity.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
| 20&lt;br /&gt;
| Material has been physically issued.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Cancelled&amp;lt;/span&amp;gt;&lt;br /&gt;
| 30&lt;br /&gt;
| Reservation was cancelled.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Expired&amp;lt;/span&amp;gt;&lt;br /&gt;
| 50&lt;br /&gt;
| Reservation has expired.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Status change rules ===&lt;br /&gt;
&lt;br /&gt;
Status changes are controlled by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The following rules are applied:&lt;br /&gt;
&lt;br /&gt;
* no status change is allowed when the current status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
* changing from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt; back to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; is not allowed&lt;br /&gt;
* other status changes are allowed by this method&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #d33; background-color: #fff5f5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Restriction:''' Once a reservation has status &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;, its status can no longer be changed by the normal status setter logic.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Planned quantity validation ===&lt;br /&gt;
&lt;br /&gt;
The setter of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; validates changes through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A new planned quantity is only allowed if:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt; is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus.Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; is assigned&lt;br /&gt;
* the new quantity is greater than 0&lt;br /&gt;
* the new quantity is lower than or equal to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Quantity rule:''' A planned reservation quantity can only be set while the reservation is still &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; and only if the selected material has enough available quantity.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Actual quantity validation ===&lt;br /&gt;
&lt;br /&gt;
The overridden &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; setter validates changes through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A new actual quantity is only allowed if:&lt;br /&gt;
&lt;br /&gt;
* the new quantity is greater than 0&lt;br /&gt;
* the status is either &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Link editing rules ===&lt;br /&gt;
&lt;br /&gt;
The setters of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; are guarded by reservation status.&lt;br /&gt;
&lt;br /&gt;
The links cannot be changed when the reservation is:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== StorageLocation ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt; is a related object used to represent a physical storage location.&lt;br /&gt;
&lt;br /&gt;
A material can reference a storage location via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Important properties and values ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Values / meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STORAGE_TYPE&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageType&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Floor&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Shelf&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Rack&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Bin&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Pallet&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Container&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ACCESS_TYPE&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AccessType&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Manual&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Forklift&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Crane&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Automated&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OCCUPANCY_STATUS&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OccupancyStatus&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Empty&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Partial&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Full&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reserved&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Blocked&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OutOfService&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STORAGE_LABEL&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Label of the storage location.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEVEL&amp;lt;/span&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| Level of the storage location.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;POSITION&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Position identifier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GoodsMovement ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt; is a technical base class.&lt;br /&gt;
&lt;br /&gt;
It provides the common &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property for material-related objects such as &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Relations ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Relation&lt;br /&gt;
! Source&lt;br /&gt;
! Target&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;&lt;br /&gt;
| Links a material instance to its master data.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines where the material is stored.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines which material is reserved.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Task&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines the task for which the material is reserved.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Quantity concepts ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Quantity&lt;br /&gt;
! Property / method&lt;br /&gt;
! Object&lt;br /&gt;
! Stored or calculated&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| Material quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Inherited from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Reserved quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Calculated&lt;br /&gt;
| Sum of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; of confirmed reservations for the material.&lt;br /&gt;
|-&lt;br /&gt;
| Available quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Calculated&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; minus &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Actually issued or consumed quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Overrides &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement.QUANTITY&amp;lt;/span&amp;gt; and is validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Reservation workflow ==&lt;br /&gt;
&lt;br /&gt;
=== Creating or editing a reservation ===&lt;br /&gt;
&lt;br /&gt;
Reservations are created manually by the user.&lt;br /&gt;
&lt;br /&gt;
A reservation links a material to a task.&lt;br /&gt;
&lt;br /&gt;
For a reservation to define its planned quantity correctly:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; must be set.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; must point to the task requiring the material.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt; must still be &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must not exceed &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Confirmed reservations ===&lt;br /&gt;
&lt;br /&gt;
When a reservation is confirmed, it contributes to the material's reserved quantity.&lt;br /&gt;
&lt;br /&gt;
This affects the available quantity of the material.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 8px 10px; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
AvailableQuantity = QUANTITY - sum(QTY_PLANNED of confirmed reservations)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Finishing a task ===&lt;br /&gt;
&lt;br /&gt;
When a task is finished, the task logic calls &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CloseReservations()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The method processes active reservations for the task:&lt;br /&gt;
&lt;br /&gt;
* if a reservation has status &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;, it is set to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
* otherwise, it is set to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Cancelled&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Workflow effect:''' Finishing a task closes its reservations. Confirmed reservations become &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;; other active reservations become &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Cancelled&amp;lt;/span&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usage in tasks ==&lt;br /&gt;
&lt;br /&gt;
Reservations are the central link between material handling and task execution.&lt;br /&gt;
&lt;br /&gt;
A reservation connects:&lt;br /&gt;
&lt;br /&gt;
* the required material through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
* the task through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
* the planned quantity through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
* the actually issued or consumed quantity through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
* the reservation state through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This means that material usage is tracked at task level.&lt;br /&gt;
&lt;br /&gt;
== Example workflow ==&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Material master exists ===&lt;br /&gt;
&lt;br /&gt;
A spare part is defined as a &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ITEM_NUMBER&amp;lt;/span&amp;gt;&lt;br /&gt;
| OF-10045&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UNIT_OF_MEASURE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Piece&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SpareParts&amp;lt;/span&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Material exists in a storage location ===&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; object references the material master and a storage location.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
| Oil Filter Type A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
| Storage Shelf A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
| 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Reservation is created for a task ===&lt;br /&gt;
&lt;br /&gt;
A user manually creates a &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; and links the material to the task.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
| Replace oil filter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
| Oil Filter Type A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 4: Reservation is confirmed ===&lt;br /&gt;
&lt;br /&gt;
The reservation status is changed to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
After confirmation, the material's reserved quantity includes the reservation's planned quantity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Quantity&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
| 9&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 5: Actual quantity is entered ===&lt;br /&gt;
&lt;br /&gt;
The actually issued or consumed quantity is stored in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation.QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation.QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 6: Task is finished ===&lt;br /&gt;
&lt;br /&gt;
When the task is finished, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CloseReservations()&amp;lt;/span&amp;gt; is called.&lt;br /&gt;
&lt;br /&gt;
The confirmed reservation is changed to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Validation and business rules ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Area&lt;br /&gt;
! Rule&lt;br /&gt;
! Implemented by&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; can only be changed while the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must not exceed &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Actual issued or consumed quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Actual issued or consumed quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; can only be changed while the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Reservation status&lt;br /&gt;
| Status cannot be changed once the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Reservation status&lt;br /&gt;
| A reservation cannot be changed from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt; back to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Reservation links&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; cannot be changed when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Property setters&lt;br /&gt;
|-&lt;br /&gt;
| Material deletion&lt;br /&gt;
| Material cannot be deleted while &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; is greater than 0.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;InternalDeleteAllowed()&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| Material deletion&lt;br /&gt;
| Material cannot be deleted while active reservations exist.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;InternalDeleteAllowed()&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;HasActiveReservation()&amp;lt;/span&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[MRO (Plugin)]]&lt;br /&gt;
* [[MRO_Objects_(Client)]]&lt;br /&gt;
* [[MRO_Implemented_Objects]]&lt;br /&gt;
* [[MROMaintenancePlans]]&lt;br /&gt;
{{UnderConstructionEnd}}&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_Material_Management&amp;diff=29989</id>
		<title>MRO Material Management</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_Material_Management&amp;diff=29989"/>
				<updated>2026-06-19T06:37:42Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UnderConstructionStart}}&lt;br /&gt;
== MRO Material Management ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''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 &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;, and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;. Materials are linked to master data and storage locations. Reservations are created manually by users and link materials to tasks.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MRO material management is used to support maintenance work with required spare parts, consumables, tools, or other material items.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Basic concept ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Object&lt;br /&gt;
! Type&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;&lt;br /&gt;
| Master data&lt;br /&gt;
| Defines the catalogue entry for a material, including item number, unit, packaging, manufacturer data, and material type.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Quantity-bearing MRO object&lt;br /&gt;
| 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.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Workflow object&lt;br /&gt;
| Represents a manually created material reservation for a task. It links a material to a task and stores planned and actual quantities.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;&lt;br /&gt;
| Technical base class&lt;br /&gt;
| Provides the common &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property used by both materials and reservations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Related storage object&lt;br /&gt;
| Represents a physical storage location for materials.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Core idea:''' &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt; defines what the material is. &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; represents the material in stock or material context. &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; links a material to a task and reserves a planned quantity for maintenance execution.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Object overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Object&lt;br /&gt;
! Class name&lt;br /&gt;
! Base / inheritance&lt;br /&gt;
! Main relations&lt;br /&gt;
|-&lt;br /&gt;
| Material&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UBIK.MRO.Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Inherits from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Material Master&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UBIK.MRO.MaterialMaster&amp;lt;/span&amp;gt;&lt;br /&gt;
| Master data class&lt;br /&gt;
| Referenced by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Reservation&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UBIK.MRO.Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Inherits from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Goods Movement&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UBIK.MRO.GoodsMovement&amp;lt;/span&amp;gt;&lt;br /&gt;
| Technical base class&lt;br /&gt;
| Provides &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; to derived objects&lt;br /&gt;
|-&lt;br /&gt;
| Storage Location&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UBIK.MRO.StorageLocation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Functional location specialization&lt;br /&gt;
| Referenced by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MaterialMaster ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt; represents the material master or catalogue entry.&lt;br /&gt;
&lt;br /&gt;
It stores item-level master data that can be referenced by material instances in MRO.&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ITEM_NUMBER&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Item number or material number.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PACKAGING_UNIT&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Packaging unit.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PACKAGING_SIZE&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Packaging size.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ACTIVE&amp;lt;/span&amp;gt;&lt;br /&gt;
| bool&lt;br /&gt;
| Defines whether the material master is active.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UNIT_OF_MEASURE&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Unit of measure.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_TYPE&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| Material type.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MANUFACTURER_COMPANY_NAME&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Manufacturer company name.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MANUFACTURER_PRODUCT_TAG&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Manufacturer product tag or product identifier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Material type ===&lt;br /&gt;
&lt;br /&gt;
Known values of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt; are:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SpareParts&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Consumables&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Tools&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Material ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; represents a material instance or stock entry in MRO.&lt;br /&gt;
&lt;br /&gt;
It inherits from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt; and therefore uses the inherited &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property as its material quantity.&lt;br /&gt;
&lt;br /&gt;
A material links to:&lt;br /&gt;
&lt;br /&gt;
* a material master via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
* a storage location via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
! Stored or calculated&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the material master data.&lt;br /&gt;
| Stored link&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the storage location where the material is located.&lt;br /&gt;
| Stored link&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Material quantity. Inherited from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Stored property&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Sum of planned quantities of confirmed reservations for this material.&lt;br /&gt;
| Calculated property&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_STATUS&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialStatus&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| Material status.&lt;br /&gt;
| User/admin managed property&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Material status ===&lt;br /&gt;
&lt;br /&gt;
The material status is stored in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_STATUS&amp;lt;/span&amp;gt; and exposed through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialStatus&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The property is managed by the user or administrator. The system does not change it automatically.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Numeric value&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Undefined&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
| No specific material status is defined.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Inactive&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
| Material is inactive and should not be used for new reservations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Active&amp;lt;/span&amp;gt;&lt;br /&gt;
| 20&lt;br /&gt;
| Material is active and can be used for reservations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Reserved quantity ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt; is calculated at read time.&lt;br /&gt;
&lt;br /&gt;
The calculation uses reservations where:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; points to the current material&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STATUS&amp;lt;/span&amp;gt; is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus.Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The calculated value is the sum of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; of these confirmed reservations.&lt;br /&gt;
&lt;br /&gt;
=== Available quantity ===&lt;br /&gt;
&lt;br /&gt;
The available material quantity is calculated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 8px 10px; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
AvailableQuantity = QUANTITY - RESERVED_QUANTITY&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Delete behavior ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.InternalDeleteAllowed()&amp;lt;/span&amp;gt; prevents deleting a material if it still has quantity or active reservations.&lt;br /&gt;
&lt;br /&gt;
Deletion is only allowed if:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; is lower than or equal to 0&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;HasActiveReservation()&amp;lt;/span&amp;gt; returns false&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #d33; background-color: #fff5f5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Restriction:''' A &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; cannot be deleted while it has a quantity greater than 0 or active reservations.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reservation ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; represents a manually created material reservation for a task.&lt;br /&gt;
&lt;br /&gt;
It links:&lt;br /&gt;
&lt;br /&gt;
* a task via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
* a material via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It stores the planned reservation quantity in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; and the actually issued or consumed quantity in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
! Important behavior&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Task&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the task for which the material is reserved.&lt;br /&gt;
| Setter is blocked when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the material being reserved.&lt;br /&gt;
| Setter is blocked when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STATUS&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| Reservation status.&lt;br /&gt;
| Changes are validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Planned quantity for the reservation.&lt;br /&gt;
| Setter validates through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Actually issued or consumed quantity. Overrides &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement.QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Setter validates through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Reservation status ===&lt;br /&gt;
&lt;br /&gt;
Known values of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus&amp;lt;/span&amp;gt; are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Status&lt;br /&gt;
! Numeric value&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
| Reservation is planned.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
| Reservation is confirmed and contributes to the material's reserved quantity.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
| 20&lt;br /&gt;
| Material has been physically issued.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Cancelled&amp;lt;/span&amp;gt;&lt;br /&gt;
| 30&lt;br /&gt;
| Reservation was cancelled.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Expired&amp;lt;/span&amp;gt;&lt;br /&gt;
| 50&lt;br /&gt;
| Reservation has expired.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Status change rules ===&lt;br /&gt;
&lt;br /&gt;
Status changes are controlled by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The following rules are applied:&lt;br /&gt;
&lt;br /&gt;
* no status change is allowed when the current status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
* changing from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt; back to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; is not allowed&lt;br /&gt;
* other status changes are allowed by this method&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #d33; background-color: #fff5f5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Restriction:''' Once a reservation has status &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;, its status can no longer be changed by the normal status setter logic.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Planned quantity validation ===&lt;br /&gt;
&lt;br /&gt;
The setter of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; validates changes through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A new planned quantity is only allowed if:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt; is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus.Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; is assigned&lt;br /&gt;
* the new quantity is greater than 0&lt;br /&gt;
* the new quantity is lower than or equal to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Quantity rule:''' A planned reservation quantity can only be set while the reservation is still &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; and only if the selected material has enough available quantity.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Actual quantity validation ===&lt;br /&gt;
&lt;br /&gt;
The overridden &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; setter validates changes through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A new actual quantity is only allowed if:&lt;br /&gt;
&lt;br /&gt;
* the new quantity is greater than 0&lt;br /&gt;
* the status is either &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Link editing rules ===&lt;br /&gt;
&lt;br /&gt;
The setters of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; are guarded by reservation status.&lt;br /&gt;
&lt;br /&gt;
The links cannot be changed when the reservation is:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== StorageLocation ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt; is a related object used to represent a physical storage location.&lt;br /&gt;
&lt;br /&gt;
A material can reference a storage location via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Important properties and values ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Values / meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STORAGE_TYPE&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageType&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Floor&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Shelf&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Rack&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Bin&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Pallet&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Container&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ACCESS_TYPE&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AccessType&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Manual&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Forklift&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Crane&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Automated&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OCCUPANCY_STATUS&amp;lt;/span&amp;gt; / &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OccupancyStatus&amp;lt;/span&amp;gt;&lt;br /&gt;
| int / enum&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Empty&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Partial&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Full&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reserved&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Blocked&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OutOfService&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STORAGE_LABEL&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Label of the storage location.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEVEL&amp;lt;/span&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| Level of the storage location.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;POSITION&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Position identifier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GoodsMovement ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt; is a technical base class.&lt;br /&gt;
&lt;br /&gt;
It provides the common &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property for material-related objects such as &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Relations ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Relation&lt;br /&gt;
! Source&lt;br /&gt;
! Target&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;&lt;br /&gt;
| Links a material instance to its master data.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines where the material is stored.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines which material is reserved.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Task&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines the task for which the material is reserved.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Quantity concepts ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Quantity&lt;br /&gt;
! Property / method&lt;br /&gt;
! Object&lt;br /&gt;
! Stored or calculated&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| Material quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Inherited from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Reserved quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Calculated&lt;br /&gt;
| Sum of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; of confirmed reservations for the material.&lt;br /&gt;
|-&lt;br /&gt;
| Available quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Calculated&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; minus &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Actually issued or consumed quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Overrides &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement.QUANTITY&amp;lt;/span&amp;gt; and is validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Reservation workflow ==&lt;br /&gt;
&lt;br /&gt;
=== Creating or editing a reservation ===&lt;br /&gt;
&lt;br /&gt;
Reservations are created manually by the user.&lt;br /&gt;
&lt;br /&gt;
A reservation links a material to a task.&lt;br /&gt;
&lt;br /&gt;
For a reservation to define its planned quantity correctly:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; must be set.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; must point to the task requiring the material.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt; must still be &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must not exceed &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Confirmed reservations ===&lt;br /&gt;
&lt;br /&gt;
When a reservation is confirmed, it contributes to the material's reserved quantity.&lt;br /&gt;
&lt;br /&gt;
This affects the available quantity of the material.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 8px 10px; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
AvailableQuantity = QUANTITY - sum(QTY_PLANNED of confirmed reservations)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Finishing a task ===&lt;br /&gt;
&lt;br /&gt;
When a task is finished, the task logic calls &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CloseReservations()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The method processes active reservations for the task:&lt;br /&gt;
&lt;br /&gt;
* if a reservation has status &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;, it is set to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
* otherwise, it is set to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Cancelled&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Workflow effect:''' Finishing a task closes its reservations. Confirmed reservations become &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;; other active reservations become &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Cancelled&amp;lt;/span&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usage in tasks ==&lt;br /&gt;
&lt;br /&gt;
Reservations are the central link between material handling and task execution.&lt;br /&gt;
&lt;br /&gt;
A reservation connects:&lt;br /&gt;
&lt;br /&gt;
* the required material through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
* the task through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
* the planned quantity through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
* the actually issued or consumed quantity through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
* the reservation state through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This means that material usage is tracked at task level.&lt;br /&gt;
&lt;br /&gt;
== Example workflow ==&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Material master exists ===&lt;br /&gt;
&lt;br /&gt;
A spare part is defined as a &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ITEM_NUMBER&amp;lt;/span&amp;gt;&lt;br /&gt;
| OF-10045&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UNIT_OF_MEASURE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Piece&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SpareParts&amp;lt;/span&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Material exists in a storage location ===&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; object references the material master and a storage location.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
| Oil Filter Type A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
| Storage Shelf A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
| 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Reservation is created for a task ===&lt;br /&gt;
&lt;br /&gt;
A user manually creates a &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; and links the material to the task.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
| Replace oil filter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
| Oil Filter Type A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 4: Reservation is confirmed ===&lt;br /&gt;
&lt;br /&gt;
The reservation status is changed to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
After confirmation, the material's reserved quantity includes the reservation's planned quantity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Quantity&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.AvailableQuantity()&amp;lt;/span&amp;gt; &lt;br /&gt;
| 9&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 5: Actual quantity is entered ===&lt;br /&gt;
&lt;br /&gt;
The actually issued or consumed quantity is stored in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation.QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation.QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 6: Task is finished ===&lt;br /&gt;
&lt;br /&gt;
When the task is finished, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CloseReservations()&amp;lt;/span&amp;gt; is called.&lt;br /&gt;
&lt;br /&gt;
The confirmed reservation is changed to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Validation and business rules ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Area&lt;br /&gt;
! Rule&lt;br /&gt;
! Implemented by&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; can only be changed while the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must not exceed &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Actual issued or consumed quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Actual issued or consumed quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; can only be changed while the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Reservation status&lt;br /&gt;
| Status cannot be changed once the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Reservation status&lt;br /&gt;
| A reservation cannot be changed from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt; back to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Reservation links&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; cannot be changed when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Property setters&lt;br /&gt;
|-&lt;br /&gt;
| Material deletion&lt;br /&gt;
| Material cannot be deleted while &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; is greater than 0.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;InternalDeleteAllowed()&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| Material deletion&lt;br /&gt;
| Material cannot be deleted while active reservations exist.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;InternalDeleteAllowed()&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;HasActiveReservation()&amp;lt;/span&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[MRO (Plugin)]]&lt;br /&gt;
* [[MRO_Objects_(Client)]]&lt;br /&gt;
* [[MRO_Implemented_Objects]]&lt;br /&gt;
* [[MROMaintenancePlans]]&lt;br /&gt;
{{UnderConstructionEnd}}&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	<entry>
		<id>https://wiki.augmensys.com/index.php?title=MRO_Material_Management&amp;diff=29988</id>
		<title>MRO Material Management</title>
		<link rel="alternate" type="text/html" href="https://wiki.augmensys.com/index.php?title=MRO_Material_Management&amp;diff=29988"/>
				<updated>2026-06-18T14:48:44Z</updated>
		
		<summary type="html">&lt;p&gt;LMA: /* Usage in tasks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UnderConstructionStart}}&lt;br /&gt;
== MRO Material Management ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''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 &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;, and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt;. Materials are linked to master data and storage locations. Reservations link materials to tasks and define planned or actual quantities for maintenance work.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MRO material management is used to support maintenance work with the required spare parts, consumables, tools, or other material items.&lt;br /&gt;
&lt;br /&gt;
In a maintenance workflow, users may need to know:&lt;br /&gt;
&lt;br /&gt;
* which material is required for a task&lt;br /&gt;
* which material master data belongs to a material&lt;br /&gt;
* where the material is stored&lt;br /&gt;
* how much material is available&lt;br /&gt;
* how much material is already reserved&lt;br /&gt;
* which reservations exist for a task&lt;br /&gt;
* whether a reservation is planned, confirmed, issued, cancelled, or expired&lt;br /&gt;
&lt;br /&gt;
The material management implementation separates the general material catalogue from the actual material quantity and reservation handling.&lt;br /&gt;
&lt;br /&gt;
== Basic concept ==&lt;br /&gt;
&lt;br /&gt;
The material management implementation is built around the following main objects:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Object&lt;br /&gt;
! Type&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;&lt;br /&gt;
| Master data&lt;br /&gt;
| Defines the catalogue entry for a material, including item number, unit, packaging, manufacturer data, and material type.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Quantity-bearing MRO object&lt;br /&gt;
| 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.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Workflow / transaction object&lt;br /&gt;
| Represents a material reservation for a task. It links a material to a task and stores planned and actual quantities.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;&lt;br /&gt;
| Base class&lt;br /&gt;
| Provides the common &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property used by both materials and reservations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Storage master / location object&lt;br /&gt;
| Represents a physical storage location and stores storage-related information such as storage type, dimensions, access type, and occupancy status.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Core idea:''' &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt; defines what the material is. &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; represents the material in the MRO stock or material context. &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; links a material to a task and reserves a planned quantity for maintenance execution.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Object overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Object&lt;br /&gt;
! Class name&lt;br /&gt;
! Base / inheritance&lt;br /&gt;
! Main relations&lt;br /&gt;
|-&lt;br /&gt;
| Material&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UBIK.MRO.Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Inherits from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Material Master&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UBIK.MRO.MaterialMaster&amp;lt;/span&amp;gt;&lt;br /&gt;
| Master data class&lt;br /&gt;
| Referenced by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Reservation&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UBIK.MRO.Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Inherits from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Goods Movement&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UBIK.MRO.GoodsMovement&amp;lt;/span&amp;gt;&lt;br /&gt;
| Base class&lt;br /&gt;
| Provides &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; to derived objects&lt;br /&gt;
|-&lt;br /&gt;
| Storage Location&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UBIK.MRO.StorageLocation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Functional location specialization&lt;br /&gt;
| Referenced by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GoodsMovement ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt; is the base class for material-related quantity-bearing objects.&lt;br /&gt;
&lt;br /&gt;
It defines the common quantity concept used by both:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Quantity value for the goods movement. For &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;, this is the material quantity. For &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;, this is the actual reservation quantity and has reservation-specific validation.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MaterialMaster ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt; represents the material master or catalogue entry.&lt;br /&gt;
&lt;br /&gt;
It stores item-level master data that can be referenced by material instances in MRO.&lt;br /&gt;
&lt;br /&gt;
A material master describes the material independently from a concrete reservation or task.&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ITEM_NUMBER&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Item number or material number of the material master.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PACKAGING_UNIT&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Packaging unit of the material.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;PACKAGING_SIZE&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Packaging size.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ACTIVE&amp;lt;/span&amp;gt;&lt;br /&gt;
| bool&lt;br /&gt;
| Defines whether the material master is active.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UNIT_OF_MEASURE&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Unit of measure used for the material.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_TYPE&amp;lt;/span&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| Underlying integer value for the material type.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt;&lt;br /&gt;
| enum&lt;br /&gt;
| Typed accessor for &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_TYPE&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MANUFACTURER_COMPANY_NAME&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Manufacturer company name.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MANUFACTURER_PRODUCT_TAG&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Manufacturer product tag or product identifier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Material type ===&lt;br /&gt;
&lt;br /&gt;
The typed material type accessor is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Known values are:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SpareParts&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Consumables&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Tools&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Material ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; represents a material instance or stock entry in MRO.&lt;br /&gt;
&lt;br /&gt;
It inherits from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt; and therefore uses the inherited &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property as its material quantity.&lt;br /&gt;
&lt;br /&gt;
A material links to:&lt;br /&gt;
&lt;br /&gt;
* a material master via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
* a storage location via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It also exposes calculated reservation and availability logic.&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
! Stored or calculated&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the material master data.&lt;br /&gt;
| Stored link&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the storage location where the material is located.&lt;br /&gt;
| Stored link&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Material quantity. Inherited from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Stored property&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Sum of planned quantities of confirmed reservations for this material.&lt;br /&gt;
| Calculated property&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_STATUS&amp;lt;/span&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| Underlying integer value for the material status.&lt;br /&gt;
| Stored property&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialStatus&amp;lt;/span&amp;gt;&lt;br /&gt;
| enum&lt;br /&gt;
| Typed accessor for &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_STATUS&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Stored through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_STATUS&amp;lt;/span&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Material status ===&lt;br /&gt;
&lt;br /&gt;
The material status is stored in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MATERIAL_STATUS&amp;lt;/span&amp;gt; and exposed through the typed accessor &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialStatus&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Known values are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Numeric value&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Undefined&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
| No specific material status is defined.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Inactive&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
| Material is inactive.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Active&amp;lt;/span&amp;gt;&lt;br /&gt;
| 20&lt;br /&gt;
| Material is active.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Reserved quantity ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt; is calculated at read time.&lt;br /&gt;
&lt;br /&gt;
The calculation uses reservations where:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; points to the current material&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STATUS&amp;lt;/span&amp;gt; is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus.Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The calculated value is the sum of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; of these confirmed reservations.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Important:''' &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt; is not treated as a normal stored quantity in the business logic. It is computed from confirmed &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; objects.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Available quantity ===&lt;br /&gt;
&lt;br /&gt;
The available material quantity is calculated by the method &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 8px 10px; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
AvailableQuantity = QUANTITY - RESERVED_QUANTITY&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Active reservations ===&lt;br /&gt;
&lt;br /&gt;
The method &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;HasActiveReservation()&amp;lt;/span&amp;gt; checks whether active reservations exist for the material.&lt;br /&gt;
&lt;br /&gt;
It queries reservations where:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; points to the current material&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STATUS&amp;lt;/span&amp;gt; is lower than or equal to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus.Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This means the method considers reservations up to the confirmed state as active.&lt;br /&gt;
&lt;br /&gt;
=== Delete behavior ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.InternalDeleteAllowed()&amp;lt;/span&amp;gt; prevents deleting a material if it still has quantity or active reservations.&lt;br /&gt;
&lt;br /&gt;
Deletion is only allowed if the base delete conditions are fulfilled and:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; is lower than or equal to 0&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;HasActiveReservation()&amp;lt;/span&amp;gt; returns false&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #d33; background-color: #fff5f5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Restriction:''' A &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; cannot be deleted while it has a quantity greater than 0 or active reservations.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reservation ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; represents a material reservation for a task.&lt;br /&gt;
&lt;br /&gt;
It links:&lt;br /&gt;
&lt;br /&gt;
* a task via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
* a material via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It stores the planned reservation quantity in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; and can also store an actual quantity through the overridden &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
! Important behavior&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Task&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the task for which the material is reserved.&lt;br /&gt;
| Setter is blocked when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Link to the material being reserved.&lt;br /&gt;
| Setter is blocked when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STATUS&amp;lt;/span&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| Underlying integer value for the reservation status.&lt;br /&gt;
| Changes are validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus&amp;lt;/span&amp;gt;&lt;br /&gt;
| Typed accessor for &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STATUS&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Uses the &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus&amp;lt;/span&amp;gt; enum.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Planned quantity for the reservation.&lt;br /&gt;
| Setter validates through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Actual reservation quantity. Overrides &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement.QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Setter validates through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Reservation status ===&lt;br /&gt;
&lt;br /&gt;
The reservation status is stored in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STATUS&amp;lt;/span&amp;gt; and exposed through the typed accessor &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Known values of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus&amp;lt;/span&amp;gt; are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Status&lt;br /&gt;
! Numeric value&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
| Reservation is planned.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
| Reservation is confirmed and contributes to the material's reserved quantity.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
| 20&lt;br /&gt;
| Material has been physically issued.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Cancelled&amp;lt;/span&amp;gt;&lt;br /&gt;
| 30&lt;br /&gt;
| Reservation was cancelled. This is only allowed if the reservation has not been issued.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Expired&amp;lt;/span&amp;gt;&lt;br /&gt;
| 50&lt;br /&gt;
| Reservation has expired.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Status change rules ===&lt;br /&gt;
&lt;br /&gt;
Status changes are controlled by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The following rules are applied:&lt;br /&gt;
&lt;br /&gt;
* no status change is allowed when the current status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
* changing from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt; back to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; is not allowed&lt;br /&gt;
* other status changes are allowed by this method&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #d33; background-color: #fff5f5; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Restriction:''' Once a reservation has status &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;, its status can no longer be changed by the normal status setter logic.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Planned quantity validation ===&lt;br /&gt;
&lt;br /&gt;
The setter of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; validates changes through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A new planned quantity is only allowed if:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt; is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus.Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; is assigned&lt;br /&gt;
* the new quantity is greater than 0&lt;br /&gt;
* the new quantity is lower than or equal to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Quantity rule:''' A planned reservation quantity can only be set while the reservation is still &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; and only if the selected material has enough available quantity.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Actual quantity validation ===&lt;br /&gt;
&lt;br /&gt;
The overridden &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; setter validates changes through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A new actual quantity is only allowed if:&lt;br /&gt;
&lt;br /&gt;
* the new quantity is greater than 0&lt;br /&gt;
* the status is either &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Link editing rules ===&lt;br /&gt;
&lt;br /&gt;
The setters of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; are guarded by reservation status.&lt;br /&gt;
&lt;br /&gt;
The links cannot be changed when the reservation is:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This prevents changing the task or material after the reservation has reached a more binding status.&lt;br /&gt;
&lt;br /&gt;
== StorageLocation ==&lt;br /&gt;
&lt;br /&gt;
=== Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt; represents a physical storage location.&lt;br /&gt;
&lt;br /&gt;
It is a functional location specialization and can be linked from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; via &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A storage location stores information about storage type, dimensions, access type, label, level, position, and occupancy.&lt;br /&gt;
&lt;br /&gt;
=== Important properties ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Type&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STORAGE_TYPE&amp;lt;/span&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| Underlying integer value for storage type.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageType&amp;lt;/span&amp;gt;&lt;br /&gt;
| enum&lt;br /&gt;
| Typed accessor for &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STORAGE_TYPE&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MAX_WEIGHT&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Maximum allowed weight for the storage location.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MAX_VOLUME&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Maximum allowed volume for the storage location.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LENGTH&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Length of the storage location.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;WIDTH&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Width of the storage location.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;HEIGHT&amp;lt;/span&amp;gt;&lt;br /&gt;
| double&lt;br /&gt;
| Height of the storage location.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ACCESS_TYPE&amp;lt;/span&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| Underlying integer value for access type.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AccessType&amp;lt;/span&amp;gt;&lt;br /&gt;
| enum&lt;br /&gt;
| Typed accessor for &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ACCESS_TYPE&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;STORAGE_LABEL&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Label of the storage location.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LEVEL&amp;lt;/span&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| Level of the storage location.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;POSITION&amp;lt;/span&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| Position identifier.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OCCUPANCY_STATUS&amp;lt;/span&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| Underlying integer value for occupancy status.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OccupancyStatus&amp;lt;/span&amp;gt;&lt;br /&gt;
| enum&lt;br /&gt;
| Typed accessor for &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OCCUPANCY_STATUS&amp;lt;/span&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Storage type ===&lt;br /&gt;
&lt;br /&gt;
Known values of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageType&amp;lt;/span&amp;gt; are:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Floor&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Shelf&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Rack&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Bin&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Pallet&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Container&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Access type ===&lt;br /&gt;
&lt;br /&gt;
Known values of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AccessType&amp;lt;/span&amp;gt; are:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Manual&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Forklift&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Crane&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Automated&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Occupancy status ===&lt;br /&gt;
&lt;br /&gt;
Known values of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OccupancyStatus&amp;lt;/span&amp;gt; are:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Empty&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Partial&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Full&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reserved&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Blocked&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;OutOfService&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Relations ==&lt;br /&gt;
&lt;br /&gt;
The following relations are relevant for material management.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Relation&lt;br /&gt;
! Source&lt;br /&gt;
! Target&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;&lt;br /&gt;
| Links a material instance to its master data.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;StorageLocation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines where the material is stored.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines which material is reserved.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Task&amp;lt;/span&amp;gt;&lt;br /&gt;
| Defines the task for which the material is reserved.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Quantity concepts ==&lt;br /&gt;
&lt;br /&gt;
=== Material quantity ===&lt;br /&gt;
&lt;br /&gt;
The material quantity is stored in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Because &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; inherits from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;, the property is inherited from the base class.&lt;br /&gt;
&lt;br /&gt;
=== Reserved quantity ===&lt;br /&gt;
&lt;br /&gt;
The reserved quantity is exposed through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.RESERVED_QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
It is calculated by summing the &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; values of confirmed reservations for the material.&lt;br /&gt;
&lt;br /&gt;
Only reservations with &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt; equal to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ReservationStatus.Confirmed&amp;lt;/span&amp;gt; are included in this calculation.&lt;br /&gt;
&lt;br /&gt;
=== Available quantity ===&lt;br /&gt;
&lt;br /&gt;
Available quantity is calculated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 8px 10px; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
AvailableQuantity = QUANTITY - RESERVED_QUANTITY&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Planned reservation quantity ===&lt;br /&gt;
&lt;br /&gt;
The planned reservation quantity is stored in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation.QTY_PLANNED&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
It can only be set if:&lt;br /&gt;
&lt;br /&gt;
* the reservation is still &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
* a material is assigned&lt;br /&gt;
* the quantity is greater than 0&lt;br /&gt;
* the quantity does not exceed the material's available quantity&lt;br /&gt;
&lt;br /&gt;
=== Actual reservation quantity ===&lt;br /&gt;
&lt;br /&gt;
The actual reservation quantity is stored in &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation.QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
This property overrides &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement.QUANTITY&amp;lt;/span&amp;gt; and can only be set if the status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt; and the new quantity is greater than 0.&lt;br /&gt;
&lt;br /&gt;
=== Quantity overview ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Quantity&lt;br /&gt;
! Property / method&lt;br /&gt;
! Object&lt;br /&gt;
! Stored or calculated&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| Material quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Inherited from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Reserved quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Calculated&lt;br /&gt;
| Sum of &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; of confirmed reservations for the material.&lt;br /&gt;
|-&lt;br /&gt;
| Available quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt;&lt;br /&gt;
| Calculated&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; minus &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Actual reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt;&lt;br /&gt;
| Stored&lt;br /&gt;
| Overrides &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement.QUANTITY&amp;lt;/span&amp;gt; and is validated by &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Reservation workflow ==&lt;br /&gt;
&lt;br /&gt;
=== Creating or editing a reservation ===&lt;br /&gt;
&lt;br /&gt;
A reservation links a material to a task.&lt;br /&gt;
&lt;br /&gt;
For a reservation to define its planned quantity correctly:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; must be set.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; should point to the task requiring the material.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt; must still be &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
# &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must not exceed &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Confirmed reservations ===&lt;br /&gt;
&lt;br /&gt;
When a reservation is confirmed, it contributes to the material's reserved quantity.&lt;br /&gt;
&lt;br /&gt;
This affects the available quantity of the material because:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 8px 10px; margin: 10px 0;&amp;quot;&amp;gt;&lt;br /&gt;
AvailableQuantity = QUANTITY - sum(QTY_PLANNED of confirmed reservations)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Finishing a task ===&lt;br /&gt;
&lt;br /&gt;
When a task is finished, the task logic calls &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CloseReservations()&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The method processes active reservations for the task:&lt;br /&gt;
&lt;br /&gt;
* if a reservation has status &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;, it is set to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;&lt;br /&gt;
* otherwise, it is set to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Cancelled&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The changed reservations are added to the unsaved children through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AddToUnsavedChildren(reservation)&amp;lt;/span&amp;gt; so that the changes are persisted.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background-color: #f8f9fa; padding: 10px 12px; margin: 12px 0;&amp;quot;&amp;gt;&lt;br /&gt;
'''Workflow effect:''' Finishing a task closes its reservations. Confirmed reservations become &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;; other active reservations become &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Cancelled&amp;lt;/span&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usage in tasks ==&lt;br /&gt;
&lt;br /&gt;
Reservations are the central link between material handling and task execution.&lt;br /&gt;
&lt;br /&gt;
A reservation connects:&lt;br /&gt;
&lt;br /&gt;
* the required material through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
* the task through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
* the planned quantity through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
* the reservation state through &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This means that material usage is tracked at task level in the inspected implementation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Goods movement usage ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;GoodsMovement&amp;lt;/span&amp;gt; is the common base class for quantity-bearing material objects.&lt;br /&gt;
&lt;br /&gt;
Both &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; inherit from it and expose &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In the inspected implementation:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.QUANTITY&amp;lt;/span&amp;gt; represents the material quantity&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation.QUANTITY&amp;lt;/span&amp;gt; represents the actual quantity for the reservation and applies reservation-specific validation&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation.QTY_PLANNED&amp;lt;/span&amp;gt; represents the planned reserved quantity&lt;br /&gt;
* &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.RESERVED_QUANTITY&amp;lt;/span&amp;gt; is calculated from confirmed reservations&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Example workflow ==&lt;br /&gt;
&lt;br /&gt;
=== Scenario ===&lt;br /&gt;
&lt;br /&gt;
A task requires one spare part from stock.&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Material master exists ===&lt;br /&gt;
&lt;br /&gt;
The spare part is defined as a &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialMaster&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;ITEM_NUMBER&amp;lt;/span&amp;gt;&lt;br /&gt;
| OF-10045&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;UNIT_OF_MEASURE&amp;lt;/span&amp;gt;&lt;br /&gt;
| Piece&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;MaterialType&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;SpareParts&amp;lt;/span&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Material exists in a storage location ===&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material&amp;lt;/span&amp;gt; object references the material master and a storage location.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL_MASTER&amp;lt;/span&amp;gt;&lt;br /&gt;
| Oil Filter Type A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_STORAGE_LOCATION&amp;lt;/span&amp;gt;&lt;br /&gt;
| Storage Shelf A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AvailableQuantity()&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Reservation is created for a task ===&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Reservation&amp;lt;/span&amp;gt; links the material to the task.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt;&lt;br /&gt;
| Replace oil filter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt;&lt;br /&gt;
| Oil Filter Type A&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Status&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The planned quantity is allowed because the material has enough available quantity.&lt;br /&gt;
&lt;br /&gt;
=== Step 4: Reservation is confirmed ===&lt;br /&gt;
&lt;br /&gt;
The reservation status is changed to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
After confirmation, the material's reserved quantity includes the reservation's planned quantity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Quantity&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.RESERVED_QUANTITY&amp;lt;/span&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Material.AvailableQuantity()&amp;lt;/span&amp;gt;&lt;br /&gt;
| 9&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Step 5: Task is finished ===&lt;br /&gt;
&lt;br /&gt;
When the task is finished, &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;CloseReservations()&amp;lt;/span&amp;gt; is called.&lt;br /&gt;
&lt;br /&gt;
The confirmed reservation is changed to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Validation and business rules ==&lt;br /&gt;
&lt;br /&gt;
The following business rules are implemented in the inspected material management logic.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Area&lt;br /&gt;
! Rule&lt;br /&gt;
! Implemented by&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; can only be changed while the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Planned reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QTY_PLANNED&amp;lt;/span&amp;gt; must not exceed &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL.AvailableQuantity()&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantityPlanned(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Actual reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; must be greater than 0.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Actual reservation quantity&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; can only be changed while the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowQuantity(double)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Reservation status&lt;br /&gt;
| Status cannot be changed once the reservation is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Reservation status&lt;br /&gt;
| A reservation cannot be changed from &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt; back to &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Planned&amp;lt;/span&amp;gt;.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;AllowStatusChange(int newStatus)&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Reservation links&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_TASK&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;LK_MATERIAL&amp;lt;/span&amp;gt; cannot be changed when status is &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Issued&amp;lt;/span&amp;gt; or &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;Confirmed&amp;lt;/span&amp;gt;.&lt;br /&gt;
| Property setters&lt;br /&gt;
|-&lt;br /&gt;
| Material deletion&lt;br /&gt;
| Material cannot be deleted while &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;QUANTITY&amp;lt;/span&amp;gt; is greater than 0.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;InternalDeleteAllowed()&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Material deletion&lt;br /&gt;
| Material cannot be deleted while active reservations exist.&lt;br /&gt;
| &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;InternalDeleteAllowed()&amp;lt;/span&amp;gt; and &amp;lt;span style=&amp;quot;font-family: Consolas, 'Courier New', monospace; color: #202122; background-color: #f8f9fa; border: 1px solid #c8ccd1; border-radius: 3px; padding: 1px 4px; white-space: nowrap;&amp;quot;&amp;gt;HasActiveReservation()&amp;lt;/span&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{UnderConstructionEnd}}&lt;/div&gt;</summary>
		<author><name>LMA</name></author>	</entry>

	</feed>