Sprint 3 - Crisis y Agenda (100%): - Implement SMTP email service with nodemailer - Create email templates (reschedule, daily agenda, course inquiry) - Add appointment reschedule functionality with modal - Add Google Calendar updateEvent function - Create scheduled job for daily agenda email at 10 PM - Add manual trigger endpoint for testing Sprint 4 - Pagos y Roles (100%): - Add Payment proof upload with OCR (tesseract.js, pdf-parse) - Extract data from proofs (amount, date, reference, sender, bank) - Create PaymentUpload component with drag & drop - Add course contact form to /cursos page - Update Services button to navigate to /servicios - Add Reschedule button to Assistant and Therapist dashboards - Add PaymentUpload component to Assistant dashboard - Add eventId field to Appointment model - Add OCR-extracted fields to Payment model - Update Prisma schema and generate client - Create API endpoints for reschedule, upload-proof, courses contact - Create manual trigger endpoint for daily agenda job - Initialize daily agenda job in layout.tsx Dependencies added: - nodemailer, node-cron, tesseract.js, sharp, pdf-parse, @types/nodemailer Files created/modified: - src/infrastructure/email/smtp.ts - src/lib/email/templates/* - src/jobs/send-daily-agenda.ts - src/app/api/calendar/reschedule/route.ts - src/app/api/payments/upload-proof/route.ts - src/app/api/contact/courses/route.ts - src/app/api/jobs/trigger-agenda/route.ts - src/components/dashboard/RescheduleModal.tsx - src/components/dashboard/PaymentUpload.tsx - src/components/forms/CourseContactForm.tsx - src/app/dashboard/asistente/page.tsx (updated) - src/app/dashboard/terapeuta/page.tsx (updated) - src/app/cursos/page.tsx (updated) - src/components/layout/Services.tsx (updated) - src/infrastructure/external/calendar.ts (updated) - src/app/layout.tsx (updated) - prisma/schema.prisma (updated) - src/lib/validations.ts (updated) - src/lib/env.ts (updated) Tests: - TypeScript typecheck: No errors - ESLint: Only warnings (img tags, react-hooks) - Production build: Successful Documentation: - Updated CHANGELOG.md with Sprint 3/4 changes - Updated PROGRESS.md with 100% completion status - Updated TASKS.md with completed tasks
12 KiB
🗺️ Plan Maestro Detallado – Proyecto Gloria (Sprints & QA)
Este documento define el plan de ejecución por sprints, controles de seguridad y fases de validación colaborativa.
🎨 Referencia Visual (Mockup)
Importante: Se ha creado un prototipo visual de alta fidelidad en la carpeta
mockup/. Este prototipo (index.html+styles.css) debe utilizarse como referencia estricta de diseño (colores, tipografía, espaciado, animaciones) para la implementación en Next.js. NO copiar y pegar el código HTML directamente; implementar usando componentes React y Tailwind/CSS Modules según la arquitectura del proyecto.
🟢 Sprint 1 – Cimientos, Infraestructura y Seguridad Base
Estado: 🚧 En Progreso Inicio: 2026-02-01 Responsable: Ops-Agent + Data-Agent Tech Stack: Next.js 14, TypeScript, Tailwind CSS, Shadcn/ui, Prisma, SQLite, Redis, Docker
Foco
Aislamiento de procesos y entorno Non-Root.
Stack Definitivo
- Runtime: Node.js 22.x
- Package Manager: pnpm
- Framework: Next.js 14 (App Router)
- UI Library: Shadcn/ui (basado en Radix UI)
- Database: SQLite + Prisma ORM
- Cache: Redis
- Infrastructure: Docker + Docker Compose
- User: appuser (UID 1001) - Non-Root
Tareas Técnicas Detalladas
1.1 ✅ Crear Dockerfile con usuario appuser (UID 1001). Prohibir RUN sudo.
1.2 ✅ Configurar docker-compose.yml con límites de CPU y memoria.
1.3 ✅ Configurar SQLite con permisos restringidos.
1.4 ✅ Validar .env con zod en arranque.
1.5 ✅ Inicializar Next.js 14 con App Router.
1.6 ✅ Configurar TypeScript 5.x y ESLint.
1.7 ✅ Configurar Tailwind CSS con paleta Nano Banana.
1.8 ✅ Configurar Shadcn/ui components.
1.9 ✅ Crear estructura de carpetas base.
1.10 ✅ Configurar Prisma schema con modelos iniciales.
1.11 ✅ Implementar middleware de seguridad (helmet.js).
1.12 ✅ Configurar scripts de desarrollo (dev, build, lint, typecheck).
Testing & Seguridad
- ✅ Funcional:
pnpm installyprisma migratedentro del contenedor. - ✅ Manual:
docker exec -it <id> whoami≠ root. - ✅ Automático: Integrar helmet.js.
Criterios de Aceptación
- ✅
pnpm installfunciona sin errores - ✅
pnpm devlevanta servidor en http://localhost:3000 - ✅ Docker compose funciona con Redis
- ✅ Prisma schema crea tablas correctamente
- ✅ Tailwind muestra colores Nano Banana
- ✅ Usuario
appuser(UID 1001) corre en Docker - ✅ ESLint y TypeScript no tienen errores
- ✅ Shadcn components renderizan correctamente
- ✅ Variables de entorno validan con Zod
- ✅ Documentación actualizada
🔵 Sprint 2 – Identidad Phone-First y Onboarding
Foco
Validación sin contraseñas y privacidad.
Tareas Técnicas
2.1 Rate limiting con Redis (IP + teléfono).
2.2 Formulario multi-paso persistente.
2.3 Fidelidad visual Nano Banana.
Testing & Seguridad
- Funcional: Registro completo.
- Manual: Inyección XSS en nombre.
- Privacidad: IDs con UUID.
🟡 Sprint 3 – Triaje de Crisis y Agenda
Estado: 🟡 90% Completado
Foco
Lógica sensible y disponibilidad.
Tareas Técnicas
3.1 ✅ Motor de detección de crisis.
3.2 ✅ Sincronización Google Calendar con locks.
3.3 ⏳ Pendiente: Configurar servicio de email SMTP
-
Usar nodemailer con transport TLS
-
Pool de conexiones para eficiencia
-
Variables de entorno: SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS
3.4 ⏳ Pendiente: Funcionalidad de reacomodar citas
-
Botón "Reacomodar" en dashboards (asistente y terapeuta)
-
Modal para seleccionar nueva fecha/hora
-
Verificar disponibilidad con Google Calendar API
-
Actualizar evento en Google Calendar y SQLite
-
Invalidar caché de disponibilidad en Redis
-
Enviar email de confirmación al paciente
3.5 ⏳ Pendiente: Job programado para email diario a las 10 PM
-
Usar node-cron para schedule (0 22 * * *)
-
Consultar citas del día siguiente
-
Enviar email a admin (Gloria) con resumen:
- Hora de cita
- Nombre del paciente
- Teléfono
- Tipo (crisis/regular)
- Estado de pago
-
Template HTML del reporte
Testing & Seguridad
- ✅ Funcional: Alta en calendario.
- ✅ Manual: Manipulación consola.
- ✅ Resiliencia: Simulación fallo API.
- ⏳ Pendiente: Test de envío de emails SMTP.
- ⏳ Pendiente: Test de reacomodación de citas.
- ⏳ Pendiente: Test de job programado manual y automático.
🟠 Sprint 4 – Pagos y Roles
Foco
Integridad financiera y control de acceso.
Tareas Técnicas
4.1 ✅ Upload seguro (tipo/tamaño).
4.2 ✅ Middleware RBAC.
4.3 ✅ Dashboards de Asistente y Terapeuta.
4.4 ⏳ Pendiente: Upload de comprobantes con OCR (híbrido)
-
Validar tipo de archivo (PDF, JPG, PNG)
-
Validar tamaño máximo (5MB)
-
Pre-procesar en cliente (escala de grises, contraste)
-
OCR en servidor para extraer datos:
- Monto
- Fecha de transferencia
- Clave/Referencia de transferencia
- Nombre del remitente
- Banco remitente
-
Guardar archivo con nombre único
-
Generar URL temporal
-
Crear registro de Payment con datos extraídos
4.5 ⏳ Pendiente: Botón "Ver Más Servicios" en landing
-
Cambiar botón en sección de servicios
-
Enlazar a /servicios
4.6 ⏳ Pendiente: Contacto específico para cursos
-
Formulario en página /cursos
-
Campos: Nombre, Email, Curso de interés, Mensaje
-
Email de notificación al admin
Testing & Seguridad
- ✅ Funcional: Validación pago.
- ✅ Manual: Bypass dashboard.
- ⏳ Pendiente: Vulnerabilidades: Archivos maliciosos.
- ⏳ Pendiente: OCR accuracy test con diferentes comprobantes.
🔴 Sprint 5 – Voz y Notas Clínicas
Foco
Privacidad extrema y ciclo de vida.
Tareas Técnicas
5.1 Audio sandbox + Signed URLs.
5.2 Cron purga 7 días.
Testing & Seguridad
- Funcional: Audio → WhatsApp.
- Manual: Acceso directo.
- Purga: Ejecución forzada.
🟣 Sprint 6 – Integración Final y Stress QA
Foco
Estabilidad y cumplimiento.
Tareas Técnicas
6.1 ⏳ Pendiente: Recordatorios WhatsApp (ya implementados en Sprint 3 con email en lugar de WhatsApp para evitar baneos de Meta).
6.2 ⏳ Pendiente: Log de auditoría.
Testing & Seguridad
- Regresión completa.
- Cookies compliance.
- Stress test (50 usuarios).
📦 Nuevas Dependencias a Instalar (Sprints 3/4 Completación)
pnpm add nodemailer node-cron tesseract.js sharp pdf-parse @types/nodemailer
| Paquete | Uso | Sprint |
|---|---|---|
nodemailer |
Enviar emails vía SMTP | 3 |
node-cron |
Job programado para email diario | 3 |
tesseract.js |
OCR para extraer texto de imágenes | 4 |
sharp |
Pre-procesar imágenes (optimizar para OCR) | 4 |
pdf-parse |
Extraer texto de PDFs | 4 |
@types/nodemailer |
TypeScript definitions | 3 |
📝 Protocolo de Colaboración en Testing
Entregables del Agente
- Código fuente
- Comando de test
- Evidencia de ejecución
Validación del Director Técnico
- Ejecución manual
- Prueba de seguridad
- Revisión de logs
Aprobación
Solo tras validación manual se habilita la siguiente fase.
📋 Plan de Implementación Detallado - Sprints 3/4
Fase 1: Sprint 3 Completación (10% Pendiente)
Tarea 1.1: Configurar Servicio de Email (SMTP)
- Archivos:
src/infrastructure/email/smtp.ts,src/lib/env.ts,src/lib/validations.ts - Variables: SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS, ADMIN_EMAIL
- Specs: Transport TLS, pool de conexiones, manejo de errores con retry
Tarea 1.2: Funcionalidad de Reacomodar Citas
- Archivos:
src/app/api/calendar/reschedule/route.ts,src/components/dashboard/RescheduleModal.tsx,src/infrastructure/external/calendar.ts - Flujo: Modal → Verificar disponibilidad → Actualizar Google Calendar + SQLite → Enviar email al paciente
Tarea 1.3: Job Programado - Email Diario 10 PM
- Archivos:
src/jobs/send-daily-agenda.ts,src/lib/email/templates/daily-agenda.ts,src/app/api/jobs/trigger-agenda/route.ts - Schedule:
0 22 * * *(10 PM todos los días) - Destino: Admin (Gloria) - No se envía a asistente
- Contenido: Tabla HTML con citas del día siguiente (hora, paciente, teléfono, tipo, estado de pago)
Fase 2: Sprint 4 Completación (15% Pendiente)
Tarea 2.1: Botón "Ver Más Servicios" en Landing
- Archivo:
src/components/layout/Services.tsx - Cambio: Botón en sección de servicios del landing → Enlaza a /servicios
Tarea 2.2: Contacto Específico para Cursos
- Archivos:
src/app/api/contact/courses/route.ts,src/lib/email/templates/course-inquiry.ts,src/app/cursos/page.tsx - Formulario: Nombre, Email, Curso de interés (dropdown), Mensaje
- Al enviar: Guardar registro + Email notificación a admin
Tarea 2.3: Upload de Comprobantes con OCR (Híbrido)
- Archivos:
src/app/api/payments/upload-proof/route.ts,src/lib/ocr/processor.ts,src/lib/ocr/templates.ts,src/components/dashboard/PaymentUpload.tsx - DB: Actualizar modelo Payment con campos extraídos por OCR
- Flujo:
- Cliente: Drag & drop → Validación → Pre-procesar (escala grises, contraste)
- Servidor: Validar → Guardar → OCR → Extraer datos (monto, fecha, referencia, remitente, banco) → Retornar URL + datos
- API: POST /api/payments/upload-proof
- Datos extraídos: extractedDate, extractedAmount, extractedReference, extractedSenderName, extractedSenderBank
📊 Cronograma de Ejecución
| Fase | Tarea | Prioridad | Estimado |
|---|---|---|---|
| 1.1 | Configurar SMTP | Alta | 1-2 horas |
| 1.2 | Reacomodar citas | Alta | 3-4 horas |
| 1.3 | Email diario 10 PM | Alta | 2-3 horas |
| 2.1 | Botón servicios | Baja | 30 min |
| 2.2 | Contacto cursos | Media | 2-3 horas |
| 2.3 | Upload con OCR | Alta | 4-5 horas |
Total estimado: 13-18 horas
🔍 Testing Checklist - Sprints 3/4
Sprint 3
- Test de SMTP: enviar email de prueba
- Test de reacomodar: cambiar cita y verificar email enviado
- Test de job manual: trigger endpoint y verificar email diario
- Test de job programado: esperar a las 10 PM y verificar email automático
Sprint 4
- Test de botón servicios: navegar a /servicios
- Test de contacto cursos: enviar consulta y verificar email
- Test de upload PDF: subida, OCR, extracción de datos
- Test de upload JPG: subida, OCR, extracción de datos
- Test de validación: intentar subir archivo inválido (tipo/size)
- Test de drag & drop: arrastrar archivo al componente
⚠️ Notas Importantes
-
Reminders por WhatsApp: Se decidió NO implementar recordatorios por WhatsApp para evitar baneos de Meta. Los recordatorios se manejan a través de:
- Google Calendar (reminders de email a 24h antes - ya implementado)
- Email diario a las 10 PM al admin con agenda del día siguiente (pendiente)
-
Reacomodar Citas: Flujo con confirmación enviada (email al paciente). El cambio es automático al recibir el email.
-
Upload de Comprobantes: Enfoque híbrido (pre-procesamiento en cliente, OCR en servidor) para extraer datos de cualquier banco sin plantillas específicas.
-
Email Diario: Se envía solo a admin (Gloria), no al asistente. Hora: 10 PM (configurable para timezone).
-
Datos a Extraer del Comprobante:
- Monto
- Fecha de transferencia
- Clave/Referencia de transferencia
- Nombre del remitente
- Banco remitente
Documento de control operativo y aseguramiento de calidad – Proyecto Gloria