generator client { provider = "prisma-client" output = "../src/generated/prisma" moduleFormat = "cjs" } datasource db { provider = "postgresql" } enum UserStatus { PENDING ACTIVE SUSPENDED } model Organization { id String @id @default(uuid()) @db.Uuid name String @db.VarChar(160) createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3) updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz(3) users User[] roles Role[] auditEvents AuditEvent[] products Product[] catalogGroups CatalogGroup[] warehouses Warehouse[] coupons Coupon[] pricingPolicies PricingPolicy[] suppliers Supplier[] materials Material[] @@map("organizations") } model User { id String @id @default(uuid()) @db.Uuid organizationId String @map("organization_id") @db.Uuid email String @db.VarChar(254) name String @db.VarChar(160) passwordHash String @map("password_hash") @db.VarChar(256) status UserStatus @default(PENDING) isOwner Boolean @default(false) @map("is_owner") createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3) updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz(3) organization Organization @relation(fields: [organizationId], references: [id], onDelete: Restrict) roles UserRole[] sessions Session[] recoveryTokens RecoveryToken[] addresses Address[] stockEntries StockLedger[] stockReservations StockReservation[] carts Cart[] orders Order[] @@unique([organizationId, email]) @@unique([id, organizationId]) @@index([organizationId, createdAt, id]) @@map("users") } model Role { id String @id @default(uuid()) @db.Uuid organizationId String @map("organization_id") @db.Uuid name String @db.VarChar(80) isSystem Boolean @default(false) @map("is_system") permissions String[] organization Organization @relation(fields: [organizationId], references: [id], onDelete: Restrict) users UserRole[] @@unique([organizationId, name]) @@unique([id, organizationId]) @@map("roles") } model UserRole { userId String @map("user_id") @db.Uuid roleId String @map("role_id") @db.Uuid organizationId String @map("organization_id") @db.Uuid user User @relation(fields: [userId, organizationId], references: [id, organizationId], onDelete: Cascade) role Role @relation(fields: [roleId, organizationId], references: [id, organizationId], onDelete: Restrict) @@id([userId, roleId]) @@index([roleId, organizationId]) @@map("user_roles") } model Session { id String @id @default(uuid()) @db.Uuid userId String @map("user_id") @db.Uuid tokenHash String @unique @map("token_hash") @db.Char(64) expiresAt DateTime @map("expires_at") @db.Timestamptz(3) createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3) user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@index([userId]) @@index([expiresAt]) @@map("sessions") } model RecoveryToken { id String @id @default(uuid()) @db.Uuid userId String @map("user_id") @db.Uuid tokenHash String @unique @map("token_hash") @db.Char(64) expiresAt DateTime @map("expires_at") @db.Timestamptz(3) user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@index([userId]) @@index([expiresAt]) @@map("recovery_tokens") } model AuditEvent { id String @id @default(uuid()) @db.Uuid organizationId String @map("organization_id") @db.Uuid actorId String? @map("actor_id") @db.Uuid action String @db.VarChar(80) targetId String? @map("target_id") @db.Uuid createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3) organization Organization @relation(fields: [organizationId], references: [id], onDelete: Restrict) @@index([organizationId, createdAt, id]) @@map("audit_events") } model RateLimit { key String @id @db.Char(64) hits Int expiresAt DateTime @map("expires_at") @db.Timestamptz(3) @@index([expiresAt]) @@map("rate_limits") }