# Sistema de Reserva de Cajas - Guía de Despliegue

## Pasos de Instalación

### 1. Ejecutar Migraciones

```bash
cd /home/development/projects/inventory/inventory_new

# Ejecutar migraciones
php artisan migrate
```

**Migraciones que se ejecutarán**:
- `create_box_reservations_table` - Tabla principal de reservas
- `create_box_reservation_items_table` - Items de cada reserva
- `add_reservation_fields_to_inventory` - Campos en inventory

### 2. Crear Permisos

```bash
# Ejecutar seeder de permisos
php artisan db:seed --class=ReservationPermissionsSeeder
```

**Permisos creados**:
- `reservations.view` - Ver reservas
- `reservations.create` - Crear reservas
- `reservations.import` - Importar cajas
- `reservations.update` - Actualizar reservas
- `reservations.cancel` - Cancelar reservas

### 3. Verificar Rutas

```bash
# Ver rutas de reservas
php artisan route:list --name=reservations

# Ver rutas de API de reservas
php artisan route:list --name=order-preparation.box
```

### 4. Limpiar Caché

```bash
php artisan config:clear
php artisan route:clear
php artisan view:clear
php artisan cache:clear
```

## Prueba Rápida

### Opción 1: Crear Reserva Manualmente

```bash
# Entrar a tinker
php artisan tinker

# Crear una reserva de prueba
$client = \App\Models\Client::first();
$reservation = \App\Models\BoxReservation::create([
    'client_id' => $client->id,
    'reservation_code' => 'RES-TEST-001',
    'status' => 'pending',
    'reserved_by_user_id' => 1,
    'reserved_at' => now()
]);

# Verificar
$reservation->fresh();
```

### Opción 2: Probar Exportación

```bash
# Desde navegador o curl
curl http://localhost/reservations/inventory/available -o inventario.xlsx

# O visitar en navegador
http://localhost/reservations/template/download
```

## Flujo de Uso

### 1. Crear Reserva (Web)
```
URL: /reservations/create
- Seleccionar cliente
- Agregar notas (opcional)
- Guardar
```

### 2. Descargar Inventario
```
URL: /reservations/inventory/available
- Descarga Excel con inventario disponible
- Columnas incluyen: BOX_NUMBER, CLIENTE, MARCA, etc.
```

### 3. Marcar Cajas en Excel
```
- Abrir Excel descargado
- Marcar con "X" o "1" en columna SELECCIONAR
- Guardar archivo
```

### 4. Importar Cajas
```
URL: /reservations/{id}/import
- Subir Excel con cajas marcadas
- Sistema crea items de reserva
- Actualiza estado de inventario a "reserved"
```

### 5. Confirmar Físicamente (Operario)
```
URL: /order-preparation (pestaña Reservas)
- Seleccionar reserva pendiente
- Escanear cada caja
- Sistema confirma o pregunta si agregar
- Completar reserva → Crea orden automáticamente
```

## Verificación

### Verificar Tablas
```sql
-- Ver reservas
SELECT * FROM box_reservations;

-- Ver items de reserva
SELECT * FROM box_reservation_items;

-- Ver inventario reservado
SELECT * FROM inventory WHERE reservation_status = 'reserved';
```

### Verificar Permisos
```sql
-- Ver permisos de reservas
SELECT * FROM permissions WHERE name LIKE 'reservations.%';

-- Ver roles con permisos
SELECT r.name, p.name 
FROM roles r
JOIN role_has_permissions rhp ON r.id = rhp.role_id
JOIN permissions p ON rhp.permission_id = p.id
WHERE p.name LIKE 'reservations.%';
```

## Endpoints Disponibles

### Web (UI)
- `GET /reservations` - Listar reservas
- `GET /reservations/create` - Formulario crear
- `POST /reservations` - Guardar reserva
- `GET /reservations/{id}` - Ver detalle
- `POST /reservations/{id}/import` - Importar Excel
- `GET /reservations/template/download` - Descargar plantilla
- `GET /reservations/inventory/available` - Descargar inventario
- `DELETE /reservations/{id}/cancel` - Cancelar

### API (Order Preparation)
- `GET /api/order-preparation/box-reservations` - Listar activas
- `POST /api/order-preparation/start-box-reservation` - Iniciar
- `POST /api/order-preparation/confirm-box-scan` - Confirmar escaneo
- `POST /api/order-preparation/add-extra-box` - Agregar extra
- `POST /api/order-preparation/complete-box-reservation` - Completar

## Solución de Problemas

### Error: "Permission not found"
```bash
# Ejecutar seeder nuevamente
php artisan db:seed --class=ReservationPermissionsSeeder

# Limpiar caché de permisos
php artisan permission:cache-reset
```

### Error: "Table not found"
```bash
# Verificar migraciones
php artisan migrate:status

# Ejecutar migraciones pendientes
php artisan migrate
```

### Error: "Class not found"
```bash
# Regenerar autoload
composer dump-autoload

# Limpiar caché
php artisan optimize:clear
```

## Próximos Pasos

1. ✅ Backend completo
2. ✅ Rutas configuradas
3. ✅ Permisos creados
4. ⏳ Crear vistas Blade (pendiente)
5. ⏳ Actualizar UI order-preparation (pendiente)
6. ⏳ Testing completo (pendiente)

## Archivos Creados

**Migraciones** (3):
- `2025_12_14_092439_create_box_reservations_table.php`
- `2025_12_14_092440_create_box_reservation_items_table.php`
- `2025_12_14_092442_add_reservation_fields_to_inventory.php`

**Modelos** (2):
- `app/Models/BoxReservation.php`
- `app/Models/BoxReservationItem.php`

**Controladores** (1 nuevo + 1 actualizado):
- `app/Http/Controllers/ReservationController.php`
- `app/Http/Controllers/OrderPreparationController.php`

**Import/Export** (3):
- `app/Imports/ReservationBoxesImport.php`
- `app/Exports/InventoryAvailableExport.php`
- `app/Exports/ReservationTemplateExport.php`

**Seeders** (1):
- `database/seeders/ReservationPermissionsSeeder.php`

**Rutas**:
- `routes/web.php` (actualizado con 15 rutas nuevas)

## Notas Importantes

⚠️ **Importante**: Las vistas Blade aún no están creadas. El backend está completo y funcional vía API.

✅ **Listo para usar**: Todos los endpoints API están funcionales y pueden ser probados con Postman o curl.

📝 **Siguiente fase**: Crear las vistas Blade para la interfaz de usuario completa.
