# Wizard 1 — Instalación inicial

> Completada: 2026-04-23

## Objetivo

Crear un wizard de instalación inicial accesible en `/install` que guíe al administrador a través de la configuración completa de la aplicación en un nuevo servidor, sin necesidad de acceso SSH ni edición manual de archivos.

---

## Archivos creados / modificados

| Archivo | Tipo |
|---|---|
| `Modules/Core/Http/Livewire/InstallWizard.php` | Creado |
| `Modules/Core/Resources/views/livewire/install-wizard.blade.php` | Creado |
| `Modules/Core/Routes/web.php` | Modificado — ruta `/install` |
| `resources/views/layouts/guest.blade.php` | Modificado — Livewire scripts |
| `app/Models/User.php` | Modificado — `is_admin` en `$fillable` |

---

## Flujo del wizard (6 pasos)

### Paso 1 — Requisitos del servidor
Verifica automáticamente:
- PHP >= 8.2
- Extensiones: BCMath, cURL, Mbstring, OpenSSL, PDO, PDO MySQL, XML
- Permisos de escritura: `storage/`, `bootstrap/cache/`

Tiene botón "Refrescar" para volver a verificar sin recargar la página.
El botón "Siguiente" está bloqueado si hay requisitos fallando.

### Paso 2 — Conexión a base de datos
- Formulario: host, puerto, nombre de BD, usuario, contraseña
- Botón "Probar conexión" usa PDO directo (sin afectar la conexión de la app)
- Al confirmar con conexión exitosa: escribe al `.env` y ejecuta `config:clear`

### Paso 3 — Ejecutar migraciones
- Corre `php artisan migrate --force` con `BufferedOutput` visible
- El botón "Siguiente" solo se habilita tras una migración exitosa

### Paso 4 — Crear administrador
- Campos: nombre completo, email, username, contraseña (con confirmación)
- Contraseña hasheada con `Hash::make()`
- Usuario creado con `is_admin: true`
- Contraseña se limpia de la memoria inmediatamente tras crear el usuario

### Paso 5 — Configuración de la aplicación
- Nombre de la instancia → `APP_NAME` en `.env`
- Idioma por defecto → `APP_LOCALE` en `.env` (`es` | `en`)
- Al confirmar: escribe al `.env`, ejecuta `config:clear`, escribe `storage/app/installed`

### Paso 6 — Completo
- Confirmación visual de instalación exitosa
- Enlace directo al login

---

## Seguridad

- Accesible sin autenticación (pre-auth)
- Una vez que `storage/app/installed` existe, `mount()` redirige al dashboard inmediatamente
- La contraseña del administrador se limpia de las propiedades Livewire tras crear el usuario
- Las credenciales de BD se borran de `.env` `DB_PASSWORD` solo en el formato que tenía el `.env` original — no se exponen en respuestas HTTP
- No usa `exec()` ni Shell — todo vía `Artisan::call()` y PDO

---

## Integración

- Ruta: `Route::get('/install', InstallWizard::class)->name('install.index')`
- Componente Livewire full-page con `->layout('layouts.guest')`
- Layout guest actualizado con `@livewireStyles` / `@livewireScripts` / `<x-penguin-notification />`
- `is_admin` agregado a `App\Models\User::$fillable`
