# ⚙️ Configuración del Sistema

## Configuración de entorno (.env)

### Variables principales de aplicación

```env
# Información básica
APP_NAME=Laravel
APP_ENV=local              # local, staging, production
APP_KEY=base64:...         # Generado con php artisan key:generate
APP_DEBUG=true             # false en producción
APP_URL=http://localhost:8000

# Localización
APP_LOCALE=es              # Idioma principal
APP_FALLBACK_LOCALE=es     # Idioma de respaldo
APP_FAKER_LOCALE=es_MX     # Locale para datos de prueba

# Modo de mantenimiento
APP_MAINTENANCE_DRIVER=file
```

### Configuración de base de datos

```env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=db_vinosylicores
DB_USERNAME=root
DB_PASSWORD=
```

**Opciones de DB_CONNECTION:**
- `mysql` - MySQL/MariaDB (recomendado para producción)
- `sqlite` - SQLite (solo para testing)
- `pgsql` - PostgreSQL

### Sistema de colas

```env
QUEUE_CONNECTION=database
```

**Opciones disponibles:**
- `database` - Cola en base de datos (configuración actual)
- `redis` - Redis (mejor rendimiento, requiere Redis instalado)
- `sync` - Síncrono (solo para desarrollo)

**Tabla de colas:**
```bash
# Crear tabla de jobs (ya incluida en migraciones)
php artisan queue:table
php artisan migrate
```

### Sistema de caché

```env
CACHE_STORE=database
# CACHE_PREFIX=  # Opcional
```

**Opciones disponibles:**
- `database` - Caché en BD (configuración actual)
- `redis` - Redis (mejor rendimiento)
- `file` - Sistema de archivos
- `array` - En memoria (solo testing)

### Sesiones

```env
SESSION_DRIVER=database
SESSION_LIFETIME=120        # minutos
SESSION_ENCRYPT=false
SESSION_PATH=/
SESSION_DOMAIN=null
```

**Tabla de sesiones:**
```bash
# Crear tabla de sesiones (ya incluida en migraciones)
php artisan session:table
php artisan migrate
```

### Configuración de correo

#### Desarrollo (Mailtrap)
```env
MAIL_MAILER=smtp
MAIL_HOST=sandbox.smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=tu_usuario_mailtrap
MAIL_PASSWORD=tu_password_mailtrap
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="noreply@ejemplo.com"
MAIL_FROM_NAME="Tequilas y Mezcales"
```

#### Producción (Gmail)
```env
MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=tucorreo@gmail.com
MAIL_PASSWORD=tu_app_password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="noreply@tudominio.com"
MAIL_FROM_NAME="Vinos y Licores"
```

#### Producción (SendGrid)
```env
MAIL_MAILER=smtp
MAIL_HOST=smtp.sendgrid.net
MAIL_PORT=587
MAIL_USERNAME=apikey
MAIL_PASSWORD=tu_sendgrid_api_key
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="noreply@tudominio.com"
MAIL_FROM_NAME="Vinos y Licores"
```

### Almacenamiento de archivos

```env
FILESYSTEM_DISK=local
```

**Opciones:**
- `local` - Almacenamiento local (`storage/app`)
- `public` - Almacenamiento público (`storage/app/public`)
- `s3` - Amazon S3 (requiere configuración adicional)

**Rutas importantes:**
- PDFs temporales: `storage/app/public/pdfTemporal/{idUsuario}/`
- Excel temporales: `storage/app/public/excelTemporal/{idUsuario}/`
- Plantillas Excel: `public/plantillas/`

### Configuración de logs

```env
LOG_CHANNEL=stack
LOG_STACK=single
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug            # debug, info, warning, error
```

**Ver logs en tiempo real:**
```bash
php artisan pail
# o
tail -f storage/logs/laravel.log
```

### Broadcasting (eventos en tiempo real)

```env
BROADCAST_CONNECTION=log
```

**Opciones:**
- `log` - Solo registrar (desarrollo)
- `pusher` - Pusher (requiere cuenta)
- `redis` - Redis con Laravel Echo

## Archivos de configuración

### config/app.php

```php
// Configuración de localización
'locale' => env('APP_LOCALE', 'es'),
'fallback_locale' => env('APP_FALLBACK_LOCALE', 'es'),
'faker_locale' => env('APP_FAKER_LOCALE', 'es_MX'),

// Timezone
'timezone' => 'America/Mexico_City',  // Ajustar según ubicación
```

### config/auth.php

```php
// Guard por defecto para API
'defaults' => [
    'guard' => 'web',
    'passwords' => 'users',
],

// Guards disponibles
'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'sanctum' => [
        'driver' => 'sanctum',
        'provider' => null,
    ],
],
```

**Autenticación actual:**
- Se usa Laravel Sanctum para API tokens
- Autenticación de 2 factores (2FA) mediante TOTP
- Token temporal para flujo de configuración 2FA

### config/sanctum.php

```php
'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(
    '%s%s',
    'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1',
    env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : ''
))),

'expiration' => null,  // Tokens no expiran (ajustar según necesidad)
```

### config/dompdf.php

Configuración para generación de PDFs:

