From d5b26a55f033a21def4ebcbc4b9af14dcc372f14 Mon Sep 17 00:00:00 2001 From: Ligbox Obsidian Vault Date: Wed, 1 Jul 2026 19:35:39 +0000 Subject: [PATCH] sync obsidian: spec 043 webmail gate + chat bruto 043/044 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Espelho VM130 das decisões webmail gate, contratos, VM112 e índice chat bruto. Co-authored-by: Cursor --- ligbox-ops-platform/_sidebar.md | 1 + ...MAIL_GATE_TICKETS_SPEC043_044_20260701.txt | 34 ++ ...TE_TICKETS_SPEC043_044_20260701_INDICE.txt | 7 + ligbox-ops-platform/docs/vms/VM112.md | 2 + .../domain-manager-console-ui.md | 444 ++++++++++++++++++ .../SESSION-CHECKPOINT.md | 92 ++++ .../contracts/webmail-release-gate.md | 148 ++++++ .../043-desk-client-activation-sync/spec.md | 15 +- .../043-desk-client-activation-sync/tasks.md | 12 +- .../specs/044-foss-desk-ticket-sync/spec.md | 2 + ligbox-ops-platform/specs/SPEC-REGISTRY.md | 2 +- 11 files changed, 755 insertions(+), 4 deletions(-) create mode 100644 ligbox-ops-platform/chat-bruto/CHAT_BRUTO_WEBMAIL_GATE_TICKETS_SPEC043_044_20260701.txt create mode 100644 ligbox-ops-platform/chat-bruto/CHAT_BRUTO_WEBMAIL_GATE_TICKETS_SPEC043_044_20260701_INDICE.txt create mode 100644 ligbox-ops-platform/specs/035-ligbox-mail-bundles-foss-openpanel/domain-manager-console-ui.md create mode 100644 ligbox-ops-platform/specs/043-desk-client-activation-sync/SESSION-CHECKPOINT.md create mode 100644 ligbox-ops-platform/specs/043-desk-client-activation-sync/contracts/webmail-release-gate.md diff --git a/ligbox-ops-platform/_sidebar.md b/ligbox-ops-platform/_sidebar.md index f0206f8..1f4bcca 100644 --- a/ligbox-ops-platform/_sidebar.md +++ b/ligbox-ops-platform/_sidebar.md @@ -212,6 +212,7 @@ - [activation-field-mapping.md](specs/043-desk-client-activation-sync/contracts/activation-field-mapping.md) — **fonte única** - [desk-activate-account-api.md](specs/043-desk-client-activation-sync/contracts/desk-activate-account-api.md) - [mail-bundle-api.md](specs/043-desk-client-activation-sync/contracts/mail-bundle-api.md) + - [webmail-release-gate.md](specs/043-desk-client-activation-sync/contracts/webmail-release-gate.md) - **044-foss-desk-ticket-sync** ⭐ Portal OB- ↔ Desk ↔ FOSS Support - [📄 spec.md](specs/044-foss-desk-ticket-sync/spec.md) - [tasks.md](specs/044-foss-desk-ticket-sync/tasks.md) diff --git a/ligbox-ops-platform/chat-bruto/CHAT_BRUTO_WEBMAIL_GATE_TICKETS_SPEC043_044_20260701.txt b/ligbox-ops-platform/chat-bruto/CHAT_BRUTO_WEBMAIL_GATE_TICKETS_SPEC043_044_20260701.txt new file mode 100644 index 0000000..3fc86cd --- /dev/null +++ b/ligbox-ops-platform/chat-bruto/CHAT_BRUTO_WEBMAIL_GATE_TICKETS_SPEC043_044_20260701.txt @@ -0,0 +1,34 @@ +# Chat bruto — Webmail gate UX + FOSS tickets sync +# Data: 2026-07-01 +# Roger + Cursor +# Specs: 043, 044, 035 (domain-manager UI) + +## Tópicos + +### 1. FOSS tickets ↔ Portal ↔ Desk +- Três filas isoladas: OB- (VM112), Desk #N, FOSS Support (VM123) +- Portal→Desk via webhook onboarding.escalated ✅ +- FOSS sem sync automático ❌ +- Criada Spec 044 com contratos ticket-field-mapping + ticket-sync-api +- Commits: ligbox-ops-platform ef126d1, obsidian-vault 4e65555 + +### 2. Onde mensagem «activar webmail» +- Infra (Traefik/cert) vs company_gate (liberação formal) +- Aviso no rodapé login Carbonio = correto (company_gate.sync_webmail_user_notice) +- Acção liberar = Painel Admin /admin (API existe, UI DomainAdmin falta) +- Banner P0 no Início + badge WEBMAIL no Resumo Contas + +### 3. VM112 paths confirmados +- company_gate.py — PENDING_WEBMAIL_USER_DESCRIPTION +- domain_admin.py — /gate/release-webmail +- WebmailReleaseModal.jsx — wizard onboarding +- dratcoin.com: aviso OK; credenciais inválidas é problema separado + +## Artefatos gerados +- specs/044-foss-desk-ticket-sync/* +- specs/043/contracts/webmail-release-gate.md (este follow-up) +- chat-bruto/CHAT_BRUTO_WEBMAIL_GATE_TICKETS_SPEC043_044_20260701.txt + +## Próximo +- [ ] UI card Activar webmail em DomainAdmin.jsx +- [ ] Implementar Fase B Spec 044 (foss_client.create_support_ticket) diff --git a/ligbox-ops-platform/chat-bruto/CHAT_BRUTO_WEBMAIL_GATE_TICKETS_SPEC043_044_20260701_INDICE.txt b/ligbox-ops-platform/chat-bruto/CHAT_BRUTO_WEBMAIL_GATE_TICKETS_SPEC043_044_20260701_INDICE.txt new file mode 100644 index 0000000..7cb4f8a --- /dev/null +++ b/ligbox-ops-platform/chat-bruto/CHAT_BRUTO_WEBMAIL_GATE_TICKETS_SPEC043_044_20260701_INDICE.txt @@ -0,0 +1,7 @@ +# Índice chat bruto — Webmail gate + FOSS tickets +# 2026-07-01 + +CHAT_BRUTO_WEBMAIL_GATE_TICKETS_SPEC043_044_20260701.txt + → Spec 043 contracts/webmail-release-gate.md + → Spec 044 foss-desk-ticket-sync/ + → Spec 035 domain-manager-console-ui.md (banner webmail) diff --git a/ligbox-ops-platform/docs/vms/VM112.md b/ligbox-ops-platform/docs/vms/VM112.md index 7e3fdb7..1d3a63f 100644 --- a/ligbox-ops-platform/docs/vms/VM112.md +++ b/ligbox-ops-platform/docs/vms/VM112.md @@ -70,6 +70,8 @@ Auth: header `X-Ops-Internal-Token` (= `OPS_INTERNAL_TOKEN` Desk VM122, em `/opt **Teste validado:** domínio `bundle-novo-spec043.ligbox.com.br` → HTTP 200 `provisioned: true`. +**Webmail gate (`company_gate`):** [043 webmail-release-gate.md](../specs/043-desk-client-activation-sync/contracts/webmail-release-gate.md) — aviso rodapé login Carbonio + liberar em Painel `/admin` (UI card pendente). + ## Integração - **→ VM122:** webhooks `onboarding.*` · Assist/takeover API diff --git a/ligbox-ops-platform/specs/035-ligbox-mail-bundles-foss-openpanel/domain-manager-console-ui.md b/ligbox-ops-platform/specs/035-ligbox-mail-bundles-foss-openpanel/domain-manager-console-ui.md new file mode 100644 index 0000000..8dd8d84 --- /dev/null +++ b/ligbox-ops-platform/specs/035-ligbox-mail-bundles-foss-openpanel/domain-manager-console-ui.md @@ -0,0 +1,444 @@ +# Spec 035-UI — Área Gerente de Domínio (Console único) + +**Criado:** 2026-06-21 +**Solicitado por:** Roger +**Status:** ✅ Decisões UX fixadas — ver [ligbox-console-shell.md](./ligbox-console-shell.md) +**URL canónica:** `https://console.ligbox.com.br/admin` (alias 301: `onboard.ligbox.com.br/admin`) +**Relacionado:** Spec **035** · **035-UX shell** · **010** · **034** · **024** · **037** ([dns-viewer.md](../037-dns-multi-cloudflare-orchestration/dns-viewer.md)) + +--- + +## 1. Decisão Roger (2026-06-21) + +| Agora (Fase A) | Depois (Fase B — estudo separado) | +|----------------|-----------------------------------| +| **Área Gerente de Domínio** — uma página/app única | **Área por utilizador de email** — cada caixa gere as suas próprias coisas | +| Gerente configura bundle, contas, quotas, Nextcloud, DMARC | Redirects, out-of-office, férias, assinaturas, calendário pessoal | +| Login: `admin@{dominio}` ou SSO FOSS | Login: `{user}@{dominio}` — self-service limitado | + +**Princípio:** o gerente **nunca** salta para FOSS, OpenPanel ou Nextcloud em modo «setup». Tudo converge num **cockpit Ligbox**. + +--- + +## 2. Três portais Ligbox — mesmo princípio de agregação + +Roger (2026-06-21): **três UIs** na **mesma shell** `console.ligbox.com.br` — design system React partilhado, tom caloroso BR (banco digital). + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ LIGBOX CONSOLE — console.ligbox.com.br │ +│ Login único · role detecta menu │ +├─────────────────────────────────────────────────────────────────┤ +│ /comercial + /ops Staff Ligbox (Fase C — depois gerente) │ +│ /admin Gerente domínio ← FASE A PRIORIDADE │ +│ /me Utilizador email (Fase B) │ +└─────────────────────────────────────────────────────────────────┘ +``` + +Ver shell completa: [ligbox-console-shell.md](./ligbox-console-shell.md) + +--- + +## 3. Onde vive a Área Gerente + +| Opção | Decisão | +|-------|---------| +| FOSS área cliente | ❌ Só billing embebido via API — não UI principal | +| OpenPanel user panel | ❌ Backend hub — não face visível | +| **Wizard SPA `/admin`** | ✅ **Escolhido** — evolui para `console.ligbox.com.br/admin` | +| Portal Ligbox novo | ❌ Evitar duplicar — **shell unificada** Spec 035-UX | + +**URL canónica:** `https://console.ligbox.com.br/admin` +**Redirect:** `https://onboard.ligbox.com.br/admin` → 301 console (legacy) + +### Mockup sandbox (seguro — zero produção) + +Ficheiro estático interactivo — **não liga a APIs**, estado só em memória do browser: + +``` +specs/035-ligbox-mail-bundles-foss-openpanel/mockups/domain-manager-sandbox.html +``` + +Abrir localmente: + +```bash +# no CT130 ou laptop +xdg-open /opt/ligbox-spec-hub/repos/ligbox-ops-platform/specs/035-ligbox-mail-bundles-foss-openpanel/mockups/domain-manager-sandbox.html +# ou servir estático (opcional): +python3 -m http.server 8765 --directory specs/035-ligbox-mail-bundles-foss-openpanel/mockups +# → http://localhost:8765/domain-manager-sandbox.html +``` + +Barra vermelha **SANDBOX** sempre visível. Acções (criar conta, remover, upgrade) mostram toast «simulado» — Carbonio, FOSS, OpenPanel e Nextcloud **não são tocados**. + +### Modo Live create-only (produção segura) + +O mesmo ficheiro HTML inclui botão **Live create-only**: + +| Modo | Comportamento | +|------|---------------| +| **Mock** | Zero API — UI only | +| **Live** | Desk API → VM112 cria domínio/contas **reais** | + +**Regras de segurança (API Desk):** + +- ✅ Criar cenário = domínio novo `cenario-*`.ops.ligbox.com.br` + `admin@` +- ✅ Adicionar contas **só** dentro do cenário criado +- ❌ **Delete/purge bloqueado** (HTTP 403) — nada existente apagado +- ❌ Domínios protegidos (`ligbox.com.br`, etc.) bloqueados +- ❌ Domínio que **já tem contas** não pode ser usado como cenário novo + +**API:** `POST /api/v1/domain-console/sandbox/scenarios` +**Auth:** JWT Desk (`ops_lead`, `super_admin`, `technician` com `manage_vm112_domains`) +**Deploy:** código em `projects/ops-desk/api/app/domain_console_sandbox*.py` — activar no VM122 + +**Login único:** sessão wizard (`/api/domain-admin/auth`) + opcional SSO desde FOSS (`sso_token`). + +--- + +## 4. Wireframe — página única (desktop) + +``` +╔══════════════════════════════════════════════════════════════════╗ +║ LIGBOX · Gerente de Domínio empresa.com.br [Sair] ║ +╠══════════════════════════════════════════════════════════════════╣ +║ ║ +║ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ║ +║ │ Plano │ │ Contas │ │ DMARC │ │ Faturação │ ║ +║ │ Business │ │ 12 / 25 │ │ ✅ Certificado│ │ Boleto/PIX │ ║ +║ │ R$ 549/mês │ │ │ │ SPF DKIM OK │ │ [Pagar] │ ║ +║ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ ║ +║ ║ +║ ┌─ Navegação lateral ─┐ ┌─ Conteúdo principal ──────────────┐ ║ +║ │ 📊 Visão geral │ │ │ ║ +║ │ 📧 Contas de email │ │ (secção activa — ver §5) │ ║ +║ │ 📁 Nextcloud / Files │ │ │ ║ +║ │ 🔐 Certificação mail │ │ │ ║ +║ │ 🌐 Domínio & DNS │ │ │ ║ +║ │ 💳 Plano & pagamento │ │ │ ║ +║ │ 🔗 Atalhos rápidos │ │ │ ║ +║ └──────────────────────┘ └────────────────────────────────────┘ ║ +║ ║ +╚══════════════════════════════════════════════════════════════════╝ +``` + +### Mobile +- Cards resumo empilhados +- Menu lateral → drawer hamburger +- Tabelas contas → cards por utilizador + +--- + +## 5. Secções da Área Gerente (Fase A) + +### 5.1 Visão geral + +| Widget | Fonte API | Acção | +|--------|-----------|-------| +| Plano activo + uso | Desk `bundle_entitlements` | — | +| Barra contas (12/25) | Wizard domain-admin | Link → Contas | +| DMARC score | EasyDMARC API | Link → Certificação | +| Disco mail domínio | Carbonio zmprov | — | +| Disco Files domínio | Nextcloud OCS | — | +| Últimas contas criadas | Wizard audit log | — | + +### 5.2 Contas de email + +**Tabela principal — tudo na mesma página, sem ir ao Carbonio Admin Console.** + +| Coluna | Editable | +|--------|----------| +| Email | criar nova | +| Nome | ✅ | +| Quota mail (GB) | ✅ (≤ bundle) | +| Quota Files (GB) | ✅ (≤ bundle) | +| Nextcloud activo | toggle | +| Estado | activo / suspenso | +| Acções | reset senha · editar · remover | + +**Botão «+ Nova conta»** → modal inline (não redirect): + +``` +Email: [ vendas ] @empresa.com.br +Nome: [ Vendas ] +Quota mail:[ 30 GB ▼ ] +Quota NC: [ 200 GB ▼ ] +☑ Criar Nextcloud Files +[ Cancelar ] [ Criar conta ] +``` + +**Backend:** Wizard `POST /api/domain-admin/accounts` → Carbonio + Nextcloud OCS (Spec 034). + +**Limite:** se `seats_used >= max_seats` → modal «Upgrade plano» (embed FOSS ou deep-link). + +#### Banner «Activar webmail» (Início `/admin` — Spec 043) + +Quando `gate.webmail_released === false`: + +``` +┌─ Activar webmail ─────────────────────────────────────────┐ +│ Webmail aguarda liberação formal pelo Gerente do Domínio. │ +│ [ Confirmar empresa ] [ Activar webmail + 2FA Ligbox ] │ +└───────────────────────────────────────────────────────────┘ +``` + +- Aviso no login Carbonio (rodapé) é **informativo** — não substitui este card. +- Ver contrato: [043 webmail-release-gate.md](../../043-desk-client-activation-sync/contracts/webmail-release-gate.md). + +### 5.3 Nextcloud / Files + +| Elemento | Comportamento | +|----------|---------------| +| **Toggle «Mail no Nextcloud»** | **ON/OFF por domínio** — default OFF (Roger 2026-06-21) | +| Resumo quota total domínio | soma quotas contas | +| Lista contas com quota Files | read-only espelho §5.2 | +| Coluna «Mail NC» | ✅ / — conforme toggle domínio + conta | +| Botão «Abrir Files do domínio» | nova tab `files.{dominio}` (SSO token NC) | +| Botão «Abrir webmail» | nova tab `mail.{dominio}` — **desactivado** até `webmail_released_at` ([043 webmail-release-gate](../../043-desk-client-activation-sync/contracts/webmail-release-gate.md)) | +| Política default novas contas | dropdown 100–500 GB | + +**UI toggle (domínio):** + +``` +Nextcloud / Files +───────────────────────────────────────── +☐ Activar Mail no Nextcloud (email dentro do Files) + Lê email via Carbonio — webmail mail.{dom} continua disponível + + Quando activo: novas contas recebem Mail app pré-configurado. + Quando inactivo: só Files — utilizadores usam mail.{dom} ou Outlook. +``` + +**Backend:** `PATCH /api/domain-admin/domains/{dom}/nextcloud-mail` → wizard → OCS + entitlements. + +**Nota:** gestão quota **na mesma app** — não enviar gerente ao painel admin Nextcloud. + +### 5.4 Certificação mail (EasyDMARC) + +| Item | UI | +|------|-----| +| SPF | ✅ / ⚠️ + texto simples | +| DKIM | ✅ / ⚠️ | +| DMARC | policy + score | +| Histórico 30 dias | gráfico simples | +| «O que significa?» | tooltip layman | + +**Sem** link para easydmarc.com — dados via API Ligbox (Desk proxy). + +### 5.5 Domínio & DNS (DNS Viewer — Spec 037-DNS-VIEWER) + +Secção **read-only** — gerente **vê** apontamentos; **não edita** na Console. Edição via link externo (Cloudflare cliente, OpenPanel, registrador). + +**Regra wizard (037):** + +| Escolha onboarding | O que esta secção mostra | +|--------------------|--------------------------| +| **Trazer DNS para Ligbox** | Apontamentos **que a Ligbox aplicou / vai aplicar** (MX, SPF, DKIM, DMARC, A mail) + NS Cloudflare | +| **DNS externo / BYO / registrador** | O que está **publicamente resolvido agora** + instruções se faltar algo | + +#### Layout `/admin/dominio` ou tab «Domínio & DNS» + +``` +┌─ DNS — empresa.com.br ─────────────────────────────────────────┐ +│ [Cloudflare Ligbox] 14 registos · 6 para e-mail │ +│ NS actuais: ada.ns.cloudflare.com … ✅ delegação Ligbox │ +├────────────────────────────────────────────────────────────────┤ +│ Função │ Nome │ Tipo │ Conteúdo │ Estado │ +│ MX │ empresa.com.br │ MX │ mail.empresa… │ ✅ OK │ +│ SPF │ empresa.com.br │ TXT │ v=spf1 include… │ ✅ OK │ +│ DKIM │ …._domainkey │ TXT │ v=DKIM1… │ ⚠ pendente│ +├────────────────────────────────────────────────────────────────┤ +│ Verificação pública: MX ✅ · SPF ✅ · DKIM ⚠ · DMARC ✅ │ +├────────────────────────────────────────────────────────────────┤ +│ Subdomínio incluído: intranet.empresa.com.br → CNAME … │ +│ [Ver instruções DNS] [Contactar suporte] [Actualizar] │ +└────────────────────────────────────────────────────────────────┘ +``` + +#### API + +**Desk (staff directo):** + +```http +GET /api/v1/dns/viewer/{domain} +Authorization: Bearer +Query: ?email_service=true&include_public=true +``` + +**Console gerente (proxy Desk — implementado V3):** + +```http +GET /api/v1/domain-console/dns/viewer/{domain} +Authorization: Bearer +Query: ?email_service=true&include_public=true +``` + +Frontend Console (`AdminDominio.jsx`) chama o proxy acima via API Desk (`console.ligbox.com.br` → VM122). +Implementação: `domain_console_routes.py` — filtra links CF Ligbox para gerente. + +Agrega CF / OpenPanel / público conforme `dns_mode`. Ver [dns-viewer.md](../037-dns-multi-cloudflare-orchestration/dns-viewer.md). + +#### Elementos UI + +| Item | Comportamento | +|------|---------------| +| Badge origem | `DNS Ligbox` · `Cloudflare sua conta` · `OpenPanel BIND` · `Registrador externo` | +| Tabela registos | Todas as linhas relevantes (mail + subdomínio bundle) | +| NS | Actuais (público) vs Ligbox CF (se aplicável) | +| Checks mail | MX/SPF/DKIM/DMARC — reutilizar Spec 009 / `public_checks` | +| Subdomínio incluído | Linha CNAME/A do bundle §2.4 — read-only ou link suporte | +| «Ver instruções DNS» | Modal com `dns/instructions` (modo externo) | +| «Editar DNS» | **Só se BYO/OpenPanel gerido pelo cliente** — nova tab | +| Modo Ligbox gerida | Sem link CF interna — «Alterações via suporte Ligbox» | + +#### Modo externo (exemplo copy) + +> O seu domínio usa DNS **fora da Ligbox**. Abaixo está o que os servidores públicos respondem **agora**. Para activar email, configure os valores em «Instruções DNS» no seu registrador. + +#### Modo Ligbox (exemplo copy) + +> A Ligbox gere o DNS deste domínio na Cloudflare. Apontamentos abaixo estão **activos** (ou **serão aplicados** após apontar os nameservers). + +#### Staff impersonate + +Staff Ligbox (Spec 027) em impersonate vê links adicionais «Editar na Cloudflare (staff)» — ocultos para gerente normal. + +**Critérios aceite (A4):** + +1. Gerente vê tabela completa mail sem abrir Cloudflare. +2. Domínio externo mostra estado público — **não** lista preview Ligbox. +3. Domínio Ligbox pré-NS mostra NS + registos planeados. +4. Zero botões «Apagar» / «Guardar registo» nesta secção. + +### 5.6 Plano, pagamento & upgrade + +| Elemento | Comportamento | +|----------|---------------| +| Plano actual | nome + preço + renovação | +| **Status pagamento** | Em dia · Aguardando · Vencido | +| **Boleto bancário** | botão «Gerar / Ver boleto» → PDF ou linha digitável (gateway via FOSS) | +| **PIX QR Code** | QR inline + copia-e-cola (gateway via FOSS) | +| Uso vs limites | barras visuais | +| «Upgrade plano» | iframe FOSS checkout **ou** API FOSS embed | +| Faturas recentes | lista 3 últimas via FOSS API | +| «Ver faturação completa» | abre FOSS cliente **nova tab** (única excepção externa) | + +**Regra Roger:** boleto + PIX **visíveis no `/admin`** — gerente não precisa caçar fatura noutro portal para pagar. + +**Backend:** Gateway (ASAAS/Iugu) → webhook FOSS → Desk → activa entitlements quando pago. + +### 5.7 Atalhos rápidos (sidebar footer) + +| Atalho | Destino | +|--------|---------| +| Webmail gerente | `mail.{dom}` nova tab | +| Files gerente | `files.{dom}` SSO | +| Suporte Ligbox | Desk ticket (email gerente) | + +--- + +## 6. Integrações invisíveis (backend) + +O gerente vê **uma app**. Por baixo: + +``` +Domain Manager SPA (console.ligbox.com.br/admin) + │ + ├── Wizard API /api/domain-admin/* → Carbonio CRUD + ├── Desk API /api/v1/domain-console/* → entitlements, DMARC, FOSS proxy + ├── Nextcloud OCS (via wizard proxy) → quotas Files, activar/desactivar + ├── FOSS API (via Desk proxy) → faturação, plano, upgrade + └── Gateway pagamento (via FOSS) → boleto + PIX QR +``` + +**OpenPanel:** zero UI exposta ao gerente — só provision backend (Spec 035 §4.1). + +--- + +## 7. Autenticação + +### 7.1 Login directo + +``` +POST /api/domain-admin/login +{ "email": "admin@empresa.com.br", "password": "..." } +→ JWT session (domínio no claim) +``` + +### 7.2 SSO desde FOSS (pós-compra) + +``` +FOSS cliente → «Abrir Console Gerente» +→ Desk POST /api/v1/domain-console/sso-token +→ redirect onboard.ligbox.com.br/admin?sso=TOKEN +→ wizard valida → sessão +``` + +### 7.3 Quem pode entrar + +| Email | Acesso Área Gerente | +|-------|---------------------| +| `admin@{dom}` | ✅ sempre | +| `administrator@{dom}` | ✅ se flag Carbonio | +| Outros `@dom` | ❌ → Fase B (self-service user) | +| Staff Ligbox Desk | ✅ impersonate auditado (Spec 027) | + +--- + +## 8. Fase B — Área Utilizador Email (placeholder) + +**Status:** 📋 A estudar — **não implementar na Fase A** + +Cada `{user}@{dominio}` terá portal **separado** e **limitado**: + +| Funcionalidade | Carbonio nativo | UI Ligbox proposta | +|----------------|-----------------|-------------------| +| Redirects / encaminhamento | sieve / prefs | Secção «O meu email» | +| Out of office / férias | vacation | Form datas + mensagem | +| Assinatura | prefs | Editor HTML simples | +| Calendário | CalDAV | Link ou embed leve | +| Alterar senha | ✅ | Form | +| Quota pessoal | read-only | Barra uso | +| Criar contas domínio | ❌ | Só gerente | + +**URL proposta Fase B:** `https://mail.{dominio}/settings` ou `onboard.ligbox.com.br/me` + +**Decisão pendente Roger:** webmail Carbonio prefs nativas vs SPA Ligbox custom. + +Documento futuro: `user-self-service-ui.md` (Spec 036 ou § Fase B desta spec). + +--- + +## 9. Fases de entrega UI + +| Fase | Entregável | Prioridade | +|------|------------|------------| +| **A1** | Shell SPA + login + cards resumo | P0 | +| **A2** | CRUD contas + quotas inline | P0 | +| **A3** | Nextcloud quota + toggle Mail opcional + atalho Files SSO | P1 | +| **A4** | EasyDMARC card + **DNS Viewer** (`/admin/dominio`) | P1 | +| **A5** | FOSS plano/faturação embed | P2 | +| **B*** | Self-service utilizador email | P2 futuro | + +--- + +## 10. Critérios de aceite (Fase A) + +1. Gerente entra **só** em `onboard.ligbox.com.br/admin` — gere contas **sem** abrir Carbonio Admin Console. +2. Criar conta `vendas@` + quota NC → funcional em **um modal**, ≤3 cliques. +3. Resumo plano + 12/25 contas visível no dashboard. +4. DMARC status legível (não técnico). +5. Utilizador `vendas@` **não** acede `/admin` — redirect para webmail ou 403. +6. Mobile: criar conta e ver resumo utilizável. + +--- + +## 11. Referências + +| Doc | Path | +|-----|------| +| Bundles comercial | `spec.md` | +| Domain Admin actual | Spec 010 · VM112 `DomainAdmin.jsx` | +| Nextcloud OCS | `../034-.../contracts/nextcloud-provisioning-api.md` | +| RBAC gerente | Spec 027 § client_domain_admin (a formalizar) | +| **DNS Viewer (read-only)** | [037 dns-viewer.md](../037-dns-multi-cloudflare-orchestration/dns-viewer.md) | diff --git a/ligbox-ops-platform/specs/043-desk-client-activation-sync/SESSION-CHECKPOINT.md b/ligbox-ops-platform/specs/043-desk-client-activation-sync/SESSION-CHECKPOINT.md new file mode 100644 index 0000000..1a62d60 --- /dev/null +++ b/ligbox-ops-platform/specs/043-desk-client-activation-sync/SESSION-CHECKPOINT.md @@ -0,0 +1,92 @@ +# SESSION-CHECKPOINT — Spec 043 — Desk Client Activation Sync + +> **Handoff entre agentes/sessões Cursor.** Ler **antes** de actuar. Actualizar **antes** de sair. + +--- + +## Estado + +| Campo | Valor | +|-------|-------| +| **Status** | `in_progress` (E2E activate OK; webmail gate UI pendente) | +| **Última actualização** | 2026-07-01 | +| **Agente / sessão** | Obsidian sync webmail gate + Spec 044 chat bruto | +| **Prioridade** | P1 (UI Activar webmail DomainAdmin.jsx) | + +--- + +## Objetivo (1 linha) + +Wizard → Desk Activar conta → FOSS → OpenPanel → Odoo → mail-bundle VM112. + +--- + +## Feito + +- [x] Produto FOSS `ligbox-mail-business` + catálogo 20 pacotes (ids 1–21, preços 1M) +- [x] Código mail-bundle VM112 (`internal/provision/mail-bundle`) +- [x] `OPS_INTERNAL_TOKEN` sincronizado VM122 → VM112 `.env` + restart wizard +- [x] mail-bundle dratcoin.com provisionado (mail.dratcoin.com, 25 seats) +- [x] Desk Spec 043 redeployed no container VM122 (`docker cp` + restart) +- [x] E2E Roger: `POST /api/v1/billing/accounts/2/activate` → `billing_active` + - OpenPanel: `dratcoix` (reused) + - Odoo partner #9 (reused) + - Wizard mail-bundle: HTTP 200, `already_provisioned: true` +- [x] Script `configure-foss-catalog-pricing.sh` no repo +- [x] `foss-products.md` actualizado com IDs reais +- [x] Contrato `contracts/webmail-release-gate.md` + chat bruto Spec 043/044 +- [x] Spec 044 documentada (tickets FOSS↔Desk) +- [x] Sync Obsidian VM130 + Spec Driver refresh + +--- + +## Residual / follow-up + +1. **FOSS `create_client`** — `client_id: null` apesar de `created: true`; investigar API admin client/create +2. **Deploy permanente VM122** — rebuild imagem Docker (código ainda via `docker cp`, não bake na imagem) +3. **Custom fields FOSS** — activar módulo Formbuilder e associar domain/manager_email aos produtos mail +4. **`foss_order_id`** — null no mail-bundle até FOSS order funcionar +5. **UI Painel Admin** — banner + card «Activar webmail» em `DomainAdmin.jsx` (backend gate OK) + +--- + +## Smoke tests (validados 2026-07-01) + +```bash +# mail-bundle GET (VM112) +curl -s -H "X-Ops-Internal-Token: $OPS_INTERNAL_TOKEN" \ + http://10.10.10.112:8090/api/internal/provision/mail-bundle/dratcoin.com + +# Desk activate +curl -s -X POST http://10.10.10.122:8080/api/v1/billing/accounts/2/activate \ + -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \ + -d '{"plan_code":"ligbox-mail-business","manager_email":"001@dratcoin.com"}' + +# FOSS pricing +curl -s -X POST "https://financeiro.ligbox.com.br/api/admin/product/get_list" \ + -u "admin:$FOSS_TOKEN" -d '{"per_page":5,"slug":"ligbox-mail-business"}' +``` + +--- + +## Referências + +| Item | Path | +|------|------| +| tasks.md | `./tasks.md` | +| Catálogo 20 | `../035-ligbox-mail-bundles-foss-openpanel/LIGBOX-CATALOG-20.md` | +| mail-bundle API | `./contracts/mail-bundle-api.md` | +| webmail gate | `./contracts/webmail-release-gate.md` | +| chat bruto | `../../chat-bruto/CHAT_BRUTO_WEBMAIL_GATE_TICKETS_SPEC043_044_20260701.txt` | +| Conta teste | dratcoin.com billing #2 | + +--- + +## Histórico de sessões + +| Data | Agente | Resumo | +|------|--------|--------| +| 2026-07-01 | A | E2E parcial; webhooks; protocolo handoff | +| 2026-07-01 | B | FOSS product + mail-bundle código/deploy VM112 | +| 2026-07-01 | C | Pricing 20 pacotes; token VM112; E2E activate dratcoin OK | +| 2026-07-01 | D | Webmail gate contrato; Spec 044; Obsidian sync | diff --git a/ligbox-ops-platform/specs/043-desk-client-activation-sync/contracts/webmail-release-gate.md b/ligbox-ops-platform/specs/043-desk-client-activation-sync/contracts/webmail-release-gate.md new file mode 100644 index 0000000..8266d29 --- /dev/null +++ b/ligbox-ops-platform/specs/043-desk-client-activation-sync/contracts/webmail-release-gate.md @@ -0,0 +1,148 @@ +# Contrato — Liberação formal webmail (`company_gate`) + +**Spec:** [043](../spec.md) · [023](../../023-billing-recurrence-desk-visibility/spec.md) · [035 domain-manager](../../035-ligbox-mail-bundles-foss-openpanel/domain-manager-console-ui.md) +**VM:** 112 (`company_gate.py`, `DomainAdmin.jsx`) +**Versão:** 1.0 · 2026-07-01 · Roger +**Status:** Backend ✅ · UI Painel Admin ⏳ pendente + +**Chat bruto:** [CHAT_BRUTO_WEBMAIL_GATE_TICKETS_SPEC043_044_20260701.txt](../../../chat-bruto/CHAT_BRUTO_WEBMAIL_GATE_TICKETS_SPEC043_044_20260701.txt) + +--- + +## 1. Duas camadas de «activar webmail» + +| Camada | O quê | Quem | Flag / API | +|--------|-------|------|------------| +| **A — Infra** | Traefik, cert LE, SNI, HTTPS `mail.{dom}` | Sistema automático | `infrastructure.ready` | +| **B — Gate formal** | Gerente confirma empresa + libera webmail (2FA Ligbox) | Gerente domínio | `webmail_released_at` | + +**Regra:** camada A não remove aviso da camada B. Login Carbonio pode funcionar antes da liberação formal — aviso é informativo. + +--- + +## 2. Onde fica cada mensagem (decisão Roger 2026-07-01) + +| Superfície | Mensagem | Tipo | +|------------|----------|------| +| **Login Carbonio** `mail.{dom}` | Rodapé: *«Aviso: ambiente operacional — aguarda activação formal pelo Gerente do Domínio no Painel Ligbox…»* | Informativo (não bloqueia) | +| **Wizard** passo Concluído | *«Conta criada — webmail em activação»* (infra pendente) | Técnico | +| **Wizard** `WebmailReleaseModal` | Confirmar empresa + liberar com 2FA | Acção gerente (onboarding) | +| **Painel Admin** `/admin` **Início** | Banner P0 + card «Activar webmail» | Acção gerente (**UI falta**) | +| **Painel Admin** Contas / Resumo | Badge `WEBMAIL ⏳` / `WEBMAIL ✓` | Estado secundário | +| **Sidebar** «Abrir Webmail» | Desactivado até `webmail_released_at` | Evita 502/confusão | + +**Não colocar** a acção de liberar só no rodapé do Carbonio — utilizador final vê aviso; **gerente actua no Painel Ligbox**. + +--- + +## 3. Fluxo backend (VM112) + +``` +Onboarding concluído + → domain_registry (sem webmail_released_at) + → sync_webmail_user_notice() → Carbonio login footer + +Gerente confirma empresa + → POST /api/domain-admin/gate/company-profile + → company_profile_confirmed_at + → webhook company.validated → Desk (Spec 043) + +Gerente libera webmail (2FA Ligbox) + → POST /api/domain-admin/gate/release-webmail + → webmail_released_at + → sync_webmail_user_notice() limpa aviso + → webhook webmail.released → Desk +``` + +### Ficheiros VM112 + +| Ficheiro | Função | +|----------|--------| +| `backend/app/services/company_gate.py` | Gate, mensagens, webhooks | +| `backend/app/routers/domain_admin.py` | `/gate/status`, `/gate/company-profile`, `/gate/release-webmail` | +| `backend/app/services/webmail_pending_page.py` | Página pública aguardando liberação | +| `frontend/src/components/WebmailReleaseModal.jsx` | Modal wizard (onboarding) | +| `frontend/src/DomainAdmin.jsx` | Painel gerente — **falta UI gate** | + +### Constantes (`company_gate.py`) + +```python +PENDING_WEBMAIL_USER_DESCRIPTION = ( + "Aviso: ambiente operacional — aguarda activação formal pelo Gerente do Domínio " + "no Painel Ligbox. Utilização de correio permitida." +) +``` + +Injectado via `carbonio.set_domain_web_ui_notice()`. + +--- + +## 4. API Painel Admin + +### `GET /api/domain-admin/gate/status` + +```json +{ + "domain": "dratcoin.com", + "needs_company_confirm": false, + "webmail_released": false, + "service_active": false, + "webmail_url": "https://mail.dratcoin.com/", + "ops_ticket_state": "awaiting_billing_validation", + "pending_message": "Este webmail aguarda activação pelo Administrador do domínio..." +} +``` + +### `POST /api/domain-admin/gate/release-webmail` + +```json +{ + "ligbox_login": "roger", + "totp_code": "123456", + "recovery_code": null +} +``` + +**Pré-requisitos:** `company_profile_confirmed_at` preenchido; 2FA portal user válido. + +--- + +## 5. Webhooks Desk + +| Evento | Quando | +|--------|--------| +| `company.validated` | Após confirmar perfil empresa | +| `webmail.released` | Após `release_webmail()` | + +Desk: `FUNNEL_STAGE` rank 8 = `webmail_released` (`main.py` VM122). + +--- + +## 6. UI pendente — Painel Admin (`DomainAdmin.jsx`) + +Wireframe **Início** (`/admin`): + +``` +┌─ Activar webmail ─────────────────────────────────────┐ +│ Empresa: ⏳ confirmar | Webmail: ⏳ aguarda liberação │ +│ [ Confirmar dados empresa ] [ Activar webmail + 2FA ] │ +└─────────────────────────────────────────────────────────┘ +``` + +Reutilizar lógica de `WebmailReleaseModal.jsx` + `me.gate` da API `/me`. + +--- + +## 7. Caso dratcoin.com (Roger 2026-07-01) + +- Login `mail.dratcoin.com` mostra aviso no rodapé ✅ (esperado) +- Erro *Credentials are not valid* = senha/email incorrectos (separado do gate) +- Painel `/admin` não mostra card liberar — **gap UI** + +--- + +## Histórico + +| Versão | Data | Notas | +|--------|------|-------| +| 1.0 | 2026-07-01 | Decisão UX mensagens + mapa company_gate | diff --git a/ligbox-ops-platform/specs/043-desk-client-activation-sync/spec.md b/ligbox-ops-platform/specs/043-desk-client-activation-sync/spec.md index 2ffcf7b..07d23cc 100644 --- a/ligbox-ops-platform/specs/043-desk-client-activation-sync/spec.md +++ b/ligbox-ops-platform/specs/043-desk-client-activation-sync/spec.md @@ -18,7 +18,9 @@ Esta spec **unifica e documenta** o mapeamento de dados desde o card **«Dados d O Desk (VM122) é o **orquestrador**: recebe `company.validated`, persiste `billing_accounts`, e expõe acção staff **«Activar conta»** que dispara a sequência documentada. -**Documento mestre de campos:** [contracts/activation-field-mapping.md](./contracts/activation-field-mapping.md) +**Documento mestre de campos:** [contracts/activation-field-mapping.md](./contracts/activation-field-mapping.md) +**Liberação webmail (gate):** [contracts/webmail-release-gate.md](./contracts/webmail-release-gate.md) +**Chat bruto:** [CHAT_BRUTO_WEBMAIL_GATE_TICKETS_SPEC043_044_20260701.txt](../../chat-bruto/CHAT_BRUTO_WEBMAIL_GATE_TICKETS_SPEC043_044_20260701.txt) --- @@ -100,6 +102,17 @@ O Desk (VM122) é o **orquestrador**: recebe `company.validated`, persiste `bill 4. **Odoo** recebe a **empresa** para gestão financeira (`res.partner`). 5. Um **gerente** por domínio: `admin@{domínio}` + `manager_name` / `manager_email`. 6. Staff activa após revisão OPS — não automático sem RBAC ([027](../027-desk-rbac-function-matrix/spec.md)). +7. **Liberação formal webmail** pelo Gerente no Painel `/admin` (`webmail_released_at`) — ver [webmail-release-gate.md](./contracts/webmail-release-gate.md). + +--- + +## Decisões / Histórico + +| Data | Decisão | +|------|---------| +| 2026-07-01 | FOSS order + mail-bundle VM112 deployados (product_id=3) | +| 2026-07-01 | Aviso Carbonio login = informativo; acção liberar no Painel Admin (UI pendente) | +| 2026-07-01 | Spec 044 tickets FOSS↔Desk documentada | --- diff --git a/ligbox-ops-platform/specs/043-desk-client-activation-sync/tasks.md b/ligbox-ops-platform/specs/043-desk-client-activation-sync/tasks.md index 28ac07e..f7f762d 100644 --- a/ligbox-ops-platform/specs/043-desk-client-activation-sync/tasks.md +++ b/ligbox-ops-platform/specs/043-desk-client-activation-sync/tasks.md @@ -12,7 +12,7 @@ - [x] `GET /billing/accounts/{id}/activation-preview` - [x] Botão **Activar conta** em `billing-ui.js` (só roles autorizados) - [x] Modal confirmação com 3 colunas FOSS / OpenPanel / Odoo -- [ ] Deploy VM122 + validação Roger (teste manual) +- [x] Deploy VM122 + validação Roger (teste manual) ## Fase 2 — FOSS client + order - [x] `foss_client.create_client()` conforme mapa §4 @@ -46,4 +46,12 @@ ## Fase 6 — Testes - [x] Unit: `test_activation_mapper_043.py` (3) - [x] Unit: `test_client_activation_043.py` (4) — happy path, idempotência FOSS, reject active -- [ ] E2E Roger: domínio teste wizard → activate → FOSS+OP+Odoo +- [x] E2E Roger: domínio teste wizard → activate → FOSS+OP+Odoo (dratcoin.com #2, 2026-07-01) + +## Fase 7 — Webmail gate (company_gate) +- [x] Contrato `contracts/webmail-release-gate.md` +- [x] Backend VM112 `company_gate.py` + API `/gate/*` +- [x] Aviso rodapé login Carbonio (`sync_webmail_user_notice`) +- [x] `WebmailReleaseModal.jsx` no wizard onboarding +- [ ] UI Painel Admin: banner + card «Activar webmail» em `DomainAdmin.jsx` +- [ ] Desactivar «Abrir Webmail» sidebar até `webmail_released_at` diff --git a/ligbox-ops-platform/specs/044-foss-desk-ticket-sync/spec.md b/ligbox-ops-platform/specs/044-foss-desk-ticket-sync/spec.md index f1225aa..10521fe 100644 --- a/ligbox-ops-platform/specs/044-foss-desk-ticket-sync/spec.md +++ b/ligbox-ops-platform/specs/044-foss-desk-ticket-sync/spec.md @@ -24,6 +24,8 @@ Esta spec define a **ponte bidireccional** Desk ↔ FOSS, preservando o portal w - [ticket-field-mapping.md](./contracts/ticket-field-mapping.md) — chaves de correlação - [ticket-sync-api.md](./contracts/ticket-sync-api.md) — webhooks e endpoints API +**Chat bruto:** [CHAT_BRUTO_WEBMAIL_GATE_TICKETS_SPEC043_044_20260701.txt](../../chat-bruto/CHAT_BRUTO_WEBMAIL_GATE_TICKETS_SPEC043_044_20260701.txt) + --- ## Specs relacionadas diff --git a/ligbox-ops-platform/specs/SPEC-REGISTRY.md b/ligbox-ops-platform/specs/SPEC-REGISTRY.md index 1e06240..1d608fd 100644 --- a/ligbox-ops-platform/specs/SPEC-REGISTRY.md +++ b/ligbox-ops-platform/specs/SPEC-REGISTRY.md @@ -7,7 +7,7 @@ | **040** | **`040-desk-design-system-v013/`** | **UserWizard + Access Control Hub + Governance API** | **0.13.1-ac-hub-ui-aprovado-roger** | | **041** | **`041-desk-operational-feed/`** | **Central Operacional (ex-Mensagens) + ops-inbox API** | **0.13.0** | | **042** | **`042-ligbox-nettools-portal/`** | **NetTools — 23 ferramentas OSS em nettools.ligbox.com.br** | — | -| **043** | **`043-desk-client-activation-sync/`** | **Mapa campos Wizard→Desk→FOSS→OpenPanel→Odoo + API Activar conta** | — | +| **043** | **`043-desk-client-activation-sync/`** | **Mapa campos Wizard→Desk→FOSS→OpenPanel→Odoo + API Activar conta + webmail gate** | — | | **044** | **`044-foss-desk-ticket-sync/`** | **Sync tickets Portal OB- ↔ Desk ↔ FOSS Support** | — | Atualizado: 2026-07-01 · Roger · Spec 044 sync tickets FOSS/portal