> ## Documentation Index
> Fetch the complete documentation index at: https://docs.alforse.com/llms.txt
> Use this file to discover all available pages before exploring further.

# The MES app

> The shop-floor surface where operators run operations, report quantities, issue material, and log their time.

The MES app is Alforse's shop-floor interface. Planners release and schedule work in the ERP; operators execute and report that work from tablets or shared stations in MES. See [jobs](/docs/reference/jobs.md), [picking lists](/docs/reference/picking.md), and [quality](/docs/reference/quality.md) for the underlying records.

MES requires a network connection for all writes. It caches item and people picker data in IndexedDB for faster reads, but it has **no offline mode**. Operators cannot start work, report output, or issue material while disconnected.

## Getting onto the floor

An operator signs in on the login screen with whichever methods the company has enabled: **"Sign in with Google"**, **"Sign in with Outlook"**, **"Sign in with Passkey"**, or an email address with **"Continue"** (a magic link, which lands on a **"Check your email"** confirmation). The available buttons follow the company's `AUTH_PROVIDERS`, so a floor that only allows passkeys sees only that one.

Once in, the operator sets their context. If the company has more than one location, a **"Location"** submenu appears in the sidebar to pick which floor they're standing on. With a single location the choice is skipped entirely. This selection scopes the board, the assigned lists, and everything they report.

### Console (shared-station) mode

**Console mode** turns a station into a shared kiosk. It requires the Business plan and the `consoleEnabled` company setting. Enabling console mode requires `settings_update` permission on the signed-in account; any operator can disable it.

