# Cambios · NimiApps 0.3.0 (ENT-003)

Actualización desde 0.2.0 (ENT-002). Detalle técnico en
`ARQUITECTURA-ENT-003.md`; instalación en `ACTUALIZACION-CPANEL-ENT-003.md`;
uso del panel en `MANUAL-ADMIN-COMERCIAL.md`; pruebas en `PRUEBAS-ENT-003.md`.

## Novedades

### Catálogo público
- `/aplicaciones`: búsqueda, filtro por categoría y tipo de precio, orden.
- Ficha por microapp (`/aplicaciones/{slug}`) con SEO (título, descripción,
  URL canónica, Open Graph, JSON-LD), imágenes, ventajas, FAQ, planes con
  selector mensual/anual y paquetes que la incluyen.

### Modelo comercial
- Microapp, capacidad, producto (individual o paquete), plan, precio,
  promoción y cupón como conceptos separados.
- Precios gratuitos, de pago único (con o sin días de acceso), mensuales y
  anuales; varios por plan.
- Pruebas gratis, promociones automáticas y cupones, planes solo para
  organizaciones, plazas.

### Contratación y cobro (Stripe)
- Contratar para el espacio personal o para una organización (solo el
  propietario).
- Stripe Checkout alojado: NimiApps no ve ni guarda tarjetas.
- Webhooks firmados e idempotentes; cada objeto se vuelve a leer de la API.
- Suscripciones: renovación, pago fallido con gracia, cancelación a final de
  periodo y reactivación, ampliación y reducción de plan, cambio de
  periodicidad, paso a gratuito. Portal de Stripe para tarjetas y facturas.
- Reembolsos totales y parciales desde el panel.
- Detección de pagos duplicados.
- Registro de transacciones y de eventos de Stripe.
- Modo de pruebas y real separados; real bloqueado salvo `STRIPE_ALLOW_LIVE`.
- Sin claves, el catálogo funciona y los planes de pago no se venden.

### Licencias
- Sistema central en el servidor: licencia por espacio y microapp, con
  estados, fechas, gracia y fallo cerrado si dejan de llegar renovaciones.
- Organizaciones: acceso de todos o solo de miembros asignados; gestión de
  plazas por propietario y administradores.
- Concesión manual, suspensión, reactivación y revocación por los
  administradores de NimiApps.

### Área privada
- **Catálogo** y **Contrataciones** en el menú; **Aplicaciones** muestra las
  microapps accesibles con botón «Abrir».
- Pedidos, suscripciones, renovaciones, cancelaciones, cambio de plan,
  licencias y plazas.

### Administración (`/admin/comercial`)
- Resumen, microapps, categorías, productos y planes, promociones, pedidos,
  suscripciones, pagos, licencias, eventos de Stripe y auditoría. Todo con
  validación, confirmación antes de acciones destructivas y registro de
  auditoría.

### Microapps (módulos)
- Bloque `microapp` en `module.json` (código, ruta de entrada, capacidades,
  permisos por rol).
- Rutas bajo `/apps/<slug>` con autenticación, email verificado, espacio
  activo y licencia obligatorios.
- Middleware `microapp`, `microapp.can`, `microapp.permission`.
- Contratos `MicroappRegistry`, `ModuleRegistry`, `Entitlements`,
  `CatalogIntegration` y `PaymentGateway` para microapps futuras.
- Módulo de demostración `modules/Demo` («Demo de licencias»).

### Diagnóstico
- `microapps:check` distingue `[ERROR]`, `[AVISO]` y `[OPCIONAL]` y revisa
  tablas comerciales, configuración de Stripe (sin mostrar claves),
  integridad del catálogo, licencias, plazas, webhooks fallidos o
  atascados, pedidos sin confirmar, módulos y recursos compilados.

## Base de datos

7 migraciones nuevas, solo de creación (detalle en `ARQUITECTURA-ENT-003.md`, apartado 2):

