# 🛡️ Archivos Protegidos Durante Actualizaciones

**Versión:** 1.0  
**Fecha:** Diciembre 2024  
**Objetivo:** Documentar todos los archivos que NO deben modificarse durante actualizaciones desde el template (cd-system) hacia proyectos

---

## 📋 Resumen Ejecutivo

Cuando se actualiza un proyecto desde el template base (cd-system), hay archivos que **NO deben sobrescribirse** porque contienen la identidad, configuración y datos específicos del proyecto/cliente.

Este documento identifica todos estos archivos y proporciona:
1. ✅ Lista completa de archivos protegidos
2. ✅ Razón por la cual cada archivo debe protegerse
3. ✅ Configuración de `.gitattributes` para protección automática
4. ✅ Proceso manual de backup/restauración (método temporal)
5. ✅ Proceso con Git (método recomendado para el futuro)

---

## 🎯 Categorías de Archivos Protegidos

### 1. Configuración del Proyecto
### 2. Identidad Visual (Assets)
### 3. Datos del Proyecto
### 4. Entorno y Variables
### 5. Storage y Cache
### 6. Personalizaciones Específicas

---

## 📁 1. CONFIGURACIÓN DEL PROYECTO

### 1.1 `config/site.php`
**Razón:** Contiene toda la identidad del proyecto/cliente:
- Nombre del sitio
- URL, autor, tagline
- Configuración SEO (keywords, description, schema.org)
- Open Graph y Twitter Cards
- Configuración de fuentes tipográficas (identidad de marca)
- Información de contacto
- Configuración de footer
- Configuración de módulos específicos del proyecto
- Configuración de páginas (about, blog, etc.)

**Protección:** `config/site.php merge=ours`

### 1.2 `config/cd-system.php`
**Razón:** Aunque es configuración del sistema base, puede contener personalizaciones del proyecto:
- Demo activo (`theme.demo`)
- Módulos activos/desactivados
- Configuración de mantenimiento
- IPs permitidas
- Configuración de analytics específica del proyecto

**Protección:** `config/cd-system.php merge=ours`

**Nota:** Si el proyecto no tiene personalizaciones en este archivo, puede no protegerse, pero es recomendable protegerlo por seguridad.

---

## 🎨 2. IDENTIDAD VISUAL (ASSETS)

### 2.1 Logos del Proyecto
**Ubicación:** `public/cd-project/img/logos/`
**Contenido:**
- `logo.png` - Logo principal
- `logo-2.png` - Logo alternativo (loader)
- `logo-alternative.png` - Logo para footer
- Logos específicos del proyecto
- Skins CSS personalizados (si existen)

**Protección:**
```gitattributes
public/cd-project/img/logos/** merge=ours
public/cd-project/img/logos/* merge=ours
```

### 2.2 Favicons del Proyecto
**Ubicación:** `public/cd-project/img/favicon/`
**Contenido:**
- `favicon.ico`
- `favicon.svg`
- `apple-touch-icon.png`
- Varios tamaños de favicon
- `site.webmanifest`

**Protección:**
```gitattributes
public/cd-project/img/favicon/** merge=ours
public/cd-project/img/favicon/* merge=ours
```

### 2.3 Assets Temporales/Backup
**Ubicación:** `public/cd-project/assets/`
**Contenido:**
- Assets temporales del proyecto
- Backups de logos/favicons
- Archivos de identidad visual adicionales

**Protección:**
```gitattributes
public/cd-project/assets/** merge=ours
public/cd-project/assets/* merge=ours
```

### 2.4 Imágenes de Meta Tags
**Ubicación:** `public/cd-project/img/meta-tags/`
**Contenido:**
- `og-image.png` - Imagen para Open Graph
- `twitter-image.png` - Imagen para Twitter Cards
- Otras imágenes de meta tags específicas del proyecto