In console mode an operator identifies themselves with a **4-digit PIN**, not a full login. PINs are generated by Alforse and handed out by an admin — shown once when an operator is created or a PIN is reset, and stored only as a hash (see [shop-floor PIN accounts](/docs/reference/permissions.md#shop-floor-pin-accounts)). The station prompts to enter a PIN for the named operator, checks it, and attributes the work to that person. Three things stop it: **"Incorrect PIN"**, **"Too many incorrect PINs. Please wait a few minutes and try again."** after repeated wrong guesses, or **"No PIN set. Ask an admin to set a console PIN for you."** if the person has none yet.

NOTE

**One station, many operators**

A shared station is meant to hand off. **"Switch Operator"** re-prompts for a PIN so the next person takes over, and **"Pin Out"** clears the current operator. Ending the shift also pins out automatically. The PIN identifies *who did the work*; it is not a substitute for the person's real account.

## The operations board

Released work appears on the **Schedule** board, with one column per work center. Each column lists queued operations by dispatch priority; the first card is the next scheduled operation.

The board is **display and filter only**. A Display popover lets each station tune its own view, toggling **"Empty work centers"** on or off and showing or hiding **"Customer"**, **"Description"**, **"Due Date"**, **"Duration"**, **"Progress"**, **"Status"**, **"Sales Order"**, and **"Thumbnail"** on each card. Filters narrow the queue by **"Work Center"**, **"Process"**, **"Tag"**, or **"Assignee"**.

HEADS UP

**The floor shows the plan; it doesn't reshuffle it.**

Operators can filter and focus, but they cannot drag a card to reschedule it. Rebalancing the plan, moving an operation to a different work center or shifting a job's dates, happens on the [ERP scheduling boards](/docs/reference/scheduling.md), where a planner owns the sequence. What reaches the floor is the result.

### Focused lists

Alongside the board, three sidebar lists cut the queue down to what one operator cares about right now:

FieldType

<details>
  <summary>**Assigned to Me**</summary>

  Operations assigned to the signed-in operator, grouped by work center. Empty state: **"No assigned operations"**.
</details>

<details>
  <summary>**Active**</summary>

  Operations the operator currently has running (a production event is open). Empty state: **"No active operations"**.
</details>

<details>
  <summary>**Recent**</summary>

  Operations the operator recently touched, for quick return. Empty state: **"No recent operations"**.
</details>

Each card carries a status badge, its progress, and a deadline chip (**"ASAP"**, **"No Deadline"**, or a date that turns red when overdue). The badge tracks the operation's own status, not the job's.

### Open Jobs

The **"Open Jobs"** list is the job-level view: columns for **Job**, **Item**, **Quantity**, **Tracking**, **Assignee**, **Due Date**, **Deadline**, and **Status**. One relabel to know here, because it trips people up:

NOTE

**A job at "Ready" shows as "Released" on the floor.**

The ERP job status jobs reach when they're cleared to run is `Ready`, but the MES Open Jobs list renders that same value as **"Released"** — the floor's word for "you can start this now." It's a display alias, not a different status. `Closed` jobs also surface in this list.

Opening a job shows its operations as a directed graph (the routing DAG), so an operator sees what feeds what. The toolbar lays it out **"Left to Right"** or **"Top to Bottom"** and offers **"Fit"**; nodes flag a **"Rework"** loop and a scrapped-quantity count when they apply.

## Running an operation

Open an operation and the station panel is where the shift actually happens. A big control starts and stops the clock: **"Start"** opens a production event, **"Pause"** closes it. A toggle picks which kind of time is being logged, matching the three production event types: **"Setup"**, **"Labor"**, or **"Machine"**. The panel is tabbed into **details**, **model** (the 3D part view), **procedure** (work instructions, with **attributes** and **parameters** sub-views), and **chat** (a per-operation note thread).

### The guided assembly view

An operation whose type is **Assembly** opens a guided 3D view instead of a plain part model: the assembly plays back one step at a time, and each step lights up the components it installs.

The player toolbar provides three visibility modes for exposing the current step:

FieldType

<details>
  <summary>**Build**</summary>

  The assembly as it stands on the bench right now: everything fitted so far is solid, and anything from a later step is not drawn. This is the default.
</details>

<details>
  <summary>**Focus**</summary>

  The already-fitted parts fade to see-through, so the current step's components are visible in place without losing the shape around them.
</details>

<details>
  <summary>**Full**</summary>

  Every component solid, the finished product.
</details>

The view only changes what the operator sees. It never changes the step order, the components a step installs, or anything reported back.

The author can also hide parts that get in the way on a particular step, and group steps into a sub-assembly that is built on its own before it goes in as one piece. Both play here exactly as authored; see [assembly instructions](/docs/reference/assembly-instructions.md).

NOTE

**The camera follows what is drawn.**

Picking a view that hides parts also stops the camera treating them as obstacles. On **Build** and **Focus**, parts from later steps are not drawn, so the view angle never angles around them.

The same control appears in the ERP assembly editor, where an author checks that a step reads clearly before publishing. An author and an operator ask the model the same question, so the buttons mean the same thing on both screens.

### Reporting quantities

Good, bad, and reworked units are reported separately, so yield stays honest:

FieldType

<details>
  <summary>**Log Completed**</summary>

  Records good units off this operation. **"Complete All"** fills the remaining quantity; **"Total Quantity"** sets it explicitly.
</details>

<details>
  <summary>**Log Scrap**</summary>

  Records scrapped units against a required **"Scrap Reason"**, so the loss is attributable. The unit flips to **"Scrapped"**, a replacement is spawned, and the routing reopens — see [scrap and unscrap](/docs/reference/scrap.md).
</details>

<details>
  <summary>**Log Rework**</summary>

  Records units reworked in place at this operation, without sending them anywhere.
</details>

Reworking *in place* is different from sending a unit back upstream. **"Create Rework"** does the latter: pick an operation under **"Go back to operation"**, give a **"Reason for rework"**, and Alforse re-runs every operation from that point forward to the current one.

Closing the operation is a distinct action. **"Mark as Done"** ends any open events and flips the operation to `Done`. If quantities or steps aren't satisfied Alforse warns (**"Insufficient quantity"**, **"Steps are missing"**) and the button reads **"Mark as Done Anyways"**. A guard also fires when tracked material was never issued; the operator must acknowledge **"I understand and want to complete without issuing"** to proceed.

HEADS UP

**"End Operations" is not the same as finishing.**

**"End Operations"** ends *all* the operator's active production events at once (a clean end-of-shift stop) and, when time cards are on, clocks them out. It does **not** complete or finish any operation. The work stays exactly where it was, ready to resume next shift.

### Issuing material

Material is consumed against an operation from the same panel. The **"Issue"** action has an Adjustment Type: **"Add to Inventory"** (a `Positive Adjmt.`) or **"Pull from Inventory"** (a `Negative Adjmt.`). For serial- or batch-tracked material, tabs let the operator **"Scan"** a barcode, **"Select"** from stock, or **"Unconsume"** to return material already issued.

One edge case surfaces right in the flow rather than failing silently. Issuing expired stock is governed by a policy (`Warn`, `Block`, or `BlockWithOverride`); an overridable block asks for a **"Reason for issuing expired stock"**.

### Clocking in and out

When the `timeCardEnabled` company setting is on, the sidebar carries a time card: **"Clock In"** and **"Clock Out"**, a **"My Hours"** view (a table of **Date**, **Clock In**, **Clock Out**, **Duration**), and a **"Clocked in since"** badge with the start time while a shift is open. Leave a shift open too long and Alforse nudges: after twelve hours it asks **"Forgot to Clock Out?"** with **"I'm Still Working"** or **"Set Clock Out"**. Time cards are labor time for payroll and presence; they are separate from the per-operation production events that drive job costing.

## Picking, quality, inspections, and maintenance

The floor does more than run operations. Four adjacent surfaces live in the same app.

### On-floor picking

The **"Picking"** view lists the picking lists assigned to the operator. **"Start"** moves a list to `In Progress`; **"Finish"** takes it to `Completed`. Each line is worked with **"Pick"**, **"Unpick"**, **"Short"**, or **"Scan"** (for tracked material), and a **"No stock"** badge flags an empty source. A short pick asks **"How many were actually picked?"** and records the shortfall with **"Mark Short"**.

NOTE

**The floor can't reopen a closed picking list.**

Once a list is `Completed` or `Cancelled` it locks. MES shows **"This picking list is closed. Reopen it from the ERP to continue."** — reopening requires an inventory permission the floor doesn't hold. See [picking lists](/docs/reference/picking.md) for the full lifecycle.

### Quality issues and inspections

An operator who spots a problem raises it without leaving the station. **"Create Quality Issue"** captures an **"Issue Type"**, a **"Priority"** (Low, Medium, High, or Critical), and a **"Description"**, and files a non-conformance for quality to triage. See [quality](/docs/reference/quality.md) for how that record is worked.

Inspections and work instructions run as typed steps inside the procedure tab. A step is one of nine kinds:

FieldType

<details>
  <summary>**Task**</summary>

  A do-this instruction the operator marks complete.
</details>

<details>
  <summary>**Checkbox**</summary>

  A yes/no confirmation.
</details>

<details>
  <summary>**Value**</summary>

  A recorded text or free value.
</details>

<details>
  <summary>**Measurement**</summary>

  A numeric reading with bounds — out of range, Alforse warns that the value must fall between the configured min and max for the unit of measure.
</details>

<details>
  <summary>**Timestamp**</summary>

  Captures the moment the step was done.
</details>

<details>
  <summary>**List**</summary>

  A choice from a predefined list.
</details>

<details>
  <summary>**Person**</summary>

  Records who performed the step.
</details>

<details>
  <summary>**File**</summary>

  An uploaded attachment (a photo, a document).
</details>

<details>
  <summary>**Inspection**</summary>

  A pass/fail gate with a **"Passed Inspection"** switch.
</details>

### Maintenance dispatch

When a machine goes down, an operator raises a maintenance dispatch from the floor. Every dispatch created here is `Reactive` by source (scheduled and non-conformance dispatches originate elsewhere). It carries a severity, a priority, and an OEE impact; choosing an OEE impact of **"Down"** ends the work center's active production events, because the center can't produce while it's under repair. The maintenance worker executes it from a detail view with Play, Pause, and Complete controls, a **"Time Worked"** total, and a **"Spare Parts"** section (**"Add & Issue"**), landing on **"Maintenance Completed"** when done.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.