# Instalar: SLA Configurável + Alertas Automáticos

## 1. Ficheiros novos

```
app/Notifications/SlaAtRiskNotification.php
app/Jobs/CheckSlaBreachesJob.php
database/migrations/2026_08_28_000002_add_sla_alert_sent_at_to_maintenance_requests.php
```

## 2. Ficheiros a substituir

```
app/Services/SlaService.php                       (lê prazos das Settings)
app/Livewire/Admin/CompanySettings.php               (separador SLA)
resources/views/livewire/admin/company-settings.blade.php
app/Livewire/NotificationBell.php                      (mensagem para o novo tipo)
routes/console.php                                       (agenda o job de hora a hora)
```

## 3. Passos

```bash
cd ~/public_html/app.amimak.co.mz
php artisan migrate
php artisan config:clear
php artisan view:clear
```

**Importante**: confirma que o cron do Laravel Scheduler está mesmo
activo (`docs/09-DEPLOY-CPANEL-AMIMAK.md`) — sem ele, nem este alerta nem
o backup diário nem a manutenção preventiva funcionam de verdade, mesmo
com o código instalado.

## 4. O que ganhaste

### Prazos de SLA configuráveis (`/admin/settings`, separador "SLA")
Tabela com Resposta/Resolução (em horas) para cada prioridade
(Baixa/Normal/Alta/Emergência). Os valores por omissão continuam a
funcionar até alguém os mudar aqui. **Só afecta pedidos criados depois de
guardares** — nunca altera prazos de pedidos já em curso (evita
confusão/injustiça com pedidos a meio do processo).

### Alerta automático
Um job corre **de hora a hora** e verifica pedidos activos com o prazo de
resolução a **menos de 4 horas** ou já ultrapassado. Para cada um, avisa
(email + notificação no sino) todos os `Admin`/`Maintenance Manager` — e
só uma vez por pedido (não volta a incomodar de hora a hora pelo mesmo).

## 5. Testar

1. `/admin/settings` → separador "SLA" → muda "Emergência - Resolução"
   para `1` hora → Guardar
2. Cria um pedido novo com prioridade Emergência → confirma no detalhe
   que o prazo já reflecte a nova configuração
3. Para testar o alerta sem esperar horas: via `tinker`,
   `MaintenanceRequest::first()->update(['sla_resolution_due_at' => now()->subHour()])`
   e depois corre manualmente `php artisan schedule:run` (ou
   `(new \App\Jobs\CheckSlaBreachesJob)->handle();` directo no tinker) →
   confirma que chega o email e a notificação no sino