**Protección:**
```gitattributes
public/cd-project/img/meta-tags/** merge=ours
public/cd-project/img/meta-tags/* merge=ours
```

### 2.5 Imágenes Específicas del Proyecto
**Ubicación:** `public/cd-project/img/`
**Contenido:**
- Imágenes de contenido específico del proyecto
- Fotos del equipo
- Imágenes de galería del proyecto
- Imágenes de blog del proyecto
- Cualquier imagen que sea parte del contenido del proyecto (no del template)

**Nota:** Esta carpeta puede contener tanto imágenes del template (demos) como del proyecto. Se recomienda proteger solo las subcarpetas específicas del proyecto, no toda la carpeta `img/`.

**Protección (selectiva):**
```gitattributes
# Proteger solo carpetas específicas del proyecto (ajustar según necesidad)
public/cd-project/img/about/** merge=ours
public/cd-project/img/banner/** merge=ours
public/cd-project/img/blog/** merge=ours
public/cd-project/img/contact/** merge=ours
public/cd-project/img/homepage/** merge=ours
public/cd-project/img/portfolio-logos/** merge=ours
public/cd-project/img/products/** merge=ours
public/cd-project/img/testimonials/** merge=ours
```

**⚠️ IMPORTANTE:** Las imágenes de demos (`public/cd-project/img/demos/`) NO deben protegerse, ya que son parte del template y deben actualizarse.

---

## 💾 3. DATOS DEL PROYECTO

### 3.1 Seeders de Datos del Proyecto
**Ubicación:** `database/seeders/project-data/`
**Contenido:**
- `products.json` - Productos del proyecto
- `services.json` - Servicios del proyecto
- `blog.json` - Posts de blog del proyecto
- `gallery.json` - Imágenes de galería del proyecto
- `team.json` - Miembros del equipo
- `faqs.json` - Preguntas frecuentes
- `projects.json` - Proyectos/portfolio
- `references.json` - Referencias/clientes
- `news.json` - Noticias
- `users.json` - Usuarios del proyecto
- `cd-base.json` - Datos base del proyecto

**Razón:** Estos archivos contienen el contenido específico del proyecto/cliente y no deben sobrescribirse con datos de ejemplo del template.

**Protección:**
```gitattributes
database/seeders/project-data/** merge=ours
database/seeders/project-data/* merge=ours
```

---

## 🔐 4. ENTORNO Y VARIABLES

### 4.1 Archivo `.env`
**Ubicación:** `.env`
**Contenido:**
- Credenciales de base de datos
- API keys
- Configuración de entorno (local/staging/production)
- URLs específicas del proyecto
- Configuración de email
- Google Analytics ID
- Otras variables de entorno sensibles

**Razón:** Contiene información sensible y específica de cada instalación del proyecto.

**Protección:** 
- Ya está en `.gitignore` (no se versiona)
- Si por alguna razón se versiona, debe protegerse:
```gitattributes
.env merge=ours
.env.* merge=ours
!.env.example
```

**Nota:** El archivo `.env.example` NO debe protegerse, ya que es un template.

---

## 💿 5. STORAGE Y CACHE

### 5.1 Directorio `storage/`
**Ubicación:** `storage/`
**Contenido:**
- `storage/app/` - Archivos subidos por usuarios
- `storage/logs/` - Logs de la aplicación
- `storage/framework/` - Cache de Laravel
- `storage/debugbar/` - Debug bar (si se usa)

**Razón:** Contiene datos generados en runtime y archivos subidos por usuarios. Es específico de cada instalación.

**Protección:**
- Ya está en `.gitignore` (no se versiona normalmente)
- Si se versiona por alguna razón, debe protegerse:
```gitattributes
storage/** merge=ours
storage/* merge=ours
```

### 5.2 Cache de Bootstrap
**Ubicación:** `bootstrap/cache/`
**Contenido:**
- Cache de configuración
- Cache de rutas
- Cache de servicios

**Razón:** Cache generado en runtime, específico de cada instalación.

