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