---
alias: meddev-feature-linkedlines
---
# Linked Lines
## Overview
The Linked Lines feature provides a logical mechanism to associate resources that belong to the same production line and to enforce line continuity during Material processing.
Once a Material begins processing on a line, subsequent dispatch operations are validated against that line. This prevents a Material from being dispatched to a Resource on a different line that shares the same service, ensuring that materials follow a defined line throughout the process.
---
## Concept
The feature tracks line assignments using the following attributes:
- **MedDevResourceLine** – defined on a **Resource**, identifies the line it belongs to.
- **MedDevCurrentLine** – defined on the **Material**, stores the line the Material was last processed on.
- **MedDevOriginalLine** – defined on the **Material**, temporarily holds the current line when the Material enters a Rework or Off-Flow. Cleared when the Material returns.
- **MedDevReturnToOriginalLineOnReworkExit** – defined on a **Flow**, it will determine if the value of the Material's **MedDevCurrentLine** attribute is saved in its **MedDevOriginalLine** once it enters the Flow in the context of a Rework or Off-Flow action.
- **MedDevClearCurrentLineOnReworkEnter** – defined on a **Flow**, it will determine if the Material's **MedDevCurrentLine** attribute is cleared once it enters the Flow in the context of a Rework or Off-Flow action.
All line values reference the `MedDevProcessLines` Lookup table.

---
## Assumptions
- Resources belonging to the same physical line share the same `MedDevResourceLine` value.
- Resources that are shared across lines, or not part of any line, have `MedDevResourceLine` left empty.
- A Material with an empty `MedDevCurrentLine` is not subject to line validation at dispatch.
---
## Configuration
### Feature Security
| Feature | Description |
| -------------------- | ------------------------------------------------------------------------ |
| `MedDev.ChangeLine` | Grants access to the Change Line button on Material/Step/Resource views |

!!! note
Feature level security level also must be enable for the **Change Material Line** functionality (described below)

### Lookup Table
Populate the `MedDevProcessLines` Lookup table with the line names that will be used.
!!! note
`MedDevResourceLine`, `MedDevCurrentLine`, and `MedDevOriginalLine` attributes will reference this table.
### Resource Attribute
Set `MedDevResourceLine` on each Resource with the appropriate line value from `MedDevProcessLines`.
Leave the attribute empty for resources that are not assigned to a specific line.
### Flow Attributes
For Rework and Off-Flow flows, configure the following attributes as required:
| Attribute | Type | Description |
| ---------------------------------------- | ---- | -------------------------------------------------------------------------------- |
| `MedDevClearCurrentLineOnReworkEnter` | Bool | When `true`, clears `MedDevCurrentLine` when the Material enters the Flow |
| `MedDevReturnToOriginalLineOnReworkExit` | Bool | When `true`, saves `MedDevCurrentLine` into `MedDevOriginalLine` before clearing |
!!! note
`MedDevOriginalLine` is always captured **before** `MedDevCurrentLine` is cleared. If both attributes are `true`, the original line is stored first, then the current line is cleared.
---
## Dispatch Validation
`Dispatch` and `Dispatch & Track-In` operations include a pre-validation check that compares the Material's current line against the target Resource's line.
### Logic
```
If MedDevCurrentLine is empty OR MedDevResourceLine is empty:
- No validation error. Process continues normally.
If both have values AND they match:
- No validation error. Process continues normally.
If both have values AND they differ:
- Error raised. Operation blocked.
```
---
## Track-Out Behavior
Track-Out applies the following logic (post-processing):
| Condition | Result |
| ------------------------------------------------------------------ | -------------------------------------------------------------------- |
| `MedDevResourceLine` is not empty | `MedDevCurrentLine` will be replaced with `MedDevResourceLine` value |
| `MedDevResourceLine` is empty and `MedDevCurrentLine` is not empty | `MedDevCurrentLine` is cleared |
| Both are empty | No change |
Materials created via Partial Track-Out follow the same logic. The newly created Material's `MedDevCurrentLine` is set or cleared based on the same Resource line rules.
---
## Rework and Off-Flow Handling
### On Entry
When a Material is sent to a Rework or Off-Flow:
1. If `MedDevReturnToOriginalLineOnReworkExit` = `true`:
- `MedDevOriginalLine` will be replaced with current value of `MedDevCurrentLine`
2. If `MedDevClearCurrentLineOnReworkEnter` = `true`:
- `MedDevCurrentLine` is cleared
### On Return
When a Material returns from a Rework or Off-Flow:
| Condition | Result |
| --------------------------------- | ---------------------------------------------------------------------------------------------------- |
| `MedDevOriginalLine` is not empty | `MedDevCurrentLine` will be replaced with `MedDevOriginalLine`, then `MedDevOriginalLine` is cleared |
| `MedDevOriginalLine` is empty | `MedDevCurrentLine` is cleared |
---
## GUI Resource Filtering
The Resource selection list in Dispatch and Dispatch & Track-In is filtered based on the Material's current line.
| Material MedDevCurrentLine | Resource list shown |
| -------------------------- | -------------------------------------------------------------------------------- |
| Empty | All eligible resources (standard behavior) |
| Has a value | Only resources whose `MedDevResourceLine` matches, or has no line assigned at all |
This filtering is implemented via the `MedDevDispatchLinkedLineResourceFilter` DEE.
---
## Change Material Line
Operators can manually update a Material's `MedDevCurrentLine` directly from the interface using the **Change Line** action.
### Access
The **Change Line** button is available in the following views:
- Material Details
- Step View (with selected Material)
- Resource View (with selected Material)
The button is only displayed to users who have been granted the `MedDev.ChangeLine` feature permission. Users without this permission will not see the button.
### Wizard

When the **Change Line** button is clicked, a single-step wizard titled **Change Line** is displayed containing:
- The Material's **current line**, shown as read-only (display empty value if the current line is empty).

- A **drop-down** populated from the `MedDevProcessLines` Lookup table to select the new line.

On confirmation:
- The Material's `MedDevCurrentLine` is updated to the selected value.
- The wizard closes.
!!! note
Confirming the wizard **without selecting a new line** is not permitted. The system will display a validation message and prevent the operation from completing until a valid line is selected.
---
## Attribute Reference
| Attribute | Entity | Type | Visibility | Purpose |
| ---------------------------------------- | -------- | ------ | ---------- | ------------------------------------------------------------ |
| `MedDevResourceLine` | Resource | String | Visible | Identifies the line the Resource belongs to |
| `MedDevCurrentLine` | Material | String | Visible | Stores the line the Material was last processed on |
| `MedDevOriginalLine` | Material | String | Visible | Temporarily holds the line during Rework / Off-Flow |
| `MedDevClearCurrentLineOnReworkEnter` | Flow | Bool | Visible | Controls whether the current line is cleared on rework entry |
| `MedDevReturnToOriginalLineOnReworkExit` | Flow | Bool | Visible | Controls whether the original line is stored on rework entry |
For a complete description of the Lookup table, see the [Tables](../artifacts/tables.md) artifact reference.