# Contrato — Mapeamento IDs: Portal ↔ Desk ↔ FOSS

**Spec:** [044](../spec.md)  
**Versão:** 1.0 · 2026-07-01 · Roger  
**Status:** Fonte única para correlação de tickets  

---

## 1. Identificadores

| Campo | Formato | Sistema dono | Persistência Desk |
|-------|---------|--------------|-------------------|
| `wizard_ticket_id` | `OB-[A-F0-9]{8}` | VM112 portal | `tickets.payload.wizard_ticket_id` |
| `desk_ticket_id` | inteiro `#N` | VM122 Desk | `tickets.id` |
| `foss_ticket_id` | inteiro FOSS | VM123 FOSS | `tickets.payload.foss_ticket_id` |
| `external_customer_id` | inteiro FOSS client | VM123 FOSS | `billing_accounts.external_customer_id` |
| `session_id` | UUID wizard | VM112 | `tickets.session_id` |
| `domain` | FQDN | — | `tickets.payload.domain` |

---

## 2. Chaves de idempotência

| Operação | Chave única | Comportamento se duplicado |
|----------|-------------|----------------------------|
| Portal → Desk | `event + session_id + domain` | Actualizar ticket existente (Spec 001 FR-012) |
| Desk → FOSS espelho | `desk_ticket_id` | Retornar `foss_ticket_id` existente |
| FOSS → Desk webhook | `foss_ticket_id + event_type` | Append nota, não criar ticket novo |
| Cliente FOSS novo | `foss_ticket_id` | Lookup Desk; criar só se ausente |

---

## 3. Mapa de estados

| Desk `status` | Portal OB- `status` | FOSS Support |
|---------------|---------------------|--------------|
| `open` | `open` | `open` |
| `escalated` | `in_review` | `open` |
| `assisting` | `in_progress` | `on hold` |
| `resolved` | `resolved` | `closed` (resolvido) |
| `closed` | `closed` | `closed` |

**Regra:** Desk é master para ops; FOSS é master para visibilidade cliente billing.

---

## 4. Payload Desk (`tickets.payload` — extensão Spec 044)

```json
{
  "event": "onboarding.escalated",
  "domain": "empresa.com.br",
  "session_id": "331b4022-70a5-4a9d-ba3e-08aaa06cb4f4",
  "data": {
    "wizard_ticket_id": "OB-D424843A",
    "client_note": "DNS não propaga",
    "reason": "client_support_request"
  },
  "foss_sync": {
    "foss_ticket_id": 42,
    "external_customer_id": 17,
    "synced_at": "2026-07-01T18:00:00Z",
    "last_foss_event": "ticket.reply",
    "foss_url": "https://financeiro.ligbox.com.br/admin/support/ticket/42"
  }
}
```

---

## 5. Pré-requisitos para espelho FOSS

| Condição | Obrigatório |
|----------|-------------|
| `billing_accounts.external_customer_id` | Sim (Spec 043) |
| Ticket Desk com `domain` | Sim |
| Role staff a criar espelho | `sales_admin`, `sales_support`, `technician`, `ops_lead` |
| Onboarding puro (sem FOSS client) | Espelho **adiado** até Activar conta |

---

## 6. URLs deep-link

| Destino | URL |
|---------|-----|
| Desk ticket | `https://desk.ligbox.com.br/#ticket/{desk_ticket_id}` |
| Portal OB- tracking | `https://onboard.ligbox.com.br/onboard?session={session_id}&ticket={wizard_ticket_id}` |
| FOSS admin ticket | `https://financeiro.ligbox.com.br/admin/support/ticket/{foss_ticket_id}` |
| FOSS client ticket | `https://financeiro.ligbox.com.br/support/ticket/{foss_ticket_id}` |

---

## Histórico

| Versão | Data | Autor | Notas |
|--------|------|-------|-------|
| 1.0 | 2026-07-01 | Roger / Cursor | Documento inicial Spec 044 |
