# Execução — `PR-7` Avisar quem foi afetado por um recálculo

**Plano:** `PR-7-plano.md` · **Data:** 07/08/2026
**Ambiente:** backend local (`test/correcao.e2e-spec.ts`,
`test/pp6-reabertura.e2e-spec.ts`), Flutter em teste de widget
(`test/regras_avisos_test.dart`).

**Resultado: ⚠️ 9 de 10** — `PR-7-10` **não aplicável** (não há push nesta
versão). **1 defeito de regra encontrado e corrigido: o aviso não era
consolidado.**

| ID | Resultado | Onde |
| -- | --------- | ---- |
| PR-7-01 | ✅ | e2e "avisa os afetados dizendo qual jogo e qual placar mudou" |
| PR-7-02 | ✅ | e2e "correção que não muda ponto de ninguém não gera aviso" |
| PR-7-03 | ✅ **novo** | widget "PR-7-03 tocar no aviso de pontuação leva ao extrato" (+ `PR-7-03b`) |
| PR-7-04 | ✅ | e2e "correção oficial recalcula e inverte o ranking" + texto de posição |
| PR-7-05 | ✅ **corrigido** | e2e "PR-7-05 dois jogos corrigidos na mesma sincronização geram UM aviso" |
| PR-7-06 | ✅ | e2e "o aviso da correção manual diz que foi o administrador" |
| PR-7-07 | ✅ | e2e "avisos são do bolão da rota, não de todos os bolões" |
| PR-7-08 | ✅ | e2e "marcar como lido só afeta o aviso do próprio participante" |
| PR-7-09 | ✅ | e2e "push desativado não impede o aviso — entrega zero, aviso gravado" |
| PR-7-10 | ⛔ não aplicável | ver abaixo |

## Defeito encontrado — `BE-3` dizia consolidar e não consolidava

O critério é explícito: *"vários jogos corrigidos de uma vez → aviso consolidado,
não um por jogo"*. A task `BE-3` estava marcada e o comentário no código dizia
"um aviso consolidado por participante e por bolão" — mas a consolidação era
**dentro de uma correção**, não entre correções. Cada jogo corrigido gravava a sua
própria notificação.

O cenário é o mais comum que existe: a sincronização roda depois da rodada e
corrige três placares. O participante recebia **três** avisos "sua pontuação
mudou" em segundos. É exatamente o comportamento que faz alguém silenciar o app —
e aí perde o lembrete de prazo, que é a notificação que sustenta o produto.

Correção:
- `CorrecaoService.aplicar` aceita um **coletor**: com ele, os avisos são
  acumulados em vez de gravados;
- `SyncService` mantém um coletor por execução e chama `gravarConsolidado` no fim,
  agrupando por participante e bolão;
- o texto consolidado lista os jogos (`A x B (0x0 → 2x1); C x D (…)`) e informa a
  mudança **líquida** de posição — de onde a pessoa estava antes da primeira
  correção para onde ficou depois da última. Somar os degraus intermediários
  contaria posições que ninguém viu.
- Correção manual (`PR-10`) continua avisando na hora: é uma por vez, e o admin
  está olhando a tela.

O caso `PR-7-05` verifica os dois lados: **um** aviso, e o corpo contendo os
**dois** jogos com os placares. Um aviso consolidado que não diz o que mudou seria
pior que dois avisos.

## `PR-7-10` — permissão negada não é executável

Não há push nesta versão: o adaptador é o `PushDesativadoAdapter` e o app nunca
pede permissão de notificação (`PP-8 FE-1`/`FE-2` seguem bloqueadas por credencial
FCM). Como o aviso já é sempre in-app, a condição "permissão negada" não muda
nada. Marcar como "passou" sugeriria uma verificação que não aconteceu — fica
registrado para voltar junto com o FCM.

## Observações

- `PR-7-03b` cobre o outro lado da navegação: aviso que **não** é de pontuação
  (lembrete de prazo) não abre o extrato. Toque que não faz nada é melhor que
  toque que abre a tela errada.
- `PR-7-02` é o caso que protege o valor do aviso: quem não foi afetado não recebe
  nada. Sem ele, a correção de um jogo notificaria o bolão inteiro.
