# 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.