Files
gloria_app/PROGRESS.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

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 upload
  • src/lib/ocr/processor.ts - Procesador OCR (servidor)
  • src/lib/ocr/templates.ts - Templates para extraer datos específicos
  • src/components/dashboard/PaymentUpload.tsx - Componente de upload con drag & drop
  • src/lib/utils/ocr-client.ts - Pre-procesamiento en cliente (opcional)

Archivos a modificar:

  • prisma/schema.prisma - Agregar campos extraídos a modelo Payment
  • src/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:

  1. Usuario arrastra o selecciona archivo (PDF, JPG, PNG)
  2. Validación de tipo y tamaño (máx 5MB)
  3. Pre-procesamiento opcional: Escala de grises, Aumentar contraste, Redimensionar si es muy grande
  4. Enviar archivo al servidor

Servidor:

  1. Recibir archivo multipart/form-data
  2. Validar tipo (PDF, JPG, PNG) y tamaño (5MB)
  3. Generar nombre único: payment_{appointmentId}_{timestamp}.{ext}
  4. Guardar en /public/uploads/payments/
  5. Procesar con OCR:
    • Si es imagen: usar tesseract.js directamente
    • Si es PDF: extraer texto con pdf-parse primero
  6. Extraer datos usando regex patterns (monto, fecha, referencia, remitente, banco)
  7. Guardar datos extraídos en Payment model
  8. 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 cursos
  • src/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

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

  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.