```php
'defines' => [
    'font_dir' => storage_path('fonts/'),
    'font_cache' => storage_path('fonts/'),
    'temp_dir' => sys_get_temp_dir(),
    'chroot' => realpath(base_path()),
    'enable_font_subsetting' => false,
    'pdf_backend' => 'CPDF',
    'default_media_type' => 'screen',
    'default_paper_size' => 'a4',
    'default_font' => 'serif',
    'dpi' => 96,
    'enable_php' => false,
    'enable_javascript' => true,
    'enable_remote' => true,
    'font_height_ratio' => 1.1,
    'enable_html5_parser' => false,
],
```

### config/excel.php

Configuración para importación/exportación Excel (maatwebsite/excel):

```php
'exports' => [
    'chunk_size' => 1000,
    'pre_calculate_formulas' => false,
    'strict_null_comparison' => false,
    'csv' => [
        'delimiter' => ',',
        'enclosure' => '"',
        'line_ending' => PHP_EOL,
        'use_bom' => false,
        'include_separator_line' => false,
        'excel_compatibility' => false,
        'output_encoding' => '',
    ],
],

'imports' => [
    'read_only' => true,
    'ignore_empty' => false,
    'heading_row' => [
        'formatter' => 'slug',
    ],
    'csv' => [
        'delimiter' => ',',
        'enclosure' => '"',
        'escape_character' => '\\',
        'contiguous' => false,
        'input_encoding' => 'UTF-8',
    ],
],
```

### config/scribe.php

Configuración para documentación de API (Scribe):

```php
'type' => 'laravel',
'theme' => 'default',
'title' => 'API Documentation',
'description' => '',
'base_url' => env('APP_URL', 'http://localhost'),
'routes' => [
    [
        'match' => [
            'prefixes' => ['api/*'],
            'domains' => ['*'],
        ],
        'include' => [],
        'exclude' => [],
    ],
],
```

**Generar documentación:**
```bash
php artisan scribe:generate
```

## Configuración de permisos del sistema

### Sistema de permisos personalizado

El sistema usa un modelo de permisos basado en:
- **Perfiles (Roles):** `base_perfil`
- **Rutas (Permisos):** `base_ruta`
- **Relación:** `base_perfilruta`

**Estado actual:** Deshabilitado en desarrollo
- Ubicación: `app/Library/FSG/Traits/HasPermission.php:25`
- Retorna `true` para todos los permisos

**Para habilitar en producción:**
```php
// En app/Library/FSG/Traits/HasPermission.php
public function hasPermissions(string $permission): bool
{
    // Comentar esta línea:
    // return true;

    // Descomentar lógica de verificación:
    $cacheKey = "user_permission_{$this->idUsuario}_{$permission}";
    return Cache::remember($cacheKey, 300, function () use ($permission) {
        // ... lógica existente
    });
}
```

### Middleware de permisos

```php
// bootstrap/app.php
->withMiddleware(function (Middleware $middleware) {
    $middleware->alias(['permiso' => Permiso::class,]);
})
```

**Uso en rutas:**
```php
Route::post('/lista', [ProveedorController::class, 'lista'])
    ->middleware('permiso:proveedor.lista');
```

## Configuración de desarrollo

### Modo debug

En `.env`:
```env
APP_DEBUG=true    # Mostrar errores detallados
APP_ENV=local     # Entorno local
```

**IMPORTANTE:** En producción:
```env
APP_DEBUG=false
APP_ENV=production
```

### Ejecutar todos los servicios

```bash
# Comando único que inicia Laravel, Queue y Vite simultáneamente
composer dev
```

Equivale a:
```bash
# Terminal 1
php artisan serve

# Terminal 2
php artisan queue:listen --tries=1

# Terminal 3
npm run dev
```

### Herramientas de desarrollo

```bash
# Laravel Pail - Ver logs en tiempo real
php artisan pail

# Tinker - REPL de Laravel
php artisan tinker

# Ver rutas
php artisan route:list

# Ver configuración
php artisan config:show
```

## Optimizaciones para producción

### Cachear configuración

```bash
# Cachear configuración
php artisan config:cache

# Cachear rutas
php artisan route:cache

# Cachear vistas
php artisan view:cache

# Optimizar autoload de Composer
composer install --optimize-autoloader --no-dev
```

### Compilar assets

```bash
# Compilar para producción (minificado)
npm run build
```

### Configurar supervisor para colas

Crear `/etc/supervisor/conf.d/laravel-worker.conf`:
```ini
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /ruta/a/proyecto/artisan queue:work database --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www-data
numprocs=2
redirect_stderr=true
stdout_logfile=/ruta/a/proyecto/storage/logs/worker.log
stopwaitsecs=3600
```

Activar:
```bash
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*
```

## Configuración de seguridad

### CORS

Si el frontend está en dominio diferente, configurar en `.env`:
```env
SANCTUM_STATEFUL_DOMAINS=localhost:3000,tudominio.com
SESSION_DOMAIN=.tudominio.com
```

### Rate limiting

Laravel incluye rate limiting por defecto. Ver `bootstrap/app.php` para ajustes.

### HTTPS en producción

Forzar HTTPS en `App\Providers\AppServiceProvider`:
```php
public function boot()
{
    if ($this->app->environment('production')) {
        URL::forceScheme('https');
    }
}
```

## Variables de entorno adicionales

### AWS S3 (opcional)

```env
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false
```

### Redis (opcional)

```env
REDIS_CLIENT=phpredis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
```

## Comandos útiles de configuración

```bash
# Ver toda la configuración actual
php artisan config:show

# Limpiar todas las cachés
php artisan optimize:clear

# Regenerar cachés de producción
php artisan optimize

# Verificar estado de la aplicación
php artisan about
```
