# 🔄 Actualizar Demos desde cd-system a Proyectos

## 🎯 Objetivo

Este documento explica cómo actualizar mejoras de demos desarrolladas en `cd-system` a proyectos existentes que usan ese demo, **respetando las protecciones de `.gitattributes`** para evitar que se sobrescriban assets y configuraciones específicas del proyecto.

---

## 📋 Principio Fundamental

**Los demos son parte del CORE y deben actualizarse desde cd-system.**  
**Los proyectos mantienen su identidad (logos, textos, configuraciones) gracias a `.gitattributes`.**

---

## ✅ ¿QUÉ SE ACTUALIZA? (Demos y Core)

### 1. **Archivos del Demo** (Se actualizan desde cd-system)

#### Vistas del Demo:
- ✅ `resources/views/layout/front/headers/demo-{name}.blade.php`
- ✅ `resources/views/layout/front/footers/demo-{name}.blade.php`
- ✅ `resources/views/modules/cd-base/frontend/demos/demo-{name}/**` - Todas las vistas del demo

#### CSS/JS del Demo:
- ✅ `public/template/css/demos/demo-{name}.css`
- ✅ `public/template/js/demos/demo-{name}.js` (si existe)
- ✅ `public/template/css/skins/skin-{name}.css` (si es genérico del demo)

#### Assets del Demo:
- ✅ `public/cd-project/img/demos/{demo-name}/**` - Assets genéricos del demo

### 2. **Core y Helpers** (Se actualizan desde cd-system)

#### Dynamic Headers de Módulos:
- ✅ `resources/views/modules/{module}/frontend/partials/dynamic-header.blade.php`
- ✅ `resources/views/modules/{module}/frontend/index.blade.php` (si es genérico)
- ✅ `resources/views/modules/{module}/frontend/show.blade.php` (si es genérico)

#### Helpers y Utilidades:
- ✅ `app/Helpers/**` - Todos los helpers reutilizables
- ✅ `app/helpers.php` - Autoload de helpers

#### Mejoras del Sistema:
- ✅ `resources/views/layout/front/master.blade.php` - Mejoras reutilizables
- ✅ `composer.json` - Actualizaciones de autoload y dependencias

---

## ❌ ¿QUÉ NO SE ACTUALIZA? (Proyecto Específico - Protegido)

### Archivos Protegidos por `.gitattributes` (merge=ours)

Los siguientes archivos están protegidos y **NO se sobrescriben** durante la actualización:

#### Configuración del Proyecto:
- ❌ `config/cd-system.php` - Mantiene la versión del proyecto (demo activo, módulos)
- ❌ `config/site.php` - Mantiene la identidad del proyecto (nombre, email, textos)

#### Assets del Proyecto:
- ❌ `public/cd-project/assets/*` - Logos, favicons y assets personalizados
- ❌ `public/cd-project/img/logos/**` - Logos del proyecto
- ❌ `public/cd-project/img/favicon/**` - Favicons del proyecto

#### Contenido Específico:
- ❌ Vistas con contenido hardcodeado del proyecto
- ❌ Textos específicos en vistas
- ❌ Datos de contacto específicos

---

## 🚀 Proceso de Actualización

### Paso 1: Verificar Estado en cd-system

```bash
cd /Applications/XAMPP/xamppfiles/htdocs/cd-system

# Verificar que los cambios están commiteados
git status

# Ver el último commit con cambios del demo
git log --oneline -5

# Ver qué archivos se modificaron en el último commit
git show HEAD --name-only
```

### Paso 2: Verificar Protecciones en el Proyecto

```bash
cd /Applications/XAMPP/xamppfiles/htdocs/cokecolombres  # o tu proyecto

# Verificar que .gitattributes existe y tiene protecciones
cat .gitattributes | grep "merge=ours"

# Debe mostrar:
# config/cd-system.php merge=ours
# config/site.php merge=ours
# public/cd-project/assets/* merge=ours
```

### Paso 3: Configurar Upstream (Solo la primera vez)

```bash
cd /Applications/XAMPP/xamppfiles/htdocs/cokecolombres

# Agregar cd-system como upstream
git remote add upstream https://github.com/LACOMPANIADIGITAL/cd-system.git || true

# Verificar que se agregó
git remote -v
```

### Paso 4: Obtener Cambios del Core

