## CV-1 — Encerrar o bolão com campeão e ranking final

**PRD:** `docs/prd/ciclo-de-vida-do-bolao.md`

**Como** administrador, **quero** que o bolão encerre sozinho quando a última
rodada é apurada, **para** não precisar anunciar o campeão na mão — e para a
discussão ter conclusão.

**Prioridade:** Must — sem encerramento o bolão não acaba, apenas para, e fica
a dúvida de quem ganhou.

**Critérios de aceite:**

- Dado que a última rodada do escopo do bolão foi apurada e não há placar
  pendente de correção, então o bolão é encerrado e o campeão e o ranking
  final ficam registrados.
- Dado que ainda existe jogo não apurado no escopo, então o bolão **não**
  encerra.
- Dado que existe correção de placar pendente, então o encerramento **espera**
  — campeão anunciado e trocado depois é pior que anunciar um dia mais tarde.
- Dado que o bolão foi encerrado, quando alguém tenta palpitar ou entrar pelo
  convite, então é recusado.
- Dado que o bolão encerrou, então todos os participantes veem o ranking final
  e quem foi campeão.

**Tasks:**

_Backend_
- [x] `BE-1` Detectar que todos os jogos do escopo foram apurados (depende de PR-1 BE-1)
- [x] `BE-2` Bloquear o encerramento enquanto houver correção de placar pendente (depende de PR-6 BE-1)
- [x] `BE-3` Encerrar o bolão, registrando campeão e ranking final — **sem congelar**, pois correção posterior pode trocar o campeão (depende de BE-1, BE-2, PR-5 BE-3)
- [x] `BE-4` Recusar palpite e entrada por convite em bolão encerrado (depende de BE-3)

_Mobile_
- [x] `FE-1` Tela de encerramento com campeão e ranking final (depende de BE-3)
- [x] `FE-2` Estado de bolão encerrado nas telas de palpite e de convite (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 jogo pendente, com correção pendente, e com jogo adiado para depois da última rodada

**Riscos/Dependências:**

- Depende de PR-1, PR-5 e PR-6.
- **Decidido em 03/08: correção de placar após o encerramento troca o
  campeão.** Portanto `BE-3` **não congela** o ranking final — ele registra
  campeão e ranking, mas permanece sujeito a recálculo por PR-6 e PR-10. O
  encerramento não é um estado final, e a UI não pode sugerir que é.
- **Decidido em 03/08: jogo adiado sem nova data não encerra o bolão** — ele
  aguarda indefinidamente até o jogo acontecer e então corrige a pontuação.
  Consequência: o bolão pode ficar aberto para sempre se o jogo nunca
  ocorrer, e o encerramento antecipado (CV-3) é a **única** saída.

- **06/08:** o diálogo mostra campeão **e** classificação final (rolável, para
  bolão grande não estourar a tela). O bolão encerrado ficou visível nas duas
  telas pedidas: a de palpite ganhou faixa explicativa, etiqueta "bolão
  encerrado" por jogo e perdeu a ação de enviar; a de convite desapareceu, já
  que bolão encerrado não aceita mais ninguém.

- **06/08:** plano de casos em `docs/testes/CV-1-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: ❌ reprovada, depois ✅ 10 de 10**
  (`docs/testes/CV-1-execucao.md`).
- `CV-1-09` achou um bug: bolão em que **ninguém pontuou** declarava todos
  co-campeões, porque o campeão era derivado só de `position === 1` e com todos em
  zero todos ficam em primeiro. Inventar um título de zero ponto para a galera
  inteira é pior que não ter campeão — e sumia com a única informação útil
  ("ninguém pontuou"). Corrigido exigindo `points > 0`; a tela já tinha o estado
  pronto, ele nunca era alcançado.
- Duas lacunas cobertas: `CV-1-04` (encerrar duas vezes é idempotente) e
  `CV-1-03` (jogo remarcado para depois do fim — o antecipado é a única saída).