**Protección:**
- Ya está en `.gitignore`
- Si se versiona:
```gitattributes
bootstrap/cache/** merge=ours
bootstrap/cache/* merge=ours
```

---

## 🎨 6. PERSONALIZACIONES ESPECÍFICAS

### 6.1 Skins CSS Personalizados
**Ubicación:** `public/template/css/skins/skin-mi-proyecto.css`
**Razón:** Si el proyecto tiene un skin CSS personalizado (no del demo), debe protegerse.

**Protección:**
```gitattributes
# Ajustar el nombre según el proyecto
public/template/css/skins/skin-mi-proyecto.css merge=ours
```

**⚠️ IMPORTANTE:** Los skins de demos (ej: `skin-architecture-2.css`, `skin-law-firm-2.css`) NO deben protegerse, ya que son parte del template.

### 6.2 Vistas Personalizadas
**Ubicación:** `resources/views/`
**Razón:** Si el proyecto tiene vistas personalizadas que no están en el template, deben protegerse.

**Nota:** Esto es más complejo porque las vistas pueden estar mezcladas. Se recomienda:
- Usar un directorio específico para personalizaciones: `resources/views/project-custom/`
- Proteger solo ese directorio:
```gitattributes
resources/views/project-custom/** merge=ours
resources/views/project-custom/* merge=ours
```

### 6.3 Scripts Específicos del Proyecto
**Ubicación:** `scripts/project-specific/`
**Razón:** Scripts de deployment, backup, o procesos específicos del proyecto.

**Protección:**
```gitattributes
scripts/project-specific/** merge=ours
scripts/project-specific/* merge=ours
```

### 6.4 Documentación Específica del Proyecto
**Ubicación:** `docs/project-specific/`
**Razón:** Documentación específica del proyecto/cliente.

**Protección:**
```gitattributes
docs/project-specific/** merge=ours
docs/project-specific/* merge=ours
```

---

## 🔧 CONFIGURACIÓN DE `.gitattributes`

### Archivo Completo Recomendado

```gitattributes
# Auto detect text files and perform LF normalization
* text=auto

# ============================================
# Archivos protegidos del proyecto
# Estos archivos mantienen la identidad del proyecto y NO deben ser sobrescritos
# durante merges o pulls desde cd-system. Se usa estrategia "ours" para mantener
# siempre la versión del proyecto.
# ============================================

# ============================================
# 1. CONFIGURACIÓN DEL PROYECTO
# ============================================

# Configuración específica del proyecto (identidad, SEO, contactos, etc.)
config/site.php merge=ours

# Configuración del sistema (puede tener personalizaciones del proyecto)
config/cd-system.php merge=ours

# ============================================
# 2. IDENTIDAD VISUAL (ASSETS)
# ============================================

# Logos del proyecto
public/cd-project/img/logos/** merge=ours
public/cd-project/img/logos/* merge=ours

# Favicons del proyecto
public/cd-project/img/favicon/** merge=ours
public/cd-project/img/favicon/* merge=ours

# Assets temporales/backup del proyecto
public/cd-project/assets/** merge=ours
public/cd-project/assets/* merge=ours

# Imágenes de meta tags (OG, Twitter)
public/cd-project/img/meta-tags/** merge=ours
public/cd-project/img/meta-tags/* merge=ours

# Imágenes específicas del proyecto (ajustar según necesidad)
public/cd-project/img/about/** merge=ours
public/cd-project/img/banner/** merge=ours
public/cd-project/img/blog/** merge=ours
public/cd-project/img/contact/** merge=ours
public/cd-project/img/homepage/** merge=ours
public/cd-project/img/portfolio-logos/** merge=ours
public/cd-project/img/products/** merge=ours
public/cd-project/img/testimonials/** merge=ours

# ============================================
# 3. DATOS DEL PROYECTO
# ============================================

# Seeders de datos específicos del proyecto
database/seeders/project-data/** merge=ours
database/seeders/project-data/* merge=ours

# ============================================
# 4. ENTORNO Y VARIABLES
# ============================================

# Variables de entorno (si se versionan, aunque normalmente están en .gitignore)
.env merge=ours
.env.* merge=ours
!.env.example

# ============================================
# 5. STORAGE Y CACHE
# ============================================

# Storage (normalmente en .gitignore, pero proteger si se versiona)
storage/** merge=ours
storage/* merge=ours

# Cache de bootstrap (normalmente en .gitignore)
bootstrap/cache/** merge=ours
bootstrap/cache/* merge=ours

# ============================================
# 6. PERSONALIZACIONES ESPECÍFICAS
# ============================================

# Skins CSS personalizados del proyecto (ajustar nombre según proyecto)
# public/template/css/skins/skin-mi-proyecto.css merge=ours

# Vistas personalizadas del proyecto (si existe directorio específico)
# resources/views/project-custom/** merge=ours

# Scripts específicos del proyecto
scripts/project-specific/** merge=ours
scripts/project-specific/* merge=ours

# Documentación específica del proyecto
docs/project-specific/** merge=ours
docs/project-specific/* merge=ours
```

