Bolão de Futebol
Palpites, apuração e ranking
- Meu papel
- Desenvolvedor full stack
- Cliente
- Catsuc Labs
- Setor
- Produto de consumo · web
- Status
- Em produção
Código proprietário. Sistema privado de cliente — o repositório não é público.
Números
apito
trava do palpite
Prazo verificado no servidor — nunca no relógio do cliente.
100%
apuração recalculável
Pontuação é função pura do resultado, então correção é reprocessamento.
Contexto
Bolão entre amigos sempre existiu em planilha e grupo de mensagem. O problema nunca foi calcular — foi confiar: quem palpitou antes do jogo, quem mudou depois, e por que o ranking mudou de um dia para o outro.
O problema
Três coisas que parecem detalhe e não são: o palpite tem que travar no início do jogo de forma inegociável; a regra de pontuação varia por campeonato e não pode estar espalhada pelo código; e resultado oficial pode ser corrigido — então a apuração precisa poder rodar de novo sem virar bagunça.
A abordagem
O prazo é do servidor. O cliente esconde o formulário por cortesia, mas quem recusa o palpite atrasado é a rota — relógio de cliente é sugestão, não autoridade. A pontuação virou função pura de (palpite, resultado, regra do campeonato), então apurar de novo é seguro por construção: se um resultado é corrigido, reprocessa e o ranking se refaz sem estado sujo pelo caminho.
Módulos
Campeonatos
Estrutura do torneio, com a regra de pontuação atrelada ao campeonato em vez de fixa no código.
Palpites
Registro e edição até o início do jogo. Depois disso, a rota recusa — e o participante vê exatamente por quê.
Apuração
Roda sobre o resultado oficial e pode rodar de novo. Correção de resultado é reprocessamento, não remendo.
Ranking
Classificação com critério de desempate explícito, para que dois participantes empatados tenham ordem estável.
As partes difíceis
O relógio do cliente mente
Esconder o formulário quando o jogo começa é UX. Recusar o palpite atrasado é integridade — e só o servidor pode fazer isso. Num bolão, um palpite aceito depois do apito não é bug de borda: é a razão para ninguém mais confiar no ranking.
Regra de pontuação como dado
Cada campeonato pontua diferente. Espalhar isso em condicional pelo código garante divergência na primeira mudança. Tratar a regra como configuração do campeonato e a apuração como função pura tornou o recálculo trivial — o que salvou quando resultado oficial foi corrigido.
O que é meu
- Modelagem de campeonatos, rodadas, jogos e palpites
- Trava de prazo no servidor e as mensagens que explicam a recusa
- Motor de apuração determinístico e reprocessável
- Ranking com desempate e as telas de participação
Resultado
O bolão saiu da planilha e do print no grupo. O prazo é o mesmo para todos, o ranking se explica, e correção de resultado deixou de ser uma discussão para virar um reprocessamento.
O que eu levei
- 01Prazo é regra de servidor. Qualquer coisa validada só no cliente não é validada.
- 02Cálculo determinístico e reprocessável vale mais que cálculo rápido.
- 03Em produto competitivo, o ranking precisa ser explicável — senão a discussão vira suporte.