# ClientFlow v4.2 — revisão operacional e UI

Esta revisão mantém a arquitetura da v4.2, mas corrige pontos de estabilidade e torna a UI mais operacional.

## Correções aplicadas

- `OUTBOX_DRY_RUN=true` deixou de marcar itens como `sent`; agora passa o item para `dry_run`.
- Integrações com `*_OUTBOX_ENABLED=false` deixam de ficar apenas em `skipped` silencioso; agora ficam `blocked` com erro claro.
- A idempotência de `jasmin.create_quotation` passou a ser determinística por oportunidade: `jasmin:quotation:{opportunity_id}`.
- `integration_outbox` ganhou estados visíveis e reprocessáveis: `pending`, `processing`, `sent`, `failed`, `blocked`, `dry_run`, `ignored`, `cancelled`.
- O schema base passa a garantir colunas de controlo da outbox (`locked_at`, `lock_owner`, `ignored_at`) mesmo em instalações novas.
- Webhooks Chatwoot exigem `CLIENTFLOW_WEBHOOK_SECRET` em `ENV=prod`, `production` ou `staging`.
- Admin UI e API interna podem ser protegidas com `CLIENTFLOW_ADMIN_TOKEN`.

## Melhorias UI

- Página da oportunidade ganhou painel **Integrações da oportunidade** com contadores:
  - pendentes;
  - falhadas;
  - bloqueadas;
  - dry-run.
- A oportunidade passa a mostrar ações Jasmin/Packlink/Chatwoot/Mautic ligadas à oportunidade, com último erro e reprocessamento.
- `/outbox` ganhou filtros para os novos estados operacionais.
- Badges visuais foram atualizados para `processing`, `blocked`, `dry_run` e `cancelled`.

## Validação

Executado:

```bash
python -m compileall app scripts tests
pytest -q
```

Resultado: `12 passed`.

## Ainda recomendado para próxima ronda

- Substituir o token simples por login/sessão + CSRF nos POSTs.
- Refatorar `admin_dashboard.py`, que continua demasiado grande.
- Confirmar endpoints reais de PDF Jasmin no tenant de produção.
- Criar testes funcionais com Postgres de teste e mocks para Jasmin/Packlink.
