# INT-015-01 — ProgramaElasController e presenter

| Campo | Valor |
|---|---|
| **status** | feita |
| **spec** | [`docs/specs/integracao/015-programa-elas.md`](../specs/integracao/015-programa-elas.md) §§2–3, §5 |
| **depende de** | [INT-014-02](INT-014-02-emprestimo-garantia-front-reads-cms.md) (feita) |
| **primo** | presenter irmão do `014`; soluções **não** passam por `home_solucoes` |

## Objetivo

`GET /programa-elas` devolve o DTO da landing (só `group=programa-elas`). O React ainda pode ignorar nesta task.

## Fazer

1. `ProgramaElasController` invokable no lugar da closure. Nome de rota igual.
2. `ProgramaElasPresenter::make()` — dobras próprias; **sem** App/Agentes/Blog/passo/faixa; soluções desta tela.
3. Testes em `tests/Feature/Integracao/`.

## Testes (PHPUnit)

- Seeder: eyebrow; titleLines; subtitleLines; 3 info; 2 abas; moto `flipX`; vantagens; números; apoio; depoimentos; IFC; FAQ; WhatsApp.
- Home seedada não troca `solucoes.title`.
- `programa-elas/x.webp` no hero → `/storage/programa-elas/x.webp`.
- Card sem `img` → default `{ w: 216, h: 333, x: 0, b: 0 }`.
- Sem seed: `GET /programa-elas` 200, coleções vazias.
- Sem keys `app`, `agentes`, `noticias`.

## Fora

Ligar as seções React (task 02). Filament. Home. Landings.