---

## 📝 PROCESO MANUAL (Método Temporal)

### Antes de Hacer Pull

```bash
# 1. Crear directorio de backup
mkdir -p storage/app/backups/pre-update-$(date +%Y%m%d_%H%M%S)

# 2. Backup de archivos de configuración
cp config/site.php storage/app/backups/pre-update-$(date +%Y%m%d_%H%M%S)/
cp config/cd-system.php storage/app/backups/pre-update-$(date +%Y%m%d_%H%M%S)/

# 3. Backup de assets
cp -r public/cd-project/img/logos storage/app/backups/pre-update-$(date +%Y%m%d_%H%M%S)/ 2>/dev/null || true
cp -r public/cd-project/img/favicon storage/app/backups/pre-update-$(date +%Y%m%d_%H%M%S)/ 2>/dev/null || true
cp -r public/cd-project/assets storage/app/backups/pre-update-$(date +%Y%m%d_%H%M%S)/ 2>/dev/null || true
cp -r public/cd-project/img/meta-tags storage/app/backups/pre-update-$(date +%Y%m%d_%H%M%S)/ 2>/dev/null || true

# 4. Backup de datos del proyecto
cp -r database/seeders/project-data storage/app/backups/pre-update-$(date +%Y%m%d_%H%M%S)/ 2>/dev/null || true

# 5. Verificar backup
ls -la storage/app/backups/pre-update-$(date +%Y%m%d_%H%M%S)/
```

### Hacer Pull

```bash
# Hacer pull desde cd-system
git pull origin cd-system
# o
git pull upstream cd-system
```

### Después de Hacer Pull - Restaurar Archivos

```bash
# 1. Identificar el directorio de backup más reciente
BACKUP_DIR=$(ls -td storage/app/backups/pre-update-* | head -1)

# 2. Restaurar configuración
cp $BACKUP_DIR/site.php config/site.php
cp $BACKUP_DIR/cd-system.php config/cd-system.php

# 3. Restaurar assets
cp -r $BACKUP_DIR/logos public/cd-project/img/ 2>/dev/null || true
cp -r $BACKUP_DIR/favicon public/cd-project/img/ 2>/dev/null || true
cp -r $BACKUP_DIR/assets public/cd-project/ 2>/dev/null || true
cp -r $BACKUP_DIR/meta-tags public/cd-project/img/ 2>/dev/null || true

# 4. Restaurar datos del proyecto
cp -r $BACKUP_DIR/project-data database/seeders/ 2>/dev/null || true

# 5. Verificar que se restauraron
git status
```

### Script Completo de Backup/Restauración

