DockerComposeOrchestration/prisma/schema.prisma

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")
}