> For the complete documentation index, see [llms.txt](https://docs.digibee.com/documentation/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.digibee.com/documentation/connectors-and-triggers/pt-br/connectors/enterprise-applications/dynamics-365-finance-and-operations.md).

# Dynamics 365 Finance & Operations

O conector **Dynamics 365 Finance & Operations** permite integrações com o [Microsoft Dynamics 365 Finance & Operations](https://learn.microsoft.com/en-us/dynamics365/fin-ops-core/) (F\&O), também conhecido como Finance and Supply Chain Management.

Ele lê e grava as **OData data entities** públicas do app, como `CustomersV3`, `VendorsV2`, `SalesOrderHeadersV2` e `ReleasedProductsV2`. As operações suportadas incluem CRUD, query options, bound e unbound actions e functions, acesso cross-company e `$batch`.

É uma especialização da integração OData genérica, usando o service root `/data`, chaves compostas `dataAreaId` e autenticação Azure AD (Azure Key). As entidades são descobertas automaticamente a partir do `$metadata` do ambiente, e o acesso cross-company é suportado.

{% hint style="info" %}

#### **Qual conector Dynamics devo usar?**

Use o **Dynamics 365 Finance & Operations** para Finance and Supply Chain (`*.operations.dynamics.com`, entidades `/data`). Use o [**Dynamics 365**](/documentation/connectors-and-triggers/pt-br/connectors/enterprise-applications/dynamics-365.md) para Customer Engagement, Dataverse e CRM (`*.crm.dynamics.com`, `/api/data/v9.x`). Use o conector [**OData**](/documentation/connectors-and-triggers/pt-br/connectors/web-protocols/odata.md) genérico para qualquer outro serviço OData.
{% endhint %}

## **Configure a autenticação (Azure AD)**

O conector autentica como um **service principal** do Azure AD (OAuth 2.0 client credentials). Essa configuração é feita apenas uma vez. Veja abaixo os passos relevantes para a Digibee. Para os cliques exatos no portal, siga a documentação vinculada da Microsoft, já que a interface deles muda com o tempo.

1. **Registre um app** no Microsoft Entra ID. No Entra admin center, acesse **App registrations** e depois **New registration**. Copie o **Application (client) ID** e o **Directory (tenant) ID**. Consulte [Register an application](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app) para o procedimento completo.
2. **Crie um client secret.** Acesse **Certificates & secrets**, depois **Client secrets** e **New client secret**. Copie o **value** do secret imediatamente, pois ele só é exibido uma vez. Consulte [Add and manage app credentials](https://learn.microsoft.com/en-us/entra/identity-platform/how-to-add-credentials) para o procedimento completo.
3. **Conceda acesso ao app dentro do Finance & Operations.** No app F\&O, acesse **System administration**, depois **Setup** e **Microsoft Entra ID applications**. Adicione uma linha com o **Client ID** do app, um nome e um **User ID** vinculado a um usuário cuja **security role** conceda acesso às entidades que você vai usar.

{% hint style="warning" %}
**O passo 3 é obrigatório.** Se ele for ignorado, as requisições ainda vão **autenticar** (um token válido é emitido), mas serão **rejeitadas** com `401`/`403`, porque o service principal não está autorizado no F\&O.
{% endhint %}

4. **Crie a conta Azure Key na Digibee** usando os valores dos passos 1 e 2:

| Campo da conta Azure Key | Valor                             |
| ------------------------ | --------------------------------- |
| Client ID                | Application (client) ID (passo 1) |
| Client Secret            | O **value** do secret (passo 2)   |
| Tenant ID                | Directory (tenant) ID (passo 1)   |

O conector solicita o token para o scope `https://{your-env}.operations.dynamics.com/.default`. Só substitua esse valor usando **OAuth Scope** se o seu resource for diferente. Consulte [Contas](/documentation/developer-guide/pt-br/development-cycle/build-overview/accounts.md).

{% hint style="info" %}
Client secrets expiram. A Microsoft define um limite de 24 meses e recomenda um período menor. Renove o secret e atualize a conta Azure Key antes do vencimento, ou a descoberta de entidades e as requisições vão começar a falhar com erros de autenticação.
{% endhint %}

Você também vai precisar da **environment URL**, por exemplo  `https://myenv.operations.dynamics.com`.

## **Conceitos**

Os termos abaixo aparecem ao longo dos parâmetros do conector, por isso é importante entendê-los antes de configurar uma requisição. Cada conceito corresponde a um campo específico que você vai preencher mais adiante.

<table><thead><tr><th width="160">Termo</th><th>Significado</th></tr></thead><tbody><tr><td><strong>Data entity</strong></td><td>A coleção OData com a qual você está trabalhando, por exemplo <code>CustomersV3</code>. Caminho: <code>/data/CustomersV3</code>.</td></tr><tr><td><strong>Composite key</strong></td><td>As chaves do F&#x26;O geralmente são compostas e incluem <code>dataAreaId</code> (a legal entity, ou empresa), por exemplo <code>dataAreaId='usmf',CustomerAccount='US-001'</code>.</td></tr><tr><td><strong>Cross-company</strong></td><td>Por padrão, uma query retorna apenas a empresa padrão do usuário. Ative <strong>Cross-company</strong> para abranger todas as legal entities (<code>cross-company=true</code>).</td></tr><tr><td><strong><code>$metadata</code></strong></td><td>O F&#x26;O expõe metadados de entidades e campos em <code>/data/$metadata</code>. O conector usa esses metadados para viabilizar o seletor guiado de <strong>Entity Set</strong> e o editor de campos.</td></tr></tbody></table>

## **Parâmetros**

A tabela abaixo lista todos os parâmetros de configuração do conector. Os parâmetros que suportam [expressões Double Braces](/documentation/connectors-and-triggers/pt-br/double-braces/overview.md) estão marcados com ✅ na coluna **Suporta DB**.

{% tabs %}
{% tab title="General" %}

<table><thead><tr><th width="111.79998779296875">Parâmetro</th><th width="230.79998779296875">Descrição</th><th width="99.9998779296875">Tipo</th><th width="110.4000244140625">Suporta DB</th><th width="150.1905517578125">Padrão</th></tr></thead><tbody><tr><td><strong>Alias</strong></td><td>Um nome para a saída deste conector, para que você possa referenciá-la depois no fluxo com <a href="/pages/CNhjMiHwGiGjmVcUAGvL#referenciando-etapas-anteriores-usando-o-previous-steps-access">Double Braces</a>.</td><td>String</td><td>✅</td><td><code>dynamics-finops-01</code></td></tr><tr><td><strong>Fail On Client Error (4xx)</strong></td><td>Interrompe o pipeline em uma resposta 4xx.</td><td>Boolean</td><td>❌</td><td><code>false</code></td></tr><tr><td><strong>Fail On Server Error (5xx)</strong></td><td>Interrompe o pipeline em uma resposta 5xx.</td><td>Boolean</td><td>❌</td><td><code>false</code></td></tr></tbody></table>
{% endtab %}

{% tab title="Authentication" %}

<table><thead><tr><th width="112">Parâmetro</th><th width="200.00006103515625">Descrição</th><th width="83.199951171875">Tipo</th><th width="80.800048828125">Suporta DB</th><th width="128">Padrão</th><th width="120">Visível quando</th></tr></thead><tbody><tr><td><strong>Environment URL</strong></td><td>URL raiz do ambiente Finance &#x26; Operations.</td><td>String</td><td>✅</td><td><code>https://myenv.operations.dynamics.com</code></td><td>—</td></tr><tr><td><strong>Use Dynamic Account</strong></td><td>Se ativado, o conector resolve a conta em tempo de execução. Se desativado, usa a conta configurada estaticamente abaixo.</td><td>Boolean</td><td>❌</td><td><code>false</code></td><td><strong>Use Dynamic Account</strong> está ativado</td></tr><tr><td><strong>Scoped</strong></td><td>Se ativado, isola a conta armazenada de outros subprocessos. Não disponível para contas referenciadas em headers ou no corpo da requisição. Para saber mais, leia a documentação de <a href="/spaces/cO0A6g1dOsu8BiHYqO67/pages/FrKJOmsImCRBImMPMsU2">Dynamic Accounts</a>.</td><td>Boolean</td><td>❌</td><td><code>false</code></td><td><strong>Use Dynamic Account</strong> está ativado</td></tr><tr><td><strong>Account Name</strong></td><td>Nome da conta definida no conector <a href="/pages/iulYYuz29bvfGjceZb4e"><strong>Store Account</strong></a>.</td><td>String</td><td>✅</td><td>N/A</td><td><strong>Use Dynamic Account</strong> está desativado</td></tr><tr><td><strong>Account</strong></td><td>Conta contendo as credenciais do Azure AD (client ID, secret e tenant). Tipo suportado: <strong>Azure Key</strong>. Saiba mais sobre <a href="/spaces/cO0A6g1dOsu8BiHYqO67/pages/fS1QLzAg8rGSSJFwtrvy">Contas</a>.</td><td>Account</td><td>—</td><td>N/A</td><td></td></tr></tbody></table>

{% hint style="info" %}
A autenticação usa o fluxo OAuth 2.0 client-credentials com o Azure AD (Microsoft Entra ID) e injeta o token resultante em um header `Bearer`. O token é armazenado em cache por combinação de client, tenant e scope.

O OData v4 é usado e fixo para o Finance & Operations.
{% endhint %}
{% endtab %}

{% tab title="Dynamics API" %}

### **Parâmetro Operation**

<table><thead><tr><th width="111.79986572265625">Parâmetro</th><th width="230.79998779296875">Descrição</th><th width="100">Tipo</th><th width="109.5999755859375">Suporta DB</th><th width="150.1907958984375">Padrão</th></tr></thead><tbody><tr><td><strong>Operation</strong></td><td>A ação a ser executada. Ela define o formato da requisição. Veja as operações suportadas abaixo.</td><td>Select</td><td>❌</td><td><code>Query</code></td></tr></tbody></table>

#### **Operações suportadas**

O parâmetro **Operation** mapeia para uma requisição OData sob o service root `/data`:

<table><thead><tr><th width="130.79986572265625">Operation</th><th width="115.99993896484375">HTTP</th><th width="140.2000732421875">Path</th><th width="131">Body</th><th>Observações</th></tr></thead><tbody><tr><td><strong>Batch</strong></td><td><code>POST</code></td><td><code>/data/$batch</code></td><td>multipart/JSON</td><td>Agrupa várias operações em uma única requisição.</td></tr><tr><td><strong>Create</strong></td><td><code>POST</code></td><td><code>/data/{EntitySet}</code></td><td>JSON</td><td>Cria um registro.</td></tr><tr><td><strong>Custom Query</strong></td><td><code>GET</code></td><td><code>/data/{EntitySet}?{$query}</code></td><td>—</td><td>Equivalente a Query. Use quando combinar parâmetros de query brutos e estruturados.</td></tr><tr><td><strong>Delete</strong></td><td><code>DELETE</code></td><td><code>/data/{EntitySet}({key})</code></td><td>—</td><td>Exclui um registro.</td></tr><tr><td><strong>Get by ID</strong></td><td><code>GET</code></td><td><code>/data/{EntitySet}({key})</code></td><td>—</td><td>Lê um único registro pela chave.</td></tr><tr><td><strong>Invoke Action</strong></td><td><code>POST</code></td><td><code>/data/{EntitySet}({key})/{Action}</code> ou <code>/data/{Action}</code></td><td>JSON</td><td>Invoca uma bound action (com key e entity set) ou uma unbound action.</td></tr><tr><td><strong>Invoke Function</strong></td><td><code>GET</code></td><td><code>/data/{EntitySet}({key})/{Function}</code> ou <code>/data/{Function}</code></td><td>—</td><td>Invoca uma bound ou unbound function.</td></tr><tr><td><strong>Query</strong></td><td><code>GET</code></td><td><code>/data/{EntitySet}?{$query}</code></td><td>—</td><td>Lê a coleção com query options.</td></tr><tr><td><strong>Update</strong></td><td><code>PATCH</code>/<code>PUT</code></td><td><code>/data/{EntitySet}({key})</code></td><td>JSON</td><td>Atualiza um registro, parcialmente (<code>PATCH</code>) ou totalmente (<code>PUT</code>).</td></tr></tbody></table>

### **Parâmetros comuns**

Estes parâmetros se aplicam independentemente da operação escolhida. Eles são agrupados aqui por clareza, mesmo que a posição deles nas configurações do conector varie.

<table><thead><tr><th width="111.79998779296875">Parâmetro</th><th width="230.79998779296875">Descrição</th><th width="100">Tipo</th><th width="110.4000244140625">Suporta DB</th><th width="150.1905517578125">Padrão</th></tr></thead><tbody><tr><td><strong>Cross-company</strong></td><td>Retorna registros de todas as legal entities, em vez de apenas da empresa padrão (<code>cross-company=true</code>).</td><td>Boolean</td><td>❌</td><td><code>false</code></td></tr><tr><td><strong>Output Format</strong></td><td>Controla o formato da resposta retornada ao pipeline. <strong>Values Only</strong> desempacota e retorna apenas o array <code>value</code>. <strong>Full Response</strong> retorna a resposta completa, incluindo os campos <code>@odata.*</code>. <strong>Single Entity</strong> retorna a primeira ou única entidade.</td><td>Select</td><td>❌</td><td><code>Values Only</code></td></tr><tr><td><strong>Headers</strong></td><td>Headers adicionais da requisição, como pares chave/valor.</td><td>Key/Value</td><td>✅</td><td>N/A</td></tr></tbody></table>

### **Parâmetros específicos por operação**

Os parâmetros restantes aparecem apenas para determinadas operações, agrupados abaixo por finalidade.

**Entity Key** — usado por **Delete**, **Get by ID**, **Invoke Action**, **Invoke Function** e **Update**.

<table><thead><tr><th width="111.79986572265625">Parâmetro</th><th width="230.79998779296875">Descrição</th><th width="100">Tipo</th><th width="109.5999755859375">Suporta DB</th><th width="150.1907958984375">Padrão</th></tr></thead><tbody><tr><td><strong>Entity Key</strong></td><td>Chave simples ou composta. As chaves do F&#x26;O geralmente são compostas, por exemplo <code>dataAreaId='usmf',CustomerAccount='US-001'</code>.</td><td>String</td><td>✅</td><td>N/A</td></tr></tbody></table>

**Action / Function Name** — usado por **Invoke Action** e **Invoke Function**.

<table><thead><tr><th width="111.800048828125">Parâmetro</th><th width="230.79998779296875">Descrição</th><th width="100">Tipo</th><th width="109.5999755859375">Suporta DB</th><th width="150.19061279296875">Padrão</th></tr></thead><tbody><tr><td><strong>Action / Function Name</strong></td><td>Nome da action ou function OData. Bound quando um <strong>Entity Set</strong> é definido, unbound caso contrário.</td><td>String</td><td>✅</td><td>N/A</td></tr></tbody></table>

**Body** — usado por **Batch**, **Create**, **Invoke Action** e **Update**.

<table><thead><tr><th width="111.79986572265625">Parâmetro</th><th width="230.79998779296875">Descrição</th><th width="100">Tipo</th><th width="110.4000244140625">Suporta DB</th><th width="150.1907958984375">Padrão</th></tr></thead><tbody><tr><td><strong>Body</strong></td><td>Payload JSON para Create e Update, parâmetros da action para Invoke Action, ou o payload do <code>$batch</code>.</td><td>JSON</td><td>✅</td><td><code>{}</code></td></tr></tbody></table>

**Interactive Mode** — usado por **Create** e **Update**.

<table><thead><tr><th width="111.800048828125">Parâmetro</th><th width="230.79998779296875">Descrição</th><th width="100">Tipo</th><th width="109.5999755859375">Suporta DB</th><th width="150.19061279296875">Padrão</th></tr></thead><tbody><tr><td><strong>Interactive Mode</strong></td><td>Se ativado, o conector exibe os campos do payload para você editar. Caso contrário, forneça um body JSON bruto.</td><td>Boolean</td><td>❌</td><td><code>false</code></td></tr></tbody></table>

**Query parameters** — usado por **Custom Query** e **Query**.

<table><thead><tr><th width="111.80010986328125">Parâmetro</th><th width="230.800048828125">Descrição</th><th width="100">Tipo</th><th width="109.5999755859375">Suporta DB</th><th width="150.19049072265625">Padrão</th></tr></thead><tbody><tr><td><strong>Filter (<code>$filter</code>)</strong></td><td>Expressão de filtro OData, por exemplo <code>CustomerGroupId eq '10'</code>.</td><td>String</td><td>✅</td><td>N/A</td></tr><tr><td><strong>Select (<code>$select</code>)</strong></td><td>Lista de campos separados por vírgula a incluir na resposta.</td><td>String</td><td>✅</td><td>N/A</td></tr><tr><td><strong>Order By (<code>$orderby</code>)</strong></td><td>Ordena os resultados por uma ou mais propriedades, em ordem crescente ou decrescente, por exemplo <code>CustomerAccount asc</code>.</td><td>String</td><td>✅</td><td>N/A</td></tr><tr><td><strong>Expand (<code>$expand</code>)</strong></td><td>Entidades relacionadas a incluir inline.</td><td>String</td><td>✅</td><td>N/A</td></tr><tr><td><strong>Top (<code>$top</code>)</strong></td><td>Número máximo de registros a retornar.</td><td>Number</td><td>✅</td><td>N/A</td></tr><tr><td><strong>Skip (<code>$skip</code>)</strong></td><td>Registros a pular, para paginação.</td><td>Number</td><td>✅</td><td>N/A</td></tr><tr><td><strong>Include Count (<code>$count</code>)</strong></td><td>Inclui a contagem total na resposta.</td><td>Boolean</td><td>❌</td><td><code>false</code></td></tr></tbody></table>
{% endtab %}

{% tab title="Advanced Settings" %}

<table><thead><tr><th width="112">Parâmetro</th><th width="231.199951171875">Descrição</th><th width="83.199951171875">Tipo</th><th width="80.7999267578125">Suporta DB</th><th width="100">Padrão</th><th width="124.800048828125">Visível quando</th></tr></thead><tbody><tr><td><strong>Request Timeout (seconds)</strong></td><td>Tempo máximo para a requisição HTTP.</td><td>Integer</td><td>❌</td><td><code>30</code></td><td></td></tr><tr><td><strong>Custom Query String</strong></td><td>Parâmetros de query extras, adicionados literalmente.</td><td>String</td><td>✅</td><td>N/A</td><td></td></tr><tr><td><strong>Update Method</strong></td><td><code>PATCH</code> para uma atualização parcial, ou <code>PUT</code> para uma substituição completa.</td><td>Select</td><td>❌</td><td><code>PATCH</code></td><td>Operation é <strong>Update</strong></td></tr></tbody></table>
{% endtab %}

{% tab title="Documentation" %}

<table><thead><tr><th width="124.60015869140625">Parâmetro</th><th width="230.800048828125">Descrição</th><th width="100">Tipo</th><th width="109.5999755859375">Suporta DB</th><th width="150.1905517578125">Padrão</th></tr></thead><tbody><tr><td><strong>Documentation</strong></td><td>Campo opcional para descrever a configuração do conector e quaisquer regras de negócio relevantes.</td><td>String</td><td>❌</td><td>N/A</td></tr></tbody></table>
{% endtab %}
{% endtabs %}

## **Exemplos**

### **Consultar clientes em uma empresa**

```
Environment URL = https://myenv.operations.dynamics.com
Entity Set      = CustomersV3
Operation       = Query
Select          = CustomerAccount,OrganizationName
Filter          = CustomerGroupId eq '10'
Top             = 2
```

**Requisição resultante:**

{% code overflow="wrap" %}

```html
GET /data/CustomersV3?$select=CustomerAccount,OrganizationName&$filter=CustomerGroupId eq '10'&$top=2
```

{% endcode %}

**Saída** (quando **Output Format** está definido como `Values Only`):

```json
[
  { "CustomerAccount": "US-001", "OrganizationName": "Contoso Retail" },
  { "CustomerAccount": "US-004", "OrganizationName": "Fabrikam" }
]
```

### **Obter um registro pela chave composta**

```
Entity Set = CustomersV3
Operation  = Get by ID
Entity Key = dataAreaId='usmf',CustomerAccount='US-001'
```

**Requisição resultante:**

```html
GET /data/CustomersV3(dataAreaId='usmf',CustomerAccount='US-001')
```

### **Consultar em todas as empresas**

```
Entity Set    = SalesOrderHeadersV2
Operation     = Query
Cross-company = true
```

**Requisição resultante:**

```html
GET /data/SalesOrderHeadersV2?cross-company=true
```

## **Limitações conhecidas**

* Apenas OData v4. O Finance & Operations não expõe a v2.
* Sem FetchXML. Isso é exclusivo do Dataverse e do CRM. Use o conector [**Dynamics 365**](/documentation/connectors-and-triggers/pt-br/connectors/enterprise-applications/dynamics-365.md) para esses casos.
* Sem paginação automática. Siga o `@odata.nextLink` manualmente, ou controle a paginação usando `$top` e `$skip`.
* A descoberta guiada de entidades e campos exige um ambiente acessível e uma conta Azure Key válida. Se a descoberta não conseguir acessar o ambiente, você ainda pode informar o Entity Set por meio de uma expressão Double Braces.
* Chaves compostas, lookups `@odata.bind` para navigation properties, e valores de enum e option são os pontos mais propensos a erro. Valide contra o `$metadata` da entidade.

## **Erros comuns**

<table><thead><tr><th width="145.20001220703125">Status</th><th>Causa</th></tr></thead><tbody><tr><td><code>400</code></td><td>Sintaxe malformada de chave composta ou de expressão <code>$filter</code>.</td></tr><tr><td><code>401</code> / <code>403</code></td><td>O app não está registrado como um Application User do F&#x26;O, não tem a security role necessária, ou o scope do token está incorreto.</td></tr><tr><td><code>404</code></td><td>Nome de entity set incorreto.</td></tr></tbody></table>

Ative **Fail On Client Error (4xx)** ou **Fail On Server Error (5xx)** para que o conector interrompa o pipeline quando esses erros ocorrerem.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.digibee.com/documentation/connectors-and-triggers/pt-br/connectors/enterprise-applications/dynamics-365-finance-and-operations.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
