# Instalacion Local (Desarrollo) - Direccion de Admision 2026

## Requisitos previos

| Herramienta | Version minima | Uso |
|---|---|---|
| Laragon | - | PHP + Composer (servidor local) |
| PHP | 8.4+ | Backend Laravel (Thread Safe, VS17 x64) |
| Composer | 2.x | Dependencias PHP |
| Node.js | 18+ | Frontend Vue |
| npm | 9+ | Dependencias JS |
| Docker | 20+ | Solo para MySQL |
| Docker Compose | 2+ | Solo para MySQL |

### Descargar PHP 8.4 para Laragon

Si Laragon no trae PHP 8.4, descargarlo manualmente:

1. Descargar desde https://windows.php.net/download/ el archivo **VS17 x64 Thread Safe** (zip)
2. Extraer en `C:\laragon\bin\php\php-8.4.xx-Win32-vs17-x64\`
3. En Laragon: clic derecho > **PHP** > seleccionar la version 8.4
4. Instalar Visual C++ 2022 si no lo tienes: https://aka.ms/vs/17/release/vc_redist.x64.exe
5. Agregar al PATH: clic derecho en Laragon > **Tools** > **Path** > **Add Laragon to Path**

---

## Paso 1: Clonar el repositorio

```bash
git clone <url-del-repo> direccion_de_admision_2026
cd direccion_de_admision_2026
```

---

## Paso 2: Levantar MySQL con Docker

```bash
docker compose up -d
```

Esto levanta un contenedor MySQL 8.0 con:
- **Host:** 127.0.0.1
- **Puerto:** 3306
- **Usuario:** root
- **Password:** root
- **Base de datos:** admision_2026

Verificar que funcione:

```bash
docker exec admision_2026_db mysql -uroot -proot -e "SELECT 'MySQL OK'"
```

---

## Paso 3: Importar la base de datos

```bash
docker exec -i admision_2026_db mysql -uroot -proot admision_2026 < admision_2006-vI.sql
```

Verificar tablas importadas:

```bash
docker exec admision_2026_db mysql -uroot -proot admision_2026 -e "SHOW TABLES;"
```

Debe mostrar 34 tablas base (users, postulantes, areas, cursos, examenes, procesos_admision, etc.).
Las tablas `comunicados` y `comunicado_imagenes` se crean en el paso 4.5 via migraciones.

> **Nota:** El dump incluye la estructura de todas las tablas **y** los registros en `migrations`.
> Aun así, siempre que hagas `git pull` debes correr `php artisan migrate` — el dump cubre las tablas
> base, pero las migraciones nuevas que se agreguen al repo después del dump no estarán en él.

---

## Paso 4: Configurar el Backend (Laravel)

```bash
cd back
```

### 4.1 Instalar dependencias

```bash
composer install
```

### 4.2 Configurar variables de entorno

```bash
copy .env.example .env
```

Editar `back/.env` y configurar:

```
DB_PASSWORD=root
```

### 4.3 Generar clave de aplicacion

```bash
php artisan key:generate
```

### 4.4 Crear enlace de storage (para imagenes)

```bash
php artisan storage:link
```

### 4.5 Correr migraciones nuevas

```bash
php artisan migrate
```

El dump cubre las tablas base. Este comando aplica cualquier migración nueva que se haya
agregado al repo después de que el dump fue generado. Si no hay migraciones pendientes,
el comando termina sin hacer nada — es seguro correrlo siempre.

**Si el comando falla** con un error tipo `Table 'users' already exists`, significa que el dump
no incluye los registros en la tabla `migrations`. Solución — correr esto primero y luego volver a migrar:

```bash
php artisan tinker --execute="
DB::table('migrations')->insertOrIgnore([
  ['migration' => '0001_01_01_000000_create_users_table', 'batch' => 1],
  ['migration' => '0001_01_01_000001_create_cache_table', 'batch' => 1],
  ['migration' => '0001_01_01_000002_create_jobs_table', 'batch' => 1],
  ['migration' => '2026_01_27_132900_create_personal_access_tokens_table', 'batch' => 1],
  ['migration' => '2026_01_27_133609_create_permission_tables', 'batch' => 1],
]);
echo 'done';
"
```

```bash
php artisan migrate
```

### 4.6 Ejecutar seeders

```bash
php artisan db:seed --class=RoleSeeder
```

Esto crea los roles: `usuario`, `administrador`, `superadmin`.

### 4.7 Asignar rol a tu usuario

Si ya tienes un usuario creado (por registro o por el dump SQL), asignarle un rol desde tinker:

```bash
php artisan tinker
```

```php
$user = \App\Models\User::where('email', 'tu@email.com')->first();
$user->assignRole('superadmin');
exit
```

> **Importante:** Sin un rol asignado, el login devuelve 200 pero no redirige al dashboard.

---

## Paso 5: Configurar el Frontend (Vue 3)

```bash
cd front
```

### 5.1 Instalar dependencias

```bash
npm install
```

### 5.2 Configurar variables de entorno

```bash
copy .env.example .env
```

El archivo debe contener:

```
VITE_API_URL=http://127.0.0.1:8000/api
```

---

## Levantar el proyecto

Necesitas **3 cosas corriendo** al mismo tiempo:

### 1. MySQL (Docker) - si no esta corriendo

```bash
docker compose up -d
```

### 2. Backend (Terminal 1)

```bash
cd back
php artisan serve
```

Estara disponible en: **http://localhost:8000**

### 3. Frontend (Terminal 2)

```bash
cd front
npm run dev
```

Estara disponible en: **http://localhost:5173**

---

## Stack tecnologico

| Capa | Tecnologia |
|---|---|
| Backend | Laravel 12 + PHP 8.4 |
| Frontend | Vue 3 + Vite 7 + Ant Design Vue + Pinia |
| Base de datos | MySQL 8.0 (Docker) |
| Autenticacion | Laravel Sanctum (Bearer tokens) |
| Permisos | Spatie Laravel Permission |
| QR | SimpleSoftwareIO QRCode |

---

## Notas importantes

- **No modificar** `composer.lock` a menos que todos los del equipo acuerden (requiere PHP 8.4+)
- El dump SQL (`admision_2006-vI.sql`) es la fuente de verdad de la base de datos. Siempre se trabaja a partir de él — nunca desde `php artisan migrate:fresh` o similar.
- Cada vez que se agrega una feature con nueva migración: el desarrollador corre `php artisan migrate` en local, luego exporta solo la tabla nueva del dump y la añade al dump maestro para que el equipo pueda importarla.
- Si el puerto 3306 esta ocupado (por otro MySQL local), detener ese servicio primero o cambiar el puerto en `docker-compose.yml`
- Los archivos `.env` no se suben al repositorio (estan en `.gitignore`)

---

## Workflow cuando hay una migración nueva en el repo

Cuando haces `git pull` y hay una migración nueva (alguien agregó una feature con nueva tabla):

### Paso 1: verificar el estado

```bash
php artisan migrate:status
```

### Caso A: solo aparece 1 migración como Pending

Eso es lo normal. Solo corre:

```bash
php artisan migrate
```

Listo.

### Caso B: aparecen TODAS las migraciones como Pending

Esto pasa cuando instalaste desde el dump SQL y **nunca corriste** `php artisan migrate` antes. La tabla `migrations` está incompleta y Laravel cree que todo está pendiente — si corres `migrate` directamente fallará con `Table 'users' already exists`.

Solución: registrar las migraciones base manualmente y luego migrar.

```bash
php artisan tinker --execute="
DB::table('migrations')->insertOrIgnore([
  ['migration' => '0001_01_01_000000_create_users_table', 'batch' => 1],
  ['migration' => '0001_01_01_000001_create_cache_table', 'batch' => 1],
  ['migration' => '0001_01_01_000002_create_jobs_table', 'batch' => 1],
  ['migration' => '2026_01_27_132900_create_personal_access_tokens_table', 'batch' => 1],
  ['migration' => '2026_01_27_133609_create_permission_tables', 'batch' => 1],
]);
echo 'done';
"
```

```bash
php artisan migrate
```

Ahora sí solo correrá la migración nueva que falta.
