Skip to content

PRD: Inventory Tickets

ModuleInventoryPRD IDPRD-TKT-001
StatusSupersededFEATTKT
EpicPlane
Date2026-07-14Versionv1.0
Packages@nx/inventoryURDTKT
SurfaceClient · Owner/Mgr
OwnerPhát Nguyễn

What an inventory ticket is

An inventory ticket is the document behind every stock change outside the sale flow: goods in, goods out, or a stock figure that needs correcting. The raiser picks exactly one of nine types - purchase request, goods receipt, stock transfer, internal issue, adjustment, cycle count, vendor return, customer return, write-off/disposal.

A merchant raises the ticket on the Client app, for one or two inventory locations depending on the type. One transfer can touch two merchants sitting inside the same organizer.

This is the shared frame. Stock transfer and stock count are two ticket types inside this frame, not two separate mechanisms.

The four numbers in stock

Lifted from Stock locations & levels so there is no need to open another PRD. Every item at every location carries four numbers:

NumberWhat the system calls itMeaning
On-handon-handGoods physically sitting in the location
ReservedreservedAlready promised to another document, no longer sellable to anyone else
AvailableavailableThe part still sellable
IncomingincomingLeft the source location, not yet arrived at the destination

The invariant, true at every moment:

Available = On-hand - Reserved

Once a ticket is approved, the promised goods sit in reserved. Only when a child ticket completes does on-hand change.

Why every stock change needs a document behind it

Stock figures are not allowed to move on their own. Every time a number changes there has to be a document behind it, with someone who raised it and someone who approved it. That is how a merchant explains why there are 60 cases on the shelf today and not 100.

Without a document, every stock change outside the sale flow has to be typed straight into the stock table: open the Stock screen, overwrite the quantity, and no trace is left of who changed it or why. Receiving a shipment, writing off a spoiled case of milk, returning a faulty batch to the vendor: all of it looks identical in the system, just a number that got overwritten.

One goods receipt, end to end

The location holds 500 cases. Receive 100 more. This is where the most important rule of the ticket frame shows itself: stock does not budge until the final step.

What happensTicket statusOn-hand
Draft a receipt for 100 casesDraft500
Submit for approvalSubmitted500
The owner approvesApproved500
The stock keeper starts receivingIn progress500
Record 100 received, hit completeCompleted600
  • Approving means agreeing the work can be done, not that it has been done. If the goods are not on the shelf yet but stock has already gone up, the figure on the Stock screen is no longer the real one.
  • Only at completion does stock change and does the inventory ledger get a row carrying the reason and the ticket code.
  • The wording changes with the ticket type. A stock transfer calls Approved To ship, In progress In transit, Completed Received. Underneath it is still one single set of states.
  • A large move keeps the intent on the parent ticket, while the child tickets record each trip out and each delivery in. The parent's status is derived from its children.

The easiest thing to get wrong

A completed ticket is final: no edit, no delete

Hit complete by mistake, type 50 where it should have said 60, pick the wrong reason - there is no Edit button and no Delete button, not even when the parent is later closed or cancelled.

The only way to bring the figure back to the truth is to raise a new compensating ticket: another issue trip, another receipt, or an adjustment. Fixing a mistake means writing another slip, not tearing up the old one.

Because of this rule, stock history is never rewritten behind anyone's back. And goods that left a location and never arrived do not silently disappear either: the raiser hits Close, and closing raises an adjustment ticket recording exactly that loss, with a reason.

Proprietary and Confidential. Unauthorized copying, distribution, or use of this software is strictly prohibited.