Browse Source

there is something wrong here

Matthew Trejo 3 months ago
parent
commit
72dba2f325
7 changed files with 518 additions and 4 deletions
  1. 8 4
      README.md
  2. 47 0
      package-lock.json
  3. 2 0
      package.json
  4. 11 0
      src/lib/db/index.js
  5. 3 0
      src/lib/db/index.ts
  6. 214 0
      src/lib/db/schema.js
  7. 233 0
      src/lib/db/seed.js

+ 8 - 4
README.md

@@ -23,8 +23,6 @@ cd nimi
 
 ```bash
 npm install
-# o
-yarn install
 ```
 
 ### 3. Configurar variables de entorno
@@ -32,10 +30,10 @@ yarn install
 Copia el archivo de ejemplo y configura las variables:
 
 ```bash
-cp .env.example .env.local
+cp .env.example .env
 ```
 
-Edita el archivo `.env.local` con tus configuraciones:
+Edita el archivo `.env` con tus configuraciones:
 
 ```env
 # Database
@@ -81,6 +79,12 @@ Si existe un archivo de seed:
 npm run db:seed
 ```
 
+Si este comando falla, intenta instalar tsx con:
+
+```bash
+npm install tsx
+```
+
 ### 5. Ejecutar el servidor de desarrollo
 
 ```bash

+ 47 - 0
package-lock.json

@@ -24,6 +24,7 @@
         "class-variance-authority": "^0.7.1",
         "clsx": "^2.1.1",
         "date-fns": "^4.1.0",
+        "dotenv": "^17.2.1",
         "drizzle-kit": "^0.31.4",
         "drizzle-orm": "^0.44.4",
         "lucide-react": "^0.539.0",
@@ -35,6 +36,7 @@
         "react-dom": "19.1.0",
         "sonner": "^2.0.7",
         "tailwind-merge": "^3.3.1",
+        "tsx": "^4.20.4",
         "zod": "^4.0.17"
       },
       "devDependencies": {
@@ -4499,6 +4501,18 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/dotenv": {
+      "version": "17.2.1",
+      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.1.tgz",
+      "integrity": "sha512-kQhDYKZecqnM0fCnzI5eIv5L4cAe/iRI+HqMbO/hbRdTAeXDG+M9FjipUxNfbARuEg4iHIbhnhs78BCHNbSxEQ==",
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://dotenvx.com"
+      }
+    },
     "node_modules/drizzle-kit": {
       "version": "0.31.4",
       "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.31.4.tgz",
@@ -5485,6 +5499,20 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/fsevents": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+      "hasInstallScript": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+      }
+    },
     "node_modules/function-bind": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
@@ -8346,6 +8374,25 @@
       "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
       "license": "0BSD"
     },
+    "node_modules/tsx": {
+      "version": "4.20.4",
+      "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.4.tgz",
+      "integrity": "sha512-yyxBKfORQ7LuRt/BQKBXrpcq59ZvSW0XxwfjAt3w2/8PmdxaFzijtMhTawprSHhpzeM5BgU2hXHG3lklIERZXg==",
+      "license": "MIT",
+      "dependencies": {
+        "esbuild": "~0.25.0",
+        "get-tsconfig": "^4.7.5"
+      },
+      "bin": {
+        "tsx": "dist/cli.mjs"
+      },
+      "engines": {
+        "node": ">=18.0.0"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.3"
+      }
+    },
     "node_modules/tw-animate-css": {
       "version": "1.3.7",
       "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.3.7.tgz",

+ 2 - 0
package.json

@@ -29,6 +29,7 @@
     "class-variance-authority": "^0.7.1",
     "clsx": "^2.1.1",
     "date-fns": "^4.1.0",
+    "dotenv": "^17.2.1",
     "drizzle-kit": "^0.31.4",
     "drizzle-orm": "^0.44.4",
     "lucide-react": "^0.539.0",
@@ -40,6 +41,7 @@
     "react-dom": "19.1.0",
     "sonner": "^2.0.7",
     "tailwind-merge": "^3.3.1",
+    "tsx": "^4.20.4",
     "zod": "^4.0.17"
   },
   "devDependencies": {

+ 11 - 0
src/lib/db/index.js

@@ -0,0 +1,11 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.db = void 0;
+var postgres_js_1 = require("drizzle-orm/postgres-js");
+var postgres_1 = require("postgres");
+var schema = require("./schema");
+if (!process.env.DATABASE_URL) {
+    throw new Error('DATABASE_URL is not defined');
+}
+var client = (0, postgres_1.default)(process.env.DATABASE_URL);
+exports.db = (0, postgres_js_1.drizzle)(client, { schema: schema });

+ 3 - 0
src/lib/db/index.ts

@@ -1,3 +1,6 @@
+import { config } from 'dotenv';
+config();
+
 import { drizzle } from 'drizzle-orm/postgres-js';
 import postgres from 'postgres';
 import * as schema from './schema';

+ 214 - 0
src/lib/db/schema.js

@@ -0,0 +1,214 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.attendanceRelations = exports.studentEnrollmentsRelations = exports.teacherAssignmentsRelations = exports.sectionsRelations = exports.classesRelations = exports.partialsRelations = exports.periodsRelations = exports.usersRelations = exports.attendance = exports.studentEnrollments = exports.teacherAssignments = exports.sections = exports.classes = exports.partials = exports.periods = exports.users = exports.like = exports.desc = exports.lte = exports.gte = exports.ne = exports.and = exports.eq = void 0;
+var pg_core_1 = require("drizzle-orm/pg-core");
+var drizzle_orm_1 = require("drizzle-orm");
+var drizzle_orm_2 = require("drizzle-orm");
+Object.defineProperty(exports, "eq", { enumerable: true, get: function () { return drizzle_orm_2.eq; } });
+Object.defineProperty(exports, "and", { enumerable: true, get: function () { return drizzle_orm_2.and; } });
+Object.defineProperty(exports, "ne", { enumerable: true, get: function () { return drizzle_orm_2.ne; } });
+Object.defineProperty(exports, "gte", { enumerable: true, get: function () { return drizzle_orm_2.gte; } });
+Object.defineProperty(exports, "lte", { enumerable: true, get: function () { return drizzle_orm_2.lte; } });
+Object.defineProperty(exports, "desc", { enumerable: true, get: function () { return drizzle_orm_2.desc; } });
+Object.defineProperty(exports, "like", { enumerable: true, get: function () { return drizzle_orm_2.like; } });
+// Tabla de usuarios (administradores, docentes, estudiantes)
+exports.users = (0, pg_core_1.pgTable)('users', {
+    id: (0, pg_core_1.uuid)('id').defaultRandom().primaryKey(),
+    email: (0, pg_core_1.varchar)('email', { length: 255 }).notNull().unique(),
+    password: (0, pg_core_1.text)('password').notNull(),
+    firstName: (0, pg_core_1.varchar)('first_name', { length: 100 }).notNull(),
+    lastName: (0, pg_core_1.varchar)('last_name', { length: 100 }).notNull(),
+    cedula: (0, pg_core_1.varchar)('cedula', { length: 20 }).notNull().unique(),
+    phone: (0, pg_core_1.varchar)('phone', { length: 20 }),
+    role: (0, pg_core_1.varchar)('role', { length: 20 }).notNull(), // 'admin', 'teacher', 'student'
+    admissionNumber: (0, pg_core_1.varchar)('admission_number', { length: 50 }), // Solo para estudiantes
+    isActive: (0, pg_core_1.boolean)('is_active').default(true),
+    createdAt: (0, pg_core_1.timestamp)('created_at').defaultNow(),
+    updatedAt: (0, pg_core_1.timestamp)('updated_at').defaultNow(),
+});
+// Tabla de periodos
+exports.periods = (0, pg_core_1.pgTable)('periods', {
+    id: (0, pg_core_1.uuid)('id').defaultRandom().primaryKey(),
+    name: (0, pg_core_1.varchar)('name', { length: 100 }).notNull(),
+    startDate: (0, pg_core_1.date)('start_date').notNull(),
+    endDate: (0, pg_core_1.date)('end_date').notNull(),
+    isActive: (0, pg_core_1.boolean)('is_active').default(true),
+    createdAt: (0, pg_core_1.timestamp)('created_at').defaultNow(),
+    updatedAt: (0, pg_core_1.timestamp)('updated_at').defaultNow(),
+});
+// Tabla de parciales
+exports.partials = (0, pg_core_1.pgTable)('partials', {
+    id: (0, pg_core_1.uuid)('id').defaultRandom().primaryKey(),
+    name: (0, pg_core_1.varchar)('name', { length: 100 }).notNull(),
+    periodId: (0, pg_core_1.uuid)('period_id').references(function () { return exports.periods.id; }),
+    startDate: (0, pg_core_1.date)('start_date').notNull(),
+    endDate: (0, pg_core_1.date)('end_date').notNull(),
+    isActive: (0, pg_core_1.boolean)('is_active').default(true),
+    createdAt: (0, pg_core_1.timestamp)('created_at').defaultNow(),
+    updatedAt: (0, pg_core_1.timestamp)('updated_at').defaultNow(),
+});
+// Tabla de clases/materias
+exports.classes = (0, pg_core_1.pgTable)('classes', {
+    id: (0, pg_core_1.uuid)('id').defaultRandom().primaryKey(),
+    name: (0, pg_core_1.varchar)('name', { length: 100 }).notNull(),
+    code: (0, pg_core_1.varchar)('code', { length: 20 }).notNull().unique(),
+    credits: (0, pg_core_1.integer)('credits').notNull(),
+    description: (0, pg_core_1.text)('description'),
+    periodId: (0, pg_core_1.uuid)('period_id').references(function () { return exports.periods.id; }),
+    isActive: (0, pg_core_1.boolean)('is_active').default(true),
+    createdAt: (0, pg_core_1.timestamp)('created_at').defaultNow(),
+    updatedAt: (0, pg_core_1.timestamp)('updated_at').defaultNow(),
+});
+// Tabla de paralelos/secciones
+exports.sections = (0, pg_core_1.pgTable)('sections', {
+    id: (0, pg_core_1.uuid)('id').defaultRandom().primaryKey(),
+    name: (0, pg_core_1.varchar)('name', { length: 50 }).notNull(),
+    classId: (0, pg_core_1.uuid)('class_id').references(function () { return exports.classes.id; }),
+    maxStudents: (0, pg_core_1.integer)('max_students').notNull(),
+    isActive: (0, pg_core_1.boolean)('is_active').default(true),
+    createdAt: (0, pg_core_1.timestamp)('created_at').defaultNow(),
+    updatedAt: (0, pg_core_1.timestamp)('updated_at').defaultNow(),
+});
+// Tabla de asignaciones de docentes a clases/secciones
+exports.teacherAssignments = (0, pg_core_1.pgTable)('teacher_assignments', {
+    id: (0, pg_core_1.uuid)('id').defaultRandom().primaryKey(),
+    teacherId: (0, pg_core_1.uuid)('teacher_id').references(function () { return exports.users.id; }),
+    classId: (0, pg_core_1.uuid)('class_id').references(function () { return exports.classes.id; }),
+    sectionId: (0, pg_core_1.uuid)('section_id').references(function () { return exports.sections.id; }),
+    isActive: (0, pg_core_1.boolean)('is_active').default(true),
+    createdAt: (0, pg_core_1.timestamp)('created_at').defaultNow(),
+});
+// Tabla de inscripciones de estudiantes
+exports.studentEnrollments = (0, pg_core_1.pgTable)('student_enrollments', {
+    id: (0, pg_core_1.uuid)('id').defaultRandom().primaryKey(),
+    studentId: (0, pg_core_1.uuid)('student_id').references(function () { return exports.users.id; }),
+    classId: (0, pg_core_1.uuid)('class_id').references(function () { return exports.classes.id; }),
+    sectionId: (0, pg_core_1.uuid)('section_id').references(function () { return exports.sections.id; }),
+    isActive: (0, pg_core_1.boolean)('is_active').default(true),
+    createdAt: (0, pg_core_1.timestamp)('created_at').defaultNow(),
+});
+// Tabla de asistencia
+exports.attendance = (0, pg_core_1.pgTable)('attendance', {
+    id: (0, pg_core_1.uuid)('id').defaultRandom().primaryKey(),
+    studentId: (0, pg_core_1.uuid)('student_id').references(function () { return exports.users.id; }),
+    classId: (0, pg_core_1.uuid)('class_id').references(function () { return exports.classes.id; }),
+    sectionId: (0, pg_core_1.uuid)('section_id').references(function () { return exports.sections.id; }),
+    teacherId: (0, pg_core_1.uuid)('teacher_id').references(function () { return exports.users.id; }),
+    partialId: (0, pg_core_1.uuid)('partial_id').references(function () { return exports.partials.id; }),
+    date: (0, pg_core_1.date)('date').notNull(),
+    status: (0, pg_core_1.varchar)('status', { length: 20 }).notNull(), // 'present', 'absent', 'justified'
+    reason: (0, pg_core_1.text)('reason'), // Motivo de falta o justificación
+    createdAt: (0, pg_core_1.timestamp)('created_at').defaultNow(),
+});
+// Relaciones
+exports.usersRelations = (0, drizzle_orm_1.relations)(exports.users, function (_a) {
+    var many = _a.many;
+    return ({
+        teacherAssignments: many(exports.teacherAssignments),
+        studentEnrollments: many(exports.studentEnrollments),
+        attendanceAsStudent: many(exports.attendance, { relationName: 'studentAttendance' }),
+        attendanceAsTeacher: many(exports.attendance, { relationName: 'teacherAttendance' }),
+    });
+});
+exports.periodsRelations = (0, drizzle_orm_1.relations)(exports.periods, function (_a) {
+    var many = _a.many;
+    return ({
+        partials: many(exports.partials),
+        sections: many(exports.sections),
+    });
+});
+exports.partialsRelations = (0, drizzle_orm_1.relations)(exports.partials, function (_a) {
+    var one = _a.one;
+    return ({
+        period: one(exports.periods, {
+            fields: [exports.partials.periodId],
+            references: [exports.periods.id],
+        }),
+    });
+});
+exports.classesRelations = (0, drizzle_orm_1.relations)(exports.classes, function (_a) {
+    var one = _a.one, many = _a.many;
+    return ({
+        period: one(exports.periods, {
+            fields: [exports.classes.periodId],
+            references: [exports.periods.id],
+        }),
+        sections: many(exports.sections),
+        teacherAssignments: many(exports.teacherAssignments),
+        studentEnrollments: many(exports.studentEnrollments),
+        attendance: many(exports.attendance),
+    });
+});
+exports.sectionsRelations = (0, drizzle_orm_1.relations)(exports.sections, function (_a) {
+    var one = _a.one, many = _a.many;
+    return ({
+        class: one(exports.classes, {
+            fields: [exports.sections.classId],
+            references: [exports.classes.id],
+        }),
+        teacherAssignments: many(exports.teacherAssignments),
+        studentEnrollments: many(exports.studentEnrollments),
+        attendance: many(exports.attendance),
+    });
+});
+exports.teacherAssignmentsRelations = (0, drizzle_orm_1.relations)(exports.teacherAssignments, function (_a) {
+    var one = _a.one;
+    return ({
+        teacher: one(exports.users, {
+            fields: [exports.teacherAssignments.teacherId],
+            references: [exports.users.id],
+        }),
+        class: one(exports.classes, {
+            fields: [exports.teacherAssignments.classId],
+            references: [exports.classes.id],
+        }),
+        section: one(exports.sections, {
+            fields: [exports.teacherAssignments.sectionId],
+            references: [exports.sections.id],
+        }),
+    });
+});
+exports.studentEnrollmentsRelations = (0, drizzle_orm_1.relations)(exports.studentEnrollments, function (_a) {
+    var one = _a.one;
+    return ({
+        student: one(exports.users, {
+            fields: [exports.studentEnrollments.studentId],
+            references: [exports.users.id],
+        }),
+        class: one(exports.classes, {
+            fields: [exports.studentEnrollments.classId],
+            references: [exports.classes.id],
+        }),
+        section: one(exports.sections, {
+            fields: [exports.studentEnrollments.sectionId],
+            references: [exports.sections.id],
+        }),
+    });
+});
+exports.attendanceRelations = (0, drizzle_orm_1.relations)(exports.attendance, function (_a) {
+    var one = _a.one;
+    return ({
+        student: one(exports.users, {
+            fields: [exports.attendance.studentId],
+            references: [exports.users.id],
+            relationName: 'studentAttendance',
+        }),
+        teacher: one(exports.users, {
+            fields: [exports.attendance.teacherId],
+            references: [exports.users.id],
+            relationName: 'teacherAttendance',
+        }),
+        class: one(exports.classes, {
+            fields: [exports.attendance.classId],
+            references: [exports.classes.id],
+        }),
+        section: one(exports.sections, {
+            fields: [exports.attendance.sectionId],
+            references: [exports.sections.id],
+        }),
+        partial: one(exports.partials, {
+            fields: [exports.attendance.partialId],
+            references: [exports.partials.id],
+        }),
+    });
+});

+ 233 - 0
src/lib/db/seed.js

@@ -0,0 +1,233 @@
+"use strict";
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+var __generator = (this && this.__generator) || function (thisArg, body) {
+    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
+    return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
+    function verb(n) { return function (v) { return step([n, v]); }; }
+    function step(op) {
+        if (f) throw new TypeError("Generator is already executing.");
+        while (g && (g = 0, op[0] && (_ = 0)), _) try {
+            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
+            if (y = 0, t) op = [op[0] & 2, t.value];
+            switch (op[0]) {
+                case 0: case 1: t = op; break;
+                case 4: _.label++; return { value: op[1], done: false };
+                case 5: _.label++; y = op[1]; op = [0]; continue;
+                case 7: op = _.ops.pop(); _.trys.pop(); continue;
+                default:
+                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
+                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
+                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
+                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
+                    if (t[2]) _.ops.pop();
+                    _.trys.pop(); continue;
+            }
+            op = body.call(thisArg, _);
+        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
+        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
+    }
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.seedDatabase = seedDatabase;
+var index_1 = require("./index");
+var schema_1 = require("./schema");
+var bcryptjs_1 = require("bcryptjs");
+function seedDatabase() {
+    return __awaiter(this, void 0, void 0, function () {
+        var hashedPassword, admin, period, partial1, partial2, class1, class2, section1A, section1B, section2A, teacherPassword, teacher, studentPassword, students, i, student, _i, _a, student, _b, _c, student, error_1;
+        return __generator(this, function (_d) {
+            switch (_d.label) {
+                case 0:
+                    _d.trys.push([0, 27, , 28]);
+                    console.log('🌱 Iniciando seed de la base de datos...');
+                    return [4 /*yield*/, bcryptjs_1.default.hash('admin123', 10)];
+                case 1:
+                    hashedPassword = _d.sent();
+                    return [4 /*yield*/, index_1.db.insert(schema_1.users).values({
+                            email: 'admin@universidad.edu',
+                            password: hashedPassword,
+                            firstName: 'Administrador',
+                            lastName: 'Sistema',
+                            cedula: '1234567890',
+                            phone: '0999999999',
+                            role: 'admin',
+                        }).returning()];
+                case 2:
+                    admin = (_d.sent())[0];
+                    return [4 /*yield*/, index_1.db.insert(schema_1.periods).values({
+                            name: '2024-2025',
+                            startDate: '2024-09-01',
+                            endDate: '2025-06-30',
+                        }).returning()];
+                case 3:
+                    period = (_d.sent())[0];
+                    return [4 /*yield*/, index_1.db.insert(schema_1.partials).values({
+                            name: 'Primer Parcial',
+                            periodId: period.id,
+                            startDate: '2024-09-01',
+                            endDate: '2024-11-15',
+                        }).returning()];
+                case 4:
+                    partial1 = (_d.sent())[0];
+                    return [4 /*yield*/, index_1.db.insert(schema_1.partials).values({
+                            name: 'Segundo Parcial',
+                            periodId: period.id,
+                            startDate: '2024-11-16',
+                            endDate: '2025-02-15',
+                        }).returning()];
+                case 5:
+                    partial2 = (_d.sent())[0];
+                    return [4 /*yield*/, index_1.db.insert(schema_1.classes).values({
+                            name: 'Programación I',
+                            code: 'PROG001',
+                            credits: 4,
+                            description: 'Introducción a la programación con fundamentos básicos',
+                        }).returning()];
+                case 6:
+                    class1 = (_d.sent())[0];
+                    return [4 /*yield*/, index_1.db.insert(schema_1.classes).values({
+                            name: 'Matemáticas I',
+                            code: 'MATH001',
+                            credits: 3,
+                            description: 'Fundamentos matemáticos para ingeniería',
+                        }).returning()];
+                case 7:
+                    class2 = (_d.sent())[0];
+                    return [4 /*yield*/, index_1.db.insert(schema_1.sections).values({
+                            name: 'A',
+                            classId: class1.id,
+                            maxStudents: 30,
+                        }).returning()];
+                case 8:
+                    section1A = (_d.sent())[0];
+                    return [4 /*yield*/, index_1.db.insert(schema_1.sections).values({
+                            name: 'B',
+                            classId: class1.id,
+                            maxStudents: 25,
+                        }).returning()];
+                case 9:
+                    section1B = (_d.sent())[0];
+                    return [4 /*yield*/, index_1.db.insert(schema_1.sections).values({
+                            name: 'A',
+                            classId: class2.id,
+                            maxStudents: 35,
+                        }).returning()];
+                case 10:
+                    section2A = (_d.sent())[0];
+                    return [4 /*yield*/, bcryptjs_1.default.hash('teacher123', 10)];
+                case 11:
+                    teacherPassword = _d.sent();
+                    return [4 /*yield*/, index_1.db.insert(schema_1.users).values({
+                            email: 'profesor@universidad.edu',
+                            password: teacherPassword,
+                            firstName: 'Juan',
+                            lastName: 'Pérez',
+                            cedula: '0987654321',
+                            phone: '0988888888',
+                            role: 'teacher',
+                        }).returning()];
+                case 12:
+                    teacher = (_d.sent())[0];
+                    // Asignar profesor a clases
+                    return [4 /*yield*/, index_1.db.insert(schema_1.teacherAssignments).values([
+                            {
+                                teacherId: teacher.id,
+                                classId: class1.id,
+                                sectionId: section1A.id,
+                            },
+                            {
+                                teacherId: teacher.id,
+                                classId: class1.id,
+                                sectionId: section1B.id,
+                            },
+                        ])];
+                case 13:
+                    // Asignar profesor a clases
+                    _d.sent();
+                    return [4 /*yield*/, bcryptjs_1.default.hash('student123', 10)];
+                case 14:
+                    studentPassword = _d.sent();
+                    students = [];
+                    i = 1;
+                    _d.label = 15;
+                case 15:
+                    if (!(i <= 5)) return [3 /*break*/, 18];
+                    return [4 /*yield*/, index_1.db.insert(schema_1.users).values({
+                            email: "estudiante".concat(i, "@universidad.edu"),
+                            password: studentPassword,
+                            firstName: "Estudiante",
+                            lastName: "".concat(i),
+                            cedula: "123456789".concat(i),
+                            phone: "099888888".concat(i),
+                            role: 'student',
+                            admissionNumber: "2024-".concat(String(i).padStart(4, '0')),
+                        }).returning()];
+                case 16:
+                    student = (_d.sent())[0];
+                    students.push(student);
+                    _d.label = 17;
+                case 17:
+                    i++;
+                    return [3 /*break*/, 15];
+                case 18:
+                    _i = 0, _a = students.slice(0, 3);
+                    _d.label = 19;
+                case 19:
+                    if (!(_i < _a.length)) return [3 /*break*/, 22];
+                    student = _a[_i];
+                    return [4 /*yield*/, index_1.db.insert(schema_1.studentEnrollments).values({
+                            studentId: student.id,
+                            classId: class1.id,
+                            sectionId: section1A.id,
+                        })];
+                case 20:
+                    _d.sent();
+                    _d.label = 21;
+                case 21:
+                    _i++;
+                    return [3 /*break*/, 19];
+                case 22:
+                    _b = 0, _c = students.slice(3, 5);
+                    _d.label = 23;
+                case 23:
+                    if (!(_b < _c.length)) return [3 /*break*/, 26];
+                    student = _c[_b];
+                    return [4 /*yield*/, index_1.db.insert(schema_1.studentEnrollments).values({
+                            studentId: student.id,
+                            classId: class1.id,
+                            sectionId: section1B.id,
+                        })];
+                case 24:
+                    _d.sent();
+                    _d.label = 25;
+                case 25:
+                    _b++;
+                    return [3 /*break*/, 23];
+                case 26:
+                    console.log('✅ Seed completado exitosamente!');
+                    console.log('👤 Admin: admin@universidad.edu / admin123');
+                    console.log('👨‍🏫 Profesor: profesor@universidad.edu / teacher123');
+                    console.log('👨‍🎓 Estudiantes: estudiante1@universidad.edu / student123 (hasta estudiante5)');
+                    return [3 /*break*/, 28];
+                case 27:
+                    error_1 = _d.sent();
+                    console.error('❌ Error durante el seed:', error_1);
+                    throw error_1;
+                case 28: return [2 /*return*/];
+            }
+        });
+    });
+}
+if (require.main === module) {
+    seedDatabase()
+        .then(function () { return process.exit(0); })
+        .catch(function () { return process.exit(1); });
+}