```bash
#!/bin/bash
# scripts/backup-protected-files.sh

BACKUP_DIR="storage/app/backups/pre-update-$(date +%Y%m%d_%H%M%S)"
mkdir -p "$BACKUP_DIR"

echo "📦 Creando backup de archivos protegidos..."

# Configuración
cp config/site.php "$BACKUP_DIR/" 2>/dev/null || true
cp config/cd-system.php "$BACKUP_DIR/" 2>/dev/null || true

# Assets
cp -r public/cd-project/img/logos "$BACKUP_DIR/" 2>/dev/null || true
cp -r public/cd-project/img/favicon "$BACKUP_DIR/" 2>/dev/null || true
cp -r public/cd-project/assets "$BACKUP_DIR/" 2>/dev/null || true
cp -r public/cd-project/img/meta-tags "$BACKUP_DIR/" 2>/dev/null || true

# Datos
cp -r database/seeders/project-data "$BACKUP_DIR/" 2>/dev/null || true

echo "✅ Backup completado en: $BACKUP_DIR"
echo "📋 Archivos respaldados:"
ls -la "$BACKUP_DIR"
```

```bash
#!/bin/bash
# scripts/restore-protected-files.sh

if [ -z "$1" ]; then
    BACKUP_DIR=$(ls -td storage/app/backups/pre-update-* | head -1)
else
    BACKUP_DIR="$1"
fi

if [ ! -d "$BACKUP_DIR" ]; then
    echo "❌ Error: Directorio de backup no encontrado: $BACKUP_DIR"
    exit 1
fi

echo "🔄 Restaurando archivos desde: $BACKUP_DIR"

# Restaurar configuración
cp "$BACKUP_DIR/site.php" config/site.php 2>/dev/null || echo "⚠️  No se encontró site.php"
cp "$BACKUP_DIR/cd-system.php" config/cd-system.php 2>/dev/null || echo "⚠️  No se encontró cd-system.php"

# Restaurar assets
cp -r "$BACKUP_DIR/logos" public/cd-project/img/ 2>/dev/null || echo "⚠️  No se encontró logos"
cp -r "$BACKUP_DIR/favicon" public/cd-project/img/ 2>/dev/null || echo "⚠️  No se encontró favicon"
cp -r "$BACKUP_DIR/assets" public/cd-project/ 2>/dev/null || echo "⚠️  No se encontró assets"
cp -r "$BACKUP_DIR/meta-tags" public/cd-project/img/ 2>/dev/null || echo "⚠️  No se encontró meta-tags"

# Restaurar datos
cp -r "$BACKUP_DIR/project-data" database/seeders/ 2>/dev/null || echo "⚠️  No se encontró project-data"

echo "✅ Restauración completada"
echo "📋 Verificar con: git status"
```

---

## 🚀 PROCESO CON GIT (Método Recomendado)

### Configuración Inicial

1. **Actualizar `.gitattributes`** con el contenido completo de arriba
2. **Commitear `.gitattributes`**:
```bash
git add .gitattributes
git commit -m "chore: Configurar protecciones de archivos del proyecto"
git push origin cd-system
```

### Proceso de Actualización

```bash
# 1. Verificar que .gitattributes está configurado
cat .gitattributes | grep "merge=ours" | wc -l
# Debe mostrar al menos 15-20 protecciones

# 2. Ver cambios disponibles
git fetch origin cd-system
git log HEAD..origin/cd-system --oneline

# 3. Hacer pull (las protecciones funcionan automáticamente)
git pull origin cd-system

# 4. Verificar que los archivos protegidos no cambiaron
git status
# No debe mostrar cambios en archivos protegidos

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

### Verificación Post-Pull

```bash
# Verificar configuración del proyecto se mantuvo
cat config/cd-system.php | grep "demo"
cat config/site.php | grep -A 2 "'name'"

# Verificar que assets no cambiaron
git status public/cd-project/img/logos/
git status public/cd-project/img/favicon/
git status public/cd-project/assets/

