obsidian-vault/ligbox-ops-platform/specs/035-ligbox-mail-bundles-foss-openpanel/domain-manager-console-ui.md
Ligbox Obsidian Vault d5b26a55f0 sync obsidian: spec 043 webmail gate + chat bruto 043/044
Espelho VM130 das decisões webmail gate, contratos, VM112 e índice chat bruto.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-01 19:35:39 +00:00

444 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 100500 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 <staff JWT>
Query: ?email_service=true&include_public=true
```
**Console gerente (proxy Desk — implementado V3):**
```http
GET /api/v1/domain-console/dns/viewer/{domain}
Authorization: Bearer <domain-admin JWT>
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) |