RF44: Usuario desactiva renovación automática
Descripción
Como usuario autenticado con suscripción de pago, quiero desactivar la renovación automática para que mi plan no se renueve al final del periodo, conservando el acceso hasta entonces.
Equivale a programar la baja al fin del periodo (cancel_at_period_end: true) sin cancelar de inmediato; el acceso premium continúa hasta el vencimiento, luego se degrada a Free (RF42). Es funcionalmente cercano a RF39, enfocado en el toggle de renovación.
| Campo | Valor |
|---|---|
| Módulo | Subscription Module |
| Actor | Usuario autenticado |
| Endpoint | POST /subscription/auto-renew ({ enabled: false }) |
| Precondiciones | Sesión activa; suscripción de pago activa con renovación habilitada |
| Prioridad | Media (MVP) |
| Etapa | MVP |
| Requisitos relacionados | RF43, RF39, RF42 |
Reglas de negocio
- RN-44.1 — Desactivar la renovación mantiene el acceso premium hasta el fin del periodo ya pagado.
- RN-44.2 — Equivale a
subscriptions.update({ cancel_at_period_end: true }). - RN-44.3 — El usuario puede reactivarla antes del vencimiento (RF43).
- RN-44.4 — Se notifica la fecha de fin de acceso (RF41).
- RN-44.5 — Operación idempotente.
Validaciones de entrada
| Campo | Reglas | Mensaje de error |
|---|---|---|
Authorization | Bearer válido. | "Sesión no válida." (401) |
| Estado | Suscripción de pago activa. | "No tienes una suscripción activa." (409) |
Criterios de aceptación
Escenario 1: Desactivación exitosa
Dado que tengo una suscripción con renovación activa,
Cuando desactivo la renovación automática,
Entonces el sistema programa la baja al fin del periodo,
Y responde 200 OK indicando hasta cuándo conservo el acceso,
Y me notifica la fecha de fin (RF41).
Escenario 2: Reactivar antes del vencimiento
Dado que desactivé la renovación pero aún no vence, Cuando la reactivo (RF43), Entonces el sistema cancela la baja programada.
Escenario 3: Sin suscripción activa
Dado que estoy en plan Free,
Cuando intento desactivar la renovación,
Entonces el sistema responde 409 con "No tienes una suscripción activa".
Criterios no funcionales
- Idempotencia; comunicación TLS 1.2+.
- El estado se sincroniza con Stripe (fuente de verdad por webhook).