## PR-10 — Correção manual de placar pelo admin

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

**Como** administrador, **quero** corrigir à mão o placar de um jogo quando a
fonte oficial estiver errada ou fora, **para** o bolão não ficar com pontuação
errada esperando a fonte se resolver.

**Prioridade:** Must — **subiu de Should em 03/08.** Como o sistema não tem o
conceito de W.O. (todo jogo não realizado é adiado), esta story passou a ser a
**única forma de resolver um jogo decidido por W.O.**, que na prática nunca é
reagendado. Sem ela, um W.O. deixa o bolão aberto para sempre.

**Critérios de aceite:**

- Dado que sou admin, quando corrijo o placar de um jogo, então os pontos e o
  ranking são recalculados exatamente como numa correção oficial (PR-6).
- Dado que corrigi um placar à mão, então **todos os participantes veem que
  aquele placar foi alterado manualmente, por quem, e qual era o valor
  anterior** — não fica parecendo correção da fonte oficial.
- Dado que corrigi um placar, então os participantes afetados são avisados
  (PR-7), com a informação de que foi correção manual.
- Dado que sou participante comum, quando tento corrigir um placar, então a
  requisição é recusada.
- Dado que o jogo ainda não terminou **e não teve o prazo de palpite
  encerrado**, quando tento informar placar final à mão, então a ação é
  recusada.
- Dado que o jogo foi decidido por W.O. e não será reagendado, quando eu lanço
  o placar oficial (ex: 3x0) à mão, então ele é apurado como qualquer outro
  jogo e deixa de manter o bolão pendente (`CV-1`).
- Dado que a fonte oficial depois envia um placar diferente do que o admin
  colocou, então **a fonte oficial prevalece** e o histórico registra as duas
  alterações.

**Tasks:**

_Backend_
- [x] `BE-1` Endpoint de correção manual de placar, com autorização de admin (depende de PR-1 BE-1)
- [x] `BE-2` Registrar autor, momento, placar anterior e placar novo na trilha de auditoria (depende de BE-1, PR-6 BE-4)
- [x] `BE-3` Disparar o recálculo de PR-6 a partir da correção manual (depende de BE-1, PR-6 BE-2)
- [x] `BE-4` Fazer a fonte oficial prevalecer sobre a correção manual quando chegar depois (depende de BE-2)
- [x] `BE-5` Recusar correção de jogo que não terminou (depende de BE-1)

_Mobile_
- [x] `FE-1` Ação de corrigir placar, visível só para admin, com confirmação antes (depende de BE-1)
- [x] `FE-2` Marca visível a **todos** os participantes de que o placar foi corrigido manualmente, com autor e valor anterior (depende de BE-2)

_QA_
- [x] `QA-1` Escrever o plano de casos de teste a partir desta story
- [x] `QA-2` Executar o plano como participante comum, em jogo não terminado, e com a fonte oficial chegando depois com valor diferente

**Riscos/Dependências:**

- Depende de PR-1, PR-6 e PR-7.
- ⚠️ **Esta story reintroduz o poder de admin que o resto do design tinha
  eliminado.** O sigilo (PP-7), a reabertura automática (PP-6) e o travamento
  de regras (CC-3) existem para impedir que o admin influencie o resultado —
  e ele também disputa o bolão. **A visibilidade de `FE-2` é a única
  mitigação prevista**, e por isso não é opcional: sem ela, a correção manual
  é indistinguível de fraude.
- Combinada com o encerramento antecipado sem proteção (CV-3) e com a
  correção que troca o campeão após o encerramento, o admin tem caminho
  aberto para alterar o resultado final. Decisão registrada e consciente.

- **06/08:** a ação aparece **só para admin** e **só em jogo que já começou** — o
  servidor recusa antes disso. O diálogo vem pré-preenchido com o placar oficial
  atual (corrigir quase sempre é ajustar um gol), e a confirmação diz, com estas
  palavras, que a alteração fica registrada com o nome de quem corrigiu e que a
  fonte oficial prevalece se chegar depois.

- **06/08:** plano de casos em `docs/testes/PR-10-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: ✅ 12 de 12** (`docs/testes/PR-10-execucao.md`).
- O plano precisou de **correção de rumo**: `PR-10-03` dizia "jogo não terminado
  é recusado", e a regra real é permitir a partir do **apito**, mesmo sem
  `FINISHED` — exigir o encerramento deixaria o bolão preso para sempre num W.O.,
  que nunca é reagendado nem recebe placar da fonte. Reescrevi o caso e
  acrescentei `PR-10-03b`. Plano também é artefato revisável: "corrigir" o código
  para caber no caso errado teria introduzido um bug.
- Lacunas cobertas agora: `PR-10-09` (correção em bolão encerrado trocando o
  campeão — a consequência mais contraintuitiva da decisão de 03/08) e o
  teardown da suíte, que não devolvia o `kickoffAt` alterado e derrubava seis
  testes na execução seguinte.
