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

# Stock corrections

> Correct what a box holds against the shelf, and review, approve, reject or withdraw the corrections that need a second person

A **correction** says that the record was wrong: the box on the shelf holds more or fewer units than muveya says. A correction never edits a past movement. It adds a new, signed movement to the stock ledger that compensates the difference, so the history always shows what was recorded first and what corrected it.

Small corrections are applied as soon as you record them. A correction above its **approval threshold** is not applied: it waits in **Stock corrections** until a different person with permission approves it from their own session.

## Who can do it

| Action | Permission (console label) |
| - | - |
| See a box and the **Stock corrections** list | `inventory.read` (**View inventory**) |
| Record a correction on a box | `inventory.adjust` (**Adjust and count stock**) |
| Approve or reject a waiting correction | `inventory.adjust`, and you did not request it |
| Withdraw a waiting correction | The person who requested it, while they still hold `inventory.adjust` |
| Change the approval threshold of a supply at a warehouse | `inventory.adjust` (see [Replenishment and alerts](/docs/en/inventory/replenishment-and-alerts)) |

Every action is also limited to the warehouses your team access reaches: you never see or decide a correction of a box in another warehouse.

<Note>
  `inventory.adjust` includes receiving, recording use and moving boxes, but it does **not** include `inventory.read`. A member who corrects stock needs both permissions to open the screens that list boxes. Permissions are explained in [Roles and permissions](/docs/en/account/roles-and-permissions).
</Note>

## Correct a box

The correction form lives on the box page. It is shown only to members with `inventory.adjust`, and only while the box is **Active**: a box that is quarantined, expired, disposed, used up or in transit takes no corrections.

<Steps>
  <Step title="Open the box">
    Go to **Inventory**, select the box in the list, or use **Scan a code** and read its label (see [Boxes and labels](/docs/en/inventory/boxes)). The page is `console.muveya.com/inventory/boxes/` followed by the box.
  </Step>

  <Step title="Fill in Correct this box">
    In the section **Correct this box**, choose the **Correction**, type the **Quantity** and choose the **Reason**.
  </Step>

  <Step title="Record it">
    Select **Record correction**. The button stays disabled until the quantity is a whole number of at least 1.
  </Step>

  <Step title="Read the result">
    Below the button the form says **Correction recorded.** when the correction was applied, or **Sent for approval. Another person with permission to correct stock must approve it.** with a link **See stock corrections** when it must wait for a second person.
  </Step>
</Steps>

### Fields

| Field | Options and rules |
| - | - |
| **Correction** | **Remove from the record** (a loss, the default) or **Add to the record** (a gain). |
| **Quantity** | Whole number from 1 to 1,000,000, in the supply's base unit (the same unit the box's **On hand** shows). A loss can never take the box below zero. |
| **Reason** | One of the reason codes below. Required. The default is **Count correction**. |

Next to the form, the link **Count this supply here** opens a quick count of that supply in the box's warehouse. When you are not sure how many units are really there, count them instead of guessing: see [Physical counts](/docs/en/inventory/counts).

If the same correction reaches muveya twice (a double tap or a retry after a lost connection), it is recorded once and the form says **Already recorded.** After a successful correction the quantity clears, and the next correction you record is treated as a new one.

## Reasons

A correction always carries a reason code. The console offers a closed list, so every correction can be compared with the others. The same list is used for count differences.

| Reason code | Console label |
| - | - |
| `count_correction` | **Count correction** |
| `damaged` | **Damaged** |
| `unrecorded_use` | **Use not recorded** |
| `other` | **Other** |

The reason is stored on the ledger movement (and on the waiting request, when there is one). There is no free text field for a correction.

## When a correction needs a second person

Each supply at each warehouse has an **effective approval threshold**. A correction whose quantity is **greater than** that threshold is not applied: it becomes a waiting request.

| Situation | Effective threshold | Result |
| - | - | - |
| No threshold set for the supply at that warehouse | 100 | A correction of 100 applies; 101 waits. |
| A threshold set in the minimum form (0 to 100) | The value set | With 5, a correction of 5 applies; 6 waits. |
| Threshold set to 0 | 0 | Every correction waits. |
| The supply is marked **High-value supply** in the catalog | 0 | Every correction waits, whatever the threshold says. |
| muveya cannot read the supply | 0 | Every correction waits. |

A threshold can only make the rule stricter: no setting allows a correction above 100 without a second person. You set the threshold in the **Approval threshold** field of the minimum form, described in [Replenishment and alerts](/docs/en/inventory/replenishment-and-alerts). For count differences, the quantity compared is the difference between the counted and the expected quantity.

Two more rules apply to waiting corrections:

* **One at a time per box.** While a correction of a box waits, another correction of the same box that also needs approval is refused with **This box already has a correction waiting for approval.**
* **What the requester saw is frozen.** The request keeps the box's on-hand quantity, its latest physical movement and the threshold in force when it was made. Approval only succeeds if the box has not physically changed since.

