---
id: SVC-SEARCH-INDEXACAO
tipo: matriz
onda: 2
status: concluido
unidades: [SVC-SEARCH]
fontes:
  - V2/Services/Search/
depende_de: [SVC-SEARCH]
consumidores: [SVC-SEARCH, MOD-PUBLICACOES-NOTICIAS, MOD-PUBLICACOES-AGENDA, MOD-CONEXOES-ASSOCIADOS, MOD-CONEXOES-UNIDADEREGIONAL, MOD-CONEXOES-PARCEIROSINSTITUCIONAIS, MOD-INSTITUCIONAL-SOBRENOS, MOD-PUBLICACOES-TRABALHECONOSCO, MOD-LAYOUTS-BASICPAGE]
criticidade: alta
dono: SvcSearchDash
---

# Mapa de indexação por entidade (índice público e CMS)

Este documento complementa `spec.md`: ali está o motor de busca, aqui está **quem escreve o índice, com quais campos e por qual gatilho**, e onde o que é prometido diverge do que é efetivamente sincronizado.

## 1. Efeito

Para cada `save()` de uma entidade coberta, o efeito observável é:

1. uma linha criada ou atualizada em `v2_public_search_index`, chaveada por `(entity_type, entity_id)` (`V2/Services/Search/Services/PublicIndexerService.php:27-40`);
2. para Notícias, BasicPages e Diretoria, também uma linha em `v2_cms_links_index`, chaveada por `(module, edit_url)` (`V2/Services/Search/Services/CMSIndexerService.php:27-36`);
3. o `search_vector` da linha pública recalculado pelo trigger com `title` (A), `summary_fragment` (B) e `search_deep_content` (C) (`V2/Services/Search/Migrations/2026_06_14_000000_create_search_indexes_tables.php:63-79`);
4. nenhum efeito quando a entidade é despublicada/desativada: em vez de atualizar, o hook **remove** a linha pública.

O que **não** é indexado em nenhuma entidade: o corpo completo de notícias (`content`), o HTML renderizado de eventos, o conteúdo de `metadata` (exceto `resumo` de regional), e as `tags` (gravadas, nunca vetorizadas).

## 2. Abordagem

### 2.1 Fluxo comum

```mermaid
sequenceDiagram
  participant M as Model (Eloquent)
  participant H as hook saved/deleted
  participant S as syncToSearch()
  participant I as PublicIndexerService / CMSIndexerService
  participant DB as PostgreSQL
  M->>H: save() / delete()
  H->>S: chama no model concreto
  S->>S: decide indexar ou remover (status/is_active)
  S->>I: new DTO(...) + index($dto)
  I->>DB: INSERT ... ON CONFLICT ... DO UPDATE
  DB-->>I: trigger recalcula search_vector
  Note over H,I: exceções são capturadas no hook; save() nunca falha por busca
```

### 2.2 Mapa por entidade (índice público)

