
Descripción
Contexto general
Sistema de gestión de historiales clínicos para el Instituto Superior Tecnológico Juan Bautista Aguirre (ISTJBA). La primera versión fue desarrollada en 2025 en PHP procedural + MySQL + Bootstrap como parte de las prácticas profesionales. En 2026 se refactorizó el proyecto completo a un monorepo moderno con NestJS 11 (REST API + JWT), React 19 + Vite 8 (SPA), PostgreSQL 18 y Prisma 7 como ORM. Incluye dashboard con métricas y gráficos (Recharts), gestión completa de pacientes con historia clínica estructurada (antecedentes patológicos, obstétricos, familiares, evolución clínica), generación de PDFs con PDFKit (listado general e informe individual), autenticación con JWT + bcrypt, rate limiting con ThrottlerGuard, perfiles de usuario editables y paleta clínica 60-30-10 con TailwindCSS 4.

Motivación
Por qué lo construí
Digitalizar y centralizar los historiales clínicos que antes se gestionaban con papel y hojas de cálculo en el instituto.
Migrar el sistema legacy (PHP procedural + MySQL) a un stack moderno (NestJS + React + PostgreSQL + Prisma) mejorando seguridad, escalabilidad y mantenibilidad.
Generar reportes y estadísticas en PDF automáticamente: listado general de pacientes, informes individuales con datos clínicos completos y gráficos de distribución.
Manejar historia clínica estructurada con antecedentes patológicos, obstétricos, familiares, evolución clínica (signos vitales, examen físico, diagnóstico, tratamiento) y transacciones atómicas.
Características
Lo que destaca
Monorepo con pnpm workspaces: API NestJS 11 + frontend React 19 + Vite 8 + paquete shared con tipos y schemas.
Backend NestJS con ValidationPipe (whitelist + forbidNonWhitelisted), ThrottlerGuard (rate limiting: 3 req/s, 20 req/10s, 100 req/min) y JWT + bcrypt para autenticación.
Prisma 7 con driver adapter @prisma/adapter-pg, schema tipado desde schema.prisma, migraciones SQL y seed de 526 pacientes con datos realistas.
Dashboard con métricas, sparklines, doughnut de distribución por sexo (Recharts), tabla de pacientes recientes y gráficos por provincia y rango etario.
Generación de PDFs con PDFKit: listado general con numeración correlativa e informe individual con datos personales, antecedentes, diagnóstico y tabla de tratamiento.
Frontend React 19 con TanStack Query 5 (cache + refetch), React Hook Form con paths anidados (pathologicalBackground.alergico), sidebar con hover-expand y perfil editable off-canvas.