Skip to content

URD: Inventory

ModuleCORE-06Versionv0.6
StatusIn-progressDate2026-06-15

Business documentation. This URD is Inventory's feature list - each feature below is one Functional Area (<AREA>). The same <AREA> keys the feature's PRDs (PRD-<AREA>-NNN) and tests (TC-<AREA>-NNN), and each feature is listed in the Delivery feature catalog. See the Feature Spine convention.

1. Purpose

Define user-facing requirements for Inventory management - stock tracking, warehouse locations, purchase orders, vendors, materials (BOM), inventory tickets, and a complete, immutable audit trail of every stock movement. The outcome is that a merchant always knows what they have, where it is, and how it got there.

2. Scope

IncludedExcluded
Inventory locations (warehouses) with hierarchySale quotation / quota-based reservation
Inventory items (variant/material linked to location)Multi-level BOM / sub-assemblies
Stock quantities (on-hand, reserved, available)Recipe yield and scrap percentage
Immutable tracking audit logMulti-currency stock valuation
Tracking type catalog (19 pre-seeded)Full barcode scanning integration
Vendor (supplier) managementNegative-stock enforcement at POS
Purchase orders with goods receiptTechnical API specifications
Inventory tickets (transfer, adjustment, count, return, scrap)
Material catalog with identifiers
Material recipes (BOM) with versioning
BOM runtime explosion on kitchen ticket
Production orders, inventory rules, unit of measure

3. Definitions

TermDefinition
Inventory LocationA warehouse or storage area within a merchant. Supports hierarchy. One default per merchant.
Inventory ItemA record linking a product variant or material to a merchant for stock tracking.
Inventory StockThe quantity record - on-hand, reserved, available. One per (item, location, lot, serial).
Inventory TrackingAn immutable audit entry for every stock movement with before/after quantities.
Inventory Tracking TypeCategorizes movement direction (IN/OUT/NEUTRAL) and reason. 19 pre-seeded + 1 custom.
Inventory TicketA document for stock operations: transfer, adjustment, cycle count, returns, scrap. Has line items.
VendorA supplier from whom the merchant purchases goods.
Purchase OrderA goods-receipt document from a vendor, containing line items with quantities and pricing.
MaterialA raw ingredient or semi-finished good tracked separately from sellable products.
Material Recipe (BOM)A versioned recipe declaring which materials are consumed to produce a product variant.
BOM ExplosionAutomatic material decrement triggered by kitchen ticket item status changes.
Production OrderA manufacturing document tracking planned/actual/scrap quantities for produced goods.
Inventory RuleA configurable threshold rule that can trigger alerts, PO creation, or webhooks.
Unit of MeasureMeasurement unit with 3-level scope: system defaults → merchant → product/material.

4. Conceptual Model

Conceptual only - the full schema lives in the developer domain model.

5. Feature Catalog

The feature list of this module. Each row is one feature (a Functional Area). Detail in §6. Mirrored in the Delivery feature catalog.

Feature IDFeaturePhaseStatusPriority
LOCInventory LocationsP1BuiltHigh
ITMInventory ItemsP1BuiltHigh
STKStock LevelsP1BuiltHigh
TRKMovement Audit TrailP1BuiltHigh
LSELot / Serial & Expiry IdentifiersP3BuiltHigh
TKTInventory TicketsP2BuiltHigh
VENVendorsP1BuiltHigh
POPurchase OrdersP1BuiltHigh
POIPurchase Order ItemsP1BuiltHigh
MATMaterialsP3BuiltHigh
RECRecipes / BOMP3In-progressHigh
PROProduction Orders & BOM ExplosionP3In-progressHigh
IOPStock operations - F&B & RetailP2PlannedHigh

Status: live from Plane where mapped, otherwise registry-declared. Vocabulary mirrors Plane (state-group / phase).

6. Features