```bash
# Obtener cambios desde cd-system
git fetch upstream cd-system

# Ver qué cambios hay disponibles
git log HEAD..upstream/cd-system --oneline

# Ver diferencias específicas del demo
git diff HEAD..upstream/cd-system --name-only | grep "demo-architecture-2"
```

### Paso 5: Revisar Cambios Antes de Aplicar

```bash
# Ver diferencias en archivos del demo
git diff HEAD..upstream/cd-system resources/views/layout/front/footers/demo-architecture-2.blade.php

# Ver diferencias en CSS del demo
git diff HEAD..upstream/cd-system public/template/css/demos/demo-architecture-2.css

# Verificar que NO hay cambios en archivos protegidos
git diff HEAD..upstream/cd-system config/cd-system.php
git diff HEAD..upstream/cd-system config/site.php
# Estos NO deberían mostrar cambios o deberían estar protegidos
```

### Paso 6: Aplicar Cambios (Merge)

```bash
# Hacer merge de los cambios del core
git merge upstream/cd-system --no-edit

# Si hay conflictos, resolverlos
# Los archivos protegidos NO deberían tener conflictos gracias a merge=ours
```

### Paso 7: Verificar que las Protecciones Funcionaron

```bash
# Verificar que config/cd-system.php mantiene la versión del proyecto
git show HEAD:config/cd-system.php | grep "demo"
# Debe mostrar el demo activo del proyecto, NO el de cd-system

# Verificar que config/site.php mantiene la identidad del proyecto
git show HEAD:config/site.php | grep "name"
# Debe mostrar el nombre del proyecto, NO el de cd-system

# Verificar que los assets del proyecto no cambiaron
git status
# No debe mostrar cambios en public/cd-project/assets/ o logos/
```

### Paso 8: Limpiar y Probar

```bash
# Limpiar cache de Laravel
php artisan config:clear
php artisan cache:clear
php artisan view:clear

# Probar que todo funciona
php artisan serve
# Abrir en navegador y verificar que:
# - El demo se ve correctamente
# - Los logos del proyecto siguen siendo los del proyecto
# - Las configuraciones del proyecto se mantienen
```

### Paso 9: Commit y Push (Opcional)

```bash
# Si todo está bien, hacer commit
git add -A
git commit -m "chore: Actualizar demo-architecture-2 desde cd-system

- Actualizar footer optimizado
- Actualizar dynamic-headers con color consistente
- Actualizar CSS del demo
- Mejoras en gallery index"

# Push a origin
git push origin cd-system
```

---

## 🔍 Validación de Protecciones

### Verificar que `.gitattributes` está Configurado Correctamente

```bash
cd /Applications/XAMPP/xamppfiles/htdocs/cokecolombres

# Ver todas las protecciones
cat .gitattributes

# Debe incluir al menos:
# config/cd-system.php merge=ours
# config/site.php merge=ours
# public/cd-project/assets/* merge=ours
```

### Probar las Protecciones

```bash
# Simular un merge conflictivo
git fetch upstream cd-system

# Intentar merge
git merge upstream/cd-system --no-edit

# Verificar que los archivos protegidos mantienen la versión del proyecto
git show HEAD:config/cd-system.php | head -20
# Debe mostrar la configuración del proyecto, NO la de cd-system
```

---

## 📋 Checklist de Actualización

### Antes de Actualizar:

- [ ] Cambios commiteados en cd-system
- [ ] `.gitattributes` verificado y correcto
- [ ] Upstream configurado en el proyecto
- [ ] Backup realizado (opcional pero recomendado)
- [ ] Cambios revisados con `git diff`

### Durante la Actualización:

- [ ] `git fetch upstream cd-system` ejecutado
- [ ] Cambios revisados con `git log` y `git diff`
- [ ] `git merge` ejecutado
- [ ] Sin conflictos en archivos protegidos
- [ ] Conflictos resueltos (si los hay)

### Después de Actualizar:

- [ ] `config/cd-system.php` mantiene configuración del proyecto
- [ ] `config/site.php` mantiene identidad del proyecto
- [ ] Assets del proyecto no cambiaron
- [ ] Cache de Laravel limpiado
- [ ] Proyecto funciona correctamente
- [ ] Cambios probados en navegador
- [ ] Commit realizado (si todo está bien)

---

## 🛠️ Script de Actualización Automática

Puedes crear un script para automatizar el proceso:

