# ClientFlow v3.2 — HTMX, validações e operação sem terminal Esta versão é incremental em cima da v3.1. O objetivo é tornar o fluxo Jasmin/Packlink mais visível e operável pela UI, sem reescrever o dashboard inteiro. ## Principais alterações ### HTMX progressivo na oportunidade A página de oportunidade passa a usar HTMX em blocos específicos: - cartão **Documentos Jasmin**; - cartão **Produtos**; - ações de outbox associadas à oportunidade. O comportamento esperado é: ```text [Criar orçamento] → cria item pending na outbox → atualiza apenas o cartão Documentos Jasmin → mostra estado pending/sent/failed → polling atualiza o cartão a cada 10 segundos ``` Isto reduz a sensação de que “não aconteceu nada” depois de clicar num botão. ### Validação antes de criar orçamento Antes de criar outbox `jasmin.create_quotation`, o sistema valida: - oportunidade com cliente local associado; - cliente com nome fiscal; - cliente com NIF; - morada/código postal/cidade quando ainda não existe `jasmin_customer_party_key`; - pelo menos uma linha de produto ativa; - todas as linhas com `jasmin_sales_item` preenchido; - preços unitários maiores que zero. Se faltar algo, a UI mostra o erro diretamente no cartão Jasmin e não cria outbox inválida. ### Produtos por HTMX No cartão **Produtos** da oportunidade: - adicionar produto atualiza apenas o cartão; - remover produto atualiza apenas o cartão; - total é recalculado no bloco; - produtos sem `jasmin_sales_item` aparecem como bloqueio visual para orçamento. ### Outbox visível na oportunidade O cartão **Documentos Jasmin** mostra as ações recentes Jasmin relacionadas com a oportunidade: - `create_quotation`; - `convert_quotation_to_invoice`; - estado `pending`, `sent`, `failed`; - último erro; - botão **Reprocessar** para itens `failed`/`pending`. ### Filtro de produtos sem Artigo Jasmin Em `/products`, o filtro de estado ganhou a opção: ```text Ativos sem Artigo Jasmin ``` Serve para encontrar rapidamente produtos que ainda bloqueiam emissão de orçamento Jasmin. ## Continuação recomendada Para v3.3: 1. Obter PDF de orçamento/fatura. 2. Mostrar link/número real do documento quando o GET Jasmin devolver `documentType`, `serie` e `seriesNumber`. 3. Adicionar ações HTMX em `/integrations` para testar Jasmin/Packlink. 4. Implementar painel de Packlink semelhante ao painel Jasmin. 5. Refatorar `admin_dashboard.py` para `app/admin_ui/pages/` por etapas.