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
7.0 KiB
Progreso del Proyecto Gloria
Este documento rastrea el progreso detallado de cada Sprint.
Resumen Global
| Sprint | Estado | Progreso | Fecha |
|---|---|---|---|
| 🟢 Sprint 1 - Cimientos | ✅ Completado | 100% | 2026-02-01 |
| 🔵 Sprint 2 - Phone-First | ✅ Completado | 100% | 2026-02-01 |
| 🟡 Sprint 3 - Crisis y Agenda | ✅ Completado | 100% | 2026-02-02 |
| 🟠 Sprint 4 - Pagos y Roles | ✅ Completado | 100% | 2026-02-02 |
| 🔴 Sprint 5 - Voz y Notas | ⏳ No Iniciado (Esperando 3/4) | 0% | Pendiente |
| 🟣 Sprint 6 - Integración Final | ⏳ No Iniciado (Esperando 3/4) | 0% | Pendiente |
Progreso Total del Proyecto: 67% (4/6 sprints completados)
🟡 Sprint 3 - Triaje de Crisis y Agenda
Estado: ✅ 100% Completado Fecha Inicio: 2026-02-01 Fecha Finalización: 2026-02-02 Responsable: Data-Agent + UI-Agent Progreso: 100%
Foco
Lógica sensible y disponibilidad.
Progreso Global
| Fase | Estado | % Completado |
|---|---|---|
| Motor de Crisis | ✅ Completado | 100% |
| Google Calendar API | ✅ Completado | 100% |
| Caché de Disponibilidad | ✅ Completado | 100% |
| Sistema de Locks | ✅ Completado | 100% |
| Servicio de Email SMTP | ✅ Completado | 100% |
| Reacomodar Citas | ✅ Completado | 100% |
| Job Email Diario 10 PM | ✅ Completado | 100% |
Tareas Detalladas
Motor de Crisis (100% Completado)
- API endpoint POST /api/crisis/evaluate
- Algoritmo de detección de palabras clave
- Preguntas de validación adicionales
Sprint 3 y 4 completados - ver detalles arriba
1. Upload de Comprobantes con OCR (Híbrido)
Archivos a crear:
src/app/api/payments/upload-proof/route.ts- API endpoint de uploadsrc/lib/ocr/processor.ts- Procesador OCR (servidor)src/lib/ocr/templates.ts- Templates para extraer datos específicossrc/components/dashboard/PaymentUpload.tsx- Componente de upload con drag & dropsrc/lib/utils/ocr-client.ts- Pre-procesamiento en cliente (opcional)
Archivos a modificar:
prisma/schema.prisma- Agregar campos extraídos a modelo Paymentsrc/app/dashboard/asistente/page.tsx- Integrar componente de upload
Base de datos - Actualizar modelo Payment:
model Payment {
// ... campos existentes
// Datos extraídos por OCR
extractedDate DateTime?
extractedAmount Float?
extractedReference String? // Clave de transferencia
extractedSenderName String?
extractedSenderBank String?
}
Flujo del proceso (Híbrido):
Cliente:
- Usuario arrastra o selecciona archivo (PDF, JPG, PNG)
- Validación de tipo y tamaño (máx 5MB)
- Pre-procesamiento opcional: Escala de grises, Aumentar contraste, Redimensionar si es muy grande
- Enviar archivo al servidor
Servidor:
- Recibir archivo multipart/form-data
- Validar tipo (PDF, JPG, PNG) y tamaño (5MB)
- Generar nombre único:
payment_{appointmentId}_{timestamp}.{ext} - Guardar en
/public/uploads/payments/ - Procesar con OCR:
- Si es imagen: usar tesseract.js directamente
- Si es PDF: extraer texto con pdf-parse primero
- Extraer datos usando regex patterns (monto, fecha, referencia, remitente, banco)
- Guardar datos extraídos en Payment model
- Retornar URL del archivo y datos extraídos
Componente PaymentUpload:
- Área de drag & drop
- Previsualización de archivo (imagen o icono PDF)
- Barra de progreso de upload
- Mostrar datos extraídos por OCR con opción de editar
- Botón para reintentar si OCR falla
2. Botón "Ver Más Servicios" en Landing
Archivo a modificar:
src/components/layout/Services.tsx- Línea 136-144
Cambios:
// Antes:
<Button onClick={() => { ... }}>Agenda tu Primera Sesión</Button>
// Después:
<Button
onClick={() => router.push("/servicios")}
className="rounded-full bg-accent px-8 py-4 font-semibold text-primary transition-colors hover:bg-accent/90"
>
Ver Más Servicios
</Button>
3. Contacto Específico para Cursos
Archivos a crear:
src/app/api/contact/courses/route.ts- Endpoint para consultas de cursossrc/lib/email/templates/course-inquiry.ts- Template HTML de notificación
Archivo a modificar:
src/app/cursos/page.tsx- Agregar sección de contacto específica
Especificaciones:
- Formulario con campos:
- Nombre (requerido)
- Email (requerido)
- Curso de interés (dropdown - requerido)
- Mensaje (requerido)
- Al enviar:
- Guardar registro en SQLite
- Enviar email de notificación a admin
- Diseño consistente con paleta Nano Banana
- Animaciones suaves con Framer Motion
- Cambiar botones "Más Información" para abrir modal o ir a sección de contacto
📊 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
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 para evitar baneos de Meta. Los recordatorios se manejan a través de Google Calendar (email 24h antes - ya implementado) y email diario a las 10 PM al admin (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.