# Verificar que datos del proyecto se mantuvieron
git status database/seeders/project-data/
```

---

## ✅ CHECKLIST DE ACTUALIZACIÓN

### Antes de Actualizar:
- [ ] `.gitattributes` configurado con todas las protecciones
- [ ] `.gitattributes` commiteado y pusheado
- [ ] Backup manual realizado (método temporal) o Git configurado (método recomendado)
- [ ] Cambios revisados con `git fetch` y `git diff`
- [ ] Proyecto en la rama correcta (`cd-system`)

### Durante la Actualización:
- [ ] `git pull` ejecutado sin errores
- [ ] Sin conflictos en archivos protegidos (si hay, revisar `.gitattributes`)

### 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
- [ ] Datos del proyecto (`project-data/`) se mantuvieron
- [ ] Archivos del template/demo se actualizaron correctamente
- [ ] Cache de Laravel limpiado
- [ ] Proyecto funciona correctamente
- [ ] Cambios probados en navegador

---

## 🔍 TROUBLESHOOTING

### Problema: Archivos Protegidos se Sobrescribieron

**Causa:** `.gitattributes` no está configurado o no está commiteado.

**Solución:**
1. Verificar que `.gitattributes` existe y tiene las protecciones
2. Si no existe, copiar el contenido completo de arriba
3. Commitear y pushear `.gitattributes`
4. Restaurar archivos desde backup o desde commit anterior:
```bash
git checkout HEAD~1 -- config/site.php config/cd-system.php
```

### Problema: Conflictos en Archivos Protegidos

**Causa:** `.gitattributes` no está funcionando correctamente.

**Solución:**
1. Verificar que `.gitattributes` está en el repositorio (commiteado)
2. Verificar sintaxis: `archivo merge=ours`
3. Limpiar cache de Git:
```bash
git rm --cached -r .
git reset --hard
```

### Problema: Assets del Template no se Actualizan

**Causa:** Protección demasiado amplia (ej: proteger toda `public/cd-project/img/`).

**Solución:**
- Proteger solo subcarpetas específicas del proyecto
- NO proteger `public/cd-project/img/demos/` (son del template)

---

## 📚 DOCUMENTACIÓN RELACIONADA

- `docs/bewpro/system/ACTUALIZAR-MEDIANTE-GIT-PULL.md` - Guía completa de Git Pull
- `docs/bewpro/system/RECUPERAR-ARCHIVOS-PROTEGIDOS.md` - Cómo recuperar archivos sobrescritos
- `docs/FLUJO-COMPLETO-CREACION-PROYECTO.md` - Flujo completo de creación de proyecto
- `.cd-system-exclude` - Archivos excluidos de propagación (inverso)

---

## 🎯 RESUMEN DE ARCHIVOS PROTEGIDOS

| Categoría | Archivos/Directorios | Protección |
|-----------|----------------------|------------|
| **Configuración** | `config/site.php` | `merge=ours` |
| | `config/cd-system.php` | `merge=ours` |
| **Logos** | `public/cd-project/img/logos/**` | `merge=ours` |
| **Favicons** | `public/cd-project/img/favicon/**` | `merge=ours` |
| **Assets** | `public/cd-project/assets/**` | `merge=ours` |
| **Meta Tags** | `public/cd-project/img/meta-tags/**` | `merge=ours` |
| **Datos** | `database/seeders/project-data/**` | `merge=ours` |
| **Entorno** | `.env` | En `.gitignore` |
| **Storage** | `storage/**` | En `.gitignore` |
| **Cache** | `bootstrap/cache/**` | En `.gitignore` |
| **Personalizaciones** | `scripts/project-specific/**` | `merge=ours` |
| | `docs/project-specific/**` | `merge=ours` |

---

**Última actualización:** Diciembre 2024  
**Estado:** ✅ DOCUMENTACIÓN COMPLETA  
**Versión:** 1.0
