# Comandos de Actualización de Módulos - Demo Law Firm 2

## Descripción General

El sistema CD-System incluye comandos específicos para actualizar la información de cada módulo activo del producto Demo Law Firm 2. Cada módulo tiene su propio comando que lee datos desde archivos JSON y los carga en la base de datos.

## Módulos Activos

Para el producto **Demo Law Firm 2**, los módulos activos son:

1. ✅ **Servicios** (Áreas de Actuación)
2. ✅ **Equipo** (Team Members)
3. ✅ **Referencias** (References)
4. ✅ **Blog** (Noticias)
5. ✅ **FAQs** (Preguntas Frecuentes)

## Comandos Disponibles

### 1. Servicios (Áreas de Actuación)

**Comando:**
```bash
php artisan services:refresh
```

**Con limpieza previa:**
```bash
php artisan services:refresh --clean
```

**Archivo JSON:**
- `database/seeders/project-data/services.json`

**Seeder utilizado:**
- `ProjectsServicesSeeder`
- También ejecuta `ServiceCategoriesSeeder` automáticamente

**Qué hace:**
- ✅ Carga servicios desde el archivo JSON
- ✅ Actualiza categorías de servicios
- ✅ Usa `updateOrCreate` (no duplica si ya existe)
- ✅ Mapea servicios a categorías automáticamente
- ✅ Con `--clean`: Elimina todos los servicios Y categorías antes de cargar (limpio desde cero)

**Estructura del JSON:**
```json
{
  "services": [
    {
      "title": "Family Law",
      "slug": "family-law",
      "description": "Descripción del servicio...",
      "logo": "cd-project/cd-system/seeders/services/icon-services-1.svg",
      "image": null,
      "is_active": true,
      "is_featured": true
    }
  ]
}
```

**Campos requeridos:**
- `title` - Título del servicio
- `slug` - Slug único del servicio

**Campos opcionales:**
- `description` - Descripción del servicio
- `logo` - Ruta al logo/icono del servicio
- `image` - Imagen del servicio
- `is_active` - Si está activo (default: true)
- `is_featured` - Si es destacado (default: false)

---

### 2. Equipo (Team Members)

**Comando:**
```bash
php artisan team:refresh
```

**Con limpieza previa:**
```bash
php artisan team:refresh --clean
```

**Archivo JSON:**
- `database/seeders/project-data/team.json`

**Seeder utilizado:**
- `TeamSeeder`

**Qué hace:**
- ✅ Carga categorías de equipo desde JSON
- ✅ Carga miembros del equipo desde JSON
- ✅ Asocia miembros a categorías por `category_id` (índice del array)
- ✅ Usa `updateOrCreate` por email (no duplica si ya existe)
- ✅ Con `--clean`: Elimina miembros y categorías antes de cargar

**Estructura del JSON:**
```json
{
  "team_categories": [
    {
      "slug": "partners",
      "name": "Socios",
      "description": "Descripción de la categoría"
    }
  ],
  "team_members": [
    {
      "name": "Juan Pérez",
      "position": "Abogado Senior",
      "email": "juan@example.com",
      "linkedin": "https://linkedin.com/in/juan",
      "languages": "Español, Inglés",
      "category_id": 1,
      "description": "Descripción breve",
      "details": "Detalles adicionales",
      "image": "cd-project/cd-system/seeders/team/team-1.jpg",
      "is_active": true
    }
  ]
}
```

**Campos requeridos:**
- `name` - Nombre del miembro
- `email` - Email (usado como clave única)

**Campos opcionales:**
- `position` - Cargo/posición
- `linkedin` - URL de LinkedIn
- `languages` - Idiomas que habla
- `category_id` - Índice del array de categorías (1-indexed)
- `description` - Descripción breve
- `details` - Detalles adicionales
- `image` - Ruta a la imagen del miembro
- `is_active` - Si está activo (default: true)

**Nota importante:** `category_id` es el índice del array `team_categories` (1-indexed), no el ID de la base de datos.

---

### 3. Referencias (References)

**Comando:**
```bash
php artisan references:refresh
```

**Con limpieza previa:**
```bash
php artisan references:refresh --clean
```

**Archivo JSON:**
- `database/seeders/project-data/references.json`

**Seeder utilizado:**
- `ReferencesSeeder`

**Qué hace:**
- ✅ **SIEMPRE limpia** referencias y categorías antes de cargar (comportamiento diferente)
- ✅ Carga categorías de referencias desde JSON
- ✅ Carga referencias desde JSON
- ✅ Asocia referencias a categorías por nombre de categoría
- ✅ Usa `updateOrCreate` por nombre (no duplica si ya existe)

**Estructura del JSON:**
```json
{
  "categories": [
    {
      "slug": "corporate",
      "name": "Corporate"
    }
  ],
  "references": [
    {
      "name": "Empresa ABC",
      "category": "Corporate",
      "logo": "cd-project/product-8/seeders/references/8.png",
      "featured": true
    }
  ]
}
```