One sub-section per feature, in catalog order. Each feature keeps its description, requirements, and acceptance together. Priority = MoSCoW (Must / Should / Could / Won't).

LOC - Inventory Locations Built

Feature ID: inventory/LOC · Phase: P1 · PRDs: - · Dev: @nx/inventory

What it does for users: merchants organize stock into warehouses/storage areas. Every merchant gets one default location automatically; larger merchants can add a hierarchy of locations with address and GPS data.

Requirements

IDPRequirement
URD-LOC-001MOwner can create an inventory location with an i18n name.
URD-LOC-002MA default location is auto-created for each merchant on commerce init.
URD-LOC-003MExactly one default location exists per merchant; setting a new default clears the previous.
URD-LOC-004SLocations support parent-child hierarchy.
URD-LOC-005SA location can store address and geographic (GPS) data.
URD-LOC-006MLocation lifecycle: NEW → ACTIVATED → DEACTIVATED → ARCHIVED (ARCHIVED terminal).
URD-LOC-007MEach location has a system-generated identifier (LOC_YYYYMMDD_id), not user-editable.
URD-LOC-008MLocations use soft-delete; data is preserved and admin-retrievable.
URD-LOC-009SOwner can list and filter locations by status.
URD-LOC-010MLocations are isolated per merchant.

Acceptance

AC-LOC-01: Default Location
GivenWhenThen
New merchantCommerce initializationDefault location auto-created
Set a new default-Previous default cleared

ITM - Inventory Items Built

Feature ID: inventory/ITM · Phase: P1 · PRDs: - · Dev: @nx/inventory

What it does for users: a stock-tracked record is created automatically whenever a product variant is added, linked to the merchant's default location, with optional min/max thresholds.

Requirements

IDPRequirement
URD-ITM-001MAn inventory item is auto-created when a product variant is created.
URD-ITM-002MOne item per (variant, location, unit) combination.
URD-ITM-003SItem supports min/max stock-level thresholds; min ≤ max.
URD-ITM-004MEach item has a system-generated identifier (SKU_YYYYMMDD_id), not user-editable.
URD-ITM-005MItem lifecycle: ACTIVATED → DEACTIVATED → ARCHIVED (ARCHIVED terminal).
URD-ITM-006MItem is linked to the merchant's default location on creation.

Acceptance

AC-ITM-01: Auto-create on variant
GivenWhenThen
A new product variantVariant is createdAn inventory item is auto-created at the default location

STK - Stock Levels Built

Feature ID: inventory/STK · Phase: P1 · PRDs: Opening Balance Import · Dev: @nx/inventory

What it does for users: merchants see how much stock they have - on-hand, reserved, and available - per item per location, with decimal precision and atomic updates.

Requirements

IDPRequirement
URD-STK-001MOne stock record per (item, location, lot, serial).
URD-STK-002MAvailable = on-hand − reserved.
URD-STK-003MAll quantities stored with decimal precision (4 places).
URD-STK-004MOwner can view current stock levels; first movement auto-creates the stock record.
URD-STK-005SLast-stocked / last-counted timestamps update automatically.
URD-STK-006MStock updates are atomic - partial failure rolls back fully.
URD-STK-007CHistorical stock-level changes are viewable.

Acceptance

AC-STK-01: Stock Tracking
GivenWhenThen
Item with inventoryViewOn-hand, reserved, available displayed
Available drops below threshold-Low-stock indicator shown

TRK - Movement Audit Trail Built

Feature ID: inventory/TRK · Phase: P1 · PRDs: - · Dev: @nx/inventory

What it does for users: every change in stock - receipt, sale, transfer, adjustment - is recorded as an immutable entry with before/change/after quantities, fully traceable to its source document.

Requirements

IDPRequirement
URD-TRK-001MEvery stock movement creates an immutable tracking entry.
URD-TRK-002MRecords before, change, and after quantities.
URD-TRK-003MEntries from business documents store reference type and ID.
URD-TRK-004MIdempotent: same (referenceType, referenceId) produces one entry only.
URD-TRK-005MEach entry typed by tracking type (IN/OUT/NEUTRAL); 19 pre-seeded + custom.
URD-TRK-006SEntries record the acting user (createdBy / modifiedBy).
URD-TRK-007MOwner can view full tracking history.
URD-TRK-008SEntries can record effective price and multiplier.
URD-TRK-009SManual entries can include a note/reason.
URD-TRK-010CFilter history by date, type, or reference document.

Acceptance

AC-TRK-01: Immutable entry
GivenWhenThen
Any stock movementIt occursAn immutable entry records before/change/after + reference
Same (referenceType, referenceId) replayed-No duplicate entry is created (idempotent)

LSE - Lot / Serial & Expiry Identifiers Built

Feature ID: inventory/LSE · Phase: P3 · PRDs: Lot / serial & expiry identifiers · Dev: @nx/inventory

What it does for users: stock becomes traceable below the item. The same item at one location splits into separate buckets per lot and per serial, each carrying its own expiry and manufacture date, while an identifier registry turns a scanned code (SKU / barcode / QR at the item level, IMEI / serial at the unit level) into exactly one inventory entity.

Requirements

IDPRequirement
URD-LSE-001MStock is bucketed by (item, location, lot, serial); distinct lots/serials of one item at one location are separate stock records.
URD-LSE-002MEach stock bucket carries a lot number, serial number, expiry date, and manufacture date.
URD-LSE-003MBuckets with no lot/serial collapse to one record (equal NULLs treated as the same bucket), so non-traceable items keep a single record.
URD-LSE-004MLot / serial / expiry are captured at goods receipt on purchase-order lines; a serial-tracked line records one serial per received unit.
URD-LSE-005MInventory-ticket lines capture lot / serial / expiry for stock-in and return-from-customer; a serial line must have planned quantity 1.
URD-LSE-006MEvery movement snapshots the lot / serial / expiry that moved into the immutable tracking entry.
URD-LSE-007MAn identifier registry records SKU / BARCODE / QRCODE at the item level and IMEI / SERIAL at the unit (stock) level.
URD-LSE-008MEach (scheme, code) pair is globally unique across active records - one code resolves to exactly one inventory entity.
URD-LSE-009MIdentifier scheme defaults to UNKNOWN when unspecified; only SKU / BARCODE / QRCODE / IMEI / SERIAL are recognized.
URD-LSE-010MIdentifiers are merchant-scoped through their principal (item or stock) and use soft-delete; soft-deleting a code frees its (scheme, code) pair.
URD-LSE-011SExpired stock is disposed through a dedicated EXPIRED movement reason that decrements the specific lot.
URD-LSE-012SA production run can stamp its finished-good output with a lot number and expiry date for recall traceability.
URD-LSE-013CExpiry and manufacture dates captured per lot support expiring-soon visibility and FEFO selection (data model only; operator UI lands with IOP).

Acceptance

AC-LSE-01: Lot bucketing
GivenWhenThen
Two receipts of one item with different lot numbersReceivedTwo distinct stock buckets exist, each with its own expiry
A non-traceable item (no lot/serial)Received twiceOne bucket accumulates - equal NULL lot/serial collapse
AC-LSE-02: Unique identifier resolution
GivenWhenThen
A registered (scheme, code)ScannedIt resolves to exactly one inventory entity
Same (scheme, code) on another recordSavedRefused - the pair must be unique across active records
A registered code is soft-deletedThe pair is re-registeredAllowed - soft-delete frees the pair
AC-LSE-03: Traceable movement & disposal
GivenWhenThen
Any movement of a traceable bucketIt occursThe tracking entry snapshots the lot / serial / expiry that moved
An expired lotDisposedDecremented via the EXPIRED reason and recorded in the trail
A serial-tracked receipt line with quantity > 1SavedRefused - a serial line must be exactly one unit

TKT - Inventory Tickets Built

Feature ID: inventory/TKT · Phase: P2 · PRDs: - · Dev: @nx/inventory

What it does for users: warehouse operations run through tickets - transfer between locations, stock adjustment, cycle count, returns, and scrap - each moving through an approval workflow before it touches stock.

Requirements

IDPRequirement
URD-TKT-001MTickets support 6 operation types: Transfer, Adjustment, Cycle Count, Return to Vendor, Return from Customer, Scrap/Disposal.
URD-TKT-002MLifecycle: DRAFT → SUBMITTED → APPROVED → IN_PROGRESS → COMPLETED / CANCELLED.
URD-TKT-003MEach ticket has line items with planned vs. actual quantities.
URD-TKT-004MCompleting a ticket creates tracking entries and updates stock.
URD-TKT-005SLine items support lot/serial numbers.
URD-TKT-006SLine items support per-item location override.

Acceptance

AC-TKT-01: Inventory Ticket
GivenWhenThen
Transfer ticketCOMPLETEDSource decreased, destination increased
Cycle count ticketCOMPLETEDVariance calculated and applied
Adjustment ticketCOMPLETEDStock corrected with reason code

VEN - Vendors Built

Feature ID: inventory/VEN · Phase: P1 · PRDs: - · Dev: @nx/inventory

What it does for users: merchants keep a directory of suppliers - contact details, address, tax registration - referenced by purchase orders and preserved for history even after removal.

Requirements

IDPRequirement
URD-VEN-001MOwner can create vendors within a merchant.
URD-VEN-002MVendor has name, contact info (emails, phones), address, and a system identifier (VEN_YYYYMMDD_id).
URD-VEN-003SVendor can store a tax registration number.
URD-VEN-004MVendor uses soft-delete; historical PO references are preserved.
URD-VEN-005MVendors are isolated per merchant.

Acceptance

AC-VEN-01: Vendor lifecycle
GivenWhenThen
Owner creates a vendorSavedVendor gets a system identifier and is merchant-isolated
Vendor referenced by a PO is removedSoft-deleteHistorical PO references are preserved

PO - Purchase Orders Built

Feature ID: inventory/PO · Phase: P1 · PRDs: - · Dev: @nx/inventory

What it does for users: owners receive goods from vendors via a purchase-order workflow; goods receipt increments stock and writes the audit trail, with OVERRIDE and ACCUMULATIVE receipt modes.

Requirements

IDPRequirement
URD-PO-001MOwner can create a PO selecting vendor + items in one operation; vendor required.
URD-PO-002MLifecycle: DRAFT → PROCESSING → RECEIVED → COMPLETED → CLOSED (with valid transitions only).
URD-PO-003MOwner can cancel a PO from any non-terminal status; received stock is not auto-reversed.
URD-PO-004MOwner can revert PROCESSING → DRAFT.
URD-PO-005MPO items are editable only in DRAFT status.
URD-PO-006MA PO must have ≥1 item before it can be confirmed.
URD-PO-007MGoods receipt increments stock and creates tracking entries.
URD-PO-008MReceipt supports OVERRIDE and ACCUMULATIVE modes.
URD-PO-009MPO defaults to the merchant's default location unless one is specified.
URD-PO-010MPO total = subtotal − discount + tax.
URD-PO-011SManual vs. system discount/tax are flagged distinctly.
URD-PO-012MEach PO has a system-generated purchase-order number.

Acceptance

AC-PO-01: Purchase Order Receipt
GivenWhenThen
PO in PROCESSINGGoods receivedStock incremented, tracking created
OVERRIDE mode-Replaces received quantity
ACCUMULATIVE mode-Adds to received quantity

POI - Purchase Order Items Built

Feature ID: inventory/POI · Phase: P1 · PRDs: - · Dev: @nx/inventory

What it does for users: each PO line computes its own total from price, quantity, multiplier, tax and discount; adding the same item+unit accumulates quantity, and zeroing a line removes it.

Requirements

IDPRequirement
URD-POI-001MAdding the same (itemType, itemId, uom) accumulates quantity; different uom creates a new line.
URD-POI-002MItem total = (unitPrice × quantity × multiplier) + tax − discount.
URD-POI-003MSetting an item quantity ≤ 0 soft-deletes the line and recalculates the PO total.
URD-POI-004SUnit price defaults to the variant's active cost price.
URD-POI-005SUOM defaults to the inventory item's base unit.

Acceptance

AC-POI-01: Line accumulation
GivenWhenThen
Same (itemType, itemId, uom) added twiceAddedQuantity accumulates on one line
Line quantity set to 0SavedLine soft-deleted and PO total recalculated

MAT - Materials Built

Feature ID: inventory/MAT · Phase: P3 · PRDs: - · Dev: @nx/inventory

What it does for users: F&B merchants track raw ingredients separately from sellable products, each with i18n names and multiple identifier schemes (SKU, barcode, QR) and barcode search.

Requirements

IDPRequirement
URD-MAT-001MOwner can create materials within a merchant.
URD-MAT-002MMaterial has a system identifier (MAT_YYYYMMDD_id) and an i18n name.
URD-MAT-003MMaterial name supports multiple locales.
URD-MAT-004MMaterial description is editable.
URD-MAT-005MMaterial can be deactivated.
URD-MAT-006MMaterial can be archived (terminal, read-only).
URD-MAT-007MMaterial identifier is unique.
URD-MAT-101MOwner can attach a BARCODE identifier to a material.
URD-MAT-102MMaterial supports identifier schemes: SYSTEM, SLUG, SKU, BARCODE, QRCODE.
URD-MAT-103MA (scheme, code) pair is unique across materials.
URD-MAT-104MIdentifier scheme defaults to SYSTEM when unspecified.
URD-MAT-105SMultiple identifiers of different schemes can coexist on one material.
URD-MAT-106SMaterial is searchable by registered barcode.

Acceptance

AC-MAT-01: Barcode identifier
GivenWhenThen
Owner attaches a BARCODE to a materialSearched by that barcodeThe material is found
Same (scheme, code) on another materialSavedRejected - pair must be unique

REC - Recipes / BOM In-progress

Feature ID: inventory/REC · Phase: P3 · PRDs: - · Dev: @nx/inventory · ADR-0001

What it does for users: F&B merchants define versioned recipes (bill of materials) per product variant; when a kitchen ticket item progresses, the active recipe auto-decrements its materials and records the movement.

Requirements

IDPRequirement
URD-REC-001MOwner can create a recipe attached to a product variant.
URD-REC-002MRecipe has a version (default 1.0).
URD-REC-003M(principal, version) is unique per recipe.
URD-REC-004MRecipe items specify a material, quantity, and unit.
URD-REC-005MRecipe items can be added to a recipe.
URD-REC-006MSame material appears at most once per recipe.
URD-REC-007MOwner can activate a recipe.
URD-REC-008MOwner can deactivate a recipe.
URD-REC-009SEditing an activated recipe creates a new version; the original is preserved.
URD-REC-010SMultiple recipe versions can be listed per principal.
URD-REC-011MOnly the activated recipe version is used at runtime.
URD-REC-101MRecipe item references a valid material.
URD-REC-102MRecipe item quantity stored at decimal precision (4 places).
URD-REC-103MRecipe item stores a unit.
URD-REC-104MRecipe item quantity is editable.
URD-REC-105MRecipe item soft-delete allows re-adding the same material.
URD-REC-201MA kitchen-ticket-item status change triggers recipe lookup and decrement prep at the default location.
URD-REC-202MEach recipe component is decremented; a tracking entry (Used as Material) is created.
URD-REC-203MComponent decrement updates stock at the default location.
URD-REC-204MThe activated recipe for the variant is the one exploded.
URD-REC-205MA material.stock-changed event is emitted after explosion.
URD-REC-206SNo default location → log warning, skip (no hard failure).
URD-REC-207SNo activated recipe → silent no-op.
URD-REC-208CNon-default kitchen location is respected (pending - current code uses the merchant default).

Acceptance

AC-REC-01: Kitchen BOM explosion
GivenWhenThen
Variant with activated recipeKitchen item status changesMaterials decremented per recipe item
No activated recipe-Silent no-op
No default location-Warning logged, skipped

IOP - Stock Operations for F&B & Retail Planned

Feature ID: inventory/IOP · Phase: P2 (Jul-Aug) · PRDs: PRD-IOP-001 · Dev: @nx/inventory

What it does for users: merchants actually operate their stock from the app - vouchers, purchase orders, counts - then go industry-deep: F&B recipes auto-deduct ingredients with lot/expiry; retail runs in/out by barcode with live counter stock. (The backend largely exists; this increment makes it usable end-to-end.)

Requirements

IDPRequirement
URD-IOP-001MOwner records goods-in / goods-out with voucher screens (all ticket types usable from the app)
URD-IOP-002MPurchase orders managed end-to-end from the app (create → receive)
URD-IOP-003MStock count & adjustment performed from the app
URD-IOP-004MF&B: selling a recipe product deducts its ingredients automatically (verified e2e, with recipe screens)
URD-IOP-005MRetail: stock in/out by barcode scan
URD-IOP-006SLot + expiry captured at receipt; expiring-soon visibility
URD-IOP-007SReal-time stock visible at the counter
URD-IOP-008CGrocery lightweight repack (1 input item → 1 output item)

Acceptance

AC-IOP-01: Operate stock from the app
GivenWhenThen
A merchant with vendorsCreates a PO, receives it, counts stockStock matches voucher history; expense voucher posted on receipt
An F&B dish with a recipeA customer buys itIngredient stock decreases per the recipe

PRO - Production Orders & BOM Explosion In-progress

Feature ID: inventory/PRO · Phase: P3 · PRDs: PRD-PRO-001 · Dev: @nx/inventory

What it does for users: make-to-stock merchants (bakeries, central kitchens, light assembly) plan a production run as a document - which finished good, from which recipe, how much, where - tracking planned vs. actual vs. scrap through a lifecycle. Behind it, a multi-level BOM explosion flattens the bound recipe through nested sub-assemblies down to the leaf materials a run consumes, with depth and cycle guards.

Requirements

IDPRequirement
URD-PRO-001MOwner can create a production order targeting a finished good (ProductVariant or Material) within the merchant.
URD-PRO-002MA production order is bound to a material recipe (BOM) that drives component explosion.
URD-PRO-003MProduction order carries planned / actual / scrap quantities in its unit of measure at decimal precision (4 places).
URD-PRO-004MProduction order lifecycle: DRAFT → IN_PROGRESS → DONE / CANCELLED (DONE and CANCELLED terminal); only valid transitions allowed.
URD-PRO-005MEach production order has a unique, system-generated production number, not user-editable.
URD-PRO-006MProduction order names the location where components are drawn and the finished good is produced.
URD-PRO-007SProduction order supports scheduling windows (scheduled start / end) for production-queue planning.
URD-PRO-008SProduction order records start / complete / cancel timestamps.
URD-PRO-009SProduction order can carry an output lot number and expiry date for recall traceability.
URD-PRO-010MProduction orders are merchant-isolated and use soft-delete.
URD-PRO-011MA bound recipe is flattened across nested sub-assemblies down to leaf materials (multi-level BOM).
URD-PRO-012MExplosion uses the latest ACTIVATED recipe version for each principal.
URD-PRO-013MExplosion is bounded by a maximum nesting depth and rejects cyclic recipe chains.
URD-PRO-014MEach leaf component quantity is the product of the quantities along its explosion path.
URD-PRO-015MA product-variant component without an activated sub-recipe is skipped; a material without a sub-recipe is a leaf consumed directly.
URD-PRO-016MProduction consumption and finished-good output are recorded as immutable tracking entries referencing the production order, typed PRODUCTION_CONSUME / PRODUCTION_OUTPUT.

Acceptance

AC-PRO-01: Create a production order
GivenWhenThen
A finished good with an activated recipeOwner creates a production order with a planned quantity and locationA unique production number is assigned and the order opens in DRAFT
Same merchantOrder createdOrder is merchant-isolated and soft-deletable
AC-PRO-02: Lifecycle transitions
GivenWhenThen
Order in DRAFTStarted / cancelledMoves to IN_PROGRESS / CANCELLED
Order in IN_PROGRESSCompleted / cancelledMoves to DONE / CANCELLED
Order in DONE or CANCELLEDAny transitionRefused - terminal state
AC-PRO-03: Multi-level BOM explosion
GivenWhenThen
A recipe whose component is itself a sub-assemblyExplosion runsFlattened to leaf materials with quantities multiplied along each branch
A recipe chain that references itselfExplosion runsRefused - cycle detected
A recipe tree deeper than the maximumExplosion runsRefused - maximum depth exceeded
A variant component with no activated sub-recipeExplosion runsSkipped, no leaf emitted
AC-PRO-04: Production tracking vocabulary
GivenWhenThen
A production movementRecordedAn immutable tracking entry typed PRODUCTION_CONSUME / PRODUCTION_OUTPUT references the production order

7. Constraints & Non-Goals

Cross-cutting requirements (CON) apply to all features above and are tested as TC-CON-*.

Cross-cutting requirements (CON)

IDPRequirement
URD-CON-001MAll inventory endpoints require authentication (JWT or basic auth).
URD-CON-002MAll records use soft-delete; soft-deleted records are excluded from standard listings.
URD-CON-003MNegative available quantity is currently tolerated (documented business constraint, not a bug).
URD-CON-004MStock deductions are idempotent per (referenceType, referenceId).

Constraints

IDConstraint
C-01One default location per merchant at all times.
C-02One stock record per (item, location, lot, serial).
C-03Available = on-hand − reserved (negative currently tolerated).
C-04Tracking records are immutable.
C-05Stock movements are idempotent via (referenceType, referenceId).
C-06PO items editable only in DRAFT.
C-0719 pre-seeded tracking types (+ 1 custom) at startup.
C-08All records use soft-delete.
C-09All quantities use decimal precision (4 places).

Non-Goals

  • Multi-level BOM (material as principal for sub-assemblies)
  • Recipe yield and scrap percentage
  • Explode-at-sale BOM for non-F&B retail
  • Negative-stock enforcement at POS
  • Full barcode scanning for stock takes
  • Multi-currency stock valuation

8. Version History

DateAuthorDescriptionVer
2026-02-28Q. Do - QEInitial from code analysisv0.1
2026-04-15Claude (AI pair)Add Material and MaterialRecipe (BOM) requirementsv0.2
2026-04-16Q. Do - QEConsolidated requirement areasv0.3
2026-05-30Claude (AI pair)Reformat to module template; reconcile tracking types to 19 (dev docs)v0.4
2026-06-04Claude (AI pair)Reorganize by feature (Feature Spine); each feature carries its own requirements + acceptance; CON moved to Constraintsv0.5
2026-06-15Claude (AI pair)Add LSE - Lot / serial & expiry identifiers (traceable stock buckets + identifier registry)v0.6

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