## PR-6 — Recalcular pontos e ranking quando um placar é corrigido

**PRD:** `docs/prd/pontuacao-e-ranking.md`

**Como** participante competitivo, **quero** que o ranking reflita o placar
oficial mesmo quando ele é corrigido depois da apuração, **para** ninguém
ficar com ponto que não é seu.

**Prioridade:** Must — decisão explícita do PRD (recalcula retroativamente);
sem isso o app usa placar errado e o competitivo aponta.

**Critérios de aceite:**

- Dado que um placar oficial é corrigido, quando a correção chega ao sistema,
  então os pontos de todos os palpites daquele jogo são recalculados pela
  regra 10/5/3/0.
- Dado que os pontos mudaram, então o ranking geral e o da rodada refletem a
  correção, mesmo que a rodada já estivesse fechada.
- Dado que o recálculo aconteceu, então o extrato (PR-2) mostra o placar
  corrigido e o novo ponto, com registro de que houve correção.
- Dado que a correção não altera o ponto de ninguém (ex: placar corrigido
  mantém vencedor e saldo), então nenhum aviso é disparado.
- Dado que o desempate muda por causa da correção, então as posições
  compartilhadas são recalculadas (PR-5).

**Tasks:**

_Backend_
- [x] `BE-1` Detectar correção de placar oficial de jogo já apurado
- [x] `BE-2` Recalcular pontos dos palpites daquele jogo (depende de BE-1, PR-1 BE-2)
- [x] `BE-3` Recalcular ranking geral, ranking da rodada e desempates (depende de BE-2, PR-5 BE-2)
- [x] `BE-4` Registrar o histórico da correção: placar anterior, novo, e quem foi afetado (depende de BE-2)
- [x] `BE-5` Disparar o gatilho de aviso de PR-7 apenas para quem teve ponto ou posição alterada (depende de BE-4)

_Mobile_
- [x] `FE-1` Indicar no extrato que aquele jogo teve placar corrigido, com o placar anterior (depende de BE-4)

_QA_
- [x] `QA-1` Escrever o plano de casos de teste a partir desta story
- [x] `QA-2` Executar o plano com correção que muda ponto, que não muda ponto, e que altera o desempate

**Riscos/Dependências:**

- **É a maior fonte de desconfiança do produto:** ranking que muda sem
  explicação é lido como bug. PR-7 é obrigatório junto, não depois.
- Depende de PR-1, PR-3, PR-4, PR-5 e da fonte oficial de resultados.
- **Pergunta aberta com impacto aqui:** correção depois do *encerramento* do
  bolão (CV-1) — se a resposta for "troca o campeão", esta story cresce.

- **06/08:** exigiu acrescentar o campo `correction` a cada linha do extrato
  (placar anterior + se foi manual). A marca distingue correção da fonte de
  correção do administrador: atribuir ao admin uma correção da fonte seria
  inventar intervenção humana onde não houve.

- **06/08:** plano de casos em `docs/testes/PR-6-plano.md`. Escrito a partir da
  story, não do código — caso escrito depois de olhar a implementação valida o
  que foi feito, não o que foi pedido.

- **06/08 — execução: ✅ 10 de 10** (`docs/testes/PR-6-execucao.md`).
- Duas lacunas cobertas: `PR-6-08` (duas correções seguidas — o extrato mostra a
  última, o histórico guarda as duas) e `PR-6-07` (jogo que não tinha placar: o
  anterior é descrito como "sem placar", não `0x0`; `0x0` é um empate que nunca
  existiu e mudaria a leitura de quem palpitou empate).
