- Stack Tecnológico
- Estructura del Proyecto
- Requisitos Previos
- Configuración de Azure PostgreSQL
- Instalación y Configuración
- Variables de Entorno
- Base de Datos y Migraciones
- Usuarios por Defecto
- Módulos del Sistema
- API Reference
- Control de Acceso por Rol
- Deploy en Producción
| Capa | Tecnología |
|---|---|
| Frontend | Next.js 14+ (App Router), React 18 |
| Estilos | Tailwind CSS |
| Backend | Next.js API Routes (REST) |
| Base de Datos | PostgreSQL en Azure (Flexible Server) |
| ORM | Prisma ORM |
| Autenticación | NextAuth.js (JWT + Credentials) |
| Excel | xlsx |
| HTML exportable (imprimible desde navegador) | |
| UI | Componentes custom + lucide-react |
| Notificaciones | react-hot-toast |
zaconato-escuela/
├── app/
│ ├── (app)/ ← Rutas protegidas (requieren sesión)
│ │ ├── layout.tsx ← Layout con Sidebar
│ │ ├── dashboard/page.tsx ← Dashboard principal
│ │ ├── estudiantes/
│ │ │ ├── page.tsx ← Listado de estudiantes
│ │ │ ├── nuevo/page.tsx ← Formulario de matrícula
│ │ │ └── [id]/
│ │ │ ├── page.tsx ← Detalle del estudiante
│ │ │ └── editar/page.tsx ← Editar datos
│ │ ├── pagos/page.tsx ← Gestión de pagos
│ │ ├── talonarios/
│ │ │ ├── page.tsx ← Listado de talonarios
│ │ │ └── [id]/
│ │ │ ├── page.tsx ← Detalle del talonario
│ │ │ └── imprimir/page.tsx ← Vista de impresión (4×hoja)
│ │ └── reportes/page.tsx ← Reportes y exportación
│ ├── api/
│ │ ├── auth/[...nextauth]/route.ts
│ │ ├── estudiantes/route.ts + [id]/route.ts
│ │ ├── talonarios/route.ts + [id]/route.ts
│ │ ├── pagos/route.ts + [id]/route.ts
│ │ ├── dashboard/stats/route.ts
│ │ └── reportes/
│ │ ├── diario/route.ts
│ │ ├── mensual/route.ts
│ │ └── exportar/excel/route.ts + pdf/route.ts
│ ├── login/page.tsx ← Pantalla de login
│ ├── layout.tsx ← Root layout
│ ├── page.tsx ← Redirect a /dashboard
│ ├── providers.tsx ← SessionProvider + Toaster
│ └── globals.css
├── components/
│ └── layout/
│ ├── Sidebar.tsx ← Navegación lateral
│ └── Header.tsx ← Cabecera de página
├── lib/
│ ├── prisma.ts ← Singleton Prisma client
│ ├── auth.ts ← Configuración NextAuth
│ └── utils.ts ← Helpers y constantes
├── prisma/
│ ├── schema.prisma ← Esquema de base de datos
│ └── seed.ts ← Datos iniciales
├── types/
│ └── next-auth.d.ts ← Tipos extendidos de NextAuth
├── middleware.ts ← Protección de rutas
├── .env.example ← Plantilla de variables de entorno
└── package.json
- Node.js 18.17.0 o superior
- Bun (Recomendado para desarrollo rápido) o npm 9+
- Cuenta de Azure con acceso a Azure Database for PostgreSQL
- Git
Si no tienes Bun instalado, puedes instalarlo con:
Windows (PowerShell):
powershell -c "irm bun.sh/install.ps1 | iex"macOS / Linux:
curl -fsSL https://bun.sh/install | bash- Ir a portal.azure.com
- Crear nuevo recurso → Azure Database for PostgreSQL Flexible Server
- Configuración recomendada:
- Tier de cómputo: Burstable, B1ms (suficiente para inicio)
- PostgreSQL version: 15 o 16
- Nombre del servidor:
zaconato-db(o el que prefieras) - Admin username:
zaconato_admin - Password: Generar contraseña segura
- Database name:
escuela_db
En el recurso de Azure PostgreSQL:
- Seguridad > Redes → Agregar regla de firewall
- Para desarrollo: agregar tu IP actual
- Para producción: agregar la IP del servidor de la app
Azure PostgreSQL requiere SSL por defecto. La cadena de conexión debe incluir ?sslmode=require.
git clone <repo-url>
cd zaconato-escuela
bun install # o npm installcp .env.example .envEditar .env con tus valores reales (ver sección Variables de Entorno).
bun prisma generate # o npx prisma generatebun prisma migrate dev --name init # o npx prisma migrate devbun run db:seed # o npm run db:seednpm run devLa aplicación estará disponible en: http://localhost:3000
Crear archivo .env en la raíz del proyecto:
# Base de Datos — Azure PostgreSQL
DATABASE_URL="postgresql://zaconato_admin:TuPassword@zaconato-db.postgres.database.azure.com:5432/escuela_db?sslmode=require"
# NextAuth — Autenticación
NEXTAUTH_SECRET="genera-con-openssl-rand-base64-32"
NEXTAUTH_URL="http://localhost:3000"
# Entorno
NODE_ENV="development"Para generar NEXTAUTH_SECRET:
openssl rand -base64 32# Aplicar esquema en Azure (desarrollo)
npm run db:migrate
# Push directo sin migraciones (útil en primeras pruebas)
npx prisma db push
# Poblar con datos iniciales
npm run db:seed
# Abrir Prisma Studio (interfaz visual de la BD)
npm run db:studio
# Regenerar cliente tras cambios en schema
npx prisma generateUsuario → Autenticación y roles
Estudiante → Datos del alumno (vinculado a Usuario)
Talonario → Talonario anual por estudiante
Comprobante → Comprobantes individuales dentro del talonario
Pago → Registro de pago de un comprobante
Tipos de pago (TipoPago):
MATRICULA— Cuota de inscripción anualPAPELERIA— Materiales y papeleríaCOLEGIATURA— Mensualidad (Enero–Octubre)ALIMENTACION— Programa de alimentación (Enero–Octubre)
Orden fijo de comprobantes en el talonario:
- Matrícula (único)
- Papelería (único)
- Colegiatura Enero — Colegiatura Octubre (10 comprobantes)
- Alimentación Enero — Alimentación Octubre (10 comprobantes)
El seed crea automáticamente estos usuarios:
| Contraseña | Rol | |
|---|---|---|
| admin@zaconato.edu.sv | admin123 | ADMINISTRATIVO |
| colector@zaconato.edu.sv | colector123 | COLECTOR |
| matricula@zaconato.edu.sv | matricula123 | MATRICULA |
⚠️ Cambiar las contraseñas inmediatamente después del primer login en producción.
- Tarjetas de estadísticas: Total Estudiantes, Al Día, Comprobantes Emitidos, Ingresos del Mes
- Tabla completa de estudiantes con búsqueda en tiempo real
- Estado de pago por alumno (Al día / Pendiente / Atrasado)
- Accesos directos a Registrar Pago y Ver perfil
- Historial completo de pagos con filtros por fecha y tipo
- Formulario de registro: buscar estudiante por NIE → seleccionar talonario → seleccionar comprobante pendiente → confirmar
- Validación automática: no permite pagar comprobantes ya pagados
- Resumen de totales en la tabla
- Tarjetas visuales por estudiante con barra de progreso de pago
- Crear talonario manualmente para cualquier año
- Vista de detalle agrupada por tipo (Matrícula, Papelería, Colegiatura, Alimentación)
- Vista de impresión (
/talonarios/[id]/imprimir): layout 2×2 (4 comprobantes por hoja A4), con sello de "PAGADO" en comprobantes ya cobrados
- Listado con búsqueda
- Matrícula nueva (
/estudiantes/nuevo): crea automáticamente usuario temporal + talonario del año - Perfil completo del estudiante con historial de talonarios y pagos
- Edición de datos personales
- Selector de fecha con reporte instantáneo
- Desglose por categorías: 💰 Colegiatura / 🍽️ Alimentación / 📋 Matrícula / 📦 Papelería
- Descargar Excel (
.xlsx): dos hojas — Detalle de pagos + Resumen por categoría - Descargar PDF (
.htmlimprimible): incluye tabla completa, totales y desglose visual
| Método | Ruta | Descripción |
|---|---|---|
| POST | /api/auth/signin |
Login con NextAuth.js |
| Método | Ruta | Descripción | Roles |
|---|---|---|---|
| GET | /api/estudiantes |
Listar (filtros: nombre, nie, grado) | Todos |
| POST | /api/estudiantes |
Matricular + crear usuario + talonario | MATRICULA, ADMIN |
| GET | /api/estudiantes/[id] |
Detalle con talonarios y pagos | Todos |
| PUT | /api/estudiantes/[id] |
Actualizar datos | MATRICULA, ADMIN |
| DELETE | /api/estudiantes/[id] |
Eliminar | Solo ADMIN |
| Método | Ruta | Descripción | Roles |
|---|---|---|---|
| GET | /api/talonarios |
Listar (filtros: estudianteId, anio) | Todos |
| POST | /api/talonarios |
Generar talonario | Todos |
| GET | /api/talonarios/[id] |
Detalle con comprobantes | Todos |
| Método | Ruta | Descripción | Roles |
|---|---|---|---|
| GET | /api/pagos |
Listar (filtros: fecha, tipo, estudianteId) | Todos |
| POST | /api/pagos |
Registrar pago | COLECTOR, ADMIN |
| GET | /api/pagos/[id] |
Detalle de pago | Todos |
| Método | Ruta | Descripción |
|---|---|---|
| GET | /api/dashboard/stats |
Estadísticas generales |
| Método | Ruta | Descripción | Roles |
|---|---|---|---|
| GET | /api/reportes/diario?fecha=YYYY-MM-DD |
Reporte del día | ADMIN |
| GET | /api/reportes/mensual?mes=MM&anio=YYYY |
Reporte mensual | ADMIN |
| GET | /api/reportes/exportar/excel?fecha=YYYY-MM-DD |
Descargar Excel | ADMIN |
| GET | /api/reportes/exportar/pdf?fecha=YYYY-MM-DD |
Descargar PDF | ADMIN |
| Módulo / Acción | COLECTOR | MATRICULA | ADMINISTRATIVO |
|---|---|---|---|
| Dashboard | ✅ | ✅ | ✅ |
| Ver estudiantes | ✅ | ✅ | ✅ |
| Matricular nuevo | ❌ | ✅ | ✅ |
| Editar estudiante | ❌ | ✅ | ✅ |
| Eliminar estudiante | ❌ | ❌ | ✅ |
| Registrar pago | ✅ | ❌ | ✅ |
| Ver talonarios | ✅ | ✅ | ✅ |
| Crear talonario | ✅ | ✅ | ✅ |
| Ver reportes | ❌ | ❌ | ✅ |
| Exportar Excel/PDF | ❌ | ❌ | ✅ |
- Subir el proyecto a GitHub/GitLab
- Conectar el repositorio en vercel.com
- Agregar las variables de entorno en el panel de Vercel:
DATABASE_URLNEXTAUTH_SECRETNEXTAUTH_URL=https://tu-dominio.vercel.app
- Vercel detecta Next.js automáticamente y hace el build
# Build de producción
npm run build
# El servidor se inicia con
npm startVariables de entorno en Azure App Service → Configuration → Application Settings.
- Cambiar
NEXTAUTH_URLal dominio real - Cambiar todas las contraseñas del seed
- Habilitar
NODE_ENV=production - Verificar que el firewall de Azure PostgreSQL permita la IP del servidor de la app
- Considerar habilitar connection pooling en Azure PostgreSQL para mejor rendimiento
npm run dev # Servidor de desarrollo
npm run build # Build de producción
npm run start # Iniciar en producción
npm run lint # Verificar código
npm run db:migrate # Aplicar migraciones
npm run db:seed # Crear usuarios iniciales
npm run db:studio # Prisma Studio (UI visual de BD)
npx prisma generate # Regenerar cliente Prisma- Verificar que
DATABASE_URLesté correctamente formateada - Verificar que la IP esté en el firewall de Azure PostgreSQL
- Asegurarse de que
?sslmode=requireesté al final de la URL
- Asegurarse de que
.envexiste y tieneNEXTAUTH_SECRETcon un valor
- La base de datos no está accesible. Verificar la cadena de conexión y el firewall de Azure
- Ejecutar
npm run buildy revisar la consola - Verificar que
tailwind.config.tsincluye los paths correctos encontent
© 2024 Complejo Educativo Católico Zanconato — Sistema de Gestión Escolar