| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- import { pgTable, text, timestamp, integer, boolean, uuid, varchar, date } from 'drizzle-orm/pg-core';
- import { relations } from 'drizzle-orm';
- import { eq, and, ne } from 'drizzle-orm';
- // Re-export drizzle operators for convenience
- export { eq, and, ne };
- // Tabla de usuarios (administradores, docentes, estudiantes)
- export const users = pgTable('users', {
- id: uuid('id').defaultRandom().primaryKey(),
- email: varchar('email', { length: 255 }).notNull().unique(),
- password: text('password').notNull(),
- firstName: varchar('first_name', { length: 100 }).notNull(),
- lastName: varchar('last_name', { length: 100 }).notNull(),
- cedula: varchar('cedula', { length: 20 }).notNull().unique(),
- phone: varchar('phone', { length: 20 }),
- role: varchar('role', { length: 20 }).notNull(), // 'admin', 'teacher', 'student'
- admissionNumber: varchar('admission_number', { length: 50 }), // Solo para estudiantes
- isActive: boolean('is_active').default(true),
- createdAt: timestamp('created_at').defaultNow(),
- updatedAt: timestamp('updated_at').defaultNow(),
- });
- // Tabla de periodos
- export const periods = pgTable('periods', {
- id: uuid('id').defaultRandom().primaryKey(),
- name: varchar('name', { length: 100 }).notNull(),
- startDate: date('start_date').notNull(),
- endDate: date('end_date').notNull(),
- isActive: boolean('is_active').default(true),
- createdAt: timestamp('created_at').defaultNow(),
- updatedAt: timestamp('updated_at').defaultNow(),
- });
- // Tabla de parciales
- export const partials = pgTable('partials', {
- id: uuid('id').defaultRandom().primaryKey(),
- name: varchar('name', { length: 100 }).notNull(),
- periodId: uuid('period_id').references(() => periods.id),
- startDate: date('start_date').notNull(),
- endDate: date('end_date').notNull(),
- isActive: boolean('is_active').default(true),
- createdAt: timestamp('created_at').defaultNow(),
- updatedAt: timestamp('updated_at').defaultNow(),
- });
- // Tabla de clases/materias
- export const classes = pgTable('classes', {
- id: uuid('id').defaultRandom().primaryKey(),
- name: varchar('name', { length: 100 }).notNull(),
- code: varchar('code', { length: 20 }).notNull().unique(),
- credits: integer('credits').notNull(),
- description: text('description'),
- periodId: uuid('period_id').references(() => periods.id),
- isActive: boolean('is_active').default(true),
- createdAt: timestamp('created_at').defaultNow(),
- updatedAt: timestamp('updated_at').defaultNow(),
- });
- // Tabla de paralelos/secciones
- export const sections = pgTable('sections', {
- id: uuid('id').defaultRandom().primaryKey(),
- name: varchar('name', { length: 50 }).notNull(),
- classId: uuid('class_id').references(() => classes.id),
- maxStudents: integer('max_students').notNull(),
- isActive: boolean('is_active').default(true),
- createdAt: timestamp('created_at').defaultNow(),
- updatedAt: timestamp('updated_at').defaultNow(),
- });
- // Tabla de asignaciones de docentes a clases/secciones
- export const teacherAssignments = pgTable('teacher_assignments', {
- id: uuid('id').defaultRandom().primaryKey(),
- teacherId: uuid('teacher_id').references(() => users.id),
- classId: uuid('class_id').references(() => classes.id),
- sectionId: uuid('section_id').references(() => sections.id),
- isActive: boolean('is_active').default(true),
- createdAt: timestamp('created_at').defaultNow(),
- });
- // Tabla de inscripciones de estudiantes
- export const studentEnrollments = pgTable('student_enrollments', {
- id: uuid('id').defaultRandom().primaryKey(),
- studentId: uuid('student_id').references(() => users.id),
- classId: uuid('class_id').references(() => classes.id),
- sectionId: uuid('section_id').references(() => sections.id),
- isActive: boolean('is_active').default(true),
- createdAt: timestamp('created_at').defaultNow(),
- });
- // Tabla de asistencia
- export const attendance = pgTable('attendance', {
- id: uuid('id').defaultRandom().primaryKey(),
- studentId: uuid('student_id').references(() => users.id),
- classId: uuid('class_id').references(() => classes.id),
- sectionId: uuid('section_id').references(() => sections.id),
- teacherId: uuid('teacher_id').references(() => users.id),
- partialId: uuid('partial_id').references(() => partials.id),
- date: date('date').notNull(),
- status: varchar('status', { length: 20 }).notNull(), // 'present', 'absent', 'justified'
- reason: text('reason'), // Motivo de falta o justificación
- createdAt: timestamp('created_at').defaultNow(),
- });
- // Relaciones
- export const usersRelations = relations(users, ({ many }) => ({
- teacherAssignments: many(teacherAssignments),
- studentEnrollments: many(studentEnrollments),
- attendanceAsStudent: many(attendance, { relationName: 'studentAttendance' }),
- attendanceAsTeacher: many(attendance, { relationName: 'teacherAttendance' }),
- }));
- export const periodsRelations = relations(periods, ({ many }) => ({
- partials: many(partials),
- sections: many(sections),
- }));
- export const partialsRelations = relations(partials, ({ one }) => ({
- period: one(periods, {
- fields: [partials.periodId],
- references: [periods.id],
- }),
- }));
- export const classesRelations = relations(classes, ({ one, many }) => ({
- period: one(periods, {
- fields: [classes.periodId],
- references: [periods.id],
- }),
- sections: many(sections),
- teacherAssignments: many(teacherAssignments),
- studentEnrollments: many(studentEnrollments),
- attendance: many(attendance),
- }));
- export const sectionsRelations = relations(sections, ({ one, many }) => ({
- class: one(classes, {
- fields: [sections.classId],
- references: [classes.id],
- }),
- teacherAssignments: many(teacherAssignments),
- studentEnrollments: many(studentEnrollments),
- attendance: many(attendance),
- }));
- export const teacherAssignmentsRelations = relations(teacherAssignments, ({ one }) => ({
- teacher: one(users, {
- fields: [teacherAssignments.teacherId],
- references: [users.id],
- }),
- class: one(classes, {
- fields: [teacherAssignments.classId],
- references: [classes.id],
- }),
- section: one(sections, {
- fields: [teacherAssignments.sectionId],
- references: [sections.id],
- }),
- }));
- export const studentEnrollmentsRelations = relations(studentEnrollments, ({ one }) => ({
- student: one(users, {
- fields: [studentEnrollments.studentId],
- references: [users.id],
- }),
- class: one(classes, {
- fields: [studentEnrollments.classId],
- references: [classes.id],
- }),
- section: one(sections, {
- fields: [studentEnrollments.sectionId],
- references: [sections.id],
- }),
- }));
- export const attendanceRelations = relations(attendance, ({ one }) => ({
- student: one(users, {
- fields: [attendance.studentId],
- references: [users.id],
- relationName: 'studentAttendance',
- }),
- teacher: one(users, {
- fields: [attendance.teacherId],
- references: [users.id],
- relationName: 'teacherAttendance',
- }),
- class: one(classes, {
- fields: [attendance.classId],
- references: [classes.id],
- }),
- section: one(sections, {
- fields: [attendance.sectionId],
- references: [sections.id],
- }),
- partial: one(partials, {
- fields: [attendance.partialId],
- references: [partials.id],
- }),
- }));
|