# CMS-002-01 — Tabela settings, model e seeder global

| Campo | Valor |
|---|---|
| **status** | feita |
| **spec** | [`docs/specs/cms/002-globais.md`](../specs/cms/002-globais.md) §§3–4, §7 |
| **depende de** | [CMS-001-05](CMS-001-05-remover-breeze.md) (feita) |
| **primo** | migration `create_settings_table`, `app/Models/Setting.php`; **não** copiar o `DatabaseSeeder` legado (`company_*` / `linkedin_url`) |

## Objetivo

Store key-value no banco e popular as globais com o institucional **igual ao footer de hoje**. Sem tela Filament nesta task. Front do site não muda.

## Fazer

1. Migration `settings`: `id`, `key` unique, `value` text nullable, `group` string default `general`, timestamps. Espelhar o primo.
2. Model `Setting`: fillable; `get($key, $default = null)`; `set($key, $value, $group = 'general')` com `updateOrCreate` na `key`.
3. `GlobalSettingsSeeder` com as keys da spec §4 (group `global`). Copy literal do `SiteFooter.tsx` / títulos `Omni`. Redes e description vazias; **não** gravar `global_seo_og_image` com path fictício.
4. `DatabaseSeeder`: chamar o seeder **antes** do `if (production) return` (junto de permissões/perfis). Root continua só local.

## Testes (PHPUnit, `tests/Feature/Cms/`)

- Após `GlobalSettingsSeeder` (ou `DatabaseSeeder`): existem `global_footer_address`, `global_footer_cnpj` (`92.228.410/0001-02`), `global_footer_copyright` (string com `© 2022`), `global_seo_site_name` = `Omni`.
- Chaves sociais existem e estão vazias (ou ausentes de path). Sem valor de OG inventado.
- `Setting::get` / `set` round-trip.

## Fora

`ManageSettingsPage`, trait de upload, Inertia `siteSettings`.
