Skip to content

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]
  • 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.

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.

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.

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.

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 --> [*]

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.