diff --git a/README.md b/README.md index 1178f08..4c7ed52 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ Taskbot ayuda a coordinar grupos en WhatsApp: crea y asigna tareas, recuerda pen - No es un framework general de bots ni un CRM. - No conecta directamente con WhatsApp: requiere Evolution API. - No gestiona flujos conversacionales complejos ni multimedia avanzada. -- Panel web en progreso: login operativo, vista básica de tareas (por fecha de vencimiento) y de grupos (contadores "abiertas" y "sin responsable"); la interacción principal sigue siendo WhatsApp. +- Panel web: login operativo, vista básica de tareas (por fecha de vencimiento), vista de grupos (contadores "abiertas" y "sin responsable") y página de preferencias de recordatorios; la interacción principal sigue siendo WhatsApp. - Está optimizado para un despliegue por comunidad/instancia (no multi-tenant masivo). ## Cómo funciona (alto nivel) @@ -93,7 +93,7 @@ Consulta: ## Pruebas (bun:test) - Suite web implementada con build programático: los tests construyen apps/web (adapter-node) una única vez, arrancan el servidor en un puerto efímero y hacen peticiones HTTP reales. - Sin dependencias externas: bun:test, bun:sqlite y helpers propios. -- Cobertura actual: endpoints /api/me/tasks (gating, orden, búsqueda con ESCAPE, soonDays y paginación), /api/me/preferences (valores por defecto) y helpers de servidor para build/arranque. +- Cobertura actual: endpoints /api/me/tasks (gating, orden, búsqueda con ESCAPE, soonDays y paginación), /api/me/preferences (GET y POST) y página /app/preferences; además de helpers de servidor para build/arranque. - Ejecución: bun test tests/web ## Estado y licencia @@ -102,6 +102,7 @@ Consulta: - Licencia por definir (software libre; se evaluará GPLv3/AGPL/MIT/Apache-2.0). - Etapa 1 (autenticación web): completada. /login (GET intermedio + POST), sesión con idle 2h, logout y ruta /app protegida; desplegado con proxy interno en Bun. - Etapa 2 (lectura de datos - MVP): completada. GET /api/me/tasks (orden por due_date asc con NULL al final, búsqueda con ESCAPE, filtros soonDays/dueBefore, paginación page/limit), GET /api/me/groups (contadores open/unassigned) y GET /api/groups/:id/tasks (unassignedFirst, onlyUnassigned, limit). UI: /app (Mis tareas, filtros/búsqueda/paginación) y /app/groups (bloque “sin responsable” con prefetch). +- Etapa 3 (preferencias): completada. GET/POST /api/me/preferences y página /app/preferences con cálculo de “próximo recordatorio” coherente con la TZ y semántica del bot. - Roadmap y contribuciones: pendientes de publicación. ## Enlaces diff --git a/docs/operations.md b/docs/operations.md index 157f560..42ce8ed 100644 --- a/docs/operations.md +++ b/docs/operations.md @@ -40,6 +40,10 @@ Endpoints operativos - Devuelve solo grupos permitidos donde el usuario está activo. Incluye counts.open y counts.unassigned por grupo. - GET /api/groups/:id/tasks?unassignedFirst=true - Requiere que el usuario sea miembro activo del grupo y que el grupo esté permitido. Orden por due_date (NULL al final); admite parámetros unassignedFirst, onlyUnassigned y limit (clamp a 100). + - GET /api/me/preferences + - Devuelve las preferencias del usuario para recordatorios como { freq, time }. Si no hay registro previo, responde { freq: 'off', time: '08:30' }. + - POST /api/me/preferences + - Actualiza preferencias. Valida freq ∈ {off,daily,weekly,weekdays} y time en formato HH:MM (24h); normaliza hora (p. ej., 7:5 → 07:05). Upsert con updated_at; si freq='off' y no se envía time, conserva la última hora guardada (o '08:30' por defecto). Arranque y servicios - src/server.ts::start() (bot) diff --git a/docs/plan-interfaz-web.md b/docs/plan-interfaz-web.md index c2dabef..5c6fdb0 100644 --- a/docs/plan-interfaz-web.md +++ b/docs/plan-interfaz-web.md @@ -192,9 +192,9 @@ Etapa 2 — Lectura de datos (MVP) — COMPLETADA: GET /api/me/tasks (orden por - UI: “Mis tareas” y “Grupos” (solo lectura). - Orden por fecha de vencimiento asc (NULL al final), filtros básicos, búsqueda. -Etapa 3 — Preferencias -- APIs: GET/POST /api/me/preferences. -- UI: edición de frecuencia/hora y vista del próximo recordatorio. +Etapa 3 — Preferencias — COMPLETADA +- APIs: GET/POST /api/me/preferences (validación y upsert; normalización HH:MM; conservación de hora al desactivar). +- UI: /app/preferences con formulario (frecuencia y hora) y “próximo recordatorio” calculado en servidor, alineado con la TZ y la semántica del bot (weekly = lunes, weekdays = L–V). Etapa 4 — ICS - Migraciones: calendar_tokens.