# INT-017-01 — NegociaOmniController e presenter

| Campo | Valor |
|---|---|
| **status** | feita |
| **spec** | [`docs/specs/integracao/017-negocia-omni.md`](../specs/integracao/017-negocia-omni.md) §§2–3, §5 |
| **depende de** | [INT-016-02](INT-016-02-renova-omni-front-reads-cms.md) (feita) |
| **primo** | hero/notícias do `014`; faixa Portal = CTA das landings |

## Objetivo

`GET /negocia-omni` devolve o DTO da landing (página + 3 do Blog). O React ainda pode ignorar nesta task.

## Fazer

1. `NegociaOmniController` invokable no lugar da closure. Nome de rota igual.
2. `NegociaOmniPresenter::make()` — hero com `subtitleLines`; `portal`; **sem** App/Agentes/Serviços.
3. Testes em `tests/Feature/Integracao/`.

## Testes (PHPUnit)

- Seeder: eyebrow; titleLines; 3 subtitleLines; sem bullets; 3 vantagens com subtitle; portal `#`; 4 passos; FAQ; WhatsApp.
- Página + Blog: 3 artigos com `href` `/blog/…`.
- `negocia-omni/x.webp` no hero → `/storage/negocia-omni/x.webp`.
- Sem seed: `GET /negocia-omni` 200, coleções vazias.
- Sem keys `app`, `agentes`, `servicos`, `cta`.

## Fora

Ligar as seções React (task 02). Filament. Renova. Cluster.
