# Fluxos de escrita — comparativo 7.4 × 8.3 (martinelli)

- **Data:** 2026-10-23
- **Código:** o mesmo nos dois ambientes (`martelli-php83`, branch `migracao-php83`)
- **Banco:** `psec_vialgpd` (local, só teste) — os dois ambientes usam o mesmo banco
- **E-mail:** o `smtp.sendgrid.net` resolve para o Mailpit na rede de validação (nenhum e-mail sai para a internet)
- **Harness:** `tools/migracao-php83/fluxos.py` (Playwright) + `tools/migracao-php83/php/testa_mailer.php`

| Fluxo | O que exercita | 7.4 | 8.3 | Veredito |
|---|---|---|---|---|
| `login_logout` | sessão (`DbSession`), `auth_key`, redirecionamento | login OK, sessão criada, logout OK | idem | ✅ igual |
| `wildcard_create` | POST de create + `Base::beforeSave` (strlen em coluna nula) | 302 → `wildcard/view?id=…`, 1 linha gravada | idem, mesma linha | ✅ igual |
| `gpp_upload` | upload de `.xlsx` → `PhpSpreadsheet` → `gpp_temp`, `gpp_causa_provavel`, `gpp_acao_proposta`, `gpp_tarefa` | 302, 2 linhas em cada tabela | idem, mesmas linhas | ✅ igual |
| `relatorio_word` | geração de `.docx` (`PhpWord` 1.4) | 200, `application/vnd.openxmlformats-officedocument.wordprocessingml.document`, 14 partes no zip | idem (2 bytes de diferença: timestamp do zip) | ✅ equivalente |
| `email` | `symfony/mailer` (SMTP 587 + STARTTLS) | enviado, recebido no Mailpit | idem | ✅ equivalente |

## Achados durante os fluxos

1. **`strlen(): Passing null to parameter #1` é deprecated no PHP 8.1** e o Yii transforma a deprecation em `ErrorException` → **500 em qualquer `save()`** de modelo que derive de `app\models\Base`/`BaseModel` com coluna nula.
   Corrigido em `models/Base.php:46` e `models/BaseModel.php:249,315,337,339,360` com `strlen((string) …)` (o mesmo do accia).
2. **`uploads/` e `web/uploads/` não existem no checkout** → o upload do GppTemp e o relatório Word quebravam (`move_uploaded_file`, `Could not close zip file`). Não é regressão do PHP 8 (falha igual nos dois ambientes); o `web/uploads/.gitkeep` foi versionado e o `uploads/` da raiz é ignorado.
3. O **PDF (mpdf) e o QR** não puderam ser exercitados: o app não usa `Mpdf` diretamente e as tabelas `ca_arvore`/`formulario_resposta` estão vazias no banco de teste (sem dados para o protocolo de segurança).

## Dados de teste criados

- `wildcard` com `tag` `MIGR83-74-wildcard` / `MIGR83-83-wildcard` (removidos no fim)
- `gpp_temp`, `gpp_causa_provavel`, `gpp_acao_proposta`, `gpp_tarefa` (removidos no fim)
- e-mails `migr83-74@teste.local` / `migr83-83@teste.local` no Mailpit
