# RF-MGN-015-001: Gestión de Planes de Suscripción

**Módulo:** MGN-015 - Billing y Suscripciones
**Prioridad:** P0 (MVP para SaaS)
**Story Points:** 8
**Estado:** Definido
**Fecha:** 2025-11-24

## Descripción

El sistema debe permitir la definición y gestión de planes de suscripción que determinan las características, límites y precios disponibles para los tenants. Los planes son globales (no pertenecen a un tenant específico) y definen qué funcionalidades están disponibles para cada nivel de servicio.

## Actores

- **Actor Principal:** Administrador de Plataforma (super_admin)
- **Actores Secundarios:** Sistema (validación automática de límites)

## Precondiciones

1. Usuario debe tener rol `super_admin` o `platform_admin`
2. Schema `billing` debe existir en la base de datos

## Flujo Principal

1. Administrador accede al panel de administración de planes
2. Sistema muestra lista de planes existentes (free, basic, professional, enterprise)
3. Administrador puede:
   - Ver detalles de cada plan
   - Crear nuevo plan
   - Editar plan existente
   - Activar/desactivar plan
4. Al crear/editar plan, administrador define:
   - Código único (ej: "basic", "pro")
   - Nombre visible (ej: "Plan Básico")
   - Descripción
   - Precios (mensual, anual)
   - Límites (usuarios, empresas, almacenamiento)
   - Features habilitadas (JSON)
   - Días de prueba
   - Orden de visualización
5. Sistema valida datos y guarda cambios
6. Cambios se reflejan inmediatamente para nuevas suscripciones

## Flujos Alternativos

### FA-1: Plan con Suscripciones Activas
1. Si administrador intenta eliminar plan con suscripciones activas
2. Sistema muestra error: "No se puede eliminar plan con suscripciones activas"
3. Sistema sugiere desactivar plan en su lugar

### FA-2: Cambio de Precio
1. Si se modifica precio de un plan
2. Sistema pregunta: "¿Aplicar a suscripciones existentes en próxima renovación?"
3. Administrador selecciona opción
4. Sistema registra cambio en historial

## Reglas de Negocio

- **RN-1:** Códigos de plan deben ser únicos (ej: "basic", "pro", "enterprise")
- **RN-2:** Debe existir al menos un plan por defecto para nuevos tenants
- **RN-3:** Plan "single_tenant" es especial y no visible públicamente
- **RN-4:** Features se definen como JSON: `{"inventory": true, "sales": true, ...}`
- **RN-5:** max_users = NULL significa usuarios ilimitados
- **RN-6:** Precio 0 indica plan gratuito
- **RN-7:** Cambios de precio no afectan suscripciones existentes hasta renovación

## Criterios de Aceptación

- [ ] Super admin puede listar todos los planes de suscripción
- [ ] Super admin puede crear nuevos planes con todos sus atributos
- [ ] Super admin puede editar planes existentes
- [ ] Super admin puede activar/desactivar planes
- [ ] Planes desactivados no aparecen en página de precios pública
- [ ] Plan por defecto se asigna automáticamente a nuevos tenants
- [ ] Sistema valida unicidad de código de plan
- [ ] Features se almacenan como JSONB para flexibilidad
- [ ] Historial de cambios de planes se registra

## Entidades Involucradas

- **Principales:**
  - billing.subscription_plans (id, code, name, price_monthly, price_yearly, max_users, features)
- **Relacionadas:**
  - billing.subscriptions (referencia plan_id)
  - auth.tenants (campo plan para retrocompatibilidad)

## Referencias

- [ALCANCE-POR-MODULO.md - MGN-015](../../01-definicion-modulos/ALCANCE-POR-MODULO.md#mgn-015-billing)
- [Billing Schema DDL](../database-design/schemas/billing-schema-ddl.sql)

## Notas Técnicas

- **Tabla:** `billing.subscription_plans`
- **No tiene tenant_id:** Los planes son globales del sistema
- **Features JSON ejemplo:**
  ```json
  {
    "inventory": true,
    "sales": true,
    "financial": true,
    "purchase": true,
    "crm": false,
    "projects": false,
    "reports_basic": true,
    "reports_advanced": false,
    "api_access": false,
    "white_label": false
  }
  ```
- **Función de verificación:** `billing.has_feature(tenant_id, 'feature_name')`

## Dependencias

- **RF Dependientes:** Ninguno (funcionalidad base de billing)
- **Bloqueante para:** RF-MGN-015-002 (Gestión de Suscripciones)
