// FieldOps — initial scaffold schema. // // All models except Tenant carry tenantId. Tenant scoping is enforced at runtime // by the Prisma extension in src/tenant-extension.ts — see that file's header for // the operations it covers and (more importantly) those it does NOT. generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } enum UserRole { ADMIN SUPERVISOR OPERATOR } enum MaintenanceRequestStatus { OPEN CLAIMED RESOLVED } model Tenant { id String @id @default(cuid()) name String createdAt DateTime @default(now()) users User[] workstations Workstation[] events DomainEvent[] maintenanceRequests MaintenanceRequest[] } model User { id String @id @default(cuid()) tenantId String email String passwordHash String? role UserRole @default(OPERATOR) createdAt DateTime @default(now()) tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) reportedRequests MaintenanceRequest[] @relation("reported") claimedRequests MaintenanceRequest[] @relation("claimed") resolvedRequests MaintenanceRequest[] @relation("resolved") @@unique([tenantId, email]) @@index([tenantId]) } model Workstation { id String @id @default(cuid()) tenantId String code String name String area String tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) maintenanceRequests MaintenanceRequest[] @@unique([tenantId, code]) @@index([tenantId]) } model DomainEvent { id String @id @default(cuid()) tenantId String aggregateType String aggregateId String eventType String payload Json occurredAt DateTime @default(now()) processedAt DateTime? tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) @@index([tenantId]) @@index([tenantId, processedAt]) @@index([tenantId, aggregateType, aggregateId]) } model MaintenanceRequest { id String @id @default(cuid()) tenantId String workstationId String reportedByUserId String description String photoKey String? status MaintenanceRequestStatus @default(OPEN) clientRequestId String createdAt DateTime @default(now()) claimedByUserId String? claimedAt DateTime? resolvedByUserId String? resolvedAt DateTime? resolutionNote String? tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) workstation Workstation @relation(fields: [workstationId], references: [id]) reportedBy User @relation("reported", fields: [reportedByUserId], references: [id]) claimedBy User? @relation("claimed", fields: [claimedByUserId], references: [id]) resolvedBy User? @relation("resolved", fields: [resolvedByUserId], references: [id]) @@unique([tenantId, clientRequestId]) @@index([tenantId, status, createdAt]) @@index([tenantId, reportedByUserId]) }