# 📘 Manual de Configuración - Producto Law Firm

Guía práctica para configurar y optimizar un proyecto Law Firm usando CD-System.

---

## 📋 Tabla de Contenidos

1. [Requisitos del Producto](#requisitos-del-producto)
2. [Módulos Activos](#módulos-activos)
3. [Archivos JSON Requeridos](#archivos-json-requeridos)
4. [Configuración Inicial](#configuración-inicial)
5. [Actualización de Identidad del Proyecto](#actualización-de-identidad-del-proyecto)
6. [Carga de Datos](#carga-de-datos)
7. [Verificación](#verificación)
8. [Checklist de Configuración](#checklist-de-configuración)

---

## 🎯 Requisitos del Producto

### Módulos Activos

El producto **Law Firm** requiere los siguientes módulos activos en `config/cd-system.php`:

```php
'modules' => [
    'blog' => [
        'active' => true,
        'name' => 'Blog',
        'description' => 'Noticias y publicaciones institucionales',
    ],
    'services' => [
        'active' => true,
        'name' => 'Areas de actuacion',
        'description' => 'Areas de actuacion',
    ],
    'team' => [
        'active' => true,
        'name' => 'Team',
        'description' => 'Equipo y miembros',
    ],
    'references' => [
        'active' => true,
        'name' => 'References',
        'description' => 'Referencias y testimonios',
    ],
]
```

### Demo y Tema

```php
'theme' => [
    'demo' => 'demo-law-firm-2',
    'skin' => 'auto',
]
```

---

## 📁 Archivos JSON Requeridos

Todos los archivos JSON deben estar en: `database/seeders/project-data/`

### 1. **services.json** - Áreas de Actuación

**Ubicación:** `database/seeders/project-data/services.json`

**Estructura requerida:**
```json
{
  "services": [
    {
      "title": "Family Law",
      "slug": "family-law",
      "description": "Comprehensive legal services for family matters...",
      "logo": "cd-project/cd-system/seeders/services/icon-services-1.svg",
      "image": null,
      "is_active": true,
      "is_featured": true
    }
  ]
}
```

**Campos obligatorios:**
- `title` - Nombre del servicio
- `slug` - URL-friendly identifier (único)
- `description` - Descripción del servicio
- `is_active` - Boolean (true/false)
- `is_featured` - Boolean (true/false)

**Campos opcionales:**
- `logo` - Ruta al logo/icono del servicio
- `image` - Ruta a imagen del servicio

**Servicios recomendados para Law Firm:**
- Family Law
- Business Law
- Criminal Law
- Civil Law
- Labor Law
- Real Estate Law
- Corporate Law
- Immigration Law

---

### 2. **blog.json** - Blog/Noticias

**Ubicación:** `database/seeders/project-data/blog.json`

**Estructura requerida:**
```json
{
  "post_categories": [
    {
      "name": "Legal News",
      "slug": "legal-news",
      "description": "Latest legal news and updates"
    }
  ],
  "posts": [
    {
      "user_id": 1,
      "title": "Article Title",
      "slug": "article-title",
      "header": "cd-project/cd-system/seeders/blog/blog-1.jpg",
      "public_id": "blog-1",
      "category_id": 1,
      "description": "Article description...",
      "type": "public",
      "status": "published",
      "content": "<p>Article content...</p>"
    }
  ]
}
```

**Campos obligatorios para posts:**
- `title` - Título del artículo
- `slug` - URL-friendly identifier (único)
- `description` - Descripción/resumen
- `content` - Contenido HTML del artículo
- `status` - "published" o "draft"
- `category_id` - ID numérico de la categoría (1-indexed)

**Campos opcionales:**
- `header` - Ruta a imagen de encabezado
- `public_id` - Identificador público
- `user_id` - ID del usuario autor (se asigna automáticamente si no existe)

**Categorías recomendadas para Law Firm:**
- Legal News
- Case Studies
- Legal Insights
- Firm Updates
- Legal Tips
- Regulatory Changes

---

### 3. **team.json** - Equipo/Miembros

**Ubicación:** `database/seeders/project-data/team.json`

**Estructura requerida:**
```json
{
  "team_categories": [
    {
      "name": "Partners",
      "slug": "partners",
      "description": "Senior partners and founding members"
    }
  ],
  "team_members": [
    {
      "name": "John Doe",
      "position": "Senior Partner & Founder",
      "email": "john.doe@lawfirm.com",
      "linkedin": "https://linkedin.com/in/john-doe",
      "languages": ["English", "Spanish"],
      "category_id": 1,
      "description": "Brief description...",
      "details": "Detailed biography...",
      "image": "cd-project/cd-system/seeders/team/team-1.jpg",
      "is_active": true
    }
  ]
}
```

**Campos obligatorios para miembros:**
- `name` - Nombre completo
- `position` - Cargo/posición
- `email` - Email (usado como clave única)
- `category_id` - ID numérico de la categoría (1-indexed, basado en el array)

**Campos opcionales:**
- `linkedin` - URL de LinkedIn
- `languages` - Array de idiomas
- `description` - Descripción breve
- `details` - Biografía detallada
- `image` - Ruta a foto del miembro
- `is_active` - Boolean (true/false)

**Categorías recomendadas para Law Firm:**
- Partners
- Senior Attorneys
- Associates
- Of Counsel
- Support Staff

**Nota importante:** El `category_id` se refiere al índice del array de categorías (1-indexed). La primera categoría es `1`, la segunda es `2`, etc.

---

### 4. **references.json** - Referencias/Clientes

**Ubicación:** `database/seeders/project-data/references.json`

**Estructura requerida:**
```json
{
  "categories": [
    {
      "name": "Corporate Clients",
      "slug": "corporate-clients"
    }
  ],
  "references": [
    {
      "name": "Company Name",
      "category": "Corporate Clients",
      "logo": "cd-project/product-8/seeders/references/1.png",
      "featured": true
    }
  ]
}
```

**Campos obligatorios para referencias:**
- `name` - Nombre de la empresa/cliente
- `category` - Nombre exacto de la categoría (debe coincidir con `name` en categories)

**Campos opcionales:**
- `logo` - Ruta al logo de la empresa
- `featured` - Boolean (true/false) - Para destacar en homepage

**Categorías recomendadas para Law Firm:**
- Corporate Clients
- Law Firms & Colleagues
- Financial Institutions

---

## ⚙️ Configuración Inicial

### Paso 1: Verificar Configuración

Editar `config/cd-system.php` y asegurar:

```php
'theme' => [
    'demo' => 'demo-law-firm-2',
    'skin' => 'auto',
],

'modules' => [
    'blog' => ['active' => true],
    'services' => ['active' => true],
    'team' => ['active' => true],
    'references' => ['active' => true],
    // Otros módulos en false
],
```

### Paso 2: Preparar Archivos JSON

1. Copiar o crear los archivos JSON en `database/seeders/project-data/`
2. Asegurar que la estructura JSON sea válida
3. Verificar que las rutas de imágenes/logos sean correctas

### Paso 3: Verificar Usuarios

El módulo Blog requiere al menos un usuario en la base de datos:

```bash
php artisan db:seed --class=UsersSeeder
```

---

## 🎨 Actualización de Identidad del Proyecto

### Comando: `php artisan project:update-assets`

Este comando actualiza los assets visuales del proyecto (logos, favicons, skins CSS) para personalizar la identidad visual del law firm.

### Sintaxis

```bash
php artisan project:update-assets {source_dir} [--project=PROJECT] [--backup]
```

### Parámetros

- **`source_dir`** (requerido): Directorio fuente con los assets
  - Ejemplo: `public/cd-project/assets`
  - Puede ser ruta relativa o absoluta

- **`--project=PROJECT`** (opcional): Nombre del proyecto (solo informativo)
  - Ejemplo: `--project="law-firm"`

- **`--backup`** (opcional): Crea backup de assets actuales antes de actualizar
  - Los backups se guardan en: `storage/app/backups/assets/{fecha_hora}/`

### Assets que Actualiza

#### 1. Logos (3 archivos)
- `logo.png` → `public/cd-project/img/logos/logo.png`
- `logo-2.png` → `public/cd-project/img/logos/logo-2.png`
- `logo-alternative.png` → `public/cd-project/img/logos/logo-alternative.png`

#### 2. Favicons (5 archivos)
- `favicon.ico` → `public/cd-project/img/favicon/favicon.ico`
- `apple-touch-icon.png` → `public/cd-project/img/favicon/apple-touch-icon.png`
- `favicon.svg` → `public/cd-project/img/favicon/favicon.svg`
- `web-app-manifest-192x192.png` → `public/cd-project/img/favicon/web-app-manifest-192x192.png`
- `web-app-manifest-512x512.png` → `public/cd-project/img/favicon/web-app-manifest-512x512.png`

#### 3. Skins CSS (opcional, dinámico)
- Busca archivos `skin-*.css` en el directorio fuente
- Los copia a: `public/template/css/skins/{nombre-skin}.css`
- Valida compatibilidad con el demo actual (`demo-law-firm-2`)

### Estructura del Directorio Fuente

```
public/cd-project/assets/
├── logo.png
├── logo-2.png
├── logo-alternative.png
├── favicon.ico
├── apple-touch-icon.png
├── favicon.svg
├── web-app-manifest-192x192.png
├── web-app-manifest-512x512.png
└── skin-law-firm-2.css (opcional)
```

### Ejemplos de Uso

#### Ejemplo 1: Actualización Básica
```bash
php artisan project:update-assets public/cd-project/assets
```

#### Ejemplo 2: Con Backup (Recomendado)
```bash
php artisan project:update-assets public/cd-project/assets --backup
```

#### Ejemplo 3: Con Nombre de Proyecto
```bash
php artisan project:update-assets public/cd-project/assets --backup --project="law-firm"
```

#### Ejemplo 4: Ruta Absoluta
```bash
php artisan project:update-assets /ruta/absoluta/a/assets --backup
```

### Proceso de Actualización

1. **Validación**: Verifica que el directorio fuente existe
2. **Backup** (si se usa `--backup`): Crea backup de assets actuales
3. **Actualización de Logos**: Copia los 3 logos a sus ubicaciones finales
4. **Actualización de Favicons**: Copia los 5 favicons a sus ubicaciones finales
5. **Procesamiento de Skins**: Busca y copia skins CSS si existen
6. **Validación de Compatibilidad**: Verifica que el skin es compatible con `demo-law-firm-2`

### Notas Importantes

- ✅ Los directorios se crean automáticamente si no existen
- ⚠️ Los archivos existentes se sobrescriben sin confirmación
- 💾 Usa `--backup` para crear respaldo antes de actualizar
- 🎨 Los skins CSS son opcionales, el comando no falla si no existen
- ✅ El comando valida compatibilidad pero no fuerza cambios

### Comandos Relacionados

```bash
# Listar todos los skins disponibles
php artisan project:manage-skins list

# Validar compatibilidad de skins
php artisan project:manage-skins validate

# Ver skins internos de Porto
php artisan project:copy-porto-skins --list
```

### Limpiar Cache Después de Actualizar

```bash
php artisan cache:clear
php artisan config:clear
php artisan view:clear
```

---

## 📥 Carga de Datos

### Opción 1: Cargar Todos los Módulos (Recomendado)

```bash
# Limpiar y cargar todos los módulos
php artisan modules:refresh --clean
```

Este comando:
- ✅ Limpia datos existentes
- ✅ Carga Services (con categorías)
- ✅ Carga Blog
- ✅ Carga References
- ✅ Carga Team

### Opción 2: Cargar Módulos Individualmente

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

# Blog
php artisan blog:refresh --clean

# References
php artisan references:refresh --clean

# Team
php artisan team:refresh --clean
```

### Opción 3: Cargar Módulos Específicos

```bash
php artisan modules:refresh --clean --modules=services --modules=blog
```

---

## ✅ Verificación

### Verificar Datos Cargados

```bash
# Verificar en tinker
php artisan tinker

>>> \App\Modules\Services\Models\Service::count()
>>> \App\Modules\Blog\Models\Post::count()
>>> \App\Modules\References\Models\Reference::count()
>>> \App\Modules\TeamMembers\Models\TeamMember::count()
```

### Verificar en la Web

1. **Homepage:** Debe mostrar servicios, equipo y referencias
2. **Blog:** `/blog` debe listar los posts
3. **Services:** `/services` debe mostrar las áreas de actuación
4. **Team:** `/team` debe mostrar los miembros del equipo
5. **References:** Debe aparecer en homepage o sección dedicada

---

## 📋 Checklist de Configuración

### Pre-Configuración

- [ ] Laravel instalado y funcionando
- [ ] Base de datos configurada
- [ ] Migraciones ejecutadas: `php artisan migrate`
- [ ] Usuarios creados: `php artisan db:seed --class=UsersSeeder`

### Configuración de Módulos

- [ ] `config/cd-system.php` configurado con `demo-law-firm-2`
- [ ] Módulos activos: blog, services, team, references
- [ ] Otros módulos desactivados (products, projects, gallery)

### Actualización de Identidad

- [ ] Assets preparados en `public/cd-project/assets/`
- [ ] Logos actualizados: `php artisan project:update-assets public/cd-project/assets --backup`
- [ ] Favicons actualizados
- [ ] Skin CSS actualizado (si aplica)
- [ ] Cache limpiado después de actualizar

### Archivos JSON

- [ ] `services.json` creado y validado
- [ ] `blog.json` creado y validado
- [ ] `team.json` creado y validado
- [ ] `references.json` creado y validado
- [ ] Rutas de imágenes/logos verificadas

### Carga de Datos

- [ ] Services cargados: `php artisan services:refresh --clean`
- [ ] Blog cargado: `php artisan blog:refresh --clean`
- [ ] References cargadas: `php artisan references:refresh --clean`
- [ ] Team cargado: `php artisan team:refresh --clean`

### Verificación Final

- [ ] Homepage muestra servicios correctamente
- [ ] Blog muestra posts y categorías
- [ ] Team muestra miembros y categorías
- [ ] References aparecen en homepage
- [ ] Rutas funcionan correctamente
- [ ] Imágenes se cargan correctamente

---

## 🔧 Comandos Útiles

### Ver todos los comandos disponibles

```bash
php artisan list | grep refresh
```

### Limpiar cache después de cambios

```bash
php artisan cache:clear
php artisan config:clear
php artisan view:clear
php artisan route:clear
```

### Ver logs de errores

```bash
tail -f storage/logs/laravel.log
```

---

## 📝 Notas Importantes

### Services

- Las categorías se crean automáticamente con `ServiceCategoriesSeeder`
- El mapeo de servicios a categorías está en `ProjectsServicesSeeder.php`
- Si un servicio no tiene categoría asignada, se usa 'legal-services' por defecto

### Blog

- El seeder limpia automáticamente los posts existentes
- Se asigna automáticamente el primer usuario disponible como autor
- Las categorías se crean si no existen

### Team

- El `category_id` es 1-indexed (primera categoría = 1)
- El email se usa como clave única
- Si un miembro no tiene categoría, se asigna `null`

### References

- El seeder limpia automáticamente referencias y categorías
- El nombre de la categoría en `references` debe coincidir exactamente con `name` en `categories`

---

## 🐛 Solución de Problemas

### Error: "No se encontró el archivo JSON"

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

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

**Solución:**
- Validar JSON con un validador online
- Verificar comas, llaves y corchetes
- Asegurar que todos los campos obligatorios estén presentes

### Error: "No se encontró ningún usuario"

**Solución:**
```bash
php artisan db:seed --class=UsersSeeder
```

### Los datos no se actualizan

**Solución:**
- Usar la opción `--clean` para forzar limpieza
- Verificar que los slugs sean únicos
- Limpiar cache: `php artisan cache:clear`

### Imágenes no se cargan

**Solución:**
- Verificar que las rutas en JSON sean correctas
- Verificar que los archivos existan en `public/`
- Verificar permisos de lectura de archivos

---

## 📚 Recursos Adicionales

- **Documentación de Seeders:** `database/seeders/README.md`
- **Comandos Artisan:** `app/Console/Commands/Refresh*.php`
- **Configuración:** `config/cd-system.php`

---

## 🎯 Resumen Rápido

```bash
# 1. Configurar módulos en config/cd-system.php
# 2. Preparar archivos JSON en database/seeders/project-data/
# 3. Cargar todos los datos
php artisan modules:refresh --clean

# 4. Verificar en la web
# 5. ¡Listo!
```

---

**Última actualización:** 2025-01-XX  
**Versión del producto:** Law Firm Demo v1.0  
**Demo:** demo-law-firm-2

