# Model e Registros

Para que o sistema de ordenação funcione corretamente, cada **model** envolvida deve seguir uma estrutura mínima obrigatória.  
Abaixo estão descritas as configurações e implementações necessárias para garantir a compatibilidade com a feature.

---

### 1. **Trait obrigatória**

Toda model que utilizar o sistema de ordenação **deve incluir a trait**:

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-use-app%5Ctraits%5Csorta"><div class="overflow-y-auto p-4" dir="ltr">**use App\\Traits\\SortableTrait;**</div></div>Essa trait contém os métodos e comportamentos essenciais para manipular a posição dos registros, incluindo funções de ordenação, reordenação após exclusões e cálculo da próxima posição disponível.

---

### 2. **Evento <span style="text-decoration: underline;">deleted</span> com <span style="text-decoration: underline;">reorder()</span>**

É obrigatório que a model implemente o evento **deleted**, chamando o método **reorder()** após a exclusão de um registro.  
Isso garante que a ordenação seja recalculada automaticamente, mantendo a sequência correta dos itens.

**Exemplo:**

```php
protected static function boot()
    {
        parent::boot();

        static::deleted(function ($model) {
            $model->reorder(); // executa após deletar com sucesso
        });
    }
```

> **Observação:**  
> Se a ordenação possuir níveis (ex: seção → produto), é necessário passar um *filtro* via **Closure** como terceiro parâmetro na função **reorder()**, indicando o escopo onde a reordenação deve ocorrer (por exemplo, dentro da mesma seção).

---

### 3. **Relacionamentos entre níveis**

Quando o módulo utiliza **ordenação com múltiplos níveis**, cada nível adicional deve possuir uma **relação "belongsTo"** com o nível imediatamente anterior.  
Essa relação é obrigatória para que o sistema saiba a qual contexto o registro pertence e consiga filtrar corretamente antes de aplicar a ordenação.

**Exemplo:**  
Na model do **nível 3**, deve existir uma relação com o **nível 2**:

```
public function nivel2() { return $this->belongsTo(NivelDoi::class, 'nivel_2_id'); }
```

---

### 4. **Colunas obrigatórias na tabela**

A tabela da model deve conter as seguintes colunas:

<div class="_tableContainer_1rjym_1" id="bkmrk-coluna-tipo-obrigato"><div class="group _tableWrapper_1rjym_13 flex w-fit flex-col-reverse" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="2596" data-start="2101" style="width: 100%;"><thead data-end="2148" data-start="2101"><tr data-end="2148" data-start="2101"><th data-col-size="sm" data-end="2110" data-start="2101" style="width: 15.9714%;">Coluna</th><th data-col-size="sm" data-end="2117" data-start="2110" style="width: 13.7068%;">Tipo</th><th data-col-size="lg" data-end="2135" data-start="2117" style="width: 42.9043%;">Obrigatoriedade</th><th data-col-size="md" data-end="2148" data-start="2135" style="width: 27.4176%;">Descrição</th></tr></thead><tbody data-end="2596" data-start="2198"><tr data-end="2307" data-start="2198"><td data-col-size="sm" data-end="2212" data-start="2198" style="width: 15.9714%;">**order**</td><td data-col-size="sm" data-end="2224" data-start="2212" style="width: 13.7068%;">**integer**</td><td data-col-size="lg" data-end="2242" data-start="2224" style="width: 42.9043%;">**Obrigatória**</td><td data-col-size="md" data-end="2307" data-start="2242" style="width: 27.4176%;">Define a posição do registro dentro do contexto da ordenação.</td></tr><tr data-end="2442" data-start="2308"><td data-col-size="sm" data-end="2326" data-start="2308" style="width: 15.9714%;">**parent\_id**</td><td data-col-size="sm" data-end="2338" data-start="2326" style="width: 13.7068%;">**integer**</td><td data-col-size="lg" data-end="2442" data-start="2338" style="width: 42.9043%;">Obrigatória **somente** quando o tipo de ordenação é **recursiva** (entre registros da mesma model).</td><td data-col-size="md" style="width: 27.4176%;"> </td></tr><tr data-end="2596" data-start="2443"><td data-col-size="sm" data-end="2464" data-start="2443" style="width: 15.9714%;">**&lt;nome\_da\_fk&gt;**</td><td data-col-size="sm" data-end="2476" data-start="2464" style="width: 13.7068%;">**integer**</td><td data-col-size="lg" data-end="2596" data-start="2476" style="width: 42.9043%;">Obrigatória **quando existe mais de um nível** (não recursiva). Representa a foreign key que liga ao nível anterior.</td><td data-col-size="md" style="width: 27.4176%;"> </td></tr></tbody></table>

</div></div>> **Exemplo:**
> 
> - Em uma ordenação recursiva (ex: categorias com subcategorias), use **parent\_id**.
> - Em uma ordenação com múltiplos níveis (ex: seção → produto), use a FK correspondente, como **secao\_id**.
> - Em uma ordenação simples (sem níveis), nenhuma FK adicional é necessária.