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>
This commit is contained in:
parent
4e65555abb
commit
d5b26a55f0
11 changed files with 755 additions and 4 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
@ -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)
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 <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) |
|
||||
|
|
@ -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 |
|
||||
|
|
@ -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 |
|
||||
|
|
@ -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 |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -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`
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue