Cancelación al final del periodo, reactivación y mejoras de seguridad
Esta actualización completa el ciclo de vida de la suscripción en Explosion POS. Los clientes pueden cancelar desde /profile mediante un modal premium: el acceso se conserva hasta subscription_expires_at y aparece un banner indicando la fecha exacta de finalización junto a un botón para reactivar la suscripción antes de que venza. Un cron público finaliza automáticamente las suscripciones programadas cuando llega la fecha, llama a EcartPay para cerrar el ciclo y deja el estado en 'canceled'. Los emails transaccionales (cancelación programada, expiración final y reactivación) se registran en subscription_events con cycle_key para evitar envíos duplicados. Se reforzaron las políticas RLS para que solo el owner pueda cancelar (los cajeros quedan bloqueados) y se publicó por primera vez el sistema de updates con versión global única (V-3.2.xxxx) visible en el footer del landing, las páginas legales y la sección /updates. También se corrigió un mismatch de hidratación en /updates causado por el formateo de fechas en zona horaria local.
Aspectos destacados
- Cancelación al final del periodo desde /profile con modal premium
- Banner 'Activa hasta X' con botón Reactivar suscripción
- Cron público que finaliza la suscripción al vencer subscription_expires_at
- Emails transaccionales sin duplicados (cycle_key en subscription_events)
- RLS endurecido: cajeros no pueden cancelar la suscripción
- Sistema de updates/changelog con versión global V-3.2.xxxx
- Footer de versión en landing, legal pages y /updates
- Fix de hydration mismatch en /updates (fechas en UTC)