# mbGasolinera — Guía de despliegue

**Stack:** Symfony 5.4 · PHP 8.4 · MySQL 8 · Apache

---

## A. Actualizar instalación existente

Usar cuando ya existe el proyecto en el servidor y se quiere aplicar una nueva versión del código.

```bash
# 1. Ir al directorio del proyecto
cd /Library/WebServer/Documents/mbGasolinera

# 2. Bajar los cambios del repositorio
git pull

# 3. Instalar/actualizar dependencias PHP
#    (ejecuta automáticamente bin/patch-php84.php al terminar)
composer install --no-dev --optimize-autoloader

# 4. Limpiar caché de producción
rm -rf var/cache/prod

# 5. Instalar assets (CSS, JS, imágenes de los bundles)
php bin/console assets:install public
```

> **Nota:** Si solo se modificaron templates Twig o archivos PHP del controlador
> (sin tocar `composer.json`), basta con el paso 4.

---

## B. Instalación desde cero

### B.1 Requisitos del servidor

| Componente | Versión mínima |
|---|---|
| PHP | 8.4 con extensiones: pdo_mysql, intl, mbstring, xml, ctype, tokenizer |
| MySQL / MariaDB | 8.0 / 10.5 |
| Apache | 2.4 con `mod_rewrite` habilitado |
| Composer | 2.x |

### B.2 Obtener el código

**Opción A — desde Git:**
```bash
git clone <url-del-repositorio> /Library/WebServer/Documents/mbGasolinera
cd /Library/WebServer/Documents/mbGasolinera
```

**Opción B — copiar archivos:**
```bash
# Copiar todo el proyecto al servidor excepto vendor/ y var/
rsync -av --exclude=vendor --exclude=var \
      /origen/mbGasolinera/ /Library/WebServer/Documents/mbGasolinera/
cd /Library/WebServer/Documents/mbGasolinera
```

### B.3 Configurar variables de entorno

```bash
# Copiar el archivo de ejemplo
cp .env .env.local

# Editar .env.local con los datos reales de conexión
nano .env.local
```

Contenido mínimo de `.env.local`:
```ini
APP_ENV=prod
APP_SECRET=<cadena-aleatoria-de-32-chars>
APP_DEBUG=0

DATABASE_URL="mysql://USUARIO:PASSWORD@127.0.0.1:3306/BASE_DATOS?serverVersion=8.0&charset=utf8mb4"
DATABASE_URL2="mysql://USUARIO:PASSWORD@127.0.0.1:3306/BASE_DATOS2?serverVersion=8.0&charset=utf8mb4"
```

### B.4 Configurar parámetros de la tienda

Editar `config/services.yaml` — estos valores cambian por instalación:

```bash
nano config/services.yaml
```

| Parámetro | Descripción | Ejemplo |
|---|---|---|
| `tienda` | ID de la tienda en la BD | `2` |
| `demo` | `'S'` muestra tiquetes en pantalla, `'N'` imprime físicamente | `'S'` |
| `tipodoc_factura` | Código del tipo de documento factura | `'4'` |
| `tipodoc_vale` | Código del tipo de documento vale | `'6'` |
| `usa_lubricantes` | `'S'` activa sección de lubricantes | `'S'` |
| `regular_background` | Color de fondo botón Regular (hex) | `'#c8c030'` |
| `super_background` | Color de fondo botón Super (hex) | `'#38a050'` |
| `diesel_background` | Color de fondo botón Diesel (hex) | `'#333333'` |

### B.5 Instalar dependencias

```bash
# Instala vendor/ y aplica parche PHP 8.4 automáticamente
composer install --no-dev --optimize-autoloader
```

### B.6 Ajustar permisos

```bash
# Apache necesita escribir en var/ (caché, logs)
sudo chown -R _www:_www var/
sudo chmod -R 775 var/

# En Linux (Debian/Ubuntu) el usuario de Apache es www-data:
# sudo chown -R www-data:www-data var/
```

### B.7 Instalar assets

```bash
php bin/console assets:install public
```

### B.8 Configurar Apache

Crear o editar el VirtualHost para apuntar el `DocumentRoot` a la carpeta `public/`:

```apache
<VirtualHost *:80>
    ServerName gasolinera.local
    DocumentRoot /Library/WebServer/Documents/mbGasolinera/public

    <Directory /Library/WebServer/Documents/mbGasolinera/public>
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog /var/log/apache2/mbGasolinera_error.log
    CustomLog /var/log/apache2/mbGasolinera_access.log combined
</VirtualHost>
```

Habilitar `mod_rewrite` si no está activo:
```bash
# macOS — ya viene activo en Apache
# Ubuntu/Debian:
sudo a2enmod rewrite
sudo systemctl restart apache2
```

### B.9 Verificar

```bash
# Debe mostrar las rutas registradas sin errores
php bin/console debug:router --env=prod

# Verificar que el caché se genera correctamente
php bin/console cache:warmup --env=prod
```

---

## C. Referencia rápida

### Limpiar caché (después de cualquier cambio en código o templates)
```bash
rm -rf var/cache/prod
```

### Ver logs de errores
```bash
tail -f var/log/prod.log
```

### Regenerar assets tras cambiar CSS/JS en bundles
```bash
php bin/console assets:install public
rm -rf var/cache/prod
```

### Servidor de prueba (desarrollo local, NO producción)
```bash
php -S 0.0.0.0:8084 public/router.php
```

### Re-aplicar parche PHP 8.4 manualmente (si es necesario)
```bash
php bin/patch-php84.php
```

---

## D. Archivos que NO se versionan (crear en cada servidor)

| Archivo | Propósito |
|---|---|
| `.env.local` | Credenciales y variables de entorno del servidor |
| `var/` | Caché y logs — se genera automáticamente |
| `vendor/` | Dependencias PHP — se instala con `composer install` |

---

## E. Parche PHP 8.4 — por qué existe

`sensio/framework-extra-bundle` v6.2.x no declara explícitamente los tipos nullable
en sus constructores, lo que PHP 8.4 marca como deprecación visible en pantalla.
El script `bin/patch-php84.php` corrige los 4 archivos afectados y se ejecuta
automáticamente en cada `composer install` / `composer update` mediante los hooks
`post-install-cmd` y `post-update-cmd` de `composer.json`.