```mermaid theme={null}
flowchart TD
  A[Record correction] --> B{Quantity above the threshold?}
  B -- No --> C[Correction movement written]
  B -- Yes --> D[Waiting in Stock corrections]
  D --> E{Another person decides}
  E -- Approve, box unchanged --> C
  E -- Approve, box changed --> F[Out of date: nothing written]
  E -- Reject --> G[Rejected: nothing written]
  D -- Requester withdraws --> H[Withdrawn: nothing written]
```

## The Stock corrections screen

Select **Stock corrections** in the main navigation, or the **Stock corrections** link on the **Stock** screen. The page is `console.muveya.com/inventory/approvals`. Its description reads: "Corrections above their threshold wait here until another person with permission approves them."

The entry is shown to every member; the list only loads for members with `inventory.read`, and only for the warehouses their team access reaches.

### Filter and columns

Use **Show** to switch between **Waiting** (the default) and **Decided**. Requests are listed newest first, 20 at a time. When there are more, the screen says **There are more requests than shown. Decide these to see the next ones.**

| Column | What it shows |
| - | - |
| **Supply** | The supply's name and SKU, for example `Nitrile gloves M · GLV-NIT-M`. |
| **Warehouse** | The warehouse of the box. |
| **Box** | The printed box code, for example `BX-000123`. |
| **Change** | The signed quantity and unit, for example `−12 Unit` for a loss or `+3 Unit` for a gain. |
| **Origin** | **Correction** for a correction recorded on the box page, or **Count: counted 88, expected 100** for a count difference. |
| **Reason** | The reason label. |
| **Requested by** | The requester's name, or **A team member** when the name is not available. |
| **When** | When the correction was requested. |
| **Decision** | What you can do, or what was decided. |

### What the Decision column offers you

| You are | You see |
| - | - |
| A member with `inventory.adjust` who did not request it | **Approve** and **Reject** |
| The requester | **Waiting for another person** and **Withdraw** |
| A member without `inventory.adjust` | **Only a member who can correct stock decides it** |

### Approve

<Steps>
  <Step title="Check the request">
    Read the supply, box, change, origin and reason. If you can, look at the box on the shelf.
  </Step>

  <Step title="Select Approve">
    muveya re-checks, at that moment, that the box is still active, in the same warehouse and has had no physical movement since the request. For a count, it also checks that the count is still open and its measurement window still holds.
  </Step>

  <Step title="Read the result">
    **Approved. The correction is recorded.** The request moves to **Decided** as **Approved by** followed by your name.
  </Step>
</Steps>

If the box changed after the request, nothing is written: the request is marked out of date and you see **The box changed; the correction must be requested or counted again.** Only physical movements count as a change (receipts, use, moves, separations, picks, dispatches, returns, corrections, quarantine, expiry and disposal). Reserving or releasing units for an order does not make a request out of date.

### Reject

Select **Reject**. A dialog titled **Reject this correction** opens with an optional **Reason (optional)** field of up to 500 characters. Select **Reject** again to confirm, or **Cancel** to go back. The result is **Rejected. Nothing changed in stock.**

The rejection reason is stored with the decision and in the audit trail, but the **Decided** list does not display it.

### Withdraw

If you requested the correction and it is no longer needed (for example, you found the missing units), select **Withdraw**. The result is **Withdrawn. Nothing changed in stock.** Only the requester can withdraw a request.

### Decided requests

| Shown as | Status | What happened |
| - | - | - |
| **Approved by** and a name | `approved` | One correction movement was written. |
| **Rejected by** and a name | `rejected` | Nothing was written. |
| **Withdrawn** | `withdrawn` | The requester withdrew it. Nothing was written. |
| **Out of date: the box changed** | `stale` | Someone tried to approve it after the box changed. Nothing was written; request the correction again or count the box again. |

Empty states: **Nothing is waiting for approval.** and **No decided corrections yet.**

## Separation of duties

* **Two people, two sessions.** The approver is always the person signed in who selects **Approve**. Nobody can be named as approver in advance, and the request is not sent to a specific person: anyone eligible can decide it.
* **You cannot approve your own request.** If you try (for example, from another tab), muveya refuses with **You cannot approve your own request.** and records the refused attempt in the audit trail.
* **The approver needs the same authority.** The approver must hold `inventory.adjust` and have access to the box's warehouse.
* **Both people are on the record.** The correction movement names the requester as the person who recorded it and the approver as the second person.
* **One decision wins.** If two people approve at the same moment, only one correction is written. The other person sees **Someone already decided this request.**

## What the ledger records

