# Call Center - Introdução e Caso de Uso

<p align="right">Credits to: <img src="/files/2Y8eETLT3YmkNWnbgcAi" alt="" data-size="line"></p>

Este é um laboratório **avançado de Decision Model & Notation (DMN)** que introduz **Serviços de Decisão DMN**, **Relações**, **expressões em caixa aninhadas**, entre outros. Explora também vários tipos de construções e expressões **FEEL**, como, por exemplo, **list contains**.

### Objetivos

* Implementar um modelo DMN
* Executar e testar o modelo

***

### Enunciado do Problema

Neste laboratório vamos criar uma decisão que determina se um **call center** pode atender uma chamada recebida.\
Se uma chamada será aceite por um determinado escritório depende de:

* O escritório aceitar a chamada.
* Existirem colaboradores disponíveis nesse escritório.

O facto de o escritório poder aceitar uma chamada depende de:

* Se o número de telefone está bloqueado.
* O propósito da chamada (por exemplo, *“help”* ou *“objection”*).

***

### Criar uma nova decisão

Para trabalhar no modelo de decisão, vamos usar o **editor KIE Sandbox DMN**.

1. No seu navegador, aceda a <http://dmn.new/>.
2. Clique no bloco **Untitled** para definir o nome do modelo DMN.
3. Dê-lhe o nome **call-centre**. Isto irá criar o artefacto e abrir o editor DMN.

<figure><img src="/files/QPcKOUEr7tNz2HBGfBXf" alt=""><figcaption></figcaption></figure>

### Próximos Passos

Pode realizar este laboratório de **duas formas**:

* Se já possui (alguns) conhecimentos de DMN, desafiamos a construir a solução por si mesmo. Depois de a ter construído, poderá verificar a sua resposta avançando para o módulo seguinte, no qual explicaremos a solução e a implementaremos no ambiente de execução.
* Seguir o guia passo a passo abaixo, que o conduzirá através da implementação.

***

### Criação da decisão para o Call Center

O enunciado descreve vários dados de entrada para a nossa decisão:

* **Call**: a chamada recebida no call center.
* **Employees**: os colaboradores de um determinado escritório.
* **Office**: um escritório para o qual a chamada pode potencialmente ser encaminhada.

Além disso, o enunciado refere que **números de telefone podem ser bloqueados**. Assim, números bloqueados também podem ser considerados uma entrada do nosso modelo (embora neste laboratório não os vamos implementar como entrada).

***

Com os dados de entrada fornecidos, precisamos de tomar as seguintes decisões:

* **Accept Call**: a decisão final que temos de tomar é se o escritório em questão irá aceitar a chamada.
* **Can Handle Call**: se o escritório pode efetivamente aceitar a chamada. Conforme definido no enunciado, isto depende de:
  * se o número de telefone foi bloqueado;
  * o propósito da chamada (*“help”* ou *“objection”*).

***

### Estrutura da Decisão *Accept Call*

* **Accept Call**: a decisão final a tomar é se o escritório em questão irá aceitar a chamada.

1. Para isso, adicione um **nó de decisão** ao diagrama, clicando no ícone de **Decision node** e colocando-o no **DRD**.

<figure><img src="/files/KJtJf682G364StTZNIko" alt=""><figcaption></figcaption></figure>

2. Faça duplo clique no nó para definir o nome. Vamos dar a este nó o nome **Accept Call**.
3. Com o nó **Accept Call** selecionado, abra o **painel de propriedades**. Defina o **tipo de dados de saída** como **booleano**.

<figure><img src="/files/0Tae09Lcnsa3HPN3pzqp" alt=""><figcaption></figcaption></figure>

4. A entrada desta decisão é a **incoming call**, **office** e **employee**. Crie estes **3 nós de entrada** e ligue-os à decisão **Accept Call**.

<figure><img src="/files/6OssarAYSg19Vd45yyqD" alt=""><figcaption></figcaption></figure>

5. Agora podemos definir os **tipos de dados** dos nossos nós de entrada.
6. Clique no nó **incoming call**, abra o **painel de propriedades** e, na secção **Output data type**, clique no botão **Manage**.
   * Isto irá abrir a janela **Custom Data Types**.
7. Na janela **Custom Data Types**, clique no botão **+ Add**.
8. Defina o tipo de dados **tPhoneNumber** da seguinte forma:

<figure><img src="/files/V2gOkXLjDx0PhVfoieqi" alt=""><figcaption></figcaption></figure>

9. Defina outro tipo de dados, **tCall**, da seguinte forma. Note que este tipo de dados possui um campo do tipo **tPhoneNumber**, o tipo que definimos anteriormente:

* **data type tCall**

10. Quando tiver criado o tipo **tCall**, volte ao **DRD** clicando no separador **Model**.
11. Selecione o nó **incoming call** e, no painel de propriedades, defina o **tipo de dados de saída** desse nó como **tCall**.

* **incoming call data type**

12. De seguida, defina o seguinte tipo de dados e atribua-o como **tipo de dados de saída** da entrada **office**, da seguinte forma:

<figure><img src="/files/EftfT4lHZmTPSsAa3ICr" alt=""><figcaption></figcaption></figure>

13. Defina o **tipo de dados para os colaboradores** da seguinte forma. Note que primeiro definimos o tipo **tEmployee** e, em seguida, definimos **tEmployees** como uma **Lista de tEmployee**.

<figure><img src="/files/fYEifDZaISBhPS40Lq5Y" alt=""><figcaption></figcaption></figure>

