Pratham200Rajbhar
first commit
78013c4
Raw
History Blame Contribute Delete
9.95 kB
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
extensions = [vector]
}
generator client {
provider = "prisma-client-py"
recursive_type_depth = 5
previewFeatures = ["postgresqlExtensions"]
}
enum Role {
STUDENT
TEACHER
ADMIN
}
enum LeaveStatus {
PENDING
APPROVED
REJECTED
}
enum DeviceChangeStatus {
PENDING
APPROVED
REJECTED
}
model User {
id String @id @default(uuid())
email String @unique
hashedPassword String @map("hashed_password")
role Role @default(STUDENT)
isActive Boolean @default(true) @map("is_active")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
student Student?
teacher Teacher?
@@map("users")
}
model Student {
id String @id @default(uuid())
userId String @unique @map("user_id")
enrollmentNumber String @unique @map("enrollment_number")
firstName String? @map("first_name")
lastName String? @map("last_name")
phone String? @map("phone")
gender String? @map("gender")
dateOfBirth DateTime? @map("date_of_birth")
semester Int? @map("semester")
batch String? @map("batch")
departmentId String? @map("department_id")
deviceUuid String? @map("device_uuid")
fcmToken String? @map("fcm_token")
faceEmbedding Unsupported("vector(128)")? @map("face_embedding")
currentStreak Int @default(0) @map("current_streak")
highestStreak Int @default(0) @map("highest_streak")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
department Department? @relation(fields: [departmentId], references: [id])
attendance Attendance[]
enrollments Enrollment[]
leaveRequests LeaveRequest[]
deviceChangeRequests DeviceChangeRequest[]
@@map("students")
}
model Teacher {
id String @id @default(uuid())
userId String @unique @map("user_id")
firstName String @map("first_name")
lastName String @map("last_name")
employeeId String @unique @map("employee_id")
phone String? @map("phone")
qualification String? @map("qualification")
specialization String? @map("specialization")
experienceYears Int? @map("experience_years")
joiningDate DateTime? @map("joining_date")
departmentId String @map("department_id")
designationId String @map("designation_id")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
department Department @relation(fields: [departmentId], references: [id])
designation Designation @relation(fields: [designationId], references: [id])
classes AcademicClass[]
@@map("teachers")
}
model AcademicClass {
id String @id @default(uuid())
name String
subjectId String @map("subject_id")
classroomId String? @map("classroom_id")
teacherId String @map("teacher_id")
semester Int? @map("semester")
batch String? @map("batch")
maxStudents Int? @map("max_students")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
teacher Teacher @relation(fields: [teacherId], references: [id])
subject Subject @relation(fields: [subjectId], references: [id])
classroom Classroom? @relation(fields: [classroomId], references: [id])
sessions Session[]
geofence Geofence?
enrollments Enrollment[]
@@map("classes")
}
model Session {
id String @id @default(uuid())
academicClassId String @map("class_id")
startTime DateTime @map("start_time")
endTime DateTime @map("end_time")
isActive Boolean @default(true) @map("is_active")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
academicClass AcademicClass @relation(fields: [academicClassId], references: [id])
attendance Attendance[]
@@map("sessions")
}
model Geofence {
id String @id @default(uuid())
academicClassId String @unique @map("class_id")
latitude Float
longitude Float
radiusMeters Float @map("radius_meters")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
academicClass AcademicClass @relation(fields: [academicClassId], references: [id])
@@map("geofences")
}
model Attendance {
id String @id @default(uuid())
studentId String @map("student_id")
sessionId String @map("session_id")
status String
faceScore Float @map("face_score")
livenessScore Float @map("liveness_score")
backgroundScore Float @map("background_score")
finalAiScore Float @map("final_ai_score")
gpsLatitude Float @map("gps_latitude")
gpsLongitude Float @map("gps_longitude")
remarks String?
studentNote String? @map("student_note")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
student Student @relation(fields: [studentId], references: [id])
session Session @relation(fields: [sessionId], references: [id])
@@unique([studentId, sessionId])
@@map("attendance")
}
model Enrollment {
id String @id @default(uuid())
studentId String @map("student_id")
academicClassId String @map("academic_class_id")
enrolledAt DateTime @default(now()) @map("enrolled_at")
student Student @relation(fields: [studentId], references: [id], onDelete: Cascade)
academicClass AcademicClass @relation(fields: [academicClassId], references: [id], onDelete: Cascade)
@@unique([studentId, academicClassId])
@@map("enrollments")
}
model Department {
id String @id @default(uuid())
name String @unique
code String @unique
head String?
description String?
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
teachers Teacher[]
students Student[]
@@map("departments")
}
model Subject {
id String @id @default(uuid())
name String @unique
code String @unique
description String?
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
classes AcademicClass[]
@@map("subjects")
}
model Classroom {
id String @id @default(uuid())
name String @unique
building String?
capacity Int?
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
classes AcademicClass[]
@@map("classrooms")
}
model Designation {
id String @id @default(uuid())
name String @unique
code String @unique
description String?
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
teachers Teacher[]
@@map("designations")
}
model LeaveRequest {
id String @id @default(uuid())
studentId String @map("student_id")
startDate DateTime @map("start_date")
endDate DateTime @map("end_date")
reason String
documentUrl String? @map("document_url")
status LeaveStatus @default(PENDING)
approvedBy String? @map("approved_by")
approverNote String? @map("approver_note")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
student Student @relation(fields: [studentId], references: [id], onDelete: Cascade)
@@map("leave_requests")
}
model AuditLog {
id String @id @default(uuid())
timestamp DateTime @default(now())
eventType String @map("event_type")
severity String
actor String
target String
description String
ipAddress String? @map("ip_address")
metadata Json?
@@map("audit_logs")
}
model DeviceChangeRequest {
id String @id @default(uuid())
studentId String @map("student_id")
status DeviceChangeStatus @default(PENDING)
reason String?
newDeviceUuid String @map("new_device_uuid")
approvedBy String? @map("approved_by")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
student Student @relation(fields: [studentId], references: [id], onDelete: Cascade)
@@map("device_change_requests")
}
model SystemConfiguration {
id String @id @default(uuid())
isFaceRecognitionEnabled Boolean @default(true) @map("is_face_recognition_enabled")
isGpsVerificationEnabled Boolean @default(true) @map("is_gps_verification_enabled")
isAiBackgroundValidationEnabled Boolean @default(true) @map("is_ai_background_validation_enabled")
updatedAt DateTime @updatedAt @map("updated_at")
@@map("system_configurations")
}