# 🗺️ 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 install` y `prisma migrate` dentro del contenedor.
- ✅ Manual: `docker exec -it <id> whoami` ≠ root.
- ✅ Automático: Integrar helmet.js.

### Criterios de Aceptación

1. ✅ `pnpm install` funciona sin errores
2. ✅ `pnpm dev` levanta servidor en http://localhost:3000
3. ✅ Docker compose funciona con Redis
4. ✅ Prisma schema crea tablas correctamente
5. ✅ Tailwind muestra colores Nano Banana
6. ✅ Usuario `appuser` (UID 1001) corre en Docker
7. ✅ ESLint y TypeScript no tienen errores
8. ✅ Shadcn components renderizan correctamente
9. ✅ Variables de entorno validan con Zod
10. ✅ 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)

```bash
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

1. **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)

2. **Reacomodar Citas:** Flujo con confirmación enviada (email al paciente). El cambio es automático al recibir el email.

3. **Upload de Comprobantes:** Enfoque híbrido (pre-procesamiento en cliente, OCR en servidor) para extraer datos de cualquier banco sin plantillas específicas.

4. **Email Diario:** Se envía solo a admin (Gloria), no al asistente. Hora: 10 PM (configurable para timezone).

5. **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
