generator client { provider = "prisma-client" output = "../src/generated/prisma" } datasource db { provider = "postgresql" } // ============== APP MODELS (existing) ============== model Plan { code String @id @map("code") @db.VarChar(10) name String @db.VarChar(30) price Decimal @map("price") @db.Decimal(19, 2) rules Json @map("rules") lastUpdatedAt DateTime @default(now()) @map("last_updated_at") complexes Complex[] @@map("plans") } model Complex { id String @id @db.Uuid complexSlug String @unique @map("complex_slug") complexName String @map("complex_name") physicalAddress String @map("physical_address") city String? state String? country String? adminEmail String @map("admin_email") planCode String @map("plan_code") isActive Boolean @default(true) @map("is_active") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") plan Plan @relation(fields: [planCode], references: [code]) users ComplexUser[] courts Court[] @@index([adminEmail]) @@map("complexes") } model ComplexUser { id String @id @default(cuid()) @map("id") complexId String @map("complex_id") @db.Uuid userId String @map("user_id") role ComplexUserRole createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") complex Complex @relation(fields: [complexId], references: [id], onDelete: Cascade) user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@unique([complexId, userId]) @@map("complex_users") } enum ComplexUserRole { ADMIN MANAGER USER } enum DayOfWeek { MONDAY TUESDAY WEDNESDAY THURSDAY FRIDAY SATURDAY SUNDAY } enum CourtBookingStatus { CONFIRMED CANCELLED COMPLETED } model Sport { id String @id @db.Uuid name String @unique slug String @unique isActive Boolean @default(true) @map("is_active") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") courts Court[] @@map("sports") } model Court { id String @id @db.Uuid complexId String @map("complex_id") @db.Uuid sportId String @map("sport_id") @db.Uuid name String slotDurationMinutes Int @map("slot_duration_minutes") basePrice Decimal @map("base_price") @db.Decimal(19, 2) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") complex Complex @relation(fields: [complexId], references: [id], onDelete: Cascade) sport Sport @relation(fields: [sportId], references: [id]) availabilities CourtAvailability[] priceRules CourtPriceRule[] bookings CourtBooking[] @@index([complexId]) @@index([sportId]) @@map("courts") } model CourtAvailability { id String @id @db.Uuid courtId String @map("court_id") @db.Uuid dayOfWeek DayOfWeek @map("day_of_week") startTime String @map("start_time") @db.VarChar(5) endTime String @map("end_time") @db.VarChar(5) createdAt DateTime @default(now()) @map("created_at") court Court @relation(fields: [courtId], references: [id], onDelete: Cascade) @@index([courtId, dayOfWeek]) @@map("court_availabilities") } model CourtPriceRule { id String @id @db.Uuid courtId String @map("court_id") @db.Uuid dayOfWeek DayOfWeek? @map("day_of_week") startTime String? @map("start_time") @db.VarChar(5) endTime String? @map("end_time") @db.VarChar(5) price Decimal @db.Decimal(19, 2) isActive Boolean @default(true) @map("is_active") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") court Court @relation(fields: [courtId], references: [id], onDelete: Cascade) @@index([courtId, isActive]) @@map("court_price_rules") } model CourtBooking { id String @id @db.Uuid bookingCode String @unique @map("booking_code") @db.VarChar(8) courtId String @map("court_id") @db.Uuid bookingDate DateTime @map("booking_date") @db.Date startTime String @map("start_time") @db.VarChar(5) endTime String @map("end_time") @db.VarChar(5) customerName String @map("customer_name") @db.VarChar(120) customerPhone String @map("customer_phone") @db.VarChar(30) status CourtBookingStatus @default(CONFIRMED) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") court Court @relation(fields: [courtId], references: [id], onDelete: Cascade) @@unique([courtId, bookingDate, startTime]) @@index([courtId, bookingDate]) @@index([bookingDate]) @@map("court_bookings") } model OnboardingRequest { id String @id @db.Uuid fullName String @map("full_name") email String otpHash String @map("otp_hash") otpExpiresAt DateTime @map("otp_expires_at") otpAttempts Int @default(0) @map("otp_attempts") otpLastSentAt DateTime @map("otp_last_sent_at") otpResendCount Int @default(0) @map("otp_resend_count") emailVerifiedAt DateTime? @map("email_verified_at") completedAt DateTime? @map("completed_at") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@index([email]) @@index([otpExpiresAt]) @@map("onboarding_requests") } model PasswordResetRequest { id String @id @db.Uuid email String otpHash String @map("otp_hash") otpExpiresAt DateTime @map("otp_expires_at") otpAttempts Int @default(0) @map("otp_attempts") otpLastSentAt DateTime @map("otp_last_sent_at") otpResendCount Int @default(0) @map("otp_resend_count") usedAt DateTime? @map("used_at") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@index([email]) @@index([otpExpiresAt]) @@map("password_reset_requests") } // ============== BETTER AUTH MODELS ============== model User { id String @id @default(cuid()) @map("id") supabaseUserId String? @unique @map("supabase_user_id") @db.Uuid name String? email String @unique emailVerified Boolean @default(false) image String? fullName String? @map("full_name") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") accounts Account[] sessions Session[] complexes ComplexUser[] @@map("users") } model Session { id String @id @default(cuid()) @map("id") userId String @map("user_id") user User @relation(fields: [userId], references: [id], onDelete: Cascade) token String @unique expiresAt DateTime @map("expires_at") ipAddress String? @map("ip_address") userAgent String? @map("user_agent") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@map("session") } model Account { id String @id @default(cuid()) @map("id") userId String @map("user_id") user User @relation(fields: [userId], references: [id], onDelete: Cascade) accountId String @map("account_id") providerId String @map("provider_id") accessToken String? @map("access_token") refreshToken String? @map("refresh_token") accessTokenExpiresAt DateTime? @map("access_token_expires_at") refreshTokenExpiresAt DateTime? @map("refresh_token_expires_at") scope String? @map("scope") idToken String? @map("id_token") password String? @map("password") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@map("account") } model Verification { id String @id @default(cuid()) @map("id") identifier String value String expiresAt DateTime @map("expires_at") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@map("verification") }