```
database/migrations/2026_10_22_000001_create_catalog_tables.php
database/migrations/2026_10_22_000002_create_products_and_plans_tables.php
database/migrations/2026_10_22_000003_create_promotions_tables.php
database/migrations/2026_10_22_000004_create_orders_and_billing_tables.php
database/migrations/2026_10_22_000005_create_licenses_tables.php
database/migrations/2026_10_22_000006_create_stripe_events_table.php
modules/Demo/database/migrations/2026_10_22_100000_create_demo_notes_table.php
```

## Dependencias

- Nueva: `stripe/stripe-php` 17.6.0 (librería oficial). Se entrega dentro
  del paquete (`vendor/stripe/` y 5 archivos de `vendor/composer/`); no hace
  falta Composer en el servidor.

## Archivos modificados de la 0.2.0

| Archivo | Cambio |
|---------|--------|
| `config/microapps.php` | Versión 0.3.0, actualizable desde 0.2.0 |
| `bootstrap/app.php` | Endpoint `/stripe/webhook` sin sesión ni CSRF; alias de middleware de microapps |
| `routes/web.php` | Catálogo, contratación, pedidos, contrataciones, licencias y `/admin/comercial` |
| `app/Providers/AppServiceProvider.php` | Pasarela de pago, licencias, límites de peticiones de contratación |
| `app/Providers/ModuleServiceProvider.php`, `app/Support/Modules/*` | Bloque `microapp`, rutas `/apps/<slug>` con licencia obligatoria, registro de microapps |
| `app/Enums/WorkspacePermission.php`, `WorkspaceRole.php`, `app/Policies/WorkspacePolicy.php` | Permisos `billing.view`, `billing.manage`, `licenses.manage` |
| `app/Http/Controllers/Panel/ApplicationsController.php`, `DashboardController.php` y sus vistas | Aplicaciones accesibles reales |
| `app/Console/Commands/CheckInstallation.php` | Comprobaciones de ENT-003 y nivel OPCIONAL |
| `resources/views/components/*` (layouts, badge, icon) | Menús, cabecera SEO, colores e iconos |
| `public/build/manifest.json` | CSS recompilado |
| `composer.json`, `composer.lock` | `stripe/stripe-php` |
| `.env.example` | Variables de Stripe e indexación |
| `modules/README.md`, `README.md`, `CHECKSUMS.sha256` | Documentación y huellas de la 0.3.0 |
| `tests/*` | Pruebas de ENT-001/002 adaptadas a 0.3.0 |

## Sin cambios

- `.htaccess` y `public/.htaccess`: no se incluyen en el paquete.
- El JavaScript compilado (`app-MgsdtW8N.js`). Los CSS anteriores quedan
  en el servidor sin uso.

## Nuevas variables de `.env` (todas opcionales)

| Variable | Por defecto | Uso |
|----------|-------------|-----|
| `STRIPE_SECRET` | (vacía) | Clave secreta `sk_test_`/`sk_live_`. Sin ella, pagos desactivados |
| `STRIPE_KEY` | (vacía) | Clave publicable; solo se usa para comprobar el modo |
| `STRIPE_WEBHOOK_SECRET` | (vacía) | Secreto de firma `whsec_` del endpoint |
| `STRIPE_ALLOW_LIVE` | `false` | Permite usar una clave real |
| `STRIPE_AUTOMATIC_TAX` | `false` | Stripe Tax |
| `STRIPE_TAX_ID_COLLECTION` | `true` | Pedir NIF/CIF en Checkout |
| `STRIPE_API_BASE` | (vacía) | Solo simulador local; se ignora en producción |
| `NIMIAPPS_PAST_DUE_GRACE_DAYS` | `7` | Días de acceso con un pago fallido |
| `NIMIAPPS_SUBSCRIPTION_GRACE_HOURS` | `72` | Margen tras el fin del periodo pagado |
| `NIMIAPPS_INDEXABLE` | `false` | Permitir indexación del sitio |

## No terminado o fuera de alcance

- **No probado con Stripe real** (solo con simulador): ver `PRUEBAS-ENT-003.md`, Parte B.
- Disputas (contracargos): no se gestionan en NimiApps.
- Paso de suscripción a pago único: no disponible.
- Stripe Tax: preparado por variable, sin probar.
- Microapp de documentación: no construida (solo contratos).
- Facturas propias de NimiApps: se usan los recibos y facturas de Stripe.
