// Domain models model Group { id String @id @default(cuid()) name String description String? createdById String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt owner User @relation("OwnerGroups", fields: [createdById], references: [id], onDelete: Cascade) members GroupMember[] students Student[] payments Payment[] @@map("groups") } model GroupMember { id String @id @default(cuid()) groupId String userId String role Role @default(MEMBER) // OWNER, ADMIN, MEMBER joinedAt DateTime @default(now()) group Group @relation(fields: [groupId], references: [id], onDelete: Cascade) user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@unique([groupId, userId]) @@map("group_members") } enum Role { OWNER ADMIN MEMBER } model Student { id String @id @default(cuid()) groupId String fullName String email String? phone String? guardianName String? guardianPhone String? notes String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt group Group @relation(fields: [groupId], references: [id], onDelete: Cascade) payments Payment[] @@index([groupId]) @@map("students") } model Payment { id String @id @default(cuid()) groupId String studentId String amount Decimal @db.Decimal(10, 2) currency String @default("MXN") status PaymentStatus @default(PENDING) // PENDING, PAID, OVERDUE, CANCELLED dueDate DateTime paidAt DateTime? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt group Group @relation(fields: [groupId], references: [id], onDelete: Cascade) student Student @relation(fields: [studentId], references: [id], onDelete: Cascade) @@index([groupId]) @@index([studentId]) @@map("payments") } enum PaymentStatus { PENDING PAID OVERDUE CANCELLED } model WaitlistEntry { id String @id @default(cuid()) email String name String? status WaitlistStatus @default(PENDING) // PENDING, INVITED, JOINED, DECLINED createdAt DateTime @default(now()) updatedAt DateTime @updatedAt userId String? @unique user User? @relation(fields: [userId], references: [id], onDelete: SetNull) @@unique([email]) @@map("waitlist_entries") } enum WaitlistStatus { PENDING INVITED JOINED DECLINED }