233 lines
5.8 KiB
Plaintext
233 lines
5.8 KiB
Plaintext
// This is your Prisma schema file,
|
|
// learn more about it in the docs: https://pris.ly/d/prisma-schema
|
|
|
|
generator client {
|
|
provider = "prisma-client-js"
|
|
}
|
|
|
|
datasource db {
|
|
provider = "mysql"
|
|
url = env("DATABASE_URL")
|
|
}
|
|
|
|
// Model untuk User (Admin, Guru, Siswa)
|
|
model User {
|
|
id String @id @default(cuid())
|
|
email String @unique
|
|
name String
|
|
password String
|
|
role Role @default(STUDENT)
|
|
profileImage String?
|
|
isActive Boolean @default(true)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
// Relations
|
|
student Student?
|
|
teacher Teacher?
|
|
classEnrollments ClassStudent[]
|
|
attendances Attendance[]
|
|
grades Grade[]
|
|
|
|
@@map("users")
|
|
}
|
|
|
|
enum Role {
|
|
ADMIN
|
|
TEACHER
|
|
STUDENT
|
|
PARENT
|
|
}
|
|
|
|
enum Gender {
|
|
MALE
|
|
FEMALE
|
|
OTHER
|
|
}
|
|
|
|
// Model untuk Siswa
|
|
model Student {
|
|
id String @id @default(cuid())
|
|
userId String @unique
|
|
studentNumber String @unique
|
|
dateOfBirth DateTime
|
|
gender Gender @default(OTHER)
|
|
address String
|
|
phone String?
|
|
parentName String
|
|
parentPhone String
|
|
emergencyContact String?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
// Relations
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
classEnrollments ClassStudent[]
|
|
attendances Attendance[]
|
|
grades Grade[]
|
|
|
|
@@map("students")
|
|
}
|
|
|
|
// Model untuk Guru
|
|
model Teacher {
|
|
id String @id @default(cuid())
|
|
userId String @unique
|
|
teacherNumber String @unique
|
|
specialization String
|
|
qualification String
|
|
experience Int // dalam tahun
|
|
phone String?
|
|
address String?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
// Relations
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
subjects Subject[]
|
|
classes Class[]
|
|
attendances Attendance[]
|
|
grades Grade[]
|
|
|
|
@@map("teachers")
|
|
}
|
|
|
|
// Model untuk Mata Pelajaran
|
|
model Subject {
|
|
id String @id @default(cuid())
|
|
name String
|
|
code String @unique
|
|
description String?
|
|
credits Int @default(1)
|
|
isActive Boolean @default(true)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
// Relations
|
|
teacherId String
|
|
teacher Teacher @relation(fields: [teacherId], references: [id])
|
|
classes Class[]
|
|
grades Grade[]
|
|
|
|
@@map("subjects")
|
|
}
|
|
|
|
// Model untuk Kelas
|
|
model Class {
|
|
id String @id @default(cuid())
|
|
name String // e.g., "X-IPA-1", "XI-IPS-2"
|
|
grade String // e.g., "X", "XI", "XII"
|
|
section String // e.g., "IPA", "IPS"
|
|
maxStudents Int @default(30)
|
|
room String?
|
|
isActive Boolean @default(true)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
// Relations
|
|
teacherId String // Wali kelas
|
|
teacher Teacher @relation(fields: [teacherId], references: [id])
|
|
subjectId String
|
|
subject Subject @relation(fields: [subjectId], references: [id])
|
|
students ClassStudent[]
|
|
attendances Attendance[]
|
|
grades Grade[]
|
|
|
|
@@map("classes")
|
|
}
|
|
|
|
// Model untuk hubungan Siswa dan Kelas (Many-to-Many)
|
|
model ClassStudent {
|
|
id String @id @default(cuid())
|
|
studentId String
|
|
classId String
|
|
userId String
|
|
enrolledAt DateTime @default(now())
|
|
isActive Boolean @default(true)
|
|
|
|
// Relations
|
|
student Student @relation(fields: [studentId], references: [id], onDelete: Cascade)
|
|
class Class @relation(fields: [classId], references: [id], onDelete: Cascade)
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
|
|
@@unique([studentId, classId])
|
|
@@map("class_students")
|
|
}
|
|
|
|
// Model untuk Absensi
|
|
model Attendance {
|
|
id String @id @default(cuid())
|
|
date DateTime
|
|
status AttendanceStatus
|
|
notes String?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
// Relations
|
|
studentId String
|
|
student Student @relation(fields: [studentId], references: [id], onDelete: Cascade)
|
|
teacherId String
|
|
teacher Teacher @relation(fields: [teacherId], references: [id])
|
|
classId String
|
|
class Class @relation(fields: [classId], references: [id])
|
|
userId String
|
|
user User @relation(fields: [userId], references: [id])
|
|
|
|
@@unique([studentId, classId, date])
|
|
@@map("attendances")
|
|
}
|
|
|
|
enum AttendanceStatus {
|
|
PRESENT
|
|
ABSENT
|
|
LATE
|
|
EXCUSED
|
|
}
|
|
|
|
// Model untuk Nilai
|
|
model Grade {
|
|
id String @id @default(cuid())
|
|
type GradeType
|
|
score Float
|
|
maxScore Float @default(100)
|
|
description String?
|
|
date DateTime
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
// Relations
|
|
studentId String
|
|
student Student @relation(fields: [studentId], references: [id], onDelete: Cascade)
|
|
teacherId String
|
|
teacher Teacher @relation(fields: [teacherId], references: [id])
|
|
subjectId String
|
|
subject Subject @relation(fields: [subjectId], references: [id])
|
|
classId String
|
|
class Class @relation(fields: [classId], references: [id])
|
|
userId String
|
|
user User @relation(fields: [userId], references: [id])
|
|
|
|
@@map("grades")
|
|
}
|
|
|
|
enum GradeType {
|
|
QUIZ
|
|
ASSIGNMENT
|
|
MIDTERM
|
|
FINAL
|
|
PROJECT
|
|
}
|
|
|
|
// Model untuk Tahun Akademik
|
|
model AcademicYear {
|
|
id String @id @default(cuid())
|
|
name String @unique // e.g., "2024/2025"
|
|
startDate DateTime
|
|
endDate DateTime
|
|
isActive Boolean @default(false)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
@@map("academic_years")
|
|
}
|