> For the complete documentation index, see [llms.txt](https://doc.sysdevmobile.com/mss-extensibility/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://doc.sysdevmobile.com/mss-extensibility/mss-5.1/myteam/menu-extensibility.md).

# Menu Extensibility

MSS 5.1 - Extensibility - myTeam - Menu Extensibility

Exemplos práticos de payloads para a **extensibilidade de menu** — entradas personalizadas na barra lateral de navegação.

### Contexto

Quando o utilizador clica numa entrada de menu de extensibilidade, o myTeam navega para uma página interna e envia um POST ao URL configurado. A autenticação do utilizador é enviada no campo `authentication` do payload, e o campo `filter` é sempre um objeto vazio.

O serviço externo identifica o utilizador através das credenciais recebidas e pode consultar a tabela `MSUSR` da base de dados do myTeam para obter qualquer informação adicional (nome, código de vendedor, etc.).

### Payload

URL configurado:

```
https://parceiro.exemplo.com/painel
```

```
{
  "authentication": {
    "user": "admin",
    "hash": "a1b2c3d4e5f6..."
  },
  "filter": {}
}

O campo `filter` é sempre enviado como objeto vazio `{}` na extensibilidade de menu. 
A identificação do utilizador é feita exclusivamente pelo campo `authentication`.
```

````json
## Exemplo de Resposta

O serviço externo deve devolver uma página HTML completa. Exemplo de um painel personalizado:

```html
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <style>
        body { font-family: sans-serif; margin: 0; padding: 24px; color: #333; background: #fafafa; }
        h2 { color: #1B5E20; margin-bottom: 8px; }
        .subtitle { color: #787878; font-size: 14px; margin-bottom: 24px; }
        .grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
        .card { background: #fff; border: 1px solid #e0e0e0; border-radius: 8px; padding: 20px; }
        .card .value { font-size: 28px; font-weight: 700; color: #2E7D32; }
        .card .label { font-size: 13px; color: #787878; margin-top: 4px; }
    </style>
</head>
<body>
    <h2>Painel do Vendedor</h2>
    <div class="subtitle">Utilizador: admin</div>
    <div class="grid">
        <div class="card">
            <div class="value">47</div>
            <div class="label">Clientes visitados</div>
        </div>
        <div class="card">
            <div class="value">€ 85.200</div>
            <div class="label">Vendas do mês</div>
        </div>
        <div class="card">
            <div class="value">12</div>
            <div class="label">Encomendas pendentes</div>
        </div>
    </div>
</body>
</html>
````

### Fluxo

```
Utilizador clica na entrada de menu "Painel do Vendedor"
    │
    ▼
myTeam navega para página de container interna
    │
    ▼
JavaScript envia POST ao URL configurado
    │  URL: https://parceiro.exemplo.com/painel
    │  payload: { authentication: { user: "admin", hash: "..." }, filter: {} }
    ▼
Serviço externo valida autenticação
    │
    ▼
Consulta MSUSR para obter dados do utilizador (nome, vendedor, etc.)
    │
    ▼
Processa dados de negócio
    │
    ▼
Devolve HTML (status 200)
    │
    ▼
Conteúdo apresentado em iframe de ecrã inteiro
```

{% hint style="info" %}
A página de menu extensibility ocupa o ecrã inteiro dentro do myTeam (exceto barra lateral e cabeçalho). O HTML devolvido deve ser pensado para ocupar todo o espaço disponível.O serviço externo tem acesso de leitura à base de dados do myTeam. Após validar a autenticação, pode consultar a tabela `MSUSR` (campo `USRUSR` = `authentication.user`) para obter o nome do utilizador (`USRNOM`), código de vendedor (`USRVND`) e quaisquer outros dados necessários.O acesso à entrada de menu é protegido por permissões. Mesmo que um utilizador conheça o URL direto, o myTeam valida as permissões e redireciona para a página "Não Autorizado" se o utilizador não tiver acesso.
{% endhint %}