### Serviço de Decisão

Com a estrutura principal definida, podemos agora analisar os requisitos da decisão sobre se o escritório pode efetivamente aceitar a chamada. Conforme definido no enunciado do problema, isto depende de:

* se o número de telefone foi bloqueado;
* o propósito da chamada (*"help"* ou *"objection"*).

Vamos modelar esta decisão como um **Serviço de Decisão DMN** que pode ser chamado pela nossa decisão principal **Accept Call**.

1. Modele o **Serviço de Decisão** no **DRD** e dê-lhe o nome **Can Handle Call**. Defina o **tipo de dados de saída** como **`Boolean`**.

<figure><img src="/files/x0jT9uLHJSo9yOU9ztO4" alt=""><figcaption></figcaption></figure>

2. Adicione um **Nó de Decisão** ao **Serviço de Decisão**. Dê-lhe o nome **Call Can Be Handled** e defina o seu **tipo de dados de saída** como **`boolean`**.

<figure><img src="/files/uI5G86zUJuBEhlU6t7xZ" alt=""><figcaption></figcaption></figure>

3. Adicione mais **2 Nós de Decisão** e nomeie-os <kbd>**`Is Banned`**</kbd> e <kbd>**Call Purpose Accepted**</kbd><kbd>.</kbd> Ambos devem ter o **tipo de dados de saída** definido como **`boolean`**.
4. Ligue estes **2 Nós de Decisão** ao nó **Call Can Be Handled**.

<figure><img src="/files/jIHTMIT7JgLVRe4ECRhk" alt=""><figcaption></figcaption></figure>

5 . A entrada para as decisões **Is Banned** e **Call Purpose Accepted** é uma **chamada**. Ligue o nó existente **incoming call** a estes **2 nós de decisão**.

<figure><img src="/files/1YpcO8cscfiDHyIDgwTE" alt=""><figcaption></figcaption></figure>

6. A decisão **Is Banned** também necessita de uma coleção de **números de telefone bloqueados**. Em vez de implementar isto como um **nó de entrada**, vamos implementá-lo como uma **Decisão de Relação DMN**.
7. Crie um novo **Nó de Decisão** e dê-lhe o nome **Banned Phone Numbers**.\
   Ligue-o ao nó de decisão **Is Banned**.

<figure><img src="/files/ah53dwME2xP3ytwYHHW8" alt=""><figcaption></figcaption></figure>

8. O **tipo de dados de saída** destes nós é um **novo tipo de dados personalizado**, que consiste numa **lista de tPhoneNumber**. Vamos dar a este tipo o nome **tPhoneNumbers**:

<figure><img src="/files/LKV21X07QiEluokJB3tn" alt=""><figcaption></figcaption></figure>

Clique no botão **Editar** do nó **Banned Phone Numbers**. Defina o **logic type da decisão** como <kbd>**Relation**</kbd>. Crie a seguinte tabela:

<figure><img src="/files/5rDSiCejVP9QzxrGLgvX" alt=""><figcaption></figcaption></figure>

10. Agora podemos implementar a lógica da decisão **Is Banned**. Clique no botão **Editar** do nó de decisão. Vamos implementar a lógica como uma **Expressão Literal**.

Defina a seguinte expressão **FEEL**:

```
~~~
  list contains(Banned Phone Numbers, call.phone)
~~~
```

11. O próximo nó para o qual queremos implementar a lógica da decisão é o **Call Purpose Accepted**. Clique no nó e depois no botão **Edit**.

Implemente a seguinte lógica como uma **Tabela de Decisão**:

<figure><img src="/files/mA1QjF5mJDp4kPR3E3VL" alt=""><figcaption></figcaption></figure>

12. Agora podemos implementar a decisão **Call Can Be Handled**. Clique no nó e depois no botão **Editar** do nó. No editor de decisões, defina o **tipo de lógica** como **Tabela de Decisão** e implemente a seguinte tabela:

<figure><img src="/files/LXJ4kWYHTW7R8Jii8VJq" alt=""><figcaption></figcaption></figure>

13. Crie um [**Requisito de Conhecimento DMN**](#user-content-fn-1)[^1] **(**[**Knowledge Requirement**](/fundamentals-of-information-systems/documentation/ligacoes-rapidas/interactive-blocks.md)**)** do serviço de decisão **Can Handle Call** para a decisão **Accept Call**.

<figure><img src="/files/AcRnmP6OxnW4GREszK8d" alt=""><figcaption></figcaption></figure>

#### ##7.3. "Accept Call" Decision Logic

13. Implemente a lógica da decisão **Accept Call** da seguinte forma:

<figure><img src="/files/bFYvibsx65Bwy7bwLU4i" alt=""><figcaption></figcaption></figure>

> Note que a **linha 1** é a invocação do serviço de decisão **"Can Handle Call"**. Trata-se de uma **Invocação** do serviço *Can Handle Call*, passando a entrada **incoming call** como a variável **call**. O resultado desta invocação será a variável booleana **Call can be handled**.

A variável **Call can be handled** é depois utilizada para validar o resultado da decisão na última linha.

[^1]: Consultar o Guia DMN


---

# Agent Instructions: 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:

```
GET https://ulht-jcb.gitbook.io/fundamentals-of-information-systems/lab-11/lab-11.2-dmn-and-low-code-exercicios-praticos-guiados/call-center-introducao-e-caso-de-uso.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
