RF27: Usuario actualiza estado de recomendación a completada
Descripción
Como usuario autenticado, quiero marcar una recomendación como "completada" para registrar mi progreso y que Finnova ajuste futuras recomendaciones.
Cambia el estado a completed. El sistema usa esta señal para medir adopción y afinar el motor de IA. Puede otorgar una recompensa (RF67) si aplica.
| Campo | Valor |
|---|---|
| Módulo | Finance Data Collection (FDC) Module — Recomendaciones |
| Actor | Usuario autenticado |
| Endpoint | PATCH /recommendations/:id/status ({ status: 'completed' }) |
| Precondiciones | Sesión activa; la recomendación pertenece al usuario |
| Prioridad | Media (MVP) |
| Etapa | MVP |
| Requisitos relacionados | RF25, RF26, RF67 |
Reglas de negocio
- RN-27.1 — Solo el dueño (
user_iddel JWT) puede completar su recomendación. - RN-27.2 — Transición válida:
new/pending→completed. - RN-27.3 — Completar una recomendación puede disparar la generación de una recompensa (RF67).
- RN-27.4 — El evento se registra con marca de tiempo para análisis de adopción y reentrenamiento del modelo.
Validaciones de entrada
| Campo | Reglas | Mensaje de error |
|---|---|---|
id | Obligatorio. UUID existente y del usuario. | "Recomendación no encontrada." (404) |
status | Debe ser completed. | "Estado no válido." (400) |
Criterios de aceptación
Escenario 1: Marcar como completada exitoso
Dado que tengo una recomendación nueva o pendiente,
Cuando la marco como completada,
Entonces el sistema actualiza su estado a completed y responde 200 OK,
Y evalúa si corresponde otorgar una recompensa (RF67).
Escenario 2: Recomendación inexistente o ajena (seguridad)
Dado que envío un id que no existe o no es mío,
Cuando intento completarla,
Entonces el sistema responde 404 Not Found.
Escenario 3: Estado no válido
Dado que envío un estado fuera del enum,
Cuando el backend valida,
Entonces responde 400 con "Estado no válido".
Criterios no funcionales
- Operación idempotente; respuesta < 500 ms.
- La evaluación de recompensa es asíncrona y no bloquea la respuesta.
- Comunicación TLS 1.2+.