# Execução — `CC-1` Criar bolão com os jogos já carregados

**Plano:** `CC-1-plano.md` · **Data:** 07/08/2026
**Ambiente:** backend local (`test/pools.e2e-spec.ts`), Flutter em teste de
widget (`test/criar_bolao_test.dart`, criado nesta execução — a tela de criação
não tinha teste nenhum).

**Resultado: ⚠️ 13 de 14** — `CC-1-14` bloqueado por credencial. 1 lacuna de
critério de aceite encontrada e implementada.

| ID | Resultado | Onde |
| -- | --------- | ---- |
| CC-1-01 | ✅ | e2e "cria o bolão com os jogos já carregados" |
| CC-1-02 | ✅ | e2e "define o criador como admin e participante" |
| CC-1-03 | ✅ | e2e "fonte indisponível NÃO cria bolão pela metade" |
| CC-1-04 | ✅ **novo** | widget "CC-1-04 fonte indisponível mostra o motivo com retry" |
| CC-1-05 | ✅ **novo** | widget "CC-1-05 falha na criação aparece com o motivo do servidor" |
| CC-1-06 | ✅ **novo** | widget "CC-1-06 sugere o intervalo daqui até o fim" |
| CC-1-07 | ✅ **novo** | widget "CC-1-07" e "CC-1-07b" |
| CC-1-08 | ✅ **implementado** | e2e "CC-1-08 rodadas já encerradas…" + widget "CC-1-08 bolão sem prazo aberto avisa antes de seguir" |
| CC-1-09 | ✅ **novo** | e2e "CC-1-09 rodadas futuras…" + widget "CC-1-09" |
| CC-1-10 | ✅ **novo** | e2e "CC-1-10 intervalo que cruza a rodada atual" |
| CC-1-11 | ✅ | e2e "reaproveita jogo já existente em vez de duplicar" |
| CC-1-12 | ✅ | e2e "jogos vêm com horários distintos" |
| CC-1-13 | ✅ | e2e "recusa rodada final antes da inicial" |
| CC-1-14 | ⛔ bloqueado | `BE-1` espera o token da `football-data.org` |

## Lacuna encontrada — o critério do aviso não tinha task nem código

A story pede, textualmente: *"Dado que escolho um intervalo de rodadas já
encerradas, então recebo aviso de que não haverá jogo com prazo aberto."*
**Nada implementava isso** — e nenhuma task cobria: `BE-3` fala de carregar os
jogos, `FE-3` fala de fonte indisponível e retry. O critério passou pelo
recorte de tasks sem virar trabalho.

O efeito é um bolão **criado com sucesso e inútil**: todos os jogos já
começaram, então ninguém palpita, e o convite também é recusado porque a entrada
fecha no primeiro jogo (`CC-5 BE-4`). O admin monta o bolão, manda o link no
grupo, e o erro aparece como "não consigo palpitar" de dez pessoas.

Implementado:
- `openMatches` na resposta da criação (`src/pools/pools.service.ts`), contando
  os jogos com prazo ainda aberto;
- aviso explícito no app antes de seguir para o bolão, dizendo **por que** ele
  não vai funcionar e o que fazer;
- na criação normal, a mensagem passou a dizer quantos jogos dão palpite — o
  número só significa algo se aparecer nos dois casos.

Optei por **avisar e criar**, não recusar: é o que o critério pede, e há uso
legítimo em criar sobre rodadas passadas (conferir extrato de um bolão antigo
recriado). Recusar seria decidir por conta própria o oposto do escrito.

## Observações

- **A tela de criação não tinha um único teste** — é a porta de entrada do
  produto. Sete casos novos nasceram aqui, incluindo validação por campo sem
  chamar a API.
- **`pumpAndSettle` não serve nesta tela:** o botão mostra um
  `CircularProgressIndicator` enquanto envia, e ele continua animando enquanto o
  diálogo de aviso está aberto — a árvore nunca fica parada. Os casos usam
  `pump` com passo fixo.
- `CC-1-14` não é executável e por isso `QA-2` **fica aberta**. A porta
  (`FonteDeDados`) e o adaptador falso estão prontos; a integração real é troca
  de adaptador, não de arquitetura.
