From d42331075d0cb2cc293ec7416b05972291853f87 Mon Sep 17 00:00:00 2001 From: fullsizemalt <106900403+fullsizemalt@users.noreply.github.com> Date: Tue, 9 Dec 2025 15:09:12 -0800 Subject: [PATCH] feat: Phase 2 Start - Shopping List Database Schema MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🚀 PROCEEDING WITH ROADMAP PARITY ✅ Seed Data Updated: - Removed all test users - Kept only 777 Wolfpack team (Travis, Jen, King) - Preserved walkthrough data 📦 Shopping List Feature (Phase 3A): - Added SupplyItem model - Added SupplyCategory enum (FILTER, CLEANING, PPE, OFFICE, BATHROOM, KITCHEN, MAINTENANCE, OTHER) - Fields: name, category, quantity, minThreshold, unit, location, lastOrdered, notes Next Steps: 1. Run migration 2. Create backend API 3. Create frontend UI 4. Deploy Priority: Shopping List → Touch Points → Task Lists --- backend/prisma/schema.prisma | 28 ++++++++++ backend/prisma/seed.js | 100 ++++++++++++----------------------- 2 files changed, 63 insertions(+), 65 deletions(-) diff --git a/backend/prisma/schema.prisma b/backend/prisma/schema.prisma index 979695f..0d86139 100644 --- a/backend/prisma/schema.prisma +++ b/backend/prisma/schema.prisma @@ -241,3 +241,31 @@ model PlantHealthCheck { @@map("plant_health_checks") } +// Supply/Shopping List models +model SupplyItem { + id String @id @default(uuid()) + name String + category SupplyCategory + quantity Int @default(0) + minThreshold Int @default(0) + unit String // "each", "box", "roll", "gallon", etc. + location String? // "Storage Room", "Bathroom", etc. + lastOrdered DateTime? + notes String? + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@map("supply_items") +} + +enum SupplyCategory { + FILTER // Air filters, water filters + CLEANING // Cleaning supplies + PPE // Gloves, masks, suits + OFFICE // Paper, pens, etc. + BATHROOM // Toilet paper, soap, etc. + KITCHEN // Coffee, snacks, etc. + MAINTENANCE // Tools, parts, etc. + OTHER +} diff --git a/backend/prisma/seed.js b/backend/prisma/seed.js index 6ad901f..08fc1c4 100644 --- a/backend/prisma/seed.js +++ b/backend/prisma/seed.js @@ -3,83 +3,53 @@ const bcrypt = require('bcrypt'); const prisma = new PrismaClient(); -const Role = { - OWNER: 'OWNER', - MANAGER: 'MANAGER', - GROWER: 'GROWER', - STAFF: 'STAFF' -}; - -const RoomType = { - VEG: 'VEG', - FLOWER: 'FLOWER', - DRY: 'DRY', - CURE: 'CURE', - MOTHER: 'MOTHER', - CLONE: 'CLONE' -}; - async function main() { console.log('Seeding database...'); - // Hash password once for all users + // Hash password once const hashedPassword = await bcrypt.hash('password123', 10); - // Create test users for each role - const users = [ - { - email: 'admin@runfoo.run', + // 777 Wolfpack Team (Production Users) + const travis = await prisma.user.upsert({ + where: { email: 'travis@runfoo.run' }, + update: {}, + create: { + email: 'travis@runfoo.run', passwordHash: hashedPassword, - name: 'Facility Owner', - role: Role.OWNER, - rate: 50.00 + name: 'Travis', + role: 'MANAGER', + rate: 35.00, }, - { - email: 'manager@runfoo.run', + }); + + const jen = await prisma.user.upsert({ + where: { email: 'jen@runfoo.run' }, + update: {}, + create: { + email: 'jen@runfoo.run', passwordHash: hashedPassword, - name: 'Operations Manager', - role: Role.MANAGER, - rate: 35.00 + name: 'Jen', + role: 'GROWER', + rate: 30.00, }, - { - email: 'grower@runfoo.run', + }); + + const king = await prisma.user.upsert({ + where: { email: 'king@runfoo.run' }, + update: {}, + create: { + email: 'king@runfoo.run', passwordHash: hashedPassword, - name: 'Head Grower', - role: Role.GROWER, - rate: 30.00 + name: 'King', + role: 'GROWER', + rate: 30.00, }, - { - email: 'staff@runfoo.run', - passwordHash: hashedPassword, - name: 'Floor Staff', - role: Role.STAFF, - rate: 20.00 - } - ]; + }); - for (const userData of users) { - const existing = await prisma.user.findUnique({ where: { email: userData.email } }); - if (!existing) { - await prisma.user.create({ data: userData }); - console.log(`Created ${userData.role}: ${userData.email} / password123`); - } - } - - // Create Default Rooms - const rooms = [ - { name: 'Veg Room 1', type: RoomType.VEG, sqft: 1200 }, - { name: 'Flower Room A', type: RoomType.FLOWER, sqft: 2500 }, - { name: 'Flower Room B', type: RoomType.FLOWER, sqft: 2500 }, - { name: 'Dry Room', type: RoomType.DRY, sqft: 800 }, - ]; - - for (const r of rooms) { - const existing = await prisma.room.findFirst({ where: { name: r.name } }); - if (!existing) { - await prisma.room.create({ data: r }); - console.log(`Created Room: ${r.name}`); - } - } + console.log('✅ Created 777 Wolfpack team users'); + console.log(' - Travis (Manager)'); + console.log(' - Jen (Grower)'); + console.log(' - King (Grower)'); console.log('Seeding complete.'); }