**Campos requeridos:**
- `name` - Nombre de la referencia
- `category` - Nombre de la categoría (debe coincidir con una categoría en el array)
- `logo` - Ruta al logo de la referencia

**Campos opcionales:**
- `featured` - Si es destacada (default: false)

**Nota importante:** Este seeder **siempre limpia** los datos antes de cargar, independientemente de la opción `--clean`.

---

### 4. Blog (Noticias)

**Comando:**
```bash
php artisan blog:refresh
```

**Con limpieza previa:**
```bash
php artisan blog:refresh --clean
```

**Archivo JSON:**
- `database/seeders/project-data/blog.json`

**Seeder utilizado:**
- `BlogSeeder`

**Qué hace:**
- ✅ **SIEMPRE limpia** posts antes de cargar (comportamiento diferente)
- ✅ Carga categorías de posts desde JSON
- ✅ Carga posts desde JSON
- ✅ Asocia posts a categorías por `category_slug`, `category_id` o `category_name`
- ✅ Usa el primer usuario disponible como autor por defecto
- ✅ Usa `updateOrCreate` por slug (no duplica si ya existe)

**Estructura del JSON:**
```json
{
  "post_categories": [
    {
      "slug": "legal-news",
      "name": "Noticias Legales",
      "description": "Descripción de la categoría"
    }
  ],
  "posts": [
    {
      "title": "Título del Post",
      "slug": "titulo-del-post",
      "excerpt": "Resumen del post...",
      "content": "Contenido completo del post...",
      "header": "cd-project/cd-system/seeders/blog/blog-1.jpg",
      "category_slug": "legal-news",
      "status": "published",
      "published_at": "2024-01-15 10:00:00"
    }
  ]
}
```

**Campos requeridos:**
- `title` - Título del post
- `slug` - Slug único del post

**Campos opcionales:**
- `excerpt` - Resumen del post
- `content` - Contenido completo
- `header` - Imagen de encabezado
- `category_slug` - Slug de la categoría (preferido)
- `category_id` - ID o índice de la categoría
- `category_name` - Nombre de la categoría
- `status` - Estado del post (default: "Published")
- `published_at` - Fecha de publicación
- `user_id` - ID del usuario autor (si no se especifica, usa el primero disponible)

**Nota importante:** Este seeder **siempre limpia** los posts antes de cargar, independientemente de la opción `--clean`.

---

### 5. FAQs (Preguntas Frecuentes)

**Comando:**
```bash
php artisan faqs:refresh
```

**Con limpieza previa:**
```bash
php artisan faqs:refresh --clean
```

**Archivo JSON:**
- `database/seeders/project-data/faqs.json`

**Seeder utilizado:**
- `FaqsSeeder`

**Qué hace:**
- ✅ Carga categorías de FAQs desde JSON
- ✅ Carga FAQs desde JSON
- ✅ Asocia FAQs a categorías por `category_slug`
- ✅ Usa `updateOrCreate` (no duplica si ya existe)
- ✅ Con `--clean`: Elimina todos los FAQs Y categorías antes de cargar (limpio desde cero)

**Estructura del JSON:**
```json
{
  "faqs_categories": [
    {
      "name": "Servicios y Capacidades",
      "slug": "servicios-capacidades",
      "description": "Información sobre nuestros servicios..."
    }
  ],
  "faqs": [
    {
      "question": "¿Qué servicios ofrecen?",
      "answer": "Ofrecemos servicios integrales...",
      "category_slug": "servicios-capacidades",
      "order": 1
    }
  ]
}
```

**Campos requeridos:**
- `question` - Pregunta del FAQ
- `category_slug` - Slug de la categoría (debe coincidir con una categoría en el array)

**Campos opcionales:**
- `answer` - Respuesta del FAQ
- `order` - Orden de visualización (default: 0)

**Nota importante:** Este comando usa `updateOrCreate` por pregunta y categoría, por lo que no duplica FAQs existentes.

---

## Proceso de Actualización

### Opción 1: Actualización Individual

Actualizar cada módulo por separado:

```bash
# Servicios
php artisan services:refresh --clean

# Equipo
php artisan team:refresh --clean

# Referencias
php artisan references:refresh --clean

# Blog
php artisan blog:refresh --clean

# FAQs
php artisan faqs:refresh --clean
```

### Opción 2: Actualización con Limpieza

Si quieres empezar desde cero:

```bash
# Limpiar y cargar todos los módulos
php artisan services:refresh --clean
php artisan team:refresh --clean
php artisan references:refresh --clean
php artisan blog:refresh --clean
php artisan faqs:refresh --clean
```

### Opción 3: Actualización Incremental

Si solo quieres agregar/actualizar sin eliminar:

```bash
# Actualizar sin limpiar (usa updateOrCreate)
php artisan services:refresh
php artisan team:refresh
php artisan faqs:refresh
php artisan references:refresh  # Nota: este siempre limpia
php artisan blog:refresh        # Nota: este siempre limpia
```

---

## Comportamientos Especiales

### Módulos que Siempre Limpian

Estos módulos **siempre limpian** los datos antes de cargar, independientemente de `--clean`:

- ❗ **Referencias** - Siempre limpia referencias y categorías
- ❗ **Blog** - Siempre limpia posts (pero mantiene categorías)

### Módulos con Limpieza Opcional

Estos módulos solo limpian si usas `--clean`:

- ✅ **Servicios** - Solo limpia con `--clean`
- ✅ **Equipo** - Solo limpia con `--clean`
- ✅ **FAQs** - Solo limpia con `--clean`

---

## Ubicación de Archivos JSON

Todos los archivos JSON se encuentran en:
```
database/seeders/project-data/
├── services.json
├── team.json
├── references.json
├── blog.json
└── faqs.json
```

---

## Proceso de Prueba Recomendado

### Paso 1: Verificar Archivos JSON

Verificar que los archivos JSON existen y tienen la estructura correcta:

```bash
# Verificar que existen
ls -la database/seeders/project-data/

# Ver estructura de un archivo
cat database/seeders/project-data/services.json | head -20
```

### Paso 2: Hacer Backup (Opcional)

Si quieres hacer backup antes de actualizar:

```bash
# Exportar datos actuales
php artisan tinker
>>> DB::table('services')->get()->toJson();
>>> DB::table('team_members')->get()->toJson();
# ... etc
```

### Paso 3: Actualizar Módulo por Módulo

Probar cada módulo individualmente:

```bash
# 1. Servicios
php artisan services:refresh --clean
# Verificar en navegador: /services

# 2. Equipo
php artisan team:refresh --clean
# Verificar en navegador: /team

# 3. Referencias
php artisan references:refresh --clean
# Verificar en navegador: /references

# 4. Blog
php artisan blog:refresh --clean
# Verificar en navegador: /blog

# 5. FAQs
php artisan faqs:refresh --clean
# Verificar en navegador: /faqs-settings
```

### Paso 4: Verificar Resultados

1. **En la base de datos:**
   ```bash
   php artisan tinker
   >>> App\Modules\Services\Models\Service::count();
   >>> App\Modules\TeamMembers\Models\TeamMember::count();
   >>> App\Modules\References\Models\Reference::count();
   >>> App\Modules\Blog\Models\Post::count();
   >>> App\Modules\CdBase\Faqs\Models\Faq::count();
   ```

2. **En el navegador:**
   - Visitar las rutas públicas de cada módulo
   - Verificar que los datos se muestran correctamente
   - Verificar imágenes y logos

---

## Troubleshooting

### Error: "Archivo no encontrado"

**Problema:** El comando no encuentra el archivo JSON

**Solución:**
- Verificar que el archivo existe en `database/seeders/project-data/`
- Verificar permisos del archivo
- Verificar que el nombre del archivo es correcto

### Error: "Estructura JSON inválida"

**Problema:** El JSON no tiene la estructura esperada

**Solución:**
- Validar el JSON con un validador online
- Verificar que tiene las claves requeridas (`services`, `team_members`, etc.)
- Verificar que los arrays están correctamente formateados

### Error: "Categoría no encontrada"

**Problema:** Un servicio/miembro/post hace referencia a una categoría que no existe

**Solución:**
- Verificar que las categorías están definidas en el JSON
- Verificar que los `category_id` o `category_slug` son correctos
- Para servicios, verificar el mapeo en `ProjectsServicesSeeder`

### Los datos no se actualizan

**Problema:** Los cambios en el JSON no se reflejan en la base de datos

**Solución:**
- Usar `--clean` para forzar limpieza
- Verificar que los slugs/emails/nombres son únicos
- Verificar que el seeder se ejecutó correctamente (revisar logs)

---

## Resumen de Comandos

| Módulo | Comando | Archivo JSON | Limpia Siempre |
|--------|---------|--------------|----------------|
| Servicios | `services:refresh` | `services.json` | ❌ Solo con `--clean` |
| Equipo | `team:refresh` | `team.json` | ❌ Solo con `--clean` |
| Referencias | `references:refresh` | `references.json` | ✅ Siempre |
| Blog | `blog:refresh` | `blog.json` | ✅ Siempre (solo posts) |
| FAQs | `faqs:refresh` | `faqs.json` | ❌ Solo con `--clean` |

---

## Próximos Pasos

1. ✅ Identificar comandos - **Completado**
2. ⏳ Probar cada comando individualmente
3. ⏳ Documentar resultados de las pruebas
4. ⏳ Crear guía de actualización de datos JSON

---

**Última actualización:** $(date +%Y-%m-%d)  
**Producto:** Demo Law Firm 2  
**Módulos activos:** Servicios, Equipo, Referencias, Blog