* **A correction movement.** A gain is written as `adjust_gain`, shown in the box's **Movements** as **Correction (gain)**; a loss is written as `adjust_loss`, shown as **Correction (loss)**. The movement carries the quantity, the reason code, the warehouse, who recorded it and, when approved, who approved it.
* **Never an edit.** To undo a wrong correction, record the opposite correction with a reason. The first one stays in the history.
* **Nothing while waiting.** A waiting, rejected, withdrawn or out-of-date request writes nothing to the ledger.
* **A box that reaches zero.** A loss that leaves the box with 0 on hand marks it **Used up**. A used-up box takes no more movements, so it cannot be corrected afterwards. If units of that box turn up later, record them with [Receive](/docs/en/inventory/receive).
* **Audit trail.** Each step leaves an audit fact:

| Audit action | When |
| - | - |
| `inventory.adjust` | A correction movement was written (directly or after approval). |
| `inventory.adjust.requested` | A correction was sent for approval. |
| `inventory.adjust.approved` | Another person approved it. |
| `inventory.adjust.rejected` | Another person rejected it. |
| `inventory.adjust.withdrawn` | The requester withdrew it. |
| `inventory.adjust.stale` | An approval found the box changed. |
| `inventory.adjust.denied` | Someone tried to approve their own correction. |

Audit facts carry ids, quantities, reason codes and dates only, never costs or patient data.

## Losses and reservations

A loss lowers what the box has on hand. It does **not** cancel units the box holds for approved orders (its **Reserved** quantity), and muveya never invents units to cover them.

* A loss cannot be larger than the box's on-hand quantity. A loss within the threshold is refused at once with **The box does not hold that much.**; a loss that waits for approval is checked when it is approved, and if the box no longer holds that much the request ends as out of date.
* A loss can leave the box with fewer units on hand than it has reserved. On the **Stock** screen, **Available** (on hand minus reserved) then shows a negative number: that is the **deficit** those orders face.
* The [Replenishment](/docs/en/inventory/replenishment-and-alerts) screen counts a box with a deficit as zero usable units, never as a negative number, so a surplus in another box cannot hide it.
* A box is dispatched whole, so a box whose on-hand no longer matches what an order reserved cannot be dispatched for that order (see [Pick and dispatch an order](/docs/en/deliveries/picking)). Review the orders that rely on that box in [Orders](/docs/en/orders/create-and-track).

## What can go wrong

| Message | Code | What to do |
| - | - | - |
| **This box already has a correction waiting for approval.** | `inventory.adjustment_already_pending` | Open **Stock corrections**. The requester can withdraw it; anyone else eligible can approve or reject it. Then record the correction again. |
| **The box does not hold that much.** | `inventory.insufficient_stock` | Check the box's **On hand**. Count the box if the number looks wrong. |
| **You cannot approve your own request.** | `inventory.second_actor_required` | Ask another member with **Adjust and count stock** to decide it. |
| **The box changed; the correction must be requested or counted again.** | `inventory.adjustment_request_stale` | Check the box's movements, then record the correction again or count the box. |
| **Someone already decided this request.** | `inventory.adjustment_request_not_pending` | Switch **Show** to **Decided** to see the outcome. |
| **Your account does not have permission for this action.** | `common.forbidden` | You lack `inventory.read` or `inventory.adjust`. Ask an administrator. |
| **This record is not available in the active dental clinic account.** | `inventory.box_not_found`, `inventory.adjustment_request_not_found` | The box or request does not exist in your warehouses. Check the active dental clinic and your team access. |
| **The record changed or already exists. Review it before trying again.** | For example `inventory.box_state_conflict`, `inventory.measurement_unverified` | The box is no longer active, or its unit needs review. Reload the box page before trying again. |
| **Review the entered values before trying again.** | `common.invalid_request` | Check the quantity and the reason. |
| **Could not complete the request. Please try again.** | Any other failure | Try again. If it persists, write to `team@muveya.com`. |

<Note>
  Recording a correction and deciding one are marked as sensitive actions. In the current version two-step verification is optional and does not block them. You can still turn it on in [Account security](/docs/en/account/security).
</Note>

## Related pages

<CardGroup cols={2}>
  <Card title="Inventory overview" icon="boxes-stacked" href="/docs/en/inventory/overview">
    Box balances, statuses and every ledger movement.
  </Card>

  <Card title="Boxes and labels" icon="box" href="/docs/en/inventory/boxes">
    Find a box, read its movements and take it out of use.
  </Card>

  <Card title="Physical counts" icon="clipboard-list" href="/docs/en/inventory/counts">
    Count a supply and turn differences into corrections.
  </Card>

  <Card title="Replenishment and alerts" icon="bell" href="/docs/en/inventory/replenishment-and-alerts">
    Set minimums and the approval threshold.
  </Card>

  <Card title="Roles and permissions" icon="user-shield" href="/docs/en/account/roles-and-permissions">
    What **Adjust and count stock** allows.
  </Card>

  <Card title="Orders" icon="cart-shopping" href="/docs/en/orders/create-and-track">
    Orders that hold reserved units.
  </Card>
</CardGroup>


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