# Dias de Férias

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

Neste laboratório irá experimentar a combinação de **tabelas de decisão DMN** com **expressões literais**. Vai também explorar vários tipos de construções e expressões **FEEL**, como, por exemplo, intervalos (*ranges*). Finalmente, aprenderá a utilizar o **KIE Java Client** para consumir decisões.

### Objetivo

* Implementar um modelo DMN utilizando o editor DMN online.
* Testar o modelo DMN.

***

### Enunciado do Problema

Neste laboratório vamos criar uma decisão que determina o número de dias de férias atribuídos a um colaborador. O número de dias de férias depende da idade e dos anos de serviço.

* Todo colaborador recebe pelo menos **22 dias**.
* Dias adicionais são atribuídos de acordo com os seguintes critérios:

{% columns %}
{% column width="8.333333333333332%" %}

{% endcolumn %}

{% column width="91.66666666666667%" %}

1. Apenas colaboradores com menos de 18 anos ou com pelo menos 60 anos, ou colaboradores com **30 ou mais anos de serviço**, recebem **5 dias extra**.
2. Colaboradores com pelo menos 30 anos de serviço e também os com 60 ou mais anos de idade recebem **3 dias extra**, para além de outros adicionais que já possam ter recebido.
3. Se um colaborador tiver pelo menos 15 mas menos de 30 anos de serviço, recebe **2 dias extra**. Estes 2 dias também são atribuídos a colaboradores com 45 ou mais anos de idade. Estes **2 dias extra não podem ser combinados com os 5 dias extra**.
   {% endcolumn %}
   {% endcolumns %}

***

### Criar uma nova decisão

Para trabalhar no modelo de decisão, vamos usar o editor **KIE Sandbox DMN**. editor 1. No seu navegador, aceda a <http://dmn.new/>.

1. Clique no bloco *Untitled* para definir o nome do modelo DMN. Dê-lhe o nome **vacation-days**. Isto criará o artefacto e abrirá o editor DMN.

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

De seguida, vamos trabalhar no modelo de decisão.

***

### **4.1. Definir os nós de entrada**

O enunciado descreve dois dados de entrada:

* **Idade do colaborador**
* **Anos de serviço do colaborador**

Logo, devemos criar dois **nós de entrada**:

1. Adicione um **Input node** ao diagrama clicando no ícone correspondente e posicionando-o no DRD.

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

2. Dê duplo-click no nó para colocar o nome.  Vamos dar o nome de **Age.**
3. Com o nó Age selecionado, abrir o painel das propriedades. Definir **data type** **`number`**.

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

4. Da mesma forma, crie um **nó de entrada** para **Years of Service**. Este nó também deve ter o seu **data type** definido como **`number`**.&#x20;

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

***

### **4.2. Constantes**

O problema define que todo colaborador recebe pelo menos **22 dias**. Isto é uma constante no modelo de decisão.

1. Adicione um **Decision node** ao DRD.

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

2. Nomeie-o como **Base Vacation Days**.
3. Defina o **data type** como **`number`**.
4. Clique no nó e click no icon **Edit** para abrir o editor de expressões&#x20;

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

5. No editor de expressões, clique na caixa que diz **Select expression** e escolha **Literal expression**.

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

6. Basta definir a **Expressão Literal** como **22**, o número de dias base de férias definido no enunciado do problema.

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

7. Guarde o modelo.

***

**4.3. Decisões**

O enunciado define 3 decisões que podem acrescentar dias extra, dependendo de critérios específicos:

* **Extra days case 1**
* **Extra days case 2**
* **Extra days case 3**

Para maior facilidade de manutenção, vamos modelar cada caso em nós de decisão separados.

1. Crie 3 nós de decisão no DRD, um para cada caso.
2. Precisamos de ligar os nós de entrada (**Age** e **Years of Service**) a cada um dos 3 nós de decisão. Podemos fazer isto clicando num **nó de entrada**, depois no seu **ícone de seta** e ligando a seta ao **nó de decisão**.

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

