Inventory (stocktaking)¶
A stocktaking campaign is a time-boxed effort to physically count stock. There is
no separate "count line" model — every count is written as an inventory stock
operation on the packet, tagged with the campaign.
Creating a campaign¶
Open Warehouse → Inventory campaigns (/store/inventory-campaign) and create a
campaign with a name, description, and an optional open_from / open_until /
target_date window.
Only one campaign can be active at a time — activating a new one is rejected while another is already active. This keeps every count made in the counting UI unambiguous about which campaign it belongs to.
Counting¶
From Warehouse → Inventory (/store/inventory), scan or search for a packet and
enter the physically counted quantity. Behind the scenes this posts an inventory
stock operation with:
counted_quantity— what you physically counted.recorded_quantity— what the system had before the count.counted_price— a snapshot of the packet'sitemValueat the moment of counting, so later purchases don't retroactively change the valuation of a completed count (see Packet pricing).
The operation's relative quantity is computed as counted − recorded, so the
packet's count ends up matching what you entered, and a human-readable note
("Physical count: X (recorded: Y)") is attached automatically.
Tracking progress¶
/store/inventory/statusshows per-location progress: how many packets at each location are already inventoried versus still pending, for the active campaign./store/inventory/packetslists packets scoped to the campaign.- The campaign list itself shows an overall progress percentage (inventoried vs. pending active packets).
Finishing a campaign¶
There is no explicit "finish" action — a campaign is wound down by setting it
inactive (or letting open_until pass) once every location has been counted.
Packets that were never inventoried during the campaign simply keep their previous
itemValue in the report (see below).
Valuation report¶
GET /api/warehouse/stocktaking/<id>/report/ renders a PDF (inventura-<date>.pdf)
valuing every inventoried packet as counted_quantity × counted_price from the
operation's metadata, with fallback to the packet's current itemValue for
non-inventoried packets or legacy operations recorded before counted_price
existed. See Packet pricing → Inventory PDF report
for the exact formula.
Query parameters let you tune what's included: show_all, show_packets,
hide_zero_value, show_uninventoried, show_warnings, show_links.
Related topics¶
- Packets & stock operations — what an
inventoryoperation changes - Packet pricing — how
counted_priceis captured and used