- 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
318 lines
9.2 KiB
Markdown
318 lines
9.2 KiB
Markdown
# 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)
|
|
|
|
```prisma
|
|
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 filters
|
|
- `GET /api/inventory/items/:id` - Get item detail
|
|
- `POST /api/inventory/items` - Create item
|
|
- `PATCH /api/inventory/items/:id` - Update item
|
|
- `DELETE /api/inventory/items/:id` - Delete item
|
|
- `POST /api/inventory/transactions` - Log transaction (add, use, adjust)
|
|
- `GET /api/inventory/transactions` - List transactions
|
|
- `GET /api/inventory/lots` - List lots
|
|
- `POST /api/inventory/lots` - Create lot
|
|
- `GET /api/inventory/lots/:id/batches` - Get batches using a lot (recall query)
|
|
- `GET /api/inventory/alerts` - Get restock and expiration alerts
|
|
- `GET /api/inventory/reports/current` - Current inventory report
|
|
- `GET /api/inventory/reports/low-stock` - Low stock report
|
|
- `GET /api/inventory/reports/usage` - Usage report
|
|
- `GET /api/inventory/reports/cost` - Cost report
|
|
- `GET /api/inventory/suppliers` - List suppliers
|
|
- `POST /api/inventory/suppliers` - Create supplier
|
|
|
|
### UI Components
|
|
|
|
- `InventoryList` - Filterable list of items
|
|
- `InventoryCard` - Item summary card with quantity gauge
|
|
- `InventoryDetail` - Full item view with transaction history
|
|
- `InventoryForm` - Item creation/editing
|
|
- `TransactionForm` - Add/use/adjust stock form
|
|
- `LotTracker` - Lot/serial tracking interface
|
|
- `RecallQuery` - Recall investigation tool
|
|
- `RestockAlerts` - Alert dashboard
|
|
- `InventoryReports` - 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)
|