| Entidade | Tabela de origem | `module` gravado | `entity_type` gravado | Título | `summary_fragment` | `search_deep_content` | `tags` | Gatilho de escrita | Gatilho de remoção | Fonte |
|---|---|---|---|---|---|---|---|---|---|---|
| Notícias (`News`) | `v2_news` | `noticias` | `get_class($news)` = `V2\Modules\Publicacoes\Noticias\Models\News` | `$news->title` | `$news->subtitle ?: ($news->summary ?: 'Notícia do portal')` | `strip_tags($news->summary)` + nome/sigla/UF da regional | `noticia`, `publicacao`, `regional`, sigla, slug e UF da regional | `static::saved` → `NewsSearchSender::sync` | `deleted` e mudança de status para ≠ `published` | `V2/Modules/Publicacoes/Noticias/Services/NewsSearchSender.php:25-116`; `News.php:292-331,376-382` |
| Eventos (`Evento`) | `v2_eventos` | `Eventos` (maiúscula) | `evento` | `$this->title` | `strip_tags($this->description)` ou `''` | `$this->description` **cru** (pode conter HTML) | `agenda`, `eventos`, `sucesu` | `static::saved` → `syncToSearch` | `deleted` e `is_active = false` | `V2/Modules/Publicacoes/Agenda/Models/Evento.php:104-147,221-239` |
| Unidades Regionais | `v2_unidade_regionais` | `unidades-regionais` | `get_class($this)` | `$this->name` | `metadata['resumo']` ou `'Regional SUCESU'` | `resumo` + texto extraído do JSON Tiptap de `description` | `unidade-regional`, `regional`, `sucesu`, `state`, `acronym` | `static::saved` | `deleted` e `is_active = false` | `V2/Modules/Conexoes/UnidadeRegional/Models/UnidadeRegional.php:130-190` |
| Associados (`AssociadoInstituicao`) | `v2_associado_instituicoes` | `associados` | `get_class($this)` | `$this->name` | `$this->description` ou `'Instituição associada'` | `description` + texto de `convenio_description` (JSON) + `benefits_list` + nome/sigla/UF das regionais | `associado`, `convenio`, `instituicao`, `regional`, sigla, slug e UF | `static::saved` | `deleted` e `is_active = false` | `V2/Modules/Conexoes/Associados/Models/AssociadoInstituicao.php:201-215,254-301,311-344` |
| Parceiros Institucionais | `v2_parceiros_institucionais` | `parceiros-institucionais` | `get_class($this)` | `$this->name` | `$this->description` ou `'Parceiro do portal'` | `strip_tags($this->getHtmlDescription())` | `parceiro`, `publicacao` | `static::saved` | `deleted` e `is_active = false` | `V2/Modules/Conexoes/ParceirosInstitucionais/Models/Parceiro.php:77-89,140-162` |
| Diretoria (`BoardMember`) | `v2_board_members` | `diretoria` | `board_member` | `$this->name` | `$this->description` ou `''` | `name + position + description` | `diretoria`, `board_member`, `$this->position` | `static::saved` | `deleted` e `is_active = false` (public); CMS tenta remover por id | `V2/Modules/Institucional/SobreNos/Models/BoardMember.php:99-113,218-256` |
| Trabalhe Conosco (`JobOpening`) | `v2_job_openings` | `trabalhe-conosco` | `get_class($this)` | `$this->title` | `str_limit(strip_tags($description_detailed ?: $title), 300)` | `strip_tags($description_detailed ?: $title)` | `vaga`, `emprego`, `trabalhe-conosco` | `static::saved` | `deleted` e `is_active = false` | `V2/Modules/Publicacoes/TrabalheConosco/Models/JobOpening.php:128-172,187-215` |
| BasicPage | `v2_basic_pages` | `basicpage` | `get_class($this)` | `$this->title` | `title + ' - Página governamental fixa.'` | `strip_tags($this->content)` | `pagina-fixa`, `institucional` | `static::saved` | **nenhum** — não há hook `deleted` | `V2/Modules/Layouts/BasicPage/Models/BasicPage.php:136-144,222-254` |

Todos os `module` acima são consumidos por `SearchService::publicResultUrl` (`V2/Services/Search/Services/SearchService.php:68-89`); `Eventos` com maiúscula e `board_member` como `entity_type` são grafias que precisam ser preservadas.

### 2.3 Mapa por entidade (índice CMS / Search-to-Edit)

| Entidade | `module` | `edit_url` | `label` | `searchable_text` | `metadata` | Gatilho de remoção | Fonte |
|---|---|---|---|---|---|---|---|
| Notícias | `noticias` | `route('v2.noticias.cms.edit', ['id'=>$id], false)`, fallback `/cms/noticias/editar/{id}` | `title` | `title subtitle summary` | `{status}` | nenhum no `deleted` (só existe remoção pública) | `NewsSearchSender.php:45-65`; `News.php:320-326` |
| BasicPage | `basicpage` | `route('v2.basicpage.editor.edit', ['slug'=>$slug], false)`, fallback `/cms/paginas-fixas/editor/{slug}` | `title` | `title + strip_tags(content)` | `[]` → `'[]'` | nenhum | `BasicPage.php:226-253` |
| Diretoria | `diretoria` | `route('v2.sobrenos.cms.members.edit', ['id'=>$id], false)`, fallback `/cms/institucional/sobre-nos/members/editar/{id}` | `name` | `name — position description` | `[]` | `CMSIndexerService::remove('diretoria', $model->id)` — **argumento errado** | `BoardMember.php:220-237`; `BoardMember.php:111` |

### 2.4 Trechos pivô

```php
// V2/Modules/Publicacoes/Noticias/Services/NewsSearchSender.php:25-37 — a decisão público vs. CMS.
public function sync(News $news)
{
    // Só indexa no público se estiver publicada
    if ($news->status === News::STATUS_PUBLISHED) {
        $this->syncPublic($news);
    } else {
        $this->removeFromPublic($news);
    }

    // CMS indexa independente do status (para busca administrativa)
    $this->syncCms($news);
}
```
Notícias é a única entidade com regra de negócio de publicação explícita e a única com classe dedicada; as demais implementam `syncToSearch()` no próprio model.

```php
// V2/Modules/Publicacoes/Noticias/Services/NewsSearchSender.php:93-116 — regional entra no texto; `content` NÃO entra.
if ($regional) {
    $tags[] = 'regional';
    if (!empty($regional->acronym)) $tags[] = $regional->acronym;
    if (!empty($regional->slug)) $tags[] = $regional->slug;
    if (!empty($regional->state)) $tags[] = $regional->state;
    $regionalNames = trim($regional->name . ' ' . ($regional->acronym ?? '') . ' ' . ($regional->state ?? ''));
}

$deepContent = trim(strip_tags($news->summary ?? '') . ' ' . $regionalNames);
$deepContent = !empty($deepContent) ? $deepContent : 'Notícia do portal';

$publicDto = new PublicSearchDTO(
    $news->title, $news->slug, 'noticias', get_class($news), $news->id,
    $news->subtitle ?: ($news->summary ?: 'Notícia do portal'),
    array_values(array_unique($tags)), $deepContent
);
```
O `content` da notícia **nunca** é indexado: buscar uma palavra que só existe no corpo da matéria devolve zero. O `v2:reindex-public` seleciona `content` na consulta (`ReindexPublicSearch.php:57`) mas o `syncToSearch()` não o utiliza — seleção inútil.

```php
// V2/Modules/Publicacoes/Agenda/Models/Evento.php:221-239 — `entity_type` literal e remoção simétrica.
public function syncToSearch()
{
    try {
        if ($this->is_active) {
            $dto = new PublicSearchDTO(
                $this->title, $this->slug, 'Eventos', 'evento', $this->id,
                $this->description ? strip_tags($this->description) : '',
                ['agenda', 'eventos', 'sucesu'],
                $this->description ?? ''
            );
            app(PublicIndexerService::class)->index($dto);
        } else {
            app(PublicIndexerService::class)->remove('evento', $this->id);
        }
    } catch (\Exception $e) {
        \Log::error('[Evento] Falha no syncToSearch: ' . $e->getMessage());
    }
}
```
`'evento'` é a única `entity_type` que não é FQCN e a única que usa `module` capitalizado (`'Eventos'`).

```php
// V2/Modules/Institucional/SobreNos/Models/BoardMember.php:109-113 — remoção do CMS com a chave errada.
static::deleted(function ($model) {
    try {
        app(CMSIndexerService::class)->remove('diretoria', $model->id);
        app(PublicIndexerService::class)->remove('board_member', $model->id);
    } catch (\Exception $e) {
        \Log::error('[BoardMember] Falha ao remover do índice: ' . $e->getMessage());
    }
});
```
`remove($module, $editUrl)` compara com a coluna `edit_url` (`CMSIndexerService.php:59-65`), mas recebe um UUID: nenhuma linha é apagada e o membro excluído continua aparecendo no Search-to-Edit.

```php
// V2/Services/Search/Console/Commands/ReindexPublicSearch.php:31-45 — reindexação por grupos fixos.
if ($only === 'all' || $only === 'news')        { $this->reindexNews(); }
if ($only === 'all' || $only === 'associados')  { $this->reindexAssociados(); }
if ($only === 'all' || $only === 'unidades')    { $this->reindexUnidades(); }
if ($only === 'all' || $only === 'basic-pages') { $this->reindexBasicPages(); }
```
Não existe grupo para `eventos`, `parceiros`, `trabalhe-conosco` ou `diretoria`; e `$only` desconhecido é aceito em silêncio.

### 2.5 Contrato do comando `ReindexPublicSearch`

| Item | Contrato observado | Fonte |
|---|---|---|
| Assinatura | `v2:reindex-public {--only= : news \| associados \| unidades \| basic-pages \| all}` | `ReindexPublicSearch.php:20-21` |
| Registro | `App\Console\Kernel::$commands` (Laravel 5.5, sem auto-discovery) | `app/Console/Kernel.php:15-23` |
| Default | `--only` ausente ⇒ `all` | `:27` |
| Grupos executados | `all` = news → associados → unidades → basic-pages, nesta ordem | `:31-45` |
| Universo de Notícias | `News::published()` (status `published`), `chunk(100)`, `orderBy('created_at')` | `:56-59` |
| Universo de Associados | `AssociadoInstituicao::active()` (`is_active = true`) | `:76` |
| Universo de Unidades | `UnidadeRegional::active()` | `:96` |
| Universo de BasicPages | todas as linhas, sem filtro; `class_exists` antes (pula com mensagem) | `:115-123` |
| Idempotência | sim, via UPSERT; reexecutar não duplica | `PublicIndexerService.php:31-39` |
| Falha por item | `Log::error` e continua; incrementa `$total` só no sucesso | `:61-67` |
| Saída | `Notícias reindexadas: N`, `Associados reindexados: N`, `Unidades regionais reindexadas: N`, `Basic pages reindexadas: N`, `Reindexação pública concluída em Ns.` | `:48,70,90,110,134` |
| Código de saída | sempre `0` (mesmo com falhas) | `:50` |
| Cobertura do índice CMS | **nenhuma**: reindexar não reconcilia `v2_cms_links_index` | ausência de chamada a `CMSIndexerService` no comando |
| Purga de órfãos | **nenhuma**: só faz upsert; registros de entidades excluídas permanecem | `:53-135` |

## 3. Particularidades

### 3.1 Invariantes e regras não óbvias

| ID | Regra | Efeito | Fonte |
|---|---|---|---|
| RN-SEARCH-IDX-01 | Notícia só entra no índice público quando `status === 'published'`; no CMS entra em qualquer status | rascunho é encontrável no CMS, não no portal | `NewsSearchSender.php:27-36` |
| RN-SEARCH-IDX-02 | Evento, Associado, Unidade, Parceiro, Vaga e Diretoria usam `is_active` (ou `active()` no reindex) | desativar remove do índice **somente** se o `save()` passar pelo Eloquent | `Evento.php:223`; `AssociadoInstituicao.php:256`; `UnidadeRegional.php:158`; `Parceiro.php:142`; `JobOpening.php:189`; `BoardMember.php:240` |
| RN-SEARCH-IDX-03 | `entity_type` é FQCN em 5 entidades, `'evento'` em 1, `'board_member'` em 1 e `get_class` de BasicPage em 1 | renomear namespace cria nova identidade e deixa a antiga órfã | `NewsSearchSender.php:108`; `Evento.php:228`; `BoardMember.php:243`; `BasicPage.php:244` |
| RN-SEARCH-IDX-04 | A remoção precisa usar exatamente o mesmo `entity_type` da indexação | qualquer divergência gera órfão silencioso | `PublicIndexerService.php:66-71` |
| RN-SEARCH-IDX-05 | `BasicPage` não tem hook `deleted` | excluir página fixa deixa linha pública e de CMS | `BasicPage.php:136-144` |
| RN-SEARCH-IDX-06 | `BoardMember` grava `slug = str_slug($this->name)` no índice, não `$this->slug` | homônimos apontam para a mesma URL pública | `BoardMember.php:239-243` |
| RN-SEARCH-IDX-07 | `module` do parceiro exige `entity_id` para montar URL | linha de parceiro sem `entity_id` é descartada da busca | `SearchService.php:83-84` |
| RN-SEARCH-IDX-08 | O texto indexado difere por entidade: só BasicPage e Associados incluem corpo longo | notícia não é encontrável pelo corpo; página fixa é | `NewsSearchSender.php:101`; `BasicPage.php:240`; `AssociadoInstituicao.php:283` |
| RN-SEARCH-IDX-09 | `tags` nunca é vetorizada | o acrônimo da regional só funciona porque também é concatenado no texto profundo | migration `:63-79`; `NewsSearchSender.php:94-101` |

### 3.2 Inconsistências entre o que o índice promete e o que é sincronizado

| # | Promessa | Realidade | Consequência | Fonte |
|---|---|---|---|---|
| 1 | “Busca global” do portal | 8 entidades cobertas, mas **nenhuma** página de módulo sem model com `syncToSearch` (ex.: Marcos históricos, Seções da Homepage, Conteúdo Estrutural) | busca parcial; usuário não encontra conteúdo institucional | grep por `syncToSearch` em `V2/Modules` |
| 2 | Reindexação completa do índice público | 4 grupos; Eventos, Parceiros, Vagas e Diretoria nunca são reindexados | após mudança na lógica, metade do índice fica com dados antigos | `ReindexPublicSearch.php:20-45` |
| 3 | Busca por conteúdo da notícia | só título, subtítulo, resumo e regional | palavra do corpo não encontra a matéria | `NewsSearchSender.php:101-113` |
| 4 | `tags` como metadado de busca | gravadas e nunca lidas; nem entram no vetor | campo morto; `LG-SEARCH-05` | `PublicIndexerService.php:24`; `SearchService.php:26-41` |
| 5 | Remoção do Search-to-Edit ao excluir membro da diretoria | `remove('diretoria', $id)` compara com `edit_url` | entrada fantasma permanente | `BoardMember.php:111`; `CMSIndexerService.php:59-65` |
| 6 | Exclusão de BasicPage reflete na busca | não há hook `deleted` | linha órfã; link para 404 | `BasicPage.php:136-144` |
| 7 | Busca restrita ao que o usuário pode ver (CMS) | menus são filtrados por RBAC; **registros** de `v2_cms_links_index` não têm coluna de módulo/permissão verificada | usuário sem permissão em “Notícias” vê e clica no resultado, caindo em 403 | `SearchService.php:218-229` (sem filtro) |
| 8 | Search-to-Edit prioriza conteúdo | menus ocupam as 10 posições antes do banco | conteúdo pode nunca aparecer | `SearchService.php:232-234` |
| 9 | `--only` valida entradas | valor inválido executa nada e retorna sucesso | operador acredita ter reindexado | `ReindexPublicSearch.php:27-50` |
| 10 | Índice reflete o estado atual | cache de página de 5 min em `/busca` | alteração demora a aparecer mesmo após reindexar | `PageCacheMiddleware.php:11-22,31-56` |

### 3.3 Casos-limite por entidade

| Entidade | Caso | Resultado | Fonte |
|---|---|---|---|
| Notícias | sem regional e sem `metadata.source_unidade_regional_id` | indexa sem tags de regional; `deepContent` pode virar `'Notícia do portal'` | `NewsSearchSender.php:82-102` |
| Notícias | `metadata` corrompido | `$news->metadata['source_unidade_regional_id']` pode gerar notice; exceção capturada no hook | `NewsSearchSender.php:83` |
| Eventos | `description` em HTML | `search_deep_content` guarda HTML; `summary_fragment` guarda texto limpo | `Evento.php:231,233` |
| Associados | `convenio_description` não é JSON Tiptap | `extractTextFromEditorJson` devolve `''` (sem `type`) | `AssociadoInstituicao.php:311-321` |
| Unidades | `metadata['resumo']` ausente | resumo vira `'Regional SUCESU'` e o deep usa a descrição | `UnidadeRegional.php:170-189` |
| Parceiros | `is_active = false` | `remove(get_class, id)` imediato | `Parceiro.php:141-145` |
| Diretoria | homônimos | `slug` do índice é o slug do nome, sem sufixo; link pode abrir o registro errado | `BoardMember.php:239-243` |
| Vagas | `description_detailed` vazio | resumo e deep caem no `title` | `JobOpening.php:202-209` |
| BasicPage | `content` nulo | `strip_tags(null)` = `''`; vetor só com título | `BasicPage.php:240` |
| Qualquer | `delete()` via query builder | hooks não disparam; linha permanece | Eloquent events |

### 3.4 Armadilhas de reimplementação

1. **Não troque o `entity_type` para “limpar” o índice.** As linhas antigas não são migradas; sem um `DELETE` prévio, a mesma entidade passa a ter duas linhas (uma com FQCN, outra com slug).
2. **`upsert` do Laravel não substitui o SQL cru sem cuidado**: a chave do índice público é `(entity_type, entity_id)` e não `id`; `Model::updateOrCreate` por `id` duplicaria.
3. **Não indexe `content` de notícia sem truncar**: o vetor e o GIN passam a carregar HTML inteiro; BasicPage já faz isso hoje e é o maior registro do índice.
4. **Remoção de entidade excluída precisa de `deleted`**, não de `saved`; BasicPage é a prova.
5. **`is_active` é a fonte de verdade do portal para 5 entidades, mas o reindex só considera `active()`**: uma entidade inativa cujo `save()` não passou pelo hook continua indexada, e o reindex **não a remove** — ele só faz upsert das ativas.

## 4. Integrabilidade

### 4.1 Checklist para plugar uma entidade nova