3. Selecione o nó **Extra days case 1** e abra o seu editor de expressões clicando no botão **Editar**.
4. De seguida, selecione a expressão **Decision Table** para criar uma expressão em caixa implementada como uma **tabela de decisão**.

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

5. O primeiro caso define **2 decisões**, que podem ser modeladas com **2 linhas** na nossa tabela de decisão, da seguinte forma:
6. colaboradores com menos de 18 anos ou com pelo menos 60 anos recebem **5 dias extra**, ou…
7. colaboradores com pelo menos 30 anos de serviço recebem **5 dias extra**

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

Para adicionar novas linhas à sua tabela, clique com o botão direito na **primeira coluna** e selecione **"**&#x49;nsert belo&#x77;**"**.

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

9. Note que a **política de acerto (hit-policy)** da tabela de decisão está, por defeito, definida como **U**, que significa **Única**. Isto implica que apenas uma regra deverá ser aplicada para uma dada entrada. Neste caso, no entanto, queremos defini-la como **Collect Max**, pois, para uma mesma entrada, várias decisões podem coincidir, mas pretendemos recolher o resultado da regra com o maior número de dias adicionais de férias. Para isso, clique no **U** no canto superior esquerdo da tabela de decisão. Em seguida, defina a **Hit Policy** como **Collect** e o **Builtin Aggregator** como **MAX**.

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

10. Finalmente, precisamos de definir o **resultado por defeito da decisão**. Este é o resultado que será devolvido quando nenhuma das regras corresponder à entrada fornecida.

Isto é feito da seguinte forma:

* Selecione a **coluna de saída/resultado** da tabela de decisão (neste caso, a coluna **Extra days case 1**).
* Abra o **painel de propriedades** no lado direito do editor.
* Expanda a secção **Default output**.
* Defina a propriedade **Default output** como **0**.

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

11. Guarde o modelo
12. As outras duas decisões podem ser implementadas da mesma forma. Agora, implemente as seguintes duas tabelas de decisão:

&#x20;             **-   Caso 2:**

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

&#x20;             **-   Caso 3:**

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

* Modele a lógica seguinte: colaboradores com ≥ 15 mas < 30 anos de serviço → **+2 dias**;
* Também colaboradores com ≥ 45 anos de idade → **+2 dias**;
* Estes **não podem ser combinados** com os 5 dias extra.

***

### **4.4. Dias de Férias Totais**

O total de dias de férias precisa de ser calculado a partir do nó **Base Vacation Days** e das 3 decisões adicionais.

1. Crie um novo nó de decisão chamado <kbd>**`Total Vacation Days`**</kbd>, do tipo **`number`**.
2. Ligue os **4 nós de decisão existentes** ao novo nó. Isto define que a saída desses nós será a entrada do próximo nó.

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

3. Clique no nó **`Total Vacation Days`** e depois em **Editar** para abrir o editor de expressões. Configure a expressão como uma **expressão literal**. No editor de expressões, selecione <kbd>**`Literal expression`**</kbd>.
4. Precisamos de configurar a seguinte lógica:

* Todos recebem os **Base Vacation Days**.
* Se tanto o **caso 1** como o **caso 3** adicionarem dias extra, apenas os dias extra de uma das decisões são considerados. Nesse caso, utilizamos o **máximo**.
* Se o **caso 2** adicionar dias extra, estes devem ser somados ao total.

5. A lógica acima pode ser implementada com a seguinte expressão **FEEL**:

<figure><img src="/files/07toKdRKHDWaxopq0PJ0" alt=""><figcaption></figcaption></figure>

> Todos recebem os **Base Vacation Days**.
>
> Se tanto o caso 1 como o caso 3 adicionarem dias extra, apenas é considerado o **máximo** entre eles.
>
> Se o caso 2 adicionar dias extra, estes devem ser somados ao total.

***

### Implementar e testar a decisão

Pode testar a decisão utilizando os **KIE Extended Services** com a opção *run* do KIE Sandbox, ou pode implementá-la no **OpenShift**.

Também pode criar um novo projeto Kogito com **Quarkus** usando **Maven** localmente e adicionar aí a sua decisão.


---

# 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/dias-de-ferias.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.
