Completing a run
Permission: Complete Production of Finish Goods
Completion is the moment production touches the ledger. Everything before it is planning.
1. What you enter
| Field | Meaning |
|---|---|
| Actual quantity produced | What you really made. May differ from planned in either direction |
| Per-ingredient actuals | What each material really consumed |
If you supply an actual for an ingredient, it is used. If you leave it out, the planned quantity is posted as consumed.
So skipping the detail does not mean "nothing was used" — it means "exactly as planned". That is the right default for a quick close, and the wrong one if a run genuinely over-consumed.
2. What completion writes
A run with 6 ingredients writes 7 ledger rows — one in, six out.
The remarks are generated, not yours
| Row | Remark |
|---|---|
PRODUCTION_IN | Production Order #<first 8 chars> completion |
CONSUMPTION_OUT | Consumption for Production Order #<first 8 chars> |
Both carry the order's id as reference_id, which is what ties a ledger row back to its run.
Unlike a goods receipt or a
sale, production rows have no reference_no and no batch_id — only
the generated remark and the reference_id. Searching the ledger for a production run means
searching the remark text for the 8-character order id.
3. Yield
The drawer computes produced ÷ planned and shows it as a percentage.
| Example | Reading |
|---|---|
| Planned 15, produced 15 | 100.0% |
| Planned 20, produced 18 | 90.0% — a real shortfall worth explaining |
| Planned 10, produced 11 | over 100% — legitimate, and worth investigating |
Yield is not compared against the BOM's wastage_allowance_percent. The allowance is recorded on
the recipe and never applied — see Bill of materials.
4. What completion does not do
Update current_stock on the finished variation | ❌ |
Update current_stock on any raw material | ❌ |
| Check that ingredients were actually available | ❌ — stock can go negative in the ledger |
| Allow itself to be undone | ❌ |
There is no availability check. Completing a run for 100 portions when the ledger balance covers 10 succeeds, and the ledger simply goes negative.
That is a deliberate posture elsewhere in the product — surface the oversell rather than hide it — but here it means the ledger is the only place the problem is visible, and only if you look.
5. Step by step
- Open the DRAFT order from the list
- Check the ingredient list is what you actually used — fix it before completing
- Complete
- Enter the actual quantity produced
- Enter per-ingredient actuals for anything that differed from plan
- Confirm
After this the order is locked and the footer reads "Order is locked — ledger has been posted."
6. Verifying a run afterwards
Open the ledger and look for the order's 8-character id in the Remarks column. You should see:
- one
PRODUCTION_INrow, positive, naming the product and SKU - one
CONSUMPTION_OUTrow per ingredient, negative
Raw-material rows do not render their name in the ledger, so the consumption side of a run shows six anonymous rows. The quantities and units are correct. See Reading a movement.
7. Troubleshooting
| Symptom | Cause |
|---|---|
production order already completed | It was completed already |
cancelled orders cannot be completed | Cancel is terminal |
| No consumption rows appeared | The variation had no BOM when the order was created |
| Consumption matches plan exactly, though it did not | Per-ingredient actuals were omitted, so planned was posted |
| Stock unchanged everywhere | Expected — completion writes the ledger only |
| Ledger balance is negative | No availability check exists; the run consumed more than had been received |