# Fase 0 — Correcciones bloqueantes

> Completada: 2026-04-23

## Objetivo

Corregir bugs críticos que comprometían la seguridad del sistema antes de continuar con cualquier otra fase.

## Cambios realizados

### B-04 — Bug en GenericPolicy (permisos siempre fallaban para no-admins)
**Archivo:** `Modules/Core/Policies/GenericPolicy.php:14`

```php
// Antes — segundo argumento era el guardName, no parte del permiso
$user->hasPermissionTo($model_name, '.index')

// Después
$user->hasPermissionTo($model_name . '.index')
```

### B-05 — pages.json de SFM con permisos duplicados en el nombre
**Archivo:** `Modules/SimpleFinancialManagement/pages.json`

El sidebar agrega `.index` al verificar permisos. Los 5 ítems del menú de SFM ya incluían `.index` en el campo `permission`, haciendo que se verificara `bucket.index.index` (inexistente). Corregido quitando `.index` del campo:

```json
// Antes
{ "permission": "bucket.index" }

// Después
{ "permission": "bucket" }
```

Aplicado a: `bucket`, `credit_card`, `card_cycle`, `tag`, `wallet`.

### B-01 — queryBuckets() sin filtro de usuario
**Archivo:** `app/Livewire/Modules/SimpleFinancialManagement/BucketIndex.php`

```php
// Antes — devolvía buckets de TODOS los usuarios
Bucket::where(function ($query) { ... })

// Después
Bucket::where('user_id', Auth::id())
    ->where(function ($query) { ... })
```

### B-06 — addBucket() sin validación
**Archivo:** `app/Livewire/Modules/SimpleFinancialManagement/BucketIndex.php`

Agregado `$this->validate()` con reglas antes del `Bucket::create()`:
- `new_name`: required, string, max:100
- `new_kind`: required, string, max:30
- `new_description`: nullable, string

También se estandarizó el uso de `Auth::id()` en lugar de `Auth::user()->id`.

### Extra — deleteBucket() permitía borrar registros de otros usuarios
**Archivo:** `app/Livewire/Modules/SimpleFinancialManagement/BucketIndex.php`

```php
// Antes — cualquier usuario podía borrar cualquier bucket por ID
Bucket::find($id)->delete()

// Después — solo borra si el bucket pertenece al usuario autenticado
Bucket::where('id', $id)->where('user_id', Auth::id())->delete()
```

### B-02 — Wallet::all() sin filtro de usuario en MovementCrud
**Archivo:** `app/Livewire/Modules/SimpleFinancialManagement/MovementCrud.php`

```php
// Antes
$this->wallets = Wallet::all();

// Después
$this->wallets = Wallet::where('user_id', Auth::id())->get();
```

### B-03 — Wallet::create() sin user_id ni campos requeridos
**Archivo:** `app/Livewire/Modules/SimpleFinancialManagement/MovementCrud.php`

El modal de crear wallet usaba el campo `reason` (inexistente en la tabla) y omitía `user_id`, `type` y `currency` (todos requeridos por la migración). Corregido:

```php
// Antes — fallaba por campos faltantes e inexistentes
Wallet::create(['name' => ..., 'reason' => ...])

// Después — campos correctos, user_id incluido
Wallet::create([
    'user_id'  => Auth::id(),
    'name'     => $this->new_wallet_name,
    'type'     => $this->new_wallet_reason,  // campo reutilizado hasta Fase 5
    'currency' => 'GTQ',
    'balance'  => 0,
])
```

Nota: el modal de Wallet se rediseñará completamente en la Fase 5 con todos los campos correctos.

### Extra — queryMovements() sin filtro de usuario
**Archivo:** `app/Livewire/Modules/SimpleFinancialManagement/MovementCrud.php`

```php
// Antes
Transaction::where('description', 'LIKE', ...)

// Después
Transaction::where('user_id', Auth::id())
    ->where('description', 'LIKE', ...)
```

### Extra — user_id agregado a $fillable de Wallet
**Archivo:** `Modules/SimpleFinancialManagement/Models/Wallet.php`

`user_id` no estaba en el array `$fillable`, lo que hacía que `Wallet::create(['user_id' => ...])` ignorara el valor silenciosamente.

### Extra — import de Auth agregado a MovementCrud
**Archivo:** `app/Livewire/Modules/SimpleFinancialManagement/MovementCrud.php`

Agregado `use Illuminate\Support\Facades\Auth;` que faltaba tras los nuevos usos de `Auth::id()`.

## Archivos modificados

| Archivo | Cambios |
|---|---|
| `Modules/Core/Policies/GenericPolicy.php` | Bug en hasPermissionTo |
| `Modules/SimpleFinancialManagement/pages.json` | 5 permisos corregidos |
| `Modules/SimpleFinancialManagement/Models/Wallet.php` | user_id en fillable |
| `app/Livewire/Modules/SimpleFinancialManagement/BucketIndex.php` | Filtro user_id, validación, delete seguro |
| `app/Livewire/Modules/SimpleFinancialManagement/MovementCrud.php` | Filtros user_id, campos wallet, import Auth |