```bash
#!/bin/bash
# scripts/update-demo-from-cd-system.sh [demo-name]

DEMO_NAME="${1:-demo-architecture-2}"
PROJECT_DIR=$(basename "$(pwd)")

echo "🔄 Actualizando $DEMO_NAME desde cd-system..."

# Verificar upstream
if ! git remote | grep -q upstream; then
    echo "📌 Configurando upstream..."
    git remote add upstream https://github.com/LACOMPANIADIGITAL/cd-system.git
fi

# Fetch
echo "📥 Obteniendo cambios..."
git fetch upstream cd-system

# Ver cambios del demo
echo ""
echo "📋 Cambios disponibles para $DEMO_NAME:"
git log HEAD..upstream/cd-system --oneline --name-only | grep -i "$DEMO_NAME" | head -20

# Preguntar confirmación
read -p "¿Deseas aplicar estos cambios? (y/n): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
    echo "🔄 Aplicando cambios..."
    git merge upstream/cd-system --no-edit
    
    # Limpiar cache
    echo "🧹 Limpiando cache..."
    php artisan config:clear
    php artisan cache:clear
    php artisan view:clear
    
    echo "✅ Actualización completada"
    echo "📝 Verifica que todo funciona antes de hacer commit"
else
    echo "❌ Actualización cancelada"
fi
```

---

## ⚠️ Manejo de Conflictos

### Archivos Protegidos NO Deberían Tener Conflictos

Gracias a `merge=ours` en `.gitattributes`, los archivos protegidos automáticamente mantienen la versión del proyecto.

Si hay conflictos en archivos protegidos, significa que `.gitattributes` no está configurado correctamente.

### Archivos que Pueden Tener Conflictos

- `composer.json` - Si hay dependencias diferentes
- Vistas genéricas - Si hay personalizaciones específicas del proyecto
- Helpers - Si hay modificaciones específicas del proyecto

### Resolver Conflictos

```bash
# Ver archivos en conflicto
git status

# Resolver manualmente cada conflicto
# Luego:
git add <archivo-resuelto>
git commit
```

---

## 🎯 Ejemplo Completo: Actualizar demo-architecture-2

### Escenario: Mejoras en Footer y Headers

```bash
# 1. En cd-system, los cambios ya están commiteados
cd /Applications/XAMPP/xamppfiles/htdocs/cd-system
git log --oneline -1
# Output: 69e59fc updates demo-architecture-2

# 2. En el proyecto, actualizar
cd /Applications/XAMPP/xamppfiles/htdocs/cokecolombres

# 3. Verificar protecciones
cat .gitattributes | grep "merge=ours"
# Debe mostrar las protecciones

# 4. Obtener cambios
git fetch upstream cd-system

# 5. Ver qué se actualizará
git diff HEAD..upstream/cd-system --name-only | grep "demo-architecture-2"
# Output:
# public/template/css/demos/demo-architecture-2.css
# resources/views/layout/front/footers/demo-architecture-2.blade.php
# resources/views/modules/*/frontend/partials/dynamic-header.blade.php

# 6. Aplicar cambios
git merge upstream/cd-system --no-edit

# 7. Verificar protecciones
git show HEAD:config/cd-system.php | grep "demo"
# Debe mostrar: 'demo' => 'demo-architecture-2' (del proyecto)

# 8. Limpiar y probar
php artisan config:clear && php artisan cache:clear
php artisan serve
```

---

## 📚 Documentación Relacionada

- `docs/bewpro/system/FLUJO-BIDIRECCIONAL-COMPLETO.md` - Flujo completo
- `docs/bewpro/system/METODOLOGIA-PROPAGACION-DEMOS.md` - Metodología
- `docs/bewpro/system/ACTUALIZAR-DESDE-CD-SYSTEM.md` - Actualización general
- `docs/bewpro/README.md` - Documentación principal

---

## ✅ Reglas de Oro

1. **Siempre verificar `.gitattributes`** antes de actualizar
2. **Revisar cambios con `git diff`** antes de aplicar
3. **Probar después de actualizar** - No asumir que todo funciona
4. **Los archivos protegidos NO deberían cambiar** - Si cambian, revisar `.gitattributes`
5. **Limpiar cache después de actualizar** - Siempre ejecutar `php artisan config:clear`

---

**Última actualización:** Diciembre 2024  
**Versión:** 1.0 - Guía Completa de Actualización de Demos

