# Arquitectura SaaS Completa - CD-System

## 🏗️ Arquitectura Multi-Tenant

### Concepto Base

Cada proyecto tiene:
- **Base de datos propia** (aislamiento completo)
- **Archivos JSON de configuración** (datos del proyecto)
- **Assets físicos** (logos, imágenes en `public/cd-project/assets/`)
- **Configuraciones dinámicas** (cargadas desde JSONs a `config/*.php`)

### Separación de Responsabilidades

```
┌─────────────────────────────────────────────────────────┐
│                    CÓDIGO BASE                          │
│  (Reutilizable, versionado en repo principal)          │
├─────────────────────────────────────────────────────────┤
│  - config/site.php (estructura)                        │
│  - config/cd-system.php (estructura)                   │
│  - Seeders (lógica de carga)                           │
│  - Controladores, modelos, vistas                       │
└─────────────────────────────────────────────────────────┘
                          ↓
┌─────────────────────────────────────────────────────────┐
│              DATOS DEL PROYECTO                         │
│  (Específicos, pueden estar en .gitignore)             │
├─────────────────────────────────────────────────────────┤
│  - database/seeders/project-data/*.json                │
│  - public/cd-project/assets/* (imágenes)                │
└─────────────────────────────────────────────────────────┘
                          ↓
┌─────────────────────────────────────────────────────────┐
│              BASE DE DATOS                              │
│  (Una DB por proyecto)                                 │
├─────────────────────────────────────────────────────────┤
│  - Tablas de contenido (blog, services, etc.)           │
│  - Tabla assets (referencias a archivos)               │
│  - Settings (configuraciones del proyecto)             │
└─────────────────────────────────────────────────────────┘
```

## 📋 Archivos JSON del Proyecto

### 1. `cd-system.json`
**Propósito:** Configuración del sistema base  
**Actualiza:** `config/cd-system.php`

```json
{
  "theme": {
    "demo": "demo-restaurant",
    "skin": "auto"
  },
  "modules": {
    "blog": {
      "active": true,
      "navigation": {
        "header": true,
        "footer": true
      }
    }
  },
  "maintenance": {
    "enabled": false
  }
}
```

### 2. `site-data.json`
**Propósito:** Datos específicos del proyecto  
**Actualiza:** `config/site.php`

```json
{
  "contact": {
    "phone": "+1 (305) 555-1234",
    "email": "hello@muma.com",
    "address": "123 Main St, Miami, FL"
  },
  "social_media": {
    "instagram": {
      "url": "https://instagram.com/muma",
      "active": true
    }
  },
  "development": {
    "enabled": true,
    "title": "Our Website is Coming Soon"
  }
}
```

### 3. `assets.json`
**Propósito:** Referencias a assets del proyecto  
**Actualiza:** Base de datos (tabla `assets`)

```json
{
  "assets": [
    {
      "name": "logo.png",
      "path": "cd-project/assets/logo.png",
      "type": "logo"
    }
  ]
}
```

### 4. `analytics.json`
**Propósito:** Google Analytics  
**Actualiza:** `config/site.php`

```json
{
  "google_analytics": {
    "enabled": true,
    "tracking_id": "G-CZ4M1W9WR0"
  }
}
```

## 🔄 Flujo Completo de Cambio de Proyecto

### Escenario: Cambiar de Proyecto A a Proyecto B (Muma)

#### 1. Preparar Datos del Nuevo Proyecto

```bash
# Copiar/crear JSONs del nuevo proyecto
cp -r proyecto-muma-json/* database/seeders/project-data/
```

#### 2. Cambiar Base de Datos

```bash
# .env
DB_DATABASE=muma_db
```

#### 3. Ejecutar Migraciones y Seeders

```bash
php artisan migrate:fresh --seed
```

**Orden de ejecución (Project_Seeder):**

1. **CdSystemSeeder** → Carga `cd-system.json` → Actualiza `config/cd-system.php`
   - Demo: `demo-restaurant`
   - Módulos activos: blog, services, etc.

2. **SiteDataSeeder** → Carga `site-data.json` → Actualiza `config/site.php`
   - Contact: phone, email, address
   - Social media: URLs
   - Development mode: enabled/disabled

3. **AssetsSeeder** → Carga `assets.json` → Inserta en tabla `assets`
   - Logos, favicons, imágenes OG/Twitter

