Fulfillment
Fulfilling an order is a short chain of documents. Nothing in it edits a stock figure directly: every step records an event, and the quantities follow.
flowchart LR so[Sales Order<br/>the demand] -- Create Fulfillment Order --> fo[Fulfillment Order<br/>the plan] fo -- Reserve --> hold[(Stock held<br/>at bins and lots)] hold -- each pick --> gm[Goods Movement<br/>one per pick] fo -- Close --> rel[Release<br/>whatever was not picked]
The documents
Section titled “The documents”- Sales Order — what the customer wants. It reserves nothing by itself. An open order is pure demand, and the stock stays available to everyone.
- Fulfillment Order — the warehouse’s plan for one future delivery: which order lines to fulfil, and optionally from which warehouse. Internal. Not the customer’s delivery note, and it carries no addresses or amounts. Its lines may come from different sales orders.
- Goods Movement — one per pick: the event that takes goods off the shelf.
- Reservation Movement — the bookkeeping of holds. Reserve writes them and Close writes them, and they are listed so every hold and release is on the record.
Boxes are not tracked. One order can occupy several boxes, and quantities for several orders can share a box.
Creating the plan commits nothing
Section titled “Creating the plan commits nothing”A fulfillment order can sit for days, be edited, or be closed unused, and the stock stays available to everyone the whole time. The document is intent.
It is written in the product’s base unit, whatever unit the sales line used. Naming a warehouse narrows picking to that location and everything beneath it; leaving it empty draws from anywhere.
Reserve is the commitment point
Section titled “Reserve is the commitment point”Reserving allocates: the system chooses real bins and lots — earliest expiry first — inside the order’s warehouse, or anywhere when it names none, and places a hard hold on exactly those coordinates, separately for each line.
flowchart TD
reserve[Reserve] --> alloc{Enough free stock?}
alloc -- yes --> res[Hold placed on chosen bins and lots<br/>available drops, on hand unchanged]
alloc -- no --> fail[Reservation refused whole<br/>the order stays open, nothing held]
Two consequences:
- A shortfall refuses the whole reservation. There is no half-covered pick; what to send now is a decision someone makes explicitly.
- Reserving seals the document. An open fulfillment order can be edited. Once reserved, the instruction is what the hold was built for, and changing what to pick means closing it and raising a new one.
Held stock still shows as on hand but drops out of available, so nobody can promise it away. It also cannot be issued or moved by an ordinary movement — the hold protects it in the stock arithmetic itself, not by a rule someone could forget.
Picking draws from the hold
Section titled “Picking draws from the hold”The pick list is the hold, read live: which products, at which bins, in which lots, still to fetch. Each pick posts one issue movement naming the bin, the goods, and the line’s hold.
sequenceDiagram participant P as Picker participant S as OnERP P->>S: Reserve S-->>P: Bin A · Lot 0525 · 4 pieces P->>S: Picked 3 from Bin A S-->>S: Hold shrinks by 3 P->>S: Close S-->>S: Remaining hold of 1 released back to free stock
Because the pick draws from held stock, a pick of more than the hold keeps will not post. A wrong bin or an over-scan fails outright.
Picked Quantity records actual picks minus undone picks. The sales-order line sums it across all its fulfillment orders, in the product’s base unit — an order for one box of 12 pieces reads as 12 pieces picked. Invoiced quantity stays in the sales line’s own unit.
Picking short is normal. Nothing forces a correction at pick time.
Closing releases the remainder
Section titled “Closing releases the remainder”The final pick closes a fully picked order on its own. Closing an unfinished one does two things: whatever the hold still keeps returns to available stock for anyone, and the order is marked Closed.
Closed means no more picking work through this document. It can have picked everything, some, or nothing. Closing never changes picked quantities, and it does not confirm shipment.
Closing posts no stock movement of its own. The goods already left the shelf, one pick at a time, and those movements are the record of what went out.
stateDiagram-v2 [*] --> Open: create — a plan, nothing held Open --> Open: edit freely Open --> Reserved: Reserve — stock held, document sealed Reserved --> Reserved: picks post, hold shrinks Reserved --> Closed: fully picked, or Close releases the remainder Open --> Closed: Close — the plan is called off Closed --> [*]
Undoing a pick
Section titled “Undoing a pick”An undo posts a receipt at the original bin and subtracts the picked quantity on both the fulfillment order and the sales order. No more can be returned than was picked from that bin, lot and owner.
On a reserved order the returned quantity rejoins the hold and can be picked again. On a closed order it stays closed, and the stock becomes available for new fulfillment work. Replacement picking takes a new fulfillment order.
An undo reverses a warehouse pick before shipment. It is not a customer return.
Doing it: Pick an order at a desk, Picking on the floor.