Files
gloria_app/TASKS.md
Marco Gallegos 423f96022a feat: Complete Sprints 3 & 4 - Email, Reschedule, OCR, Upload, Contact Forms
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
2026-02-02 20:45:32 -06:00

388 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🗺️ 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