hadirapp_be/prisma/schema.prisma
2025-10-30 21:11:44 +07:00

257 lines
6.8 KiB
Plaintext

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
}