RF57: Usuario finaliza curso
Descripción
Como usuario que completó las lecciones y aprobó la evaluación, quiero finalizar el curso para marcarlo como completado y obtener mi certificado.
El sistema valida que se cumplan las condiciones de finalización (lecciones vistas + evaluación aprobada) y marca el curso como completado, lo que dispara la generación del certificado (RF59) y puede otorgar una recompensa (RF67).
| Campo | Valor |
|---|---|
| Módulo | Courses Module |
| Actor | Usuario autenticado |
| Endpoint | POST /courses/:id/complete |
| Precondiciones | Sesión activa; lecciones requeridas vistas; evaluación aprobada (RF56) |
| Prioridad | Media (MVP) |
| Etapa | MBI 1 |
| Requisitos relacionados | RF56, RF58, RF59, RF67 |
Reglas de negocio
- RN-57.1 — El curso solo se finaliza si se cumplen las condiciones (lecciones completas + evaluación aprobada); se validan en el backend.
- RN-57.2 — Finalizar es idempotente: un curso ya completado no se re-completa ni duplica certificado/recompensa.
- RN-57.3 — La finalización dispara la generación del certificado (RF59) y la evaluación de recompensa (RF67).
- RN-57.4 — Se registra la fecha de finalización.
Validaciones de entrada
| Campo | Reglas | Mensaje de error |
|---|---|---|
id | Obligatorio. Curso al que el usuario tiene acceso. | "Curso no encontrado." (404) |
| Estado | Condiciones de finalización cumplidas. | "Aún no completas todas las lecciones o la evaluación." (409) |
Criterios de aceptación
Escenario 1: Finalización exitosa
Dado que vi todas las lecciones y aprobé la evaluación,
Cuando finalizo el curso,
Entonces el sistema lo marca como completado,
Y dispara la generación del certificado (RF59),
Y evalúa otorgar una recompensa (RF67),
Y responde 200 OK.
Escenario 2: Condiciones no cumplidas
Dado que me faltan lecciones o no aprobé la evaluación,
Cuando intento finalizar,
Entonces el sistema responde 409 con "Aún no completas todas las lecciones o la evaluación".
Escenario 3: Curso ya finalizado (idempotencia)
Dado que el curso ya está completado,
Cuando intento finalizarlo de nuevo,
Entonces el sistema responde 200 OK sin duplicar certificado ni recompensa.
Criterios no funcionales
- Validación de condiciones en backend; respuesta < 1 s.
- Generación de certificado y recompensa de forma asíncrona.
- Comunicación TLS 1.2+.