- Constitution and project spec (spec.yml) - 7 comprehensive feature specs (tasks, batches, labor, compliance, inventory, integrations, comms) - Phase 1 implementation plan (6-week roadmap) - Week 1 task breakdown (15 concrete tasks) - Architecture and compliance documentation - Backend and frontend setup guides - Deployment guide for nexus-vector - CI/CD workflows (Forgejo Actions) - Quick start guide for developers Project is ready for implementation with: - Automated testing on every push - Automatic deployment to nexus-vector on push to main - Database migrations handled automatically - Health checks and monitoring Stack: TypeScript, Fastify, React, Vite, PostgreSQL, Prisma, Docker
9.2 KiB
9.2 KiB
Feature Spec: Inventory and Materials
Domain: Inventory
Status: Draft
Version: 0.1.0
Last Updated: 2025-12-08
Overview
The Inventory and Materials module tracks cultivation supplies (nutrients, pots, IPM products, PPE, CO₂ tanks, filters, soil/media, packaging) with quantity tracking, min/max thresholds, restock prompts, and optional lot/serial linkage to batches for recall support.
User Stories
As a Head Grower
- I want to track current inventory levels so I know what's in stock
- I want to set min/max thresholds so I'm alerted when supplies are low
- I want to link material lots to batches so I can trace issues back to specific inputs
- I want to see material usage trends so I can optimize ordering
As a Staff Member
- I want to quickly check if we have enough nutrients for today's feed so I don't run out mid-task
- I want to log material usage so inventory stays accurate
As an Owner
- I want to see material costs per batch so I can calculate profitability
- I want to track supplier performance (quality, delivery time)
As a Compliance Manager
- I want to link material lots to batches so I can support recall investigations
Requirements
Functional Requirements
Item Catalog
- Item types:
- Nutrients (base, additives, supplements)
- Growing media (soil, coco, rockwool)
- Pots and containers
- IPM products (pesticides, beneficial insects)
- PPE (gloves, masks, suits)
- CO₂ tanks and regulators
- Filters (carbon, HEPA)
- Packaging (jars, bags, labels)
- Tools and equipment
- Item properties:
- Name and SKU
- Category
- Unit (gallon, pound, each, etc.)
- Current quantity
- Min/max thresholds
- Location (room, shelf)
- Supplier
- Lot/serial number (optional)
- Expiration date (optional)
- Cost per unit
- Notes
Inventory Tracking
- Add stock: Log new deliveries with quantity, lot, and cost
- Use stock: Log material usage with quantity, batch, and user
- Adjust stock: Manual adjustments with reason and approval
- Transfer stock: Move items between locations
- Automatic updates: Deduct stock when linked to task completion (future)
Restock Alerts
- Min threshold alerts: Notify when quantity falls below minimum
- Expiration alerts: Notify when items approach expiration
- Restock suggestions: Based on usage trends
Lot/Serial Tracking
- Link lots to batches: Associate material lots with batches for traceability
- Recall support: Query which batches used a specific lot
- Supplier traceability: Track materials back to supplier and purchase order
Reporting
- Current inventory: List of all items with quantities
- Low stock report: Items below min threshold
- Usage report: Material usage by item, batch, period
- Cost report: Material costs per batch
- Expiration report: Items expiring soon
Non-Functional Requirements
- Performance: Inventory list loads in < 500ms
- Data integrity: Stock adjustments require reason and approval
- Accessibility: WCAG 2.1 AA compliant
- Mobile-first: Stock usage logging optimized for tablet
Out of Scope (v1)
- Automated reordering (integration with suppliers)
- Barcode/QR code scanning
- Multi-location inventory (single facility only in v1)
- Integration with accounting systems for purchase orders
Acceptance Criteria
Item Catalog
- Items can be created with all required properties
- Items can be categorized by type
- Items can be searched and filtered
- Min/max thresholds can be set per item
Inventory Tracking
- Stock can be added with lot and cost
- Stock can be used with batch linkage
- Stock adjustments require reason and approval
- Stock transfers are logged with user and timestamp
Restock Alerts
- Alerts are generated when quantity falls below min threshold
- Alerts are generated for items expiring within 30 days
- Alerts can be dismissed or actioned
Lot/Serial Tracking
- Lots can be linked to batches
- Recall query returns all batches using a specific lot
- Lot history is immutable
Reporting
- Current inventory report displays all items with quantities
- Low stock report displays items below min threshold
- Usage report displays material usage by batch
- Cost report displays material costs per batch
Technical Notes
Data Model (Prisma Schema)
model InventoryItem {
id String @id @default(cuid())
name String
sku String? @unique
category ItemCategory
unit String // gallon, pound, each, etc.
quantity Float
minThreshold Float?
maxThreshold Float?
location String?
supplierId String?
supplier Supplier? @relation(fields: [supplierId], references: [id])
costPerUnit Float?
notes String?
lots InventoryLot[]
transactions InventoryTransaction[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model InventoryLot {
id String @id @default(cuid())
itemId String
item InventoryItem @relation(fields: [itemId], references: [id])
lotNumber String
serialNumber String?
quantity Float
expirationDate DateTime?
receivedDate DateTime
supplierId String?
supplier Supplier? @relation(fields: [supplierId], references: [id])
batchLinks BatchMaterialLink[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model InventoryTransaction {
id String @id @default(cuid())
itemId String
item InventoryItem @relation(fields: [itemId], references: [id])
type TransactionType
quantity Float
lotId String?
lot InventoryLot? @relation(fields: [lotId], references: [id])
batchId String?
batch Batch? @relation(fields: [batchId], references: [id])
userId String
user User @relation(fields: [userId], references: [id])
reason String?
approvedBy String?
approvedAt DateTime?
createdAt DateTime @default(now())
}
model BatchMaterialLink {
id String @id @default(cuid())
batchId String
batch Batch @relation(fields: [batchId], references: [id])
lotId String
lot InventoryLot @relation(fields: [lotId], references: [id])
quantityUsed Float
usedAt DateTime @default(now())
userId String
user User @relation(fields: [userId], references: [id])
}
model Supplier {
id String @id @default(cuid())
name String
contact String?
email String?
phone String?
address String?
notes String?
items InventoryItem[]
lots InventoryLot[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
enum ItemCategory {
NUTRIENT
MEDIA
POT
IPM
PPE
CO2
FILTER
PACKAGING
TOOL
OTHER
}
enum TransactionType {
ADD
USE
ADJUST
TRANSFER
}
API Endpoints
GET /api/inventory/items- List items with filtersGET /api/inventory/items/:id- Get item detailPOST /api/inventory/items- Create itemPATCH /api/inventory/items/:id- Update itemDELETE /api/inventory/items/:id- Delete itemPOST /api/inventory/transactions- Log transaction (add, use, adjust)GET /api/inventory/transactions- List transactionsGET /api/inventory/lots- List lotsPOST /api/inventory/lots- Create lotGET /api/inventory/lots/:id/batches- Get batches using a lot (recall query)GET /api/inventory/alerts- Get restock and expiration alertsGET /api/inventory/reports/current- Current inventory reportGET /api/inventory/reports/low-stock- Low stock reportGET /api/inventory/reports/usage- Usage reportGET /api/inventory/reports/cost- Cost reportGET /api/inventory/suppliers- List suppliersPOST /api/inventory/suppliers- Create supplier
UI Components
InventoryList- Filterable list of itemsInventoryCard- Item summary card with quantity gaugeInventoryDetail- Full item view with transaction historyInventoryForm- Item creation/editingTransactionForm- Add/use/adjust stock formLotTracker- Lot/serial tracking interfaceRecallQuery- Recall investigation toolRestockAlerts- Alert dashboardInventoryReports- Reporting interface
Dependencies
- Batches and Rooms module (for batch linkage)
- Tasks module (for automatic stock deduction on task completion)
- Authentication (for user attribution and RBAC)
Risks & Mitigations
| Risk | Impact | Mitigation |
|---|---|---|
| Inventory drift (physical vs. system) | High | Regular physical counts; adjustment approval workflow |
| Lot tracking errors | Medium | Clear UI; validation; immutable lot history |
| Restock alert fatigue | Medium | Configurable thresholds; smart batching of alerts |
Future Enhancements (Post-v1)
- Barcode/QR code scanning for quick stock updates
- Automated reordering based on usage trends
- Integration with supplier systems for purchase orders
- Multi-location inventory (multiple facilities)
- Predictive restock suggestions based on batch schedules
- Integration with accounting systems (QuickBooks, Xero)