// VIP Coordinator - Prisma Schema // This is your database schema (source of truth) generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } // ============================================ // User Management // ============================================ model User { id String @id @default(uuid()) auth0Id String @unique // Auth0 sub claim email String @unique name String? picture String? role Role @default(COORDINATOR) isApproved Boolean @default(false) driver Driver? // Optional linked driver account createdAt DateTime @default(now()) updatedAt DateTime @updatedAt deletedAt DateTime? // Soft delete @@map("users") } enum Role { ADMINISTRATOR COORDINATOR DRIVER } // ============================================ // VIP Management // ============================================ model VIP { id String @id @default(uuid()) name String organization String? department Department arrivalMode ArrivalMode expectedArrival DateTime? // For self-driving arrivals airportPickup Boolean @default(false) venueTransport Boolean @default(false) notes String? @db.Text flights Flight[] events ScheduleEvent[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt deletedAt DateTime? // Soft delete @@map("vips") } enum Department { OFFICE_OF_DEVELOPMENT ADMIN } enum ArrivalMode { FLIGHT SELF_DRIVING } // ============================================ // Flight Tracking // ============================================ model Flight { id String @id @default(uuid()) vipId String vip VIP @relation(fields: [vipId], references: [id], onDelete: Cascade) flightNumber String flightDate DateTime segment Int @default(1) // For multi-segment itineraries departureAirport String // IATA code (e.g., "JFK") arrivalAirport String // IATA code (e.g., "LAX") scheduledDeparture DateTime? scheduledArrival DateTime? actualDeparture DateTime? actualArrival DateTime? status String? // scheduled, delayed, landed, etc. createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@map("flights") @@index([vipId]) @@index([flightNumber, flightDate]) } // ============================================ // Driver Management // ============================================ model Driver { id String @id @default(uuid()) name String phone String department Department? userId String? @unique user User? @relation(fields: [userId], references: [id]) // Shift/Availability shiftStartTime DateTime? // When driver's shift starts shiftEndTime DateTime? // When driver's shift ends isAvailable Boolean @default(true) events ScheduleEvent[] assignedVehicle Vehicle? @relation("AssignedDriver") createdAt DateTime @default(now()) updatedAt DateTime @updatedAt deletedAt DateTime? // Soft delete @@map("drivers") } // ============================================ // Vehicle Management // ============================================ model Vehicle { id String @id @default(uuid()) name String // "Blue Van", "Suburban #3" type VehicleType @default(VAN) licensePlate String? seatCapacity Int // Total seats (e.g., 8) status VehicleStatus @default(AVAILABLE) // Current assignment currentDriverId String? @unique currentDriver Driver? @relation("AssignedDriver", fields: [currentDriverId], references: [id]) // Relationships events ScheduleEvent[] notes String? @db.Text createdAt DateTime @default(now()) updatedAt DateTime @updatedAt deletedAt DateTime? // Soft delete @@map("vehicles") } enum VehicleType { VAN // 7-15 seats SUV // 5-8 seats SEDAN // 4-5 seats BUS // 15+ seats GOLF_CART // 2-6 seats TRUCK // For equipment/supplies } enum VehicleStatus { AVAILABLE // Ready to use IN_USE // Currently on a trip MAINTENANCE // Out of service RESERVED // Scheduled for upcoming trip } // ============================================ // Schedule & Event Management // ============================================ model ScheduleEvent { id String @id @default(uuid()) vipId String vip VIP @relation(fields: [vipId], references: [id], onDelete: Cascade) title String // Location details pickupLocation String? dropoffLocation String? location String? // For non-transport events // Timing startTime DateTime endTime DateTime actualStartTime DateTime? actualEndTime DateTime? description String? @db.Text type EventType @default(TRANSPORT) status EventStatus @default(SCHEDULED) // Assignments driverId String? driver Driver? @relation(fields: [driverId], references: [id], onDelete: SetNull) vehicleId String? vehicle Vehicle? @relation(fields: [vehicleId], references: [id], onDelete: SetNull) // Metadata notes String? @db.Text createdAt DateTime @default(now()) updatedAt DateTime @updatedAt deletedAt DateTime? // Soft delete @@map("schedule_events") @@index([vipId]) @@index([driverId]) @@index([vehicleId]) @@index([startTime, endTime]) @@index([status]) } enum EventType { TRANSPORT MEETING EVENT MEAL ACCOMMODATION } enum EventStatus { SCHEDULED IN_PROGRESS COMPLETED CANCELLED }