13. Suscripción y plan
Cubre subscriptions: trial, demo, vencimiento, paywall y los límites de funcionalidad por plan. No cubre el checkout real de MercadoPago de punta a punta (requeriría un pago real o credenciales sandbox — si existen credenciales sandbox en staging, agregar esos casos después; de lo contrario, documentar como limitación conocida de este ciclo).
Historial de ejecución
| Ciclo | Fecha | Ejecutado por | Casos ejecutados | Resultado |
|---|---|---|---|---|
| 1 | — | — | — | Pendiente |
CP SUB-01: Toda empresa nueva arranca en
trial
- Precondición: empresa recién registrada (ver AUTH-01).
- Resultado esperado:
status="trial",plan="basic",trial_ends_at= fecha de registro + 45 días (TrialDays=45).- Resultado obtenido: Pendiente.
CP SUB-02: Iniciar modo demo (
POST /subscription/demo)
- Pasos: elegir un
business_type(retail/food/services/generic).- Resultado esperado:
status="demo",demo_expires_at= ahora + 1 hora (DemoHours=1); confirmar que el demo precarga datos de ejemplo acordes albusiness_typeelegido (ver nota de la técnica de capturas: “Cargar datos de demo” tipo “Gastrobar”).- Resultado obtenido: Pendiente.
CP SUB-03: Iniciar demo con
business_typeinválido (ej."otro")
- Resultado esperado: error 400 (
binding:"oneof=retail food services generic").- Resultado obtenido: Pendiente.
CP SUB-04: Demo vencido (esperar 1 hora, o ajustar
demo_expires_atmanualmente en la base para no esperar)
- Resultado esperado:
statuspasa a"expired"; confirmar queIsDemoExpired()efectivamente bloquea el acceso normal y muestra el paywall.- Resultado obtenido: Pendiente.
CP SUB-05: Trial vencido — comportamiento del paywall
- Objetivo: conocido por sesiones anteriores — al vencer el trial aparece un modal
.paywall-overlayfijo con blur de fondo en todas las páginas, sin botón de cierre.- Pasos: forzar
trial_ends_atal pasado (directamente en la base, ya que esperar 45 días no es viable) → recargar cualquier página del dashboard.- Resultado esperado a verificar: el modal aparece, pero no bloquea la interacción real (se puede seguir llenando formularios y guardando “por debajo” del modal) — confirmar si esto es intencional o es en sí mismo un hallazgo: un modal de paywall que no impide usar la app no cumple su propósito de negocio.
- Resultado obtenido: Pendiente.
CP SUB-06: Intentar usar una función de Plan Medio/Pro estando en Plan Básico (fuera de invoicing/terminales, que están excluidos de este plan)
- Pasos: revisar si hay alguna otra función con gate de plan (ej. número máximo de tiendas, de usuarios, de productos) — si existe, probar el límite exacto.
- Resultado esperado a verificar: confirmar si existen límites de ese tipo en el código actual o si el único gate real hoy es
CanUseInvoicing/CanUseTerminals(ambos sobre features excluidas de este ciclo de pruebas).- Resultado obtenido: Pendiente.
CP SUB-07: Iniciar checkout (
POST /subscription/checkout) con plan y ciclo de facturación válidos
- Pasos:
plan="medium",billing_cycle="monthly".- Resultado esperado: debe devolver una
checkout_urlde MercadoPago válida (no necesariamente completar el pago real).- Resultado obtenido: Pendiente.
CP SUB-08: Checkout con
plan/billing_cycleinválidos
- Resultado esperado: error 400 claro (
oneof=basic medium pro/oneof=monthly annual).- Resultado obtenido: Pendiente.
CP SUB-09: Pasar de
demoatrial/plan real mediante checkout
- Resultado esperado a verificar: confirmar que el webhook de MercadoPago (
HandleWebhook) efectivamente actualiza el estado y plan al confirmar el pago (si hay forma de simularlo en sandbox); si no es viable en este ciclo, dejar explícitamente como “no probado — requiere sandbox de MercadoPago”.- Resultado obtenido: Pendiente — probablemente no ejecutable en staging sin credenciales sandbox; confirmar con el usuario antes de intentar.
Notas de usabilidad y sugerencias
Se completa durante la ejecución. El caso SUB-05 (paywall que no bloquea) es, de los 13 módulos de este plan, uno de los pocos donde ya hay evidencia previa de un comportamiento cuestionable — priorizarlo.