# Deploy da atualização de 24/07/2026 — "Outro" nas habilitações + validação de campos

Atualização já implementada no código local (`/Volumes/www/segunor-dados-portal`), **por publicar em produção**.
Deploy via cPanel/FTP, sem SSH (ver [DEPLOY.md](DEPLOY.md) para o guia geral de instalação).

## O que esta atualização resolve

1. **Habilitações "Outro" não abria caixa de texto** — a opção existia no select mas não havia onde escrever
   qual, nem onde guardar esse valor. Passa a existir a caixa "Especifique" (aparece só quando se escolhe
   "Outro") e uma coluna nova para o texto.
2. **Campos obrigatórios aceitavam lixo** — era possível submeter com apenas um ponto final (`.`) no nome e na
   relação, e os telefones não eram validados. Passa a exigir pelo menos 2 letras seguidas nos campos de texto
   livre e 9 dígitos nos telefones (aceitando `+351`, `00351` e espaços, que são normalizados).

## Ordem do deploy

**A (base de dados) → B (ficheiros) → C (limpar cache) → D (verificar).**
O Passo A tem de ser feito antes do B: os ficheiros novos escrevem na coluna nova.

---

## Passo A — Base de dados (PRIMEIRO)

cPanel → phpMyAdmin → base de dados do portal → separador **SQL** → executar:

```sql
ALTER TABLE `submissions`
  ADD COLUMN `habilitacoes_literarias_outro` VARCHAR(150) NULL AFTER `habilitacoes_literarias`;
```

Aditivo e seguro: coluna nova e nullable, não altera nem apaga dados existentes.
Confirmar em **Estrutura** da tabela `submissions` que a coluna aparece.

Se der erro `Duplicate column name`, a coluna já existe — ignorar e seguir para o Passo B.

## Passo B — Ficheiros por FTP

Enviar a partir da cópia local, mantendo **exatamente a mesma estrutura de pastas** (caminhos relativos à raiz
da aplicação Laravel no servidor — a pasta onde estão `app/`, `resources/`, `routes/`).

Obrigatórios:

| # | Ficheiro | O que muda |
|---|---|---|
| 1 | `app/Models/Submission.php` | campo novo no `$fillable`; `habilitacoes_label` devolve "Outro — <texto>" |
| 2 | `app/Http/Controllers/Public/SubmissionController.php` | normalização dos telefones + regras e mensagens de validação |
| 3 | `app/Services/SubmissionService.php` | grava o texto do "Outro" (e só quando a seleção é "outro") |
| 4 | `app/Http/Controllers/Api/SyncController.php` | expõe `habilitacoes_literarias_outro` no payload de sync |
| 5 | `lang/pt/validation.php` | nome legível do campo novo nas mensagens de erro |
| 6 | `resources/views/public/form.blade.php` | caixa "Especifique" + validação no browser |
| 7 | `resources/views/admin/submissions/show.blade.php` | mostra as habilitações por extenso, não a chave crua |

Opcionais (não têm efeito em produção):

| # | Ficheiro | Nota |
|---|---|---|
| 8 | `database/schema.sql` | só serve para instalações de raiz; a prod já fica tratada pelo Passo A |
| 9 | `database/migrations/2026_07_24_000000_add_habilitacoes_outro_to_submissions.php` | só corre com `artisan migrate` (dev/local) |

## Passo C — Limpar cache depois do upload

No File Manager do cPanel (ou por FTP):

- Apagar todos os `*.php` dentro de `storage/framework/views/` (deixar o `.gitignore`) — força a recompilação
  dos Blade alterados.
- Se existirem, apagar `bootstrap/cache/config.php` e `bootstrap/cache/routes-*.php`.

## Passo D — Verificar em produção

1. Abrir `/formulario/new` e `/formulario/update`.
2. Habilitações = **Outro** → aparece a caixa "Especifique"; mudar para outra opção → desaparece.
3. Submeter com "Outro" e a caixa vazia → rejeitado.
4. Submeter `.` no nome e na relação → rejeitado.
5. Telemóvel `123` → rejeitado. `912 345 678`, `+351 912 345 678` e `00351912345678` → aceites e guardados
   como `912345678`.
6. Fazer uma submissão real com "Outro" → confirmar na tabela `submissions` que `habilitacoes_literarias` =
   `outro` e `habilitacoes_literarias_outro` tem o texto; no admin (detalhe, PDF e CSV) aparece
   "Outro — <texto>".

---

## Rollback

Repor a versão anterior dos 7 ficheiros por FTP e voltar a limpar `storage/framework/views/`.
A coluna nova pode ficar na base de dados sem qualquer efeito (é nullable e o código antigo ignora-a);
só se for mesmo necessário:

```sql
ALTER TABLE `submissions` DROP COLUMN `habilitacoes_literarias_outro`;
```

## Estado da verificação local (24/07/2026)

- `php -l` sem erros em todos os PHP alterados; `php artisan view:cache` compila todos os Blade.
- Regras de validação testadas com o Validator do Laravel (17 casos, todos conforme o esperado).
- **Não testado end-to-end**: não havia MySQL acessível na máquina local, por isso a migration não chegou a
  correr nem o formulário foi aberto no browser. O Passo D é a primeira verificação real.
