# Sprint 11.10 — Prefijos por empresa

## Reglas

```
Fedef  → TKT-####  (próximo: TKT-0123)
Gessig → GES-####  (renumerado limpio: GES-0001 a GES-0136, próximo GES-0137)
Trexdi → RQ-####   (comparte secuencia con Fycls)
Fycls  → RQ-####   (comparte secuencia con Trexdi)
```

## Cómo funciona

El nuevo modelo `Ticket.php` agrega un hook `creating` en el método `booted()`:

1. Cuando se va a crear un ticket, **antes de guardarlo**, el sistema verifica el `company_id` que ya fue asignado por el trait `BelongsToCompany`.
2. Lee el `ticket_prefix` de esa empresa (TKT/GES/RQ).
3. Calcula el siguiente número con ese prefijo.
4. Asigna el `number` correcto.

**Ventaja**: funciona independientemente de cómo se llame `Ticket::create()`. El `TicketService.php` actual sigue funcionando sin modificarlo.

## Manejo del caso problemático

Si el código viejo del `TicketService` llama `Ticket::generateNumber()` (sin parámetro), antes daba siempre TKT-XXXX. Ahora:

- Si la empresa actual usa **TKT** → genera TKT correctamente
- Si la empresa actual usa **GES** o **RQ** → el `creating` detecta que el número TKT-XXXX no corresponde y lo regenera

## Archivos

```
app/Models/Ticket.php           ← REEMPLAZA al actual
sql/sprint11_10_setup.sql       ← SQL para BD
```

## Pasos

### Paso 1: SQL — agregar prefijos + renumerar Gessig

phpMyAdmin → BD → SQL → ejecuta `sprint11_10_setup.sql`

Lo que hace:
1. Agrega campo `companies.ticket_prefix`
2. Pobla TKT/GES/RQ/RQ
3. Renumera los 136 tickets de Gessig a GES-0001..GES-0136

### Paso 2: Subir el ZIP

File Manager → /public_html/servicedesk/ → Upload → Extract → mover al raíz (sobreescribe `app/Models/Ticket.php`).

### Paso 3: Limpiar caché

```
cd ~/public_html/servicedesk && rm -f bootstrap/cache/*.php
```

## Tests

| Switcher | Crear ticket | Resultado esperado |
|---|---|---|
| Trexdi | Cualquier ticket | RQ-0001 |
| Fycls  | Cualquier ticket | RQ-0002 |
| Trexdi otra vez | Cualquier ticket | RQ-0003 |
| Fedef  | Cualquier ticket | TKT-0123 |
| Gessig | Cualquier ticket | GES-0137 |

## Notas técnicas

- El método `generateNumber()` mantiene compatibilidad con el código viejo
- Pero ahora acepta parámetro opcional `companyId` para casos explícitos
- El `creating` hook es el "cinturón de seguridad" que asegura el número correcto
- `withTrashed()`: incluye soft-deleted para no reusar números
