generator client { provider = "prisma-client-js" } datasource db { provider = "mysql" url = env("DATABASE_URL") } model admins { id String @id userId String @unique name String phone String? createdAt DateTime @default(now()) updatedAt DateTime users users @relation(fields: [userId], references: [id], onDelete: Cascade) } model attendance_sessions { id String @id scheduleId String date DateTime @db.Date startTime DateTime endTime DateTime qrCode String? @unique qrExpiredAt DateTime? topic String? notes String? @db.Text isActive Boolean @default(true) createdAt DateTime @default(now()) updatedAt DateTime schedules schedules @relation(fields: [scheduleId], references: [id], onDelete: Cascade) attendances attendances[] @@unique([scheduleId, date]) } model attendances { id String @id sessionId String studentId String status attendances_status @default(PRESENT) checkInTime DateTime @default(now()) ipAddress String? latitude Float? longitude Float? deviceInfo String? @db.Text notes String? @db.Text createdAt DateTime @default(now()) updatedAt DateTime attendance_sessions attendance_sessions @relation(fields: [sessionId], references: [id], onDelete: Cascade) students students @relation(fields: [studentId], references: [id], onDelete: Cascade) @@unique([sessionId, studentId]) @@index([studentId], map: "attendances_studentId_fkey") } model audit_logs { id String @id userId String action String entity String entityId String oldValue String? @db.Text newValue String? @db.Text ipAddress String? userAgent String? @db.Text createdAt DateTime @default(now()) } model classes { id String @id name String @unique grade String major String? capacity Int @default(40) createdAt DateTime @default(now()) updatedAt DateTime schedules schedules[] students students[] } model courses { id String @id code String @unique name String description String? @db.Text teacherId String credits Int @default(2) createdAt DateTime @default(now()) updatedAt DateTime teachers teachers @relation(fields: [teacherId], references: [id], onDelete: Cascade) schedules schedules[] @@index([teacherId], map: "courses_teacherId_fkey") } model leave_requests { id String @id studentId String startDate DateTime @db.Date endDate DateTime @db.Date type leave_requests_type reason String @db.Text attachment String? status leave_requests_status @default(PENDING) reviewedBy String? reviewedAt DateTime? reviewNotes String? @db.Text createdAt DateTime @default(now()) updatedAt DateTime students students @relation(fields: [studentId], references: [id], onDelete: Cascade) @@index([studentId], map: "leave_requests_studentId_fkey") } model notifications { id String @id userId String type notifications_type title String message String @db.Text isRead Boolean @default(false) createdAt DateTime @default(now()) } model schedules { id String @id courseId String classId String teacherId String dayOfWeek schedules_dayOfWeek startTime String endTime String room String? wifiNetworkId String? isActive Boolean @default(true) createdAt DateTime @default(now()) updatedAt DateTime attendance_sessions attendance_sessions[] classes classes @relation(fields: [classId], references: [id], onDelete: Cascade) courses courses @relation(fields: [courseId], references: [id], onDelete: Cascade) teachers teachers @relation(fields: [teacherId], references: [id], onDelete: Cascade) wifi_networks wifi_networks? @relation(fields: [wifiNetworkId], references: [id]) @@index([classId], map: "schedules_classId_fkey") @@index([courseId], map: "schedules_courseId_fkey") @@index([teacherId], map: "schedules_teacherId_fkey") @@index([wifiNetworkId], map: "schedules_wifiNetworkId_fkey") } model students { id String @id userId String @unique nis String @unique name String phone String? address String? @db.Text photo String? classId String? parentPhone String? parentEmail String? createdAt DateTime @default(now()) updatedAt DateTime attendances attendances[] leave_requests leave_requests[] classes classes? @relation(fields: [classId], references: [id]) users users @relation(fields: [userId], references: [id], onDelete: Cascade) @@index([classId], map: "students_classId_fkey") } model teachers { id String @id userId String @unique nip String @unique name String phone String? createdAt DateTime @default(now()) updatedAt DateTime courses courses[] schedules schedules[] users users @relation(fields: [userId], references: [id], onDelete: Cascade) } model users { id String @id email String @unique password String role users_role @default(STUDENT) isActive Boolean @default(true) createdAt DateTime @default(now()) updatedAt DateTime admins admins? students students? teachers teachers? } model wifi_networks { id String @id ssid String description String? ipRange String latitude Float? longitude Float? radius Int @default(50) isActive Boolean @default(true) createdAt DateTime @default(now()) updatedAt DateTime schedules schedules[] } enum notifications_type { ATTENDANCE_REMINDER ABSENCE_ALERT LEAVE_APPROVED LEAVE_REJECTED SYSTEM } enum attendances_status { PRESENT LATE EXCUSED SICK ABSENT } enum users_role { ADMIN STUDENT TEACHER } enum leave_requests_type { SICK EXCUSED OTHER } enum schedules_dayOfWeek { MONDAY TUESDAY WEDNESDAY THURSDAY FRIDAY SATURDAY SUNDAY } enum leave_requests_status { PENDING APPROVED REJECTED }