# Arquitectura del CMS Multi-Tenant Modular

## Visión General

CD-System es un **CMS multi-tenant modular** que se moldea según la configuración de cada proyecto. Cada proyecto selecciona un **demo** (template visual) y activa los **módulos** que necesita. El sistema ensambla automáticamente header, footer, vistas base y módulos en una experiencia coherente.

## Principio Fundamental

> **Un proyecto = Una configuración = Un demo + Módulos activos**

Cada proyecto tiene un **proyecto de referencia** que valida la implementación del demo. Por ejemplo: **Muma** es el proyecto de referencia para `demo-restaurant`.

## Flujo de Decisión

```
┌─────────────────────────────────────────────────────────────────┐
│                    CONFIGURACIÓN DEL PROYECTO                      │
│  (DB / JSON / config/cd-system.php)                              │
└────────────────────────────┬────────────────────────────────────┘
                             │
                             ▼
┌─────────────────────────────────────────────────────────────────┐
│  cd-system.theme.demo = 'demo-restaurant'                         │
│  cd-system.modules.blog.active = true                            │
│  cd-system.modules.menu.active = true                            │
│  ...                                                              │
└────────────────────────────┬────────────────────────────────────┘
                             │
         ┌───────────────────┼───────────────────┐
         ▼                   ▼                   ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐
│  LAYOUT MASTER  │ │  VISTAS BASE    │ │  MÓDULOS ACTIVOS    │
│  Header         │ │  welcome.blade   │ │  Blog → index       │
│  Footer         │ │  about.blade    │ │  Menu → index       │
│  (según demo)   │ │  contact.blade  │ │  (cada uno adaptado │
│                 │ │  (según demo)   │ │   al demo activo)    │
└─────────────────┘ └─────────────────┘ └─────────────────────┘
         │                   │                   │
         └───────────────────┼───────────────────┘
                             ▼
┌─────────────────────────────────────────────────────────────────┐
│  PÁGINA RENDERIZADA                                               │
│  Header demo-restaurant + Contenido welcome demo-restaurant +     │
│  Footer demo-restaurant (si navega a /)                            │
│  O: Header + Blog index (dynamic-header estilo restaurant) +      │
│  Footer (si navega a /blog)                                       │
└─────────────────────────────────────────────────────────────────┘
```

## Componentes Clave

### 1. Configuración Central

| Config | Ubicación | Determina |
|--------|-----------|-----------|
| `cd-system.theme.demo` | config/cd-system.php o DB | Demo activo |
| `cd-system.theme.skin` | config/cd-system.php o DB | Skin CSS (colores) |
| `cd-system.modules.{x}.active` | config/cd-system.php o DB | Módulos activos |
| `cd-system.modules.{x}.navigation` | config/cd-system.php o DB | Navegación header/footer |

### 2. Helpers de Decisión

```php
get_theme_demo()        // → 'demo-restaurant'
get_active_demo()       // → Alias, mismo valor
get_demo_layout('header')  // → 'demo-restaurant' (incluye headers/demo-restaurant.blade.php)
get_demo_layout('footer')  // → 'demo-restaurant'
is_module_active('blog')   // → true/false
```

### 3. Vistas Base por Demo

La página de inicio usa:
```php
@include('modules.cd-base.frontend.demos.' . config('cd-system.theme.demo') . '.welcome')
```

Rutas `/about` y `/contact` resuelven a las vistas del demo activo desde el enrutador.

### 4. Módulos con Adaptación al Demo

Cada módulo tiene un **partial `dynamic-header.blade.php`** que detecta el demo activo y renderiza el estilo de page header correspondiente:

```php
$activeDemo = get_active_demo();
$isRestaurant = ($activeDemo === 'demo-restaurant');
// ... renderiza sección con clases/estilo del demo
```

## Multi-Tenant: Aislamiento

- **Un demo por proyecto**: Solo se carga el CSS del demo activo.
- **Scoping**: Demos como restaurant usan `html.demo-restaurant` para que sus estilos no afecten a otros.
- **Config por proyecto**: DB o JSON determinan demo y módulos. Proyecto A (Muma) ≠ Proyecto B (Law Firm).

## Principios para Cambio de Proyecto (cambio de DB)

Para que el sistema se adapte al cambiar la base de datos por la de otro proyecto:

1. **Toda la configuración de proyecto (demo + módulos activos) vive en la DB actual**: tabla `settings` (keys `cd-system.*`) y/o tabla `demos` (`cd_system_config`). Los archivos `config/cd-system.php` y `cd-system.json` son valores por defecto o fuente para seeders; en runtime gana la DB.
2. **Helpers y vistas dependen solo de config**: `get_active_demo()`, `is_module_active('menu')`, header/footer y dashboard leen `config('cd-system.theme.demo')` y `config('cd-system.modules.*')`. Esos valores se rellenan desde la DB en el boot (CdSystemConfigServiceProvider + DemoConfigServiceProvider). No se hardcodea demo ni lista de módulos por proyecto.
3. **Cache por DB**: Los servicios que cachean config (CdSystemConfigService, SiteConfigService) incluyen el nombre de la DB en la clave de cache, así que cambiar `DB_DATABASE` y limpiar caché hace que se cargue la config del nuevo proyecto.
4. **Comandos y seeders actúan sobre la DB actual**: Habilitar un módulo, ejecutar seeders, etc., modifica solo la base de datos en uso. Al cambiar a otra DB, esa otra tiene su propio demo y módulos.

Ver [07-flujo-proyecto-desde-db.md](07-flujo-proyecto-desde-db.md) y [TROUBLESHOOTING-CAMBIO-DB.md](../saas/TROUBLESHOOTING-CAMBIO-DB.md).

## Generación desde Base de Datos

Cuando el proyecto usa configuración DB-based:

1. **DemoConfigServiceProvider** carga desde tabla `demos` o `settings`.
2. **CdSystemSeeder** carga `cd-system.json` → `config/cd-system.php`.
3. **SiteDataSeeder** carga `site-data.json` → `config/site.php`.
4. El demo y módulos quedan configurados; el sistema ensambla todo automáticamente.

Ver: [07-flujo-proyecto-desde-db.md](07-flujo-proyecto-desde-db.md)

## Documentación Relacionada

- [02-sistema-demos.md](02-sistema-demos.md) - Detalle del sistema de demos
- [03-layouts-dinamicos.md](03-layouts-dinamicos.md) - Header y footer
- [05-modulos-y-ensamblaje.md](05-modulos-y-ensamblaje.md) - Adaptación de módulos al demo