4. **AnalyticsSeeder** → Carga `analytics.json` → Actualiza `config/site.php`
   - Google Analytics tracking ID

5. **Otros seeders** → Carga contenido
   - BlogSeeder → Posts
   - ProjectsServicesSeeder → Servicios
   - etc.

#### 4. Resultado

Después de ejecutar los seeders:

- ✅ `config/cd-system.php` actualizado con demo y módulos de Muma
- ✅ `config/site.php` actualizado con datos de Muma
- ✅ Assets cargados en DB
- ✅ Google Analytics configurado
- ✅ Contenido cargado (blog, services, etc.)

## 🎯 Caso de Uso: Proyecto Muma

### Configuración Actual (Muma)

**Base de Datos:** `muma_db`

**Archivos JSON:**
- `cd-system.json`: demo=`demo-restaurant`, módulos activos
- `site-data.json`: name=`Muma`, contact, social_media
- `assets.json`: logos de Muma, og-image, twitter-image
- `analytics.json`: GA=`G-CZ4M1W9WR0`

**Resultado:**
- Demo: `demo-restaurant`
- Módulos: blog, services, projects activos
- Assets: logos de Muma cargados
- GA: tracking activo
- Development mode: enabled (coming soon)

### Cambiar a Otro Proyecto

1. Cambiar `DB_DATABASE` en `.env`
2. Actualizar JSONs con datos del nuevo proyecto
3. Ejecutar `php artisan migrate:fresh --seed`
4. Todo se actualiza automáticamente

## 📊 Mapeo Completo: DB → Configuración

| Componente | Fuente | Seeder | Destino | Ejemplo (Muma) |
|-----------|--------|--------|---------|----------------|
| **Demo activo** | `cd-system.json` | `CdSystemSeeder` | `config/cd-system.php` | `demo-restaurant` |
| **Módulos activos** | `cd-system.json` | `CdSystemSeeder` | `config/cd-system.php` | blog, services, projects |
| **Contact info** | `site-data.json` | `SiteDataSeeder` | `config/site.php` | phone, email, address |
| **Social media** | `site-data.json` | `SiteDataSeeder` | `config/site.php` | Instagram, Facebook URLs |
| **Assets** | `assets.json` | `AssetsSeeder` | DB (tabla `assets`) | logos, favicons |
| **GA Tracking** | `analytics.json` | `AnalyticsSeeder` | `config/site.php` | `G-CZ4M1W9WR0` |
| **Development mode** | `site-data.json` | `SiteDataSeeder` | `config/site.php` | enabled, title, progress |

## 🔧 Comandos Útiles

### Cargar solo configuración del sistema
```bash
php artisan db:seed --class=CdSystemSeeder
php artisan config:clear
```

### Cargar solo datos del proyecto
```bash
php artisan db:seed --class=SiteDataSeeder
php artisan config:clear
```

### Cargar solo assets
```bash
php artisan db:seed --class=AssetsSeeder
```

### Cargar solo analytics
```bash
php artisan db:seed --class=AnalyticsSeeder
php artisan config:clear
```

### Cargar todo (proyecto completo)
```bash
php artisan migrate:fresh --seed
php artisan config:clear
php artisan view:clear
```

## ⚠️ Reglas Importantes

1. **Nunca** modificar `config/site.php` o `config/cd-system.php` manualmente
2. **Siempre** usar los JSONs y seeders para cambios
3. **Siempre** limpiar cache después de cambios
4. **Versionar** los JSONs del proyecto (opcional, pueden estar en .gitignore)
5. **Mantener** la estructura en los configs, solo valores en JSONs

## 🚀 Propagación de Actualizaciones

### Actualizar Código Base

1. Actualizar código en repo principal
2. Todos los proyectos se benefician automáticamente
3. Los JSONs antiguos siguen funcionando (compatibilidad hacia atrás)

### Agregar Nueva Funcionalidad

1. Agregar nuevo campo en estructura de config
2. Actualizar seeder para manejar nuevo campo
3. Los proyectos existentes pueden optar por usar el nuevo campo
4. Compatibilidad: si no existe en JSON, usa valor por defecto

## 📚 Referencias

- Ver `docs/CONFIGURACION-VS-DATOS-PROYECTO.md` para separación de configuración vs datos
- Ver `database/seeders/Project_Seeder.php` para orden de ejecución
- Ver seeders individuales para implementación