1. Definir `module` (string estável, minúscula) e adicionar um `case` em `SearchService::publicResultUrl` — sem isso o link cai em `/{slug}` (`SearchService.php:85-87`).
2. Escolher `entity_type` estável; preferir string curta a FQCN para sobreviver a refatorações de namespace.
3. Implementar `syncToSearch()` no model: montar `PublicSearchDTO` e, se aplicável, `CMSIndexDTO`.
4. Registrar `static::saved` **e** `static::deleted`, ambos com `try/catch` + `Log::error` (o padrão de `News.php:292-331`).
5. Garantir que a remoção use o mesmo par `(entity_type, entity_id)` e que a remoção CMS use a **URL** de edição.
6. Se a entidade precisar de reindexação em lote, adicionar um grupo em `ReindexPublicSearch` e um `if` em `handle()`.
7. Se o conteúdo tiver Tiptap, extrair texto (padrão `extractTextFromEditorJson`, `AssociadoInstituicao.php:311-344`) antes de gravar.

### 4.2 Receitas

```php
// Remover corretamente do índice público (mesmo par usado no index()).
app(\V2\Services\Search\Services\PublicIndexerService::class)
    ->remove(\V2\Modules\Publicacoes\Noticias\Models\News::class, $id);
```

```php
// Remover corretamente do índice CMS: pela URL exata gravada em edit_url.
$editUrl = route('v2.sobrenos.cms.members.edit', ['id' => $id], false);
app(\V2\Services\Search\Services\CMSIndexerService::class)->remove('diretoria', $editUrl);
```

```bash
# Reindexar só notícias e conferir a contagem; não há dry-run.
php artisan v2:reindex-public --only=news
```

### 4.3 Anti-uso

- **Chamar `syncToSearch()` dentro de transação longa**: cada item executa 1–4 statements e o trigger `to_tsvector`; em lote, faça `chunk(100)` como o comando.
- **Indexar uma entidade sem página pública**: cria resultado que leva a 404 ou `/{slug}`; só indexe o que tem rota.
- **Confiar no `syncToSearch` para limpar o índice**: ele nunca apaga órfãos; a única remoção é por `deleted`/desativação.

## 5. Lacunas

| ID | Lacuna | Impacto | Onde procurar |
|---|---|---|---|
| LG-SEARCH-06 | Não existe índice para Eventos/Parceiros/Vagas/Diretoria via comando | reindexação parcial | `ReindexPublicSearch.php:20-45` |
| LG-SEARCH-07 | Não há teste que prove a simetria `index`/`remove` por entidade | órfãos passam despercebidos | `sucesu-cms/tests/` |
| LG-SEARCH-08 | `[L]` não há registro de quantas linhas órfãs existem em produção | impacto desconhecido do card “Páginas Indexadas” | consulta manual a `v2_public_search_index` |
| LG-SEARCH-09 | `[L]` o conteúdo de `v2_news.content` pode ser JSON do editor ou HTML; não há documentação | impossível saber qual extração usar se a reimplementação decidir indexar o corpo | `V2/Modules/Publicacoes/Noticias/Models/News.php` (casts) |

## 6. Evidências consultadas

| Arquivo | Faixas |
|---|---|
| `V2/Services/Search/Services/PublicIndexerService.php` | 1-73 |
| `V2/Services/Search/Services/CMSIndexerService.php` | 1-66 |
| `V2/Services/Search/Services/SearchService.php` | 20-90, 218-235 |
| `V2/Services/Search/Console/Commands/ReindexPublicSearch.php` | 1-136 |
| `V2/Services/Search/Migrations/2026_06_14_000000_create_search_indexes_tables.php` | 42-83 |
| `V2/Modules/Publicacoes/Noticias/Services/NewsSearchSender.php` | 1-135 |
| `V2/Modules/Publicacoes/Noticias/Models/News.php` | 285-400 |
| `V2/Modules/Publicacoes/Agenda/Models/Evento.php` | 95-245 |
| `V2/Modules/Conexoes/Associados/Models/AssociadoInstituicao.php` | 195-360 |
| `V2/Modules/Conexoes/UnidadeRegional/Models/UnidadeRegional.php` | 120-200 |
| `V2/Modules/Conexoes/ParceirosInstitucionais/Models/Parceiro.php` | 70-170 |
| `V2/Modules/Institucional/SobreNos/Models/BoardMember.php` | 80-262 |
| `V2/Modules/Publicacoes/TrabalheConosco/Models/JobOpening.php` | 120-230 |
| `V2/Modules/Layouts/BasicPage/Models/BasicPage.php` | 130-260 |
| `app/Console/Kernel.php` | 1-40 |
