schema.prisma 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. // This is your Prisma schema file,
  2. // learn more about it in the docs: https://pris.ly/d/prisma-schema
  3. generator client {
  4. provider = "prisma-client-js"
  5. }
  6. datasource db {
  7. provider = "postgresql"
  8. url = env("DATABASE_URL")
  9. }
  10. // Modelo de Usuario para autenticación
  11. model User {
  12. id String @id @default(cuid())
  13. email String @unique
  14. password String
  15. role UserRole
  16. createdAt DateTime @default(now())
  17. updatedAt DateTime @updatedAt
  18. // Relaciones
  19. teacher Teacher?
  20. student Student?
  21. @@map("users")
  22. }
  23. enum UserRole {
  24. ADMIN
  25. TEACHER
  26. STUDENT
  27. }
  28. // Modelo de Periodo Académico
  29. model Period {
  30. id String @id @default(cuid())
  31. name String
  32. startDate DateTime
  33. endDate DateTime
  34. isActive Boolean @default(true)
  35. createdAt DateTime @default(now())
  36. updatedAt DateTime @updatedAt
  37. deletedAt DateTime?
  38. // Relaciones
  39. classes Class[]
  40. partials Partial[]
  41. @@map("periods")
  42. }
  43. // Modelo de Parciales
  44. model Partial {
  45. id String @id @default(cuid())
  46. name String
  47. periodId String
  48. isActive Boolean @default(true)
  49. createdAt DateTime @default(now())
  50. updatedAt DateTime @updatedAt
  51. deletedAt DateTime?
  52. // Relaciones
  53. period Period @relation(fields: [periodId], references: [id])
  54. @@map("partials")
  55. }
  56. // Modelo de Clases (Materias)
  57. model Class {
  58. id String @id @default(cuid())
  59. name String
  60. code String @unique
  61. description String?
  62. periodId String
  63. isActive Boolean @default(true)
  64. createdAt DateTime @default(now())
  65. updatedAt DateTime @updatedAt
  66. deletedAt DateTime?
  67. // Relaciones
  68. period Period @relation(fields: [periodId], references: [id])
  69. sections Section[]
  70. @@map("classes")
  71. }
  72. // Modelo de Secciones (Paralelos)
  73. model Section {
  74. id String @id @default(cuid())
  75. name String
  76. classId String
  77. isActive Boolean @default(true)
  78. createdAt DateTime @default(now())
  79. updatedAt DateTime @updatedAt
  80. deletedAt DateTime?
  81. // Relaciones
  82. class Class @relation(fields: [classId], references: [id])
  83. teacherAssignments TeacherAssignment[]
  84. studentEnrollments StudentEnrollment[]
  85. attendances Attendance[]
  86. @@map("sections")
  87. }
  88. // Modelo de Profesores
  89. model Teacher {
  90. id String @id @default(cuid())
  91. userId String @unique
  92. firstName String
  93. lastName String
  94. cedula String @unique
  95. email String @unique
  96. phone String
  97. isActive Boolean @default(true)
  98. createdAt DateTime @default(now())
  99. updatedAt DateTime @updatedAt
  100. deletedAt DateTime?
  101. // Relaciones
  102. user User @relation(fields: [userId], references: [id])
  103. assignments TeacherAssignment[]
  104. @@map("teachers")
  105. }
  106. // Modelo de Estudiantes
  107. model Student {
  108. id String @id @default(cuid())
  109. userId String @unique
  110. firstName String
  111. lastName String
  112. cedula String @unique
  113. email String @unique
  114. phone String
  115. admissionNumber String @unique
  116. isActive Boolean @default(true)
  117. createdAt DateTime @default(now())
  118. updatedAt DateTime @updatedAt
  119. deletedAt DateTime?
  120. // Relaciones
  121. user User @relation(fields: [userId], references: [id])
  122. enrollments StudentEnrollment[]
  123. attendances Attendance[]
  124. @@map("students")
  125. }
  126. // Tabla de asignación de profesores a secciones
  127. model TeacherAssignment {
  128. id String @id @default(cuid())
  129. teacherId String
  130. sectionId String
  131. isActive Boolean @default(true)
  132. createdAt DateTime @default(now())
  133. updatedAt DateTime @updatedAt
  134. // Relaciones
  135. teacher Teacher @relation(fields: [teacherId], references: [id])
  136. section Section @relation(fields: [sectionId], references: [id])
  137. @@unique([teacherId, sectionId])
  138. @@map("teacher_assignments")
  139. }
  140. // Tabla de inscripción de estudiantes a secciones
  141. model StudentEnrollment {
  142. id String @id @default(cuid())
  143. studentId String
  144. sectionId String
  145. isActive Boolean @default(true)
  146. createdAt DateTime @default(now())
  147. updatedAt DateTime @updatedAt
  148. // Relaciones
  149. student Student @relation(fields: [studentId], references: [id])
  150. section Section @relation(fields: [sectionId], references: [id])
  151. @@unique([studentId, sectionId])
  152. @@map("student_enrollments")
  153. }
  154. // Modelo de Asistencia
  155. model Attendance {
  156. id String @id @default(cuid())
  157. studentId String
  158. sectionId String
  159. date DateTime @db.Date
  160. status AttendanceStatus
  161. reason String?
  162. createdAt DateTime @default(now())
  163. updatedAt DateTime @updatedAt
  164. // Relaciones
  165. student Student @relation(fields: [studentId], references: [id])
  166. section Section @relation(fields: [sectionId], references: [id])
  167. @@unique([studentId, sectionId, date])
  168. @@map("attendances")
  169. }
  170. enum AttendanceStatus {
  171. PRESENT
  172. ABSENT
  173. JUSTIFIED
  174. }