ca-grow-ops-manager/backend/prisma/schema.prisma
fullsizemalt 7d42ecbfad feat: Daily Walkthrough Database Schema
🔴 Phase 1.5: Daily Operations for 777 Wolfpack

 Database Schema Complete:
- DailyWalkthrough model (parent walkthrough session)
- ReservoirCheck model (tank levels, veg/flower)
- IrrigationCheck model (drippers, water flow, nutrients, 4 zones)
- PlantHealthCheck model (pests, water/food access, photos)

📊 New Enums:
- WalkthroughStatus (IN_PROGRESS, COMPLETED, INCOMPLETE)
- TankType (VEG, FLOWER)
- TankStatus (OK, LOW, CRITICAL)
- HealthStatus (GOOD, FAIR, NEEDS_ATTENTION)
- AccessStatus (OK, ISSUES)

🔗 Relationships:
- User → DailyWalkthrough (one-to-many)
- DailyWalkthrough → ReservoirCheck (one-to-many, cascade delete)
- DailyWalkthrough → IrrigationCheck (one-to-many, cascade delete)
- DailyWalkthrough → PlantHealthCheck (one-to-many, cascade delete)

📝 Features:
- Photo URLs for all check types
- JSON storage for failed dripper IDs
- Cascade delete (cleanup on walkthrough deletion)
- Timestamps for audit trail
- Status tracking (in progress → completed)

⏭️ Next: Migration + Backend API endpoints

Migration Command (run on deployment):
npx prisma migrate dev --name add_daily_walkthrough
2025-12-09 14:06:16 -08:00

243 lines
5.4 KiB
Text

generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
enum Role {
OWNER
MANAGER
GROWER
STAFF
}
enum RoomType {
VEG
FLOWER
DRY
CURE
MOTHER
CLONE
}
enum TaskStatus {
PENDING
IN_PROGRESS
COMPLETED
BLOCKED
}
// Daily Walkthrough Enums
enum WalkthroughStatus {
IN_PROGRESS
COMPLETED
INCOMPLETE
}
enum TankType {
VEG
FLOWER
}
enum TankStatus {
OK
LOW
CRITICAL
}
enum HealthStatus {
GOOD
FAIR
NEEDS_ATTENTION
}
enum AccessStatus {
OK
ISSUES
}
model User {
id String @id @default(uuid())
email String @unique
passwordHash String
name String?
role Role @default(STAFF)
rate Decimal? @map("hourly_rate") // For labor cost calc
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
tasks TaskInstance[]
timeLogs TimeLog[]
walkthroughs DailyWalkthrough[]
@@map("users")
}
model Room {
id String @id @default(uuid())
name String
type RoomType
sqft Float?
width Float?
length Float?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
batches Batch[]
tasks TaskInstance[]
@@map("rooms")
}
model Batch {
id String @id @default(uuid())
name String // e.g., "B-2023-10-15-GG4"
strain String
startDate DateTime
harvestDate DateTime?
status String @default("ACTIVE") // ACTIVE, HARVESTED, COMPLETED
roomId String?
room Room? @relation(fields: [roomId], references: [id])
tasks TaskInstance[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("batches")
}
model TaskTemplate {
id String @id @default(uuid())
title String
description String?
estimatedMinutes Int?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("task_templates")
}
model TaskInstance {
id String @id @default(uuid())
title String // Copied from template or custom
description String?
status TaskStatus @default(PENDING)
priority String @default("MEDIUM")
assignedToId String?
assignedTo User? @relation(fields: [assignedToId], references: [id])
batchId String?
batch Batch? @relation(fields: [batchId], references: [id])
roomId String?
room Room? @relation(fields: [roomId], references: [id])
completedAt DateTime?
dueDate DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("task_instances")
}
model TimeLog {
id String @id @default(uuid())
userId String
user User @relation(fields: [userId], references: [id])
startTime DateTime
endTime DateTime?
activityType String? // e.g. "Trimming", "Feeding", "Cleaning"
notes String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("time_logs")
}
// Daily Walkthrough Models
model DailyWalkthrough {
id String @id @default(uuid())
date DateTime @default(now())
completedBy String
user User @relation(fields: [completedBy], references: [id])
startTime DateTime @default(now())
endTime DateTime?
status WalkthroughStatus @default(IN_PROGRESS)
reservoirChecks ReservoirCheck[]
irrigationChecks IrrigationCheck[]
plantHealthChecks PlantHealthCheck[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("daily_walkthroughs")
}
model ReservoirCheck {
id String @id @default(uuid())
walkthroughId String
walkthrough DailyWalkthrough @relation(fields: [walkthroughId], references: [id], onDelete: Cascade)
tankName String
tankType TankType
levelPercent Int
status TankStatus
photoUrl String?
notes String?
createdAt DateTime @default(now())
@@map("reservoir_checks")
}
model IrrigationCheck {
id String @id @default(uuid())
walkthroughId String
walkthrough DailyWalkthrough @relation(fields: [walkthroughId], references: [id], onDelete: Cascade)
zoneName String // "Veg Upstairs", "Veg Downstairs", "Flower Upstairs", "Flower Downstairs"
drippersTotal Int
drippersWorking Int
drippersFailed String? // JSON array of failed dripper IDs
waterFlow Boolean
nutrientsMixed Boolean
scheduleActive Boolean
photoUrl String? // Photo of working system
issues String?
createdAt DateTime @default(now())
@@map("irrigation_checks")
}
model PlantHealthCheck {
id String @id @default(uuid())
walkthroughId String
walkthrough DailyWalkthrough @relation(fields: [walkthroughId], references: [id], onDelete: Cascade)
zoneName String
healthStatus HealthStatus
pestsObserved Boolean
pestType String?
waterAccess AccessStatus
foodAccess AccessStatus
flaggedForAttention Boolean @default(false)
issuePhotoUrl String?
referencePhotoUrl String? // Photo of healthy system
notes String?
createdAt DateTime @default(now())
@@map("plant_health_checks")
}