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:
Ligbox Obsidian Vault 2026-07-01 19:35:39 +00:00
parent 4e65555abb
commit d5b26a55f0
11 changed files with 755 additions and 4 deletions

View file

@ -212,6 +212,7 @@
- [activation-field-mapping.md](specs/043-desk-client-activation-sync/contracts/activation-field-mapping.md) — **fonte única** - [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) - [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) - [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 - **044-foss-desk-ticket-sync** ⭐ Portal OB- ↔ Desk ↔ FOSS Support
- [📄 spec.md](specs/044-foss-desk-ticket-sync/spec.md) - [📄 spec.md](specs/044-foss-desk-ticket-sync/spec.md)
- [tasks.md](specs/044-foss-desk-ticket-sync/tasks.md) - [tasks.md](specs/044-foss-desk-ticket-sync/tasks.md)

View file

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

View file

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

View file

@ -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`. **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 ## Integração
- **→ VM122:** webhooks `onboarding.*` · Assist/takeover API - **→ VM122:** webhooks `onboarding.*` · Assist/takeover API

View file

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

View file

@ -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 121, 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 |

View file

@ -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 |

View file

@ -19,6 +19,8 @@ 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. 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`). 4. **Odoo** recebe a **empresa** para gestão financeira (`res.partner`).
5. Um **gerente** por domínio: `admin@{domínio}` + `manager_name` / `manager_email`. 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)). 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 |
--- ---

View file

@ -12,7 +12,7 @@
- [x] `GET /billing/accounts/{id}/activation-preview` - [x] `GET /billing/accounts/{id}/activation-preview`
- [x] Botão **Activar conta** em `billing-ui.js` (só roles autorizados) - [x] Botão **Activar conta** em `billing-ui.js` (só roles autorizados)
- [x] Modal confirmação com 3 colunas FOSS / OpenPanel / Odoo - [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 ## Fase 2 — FOSS client + order
- [x] `foss_client.create_client()` conforme mapa §4 - [x] `foss_client.create_client()` conforme mapa §4
@ -46,4 +46,12 @@
## Fase 6 — Testes ## Fase 6 — Testes
- [x] Unit: `test_activation_mapper_043.py` (3) - [x] Unit: `test_activation_mapper_043.py` (3)
- [x] Unit: `test_client_activation_043.py` (4) — happy path, idempotência FOSS, reject active - [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`

View file

@ -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-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 - [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 ## Specs relacionadas

View file

@ -7,7 +7,7 @@
| **040** | **`040-desk-design-system-v013/`** | **UserWizard + Access Control Hub + Governance API** | **0.13.1-ac-hub-ui-aprovado-roger** | | **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** | | **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** | — | | **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** | — | | **044** | **`044-foss-desk-ticket-sync/`** | **Sync tickets Portal OB- ↔ Desk ↔ FOSS Support** | — |
Atualizado: 2026-07-01 · Roger · Spec 044 sync tickets FOSS/portal Atualizado: 2026-07-01 · Roger · Spec 044 sync tickets FOSS/portal