Files
VdcScoreLive/docs/05-features.md
2026-05-05 17:12:06 +01:00

215 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 05 — Funcionalidades Detalhadas
## Módulo 1: Dashboard (Visão Geral)
**Rota:** `/dashboard`
**Prioridade:** Alta
### O que mostra:
- **Cartão de jogo LIVE** (se houver jogo a decorrer) com link rápido para Live Editor
- **Próximos jogos** (2-3 próximas partidas)
- **Últimos resultados** (2-3 jogos recentes)
- **Métricas rápidas:** Total de jogos, golos marcados, jornada atual
- **Top 3 artilheiros**
- **Top 3 da classificação**
### Comportamento:
- Se houver jogo LIVE, o cartão aparece em destaque no topo com pulse animation
- Dados atualizados em tempo real via Firestore listeners
- Links diretos para edição de cada entidade
---
## Módulo 2: Gestão de Jogos
**Rota:** `/games`
**Prioridade:** Crítica
### Lista de Jogos (`/games`)
- Filtro por jornada (dropdown ou tabs)
- Filtro por estado: Todos / Agendados / Terminados / Live
- Cards de jogo com: clubes, data/hora, resultado (se existir), estado
- Botão "Novo Jogo"
- Botão "Iniciar" (para jogos agendados)
- Botão "Live" (para jogos a decorrer — destaque verde)
### Criar/Editar Jogo (`/games/new` e `/games/:id/edit`)
**Campos:**
- Jornada (select)
- Data e hora
- Clube casa (select com crest)
- Clube fora (select com crest)
- Local/estádio
- Estado (agendado/adiado)
### Live Score Editor (`/games/:id/live`) ⭐ FUNCIONALIDADE CORE
**Este é o ecrã mais importante do projeto.**
#### Layout do ecrã:
```
┌─────────────────────────────────────────────────┐
│ ● LIVE • Jornada 15 • [Pausar] [Terminar] │
├─────────────────────────────────────────────────┤
│ │
│ FC PORTO 2 — 1 BENFICA │
│ (grande, Bebas Neue) │
│ │
│ [] [+Golo] [+Outro] [+Golo] [+] │
│ │
├─────────────────────────────────────────────────┤
│ EVENTOS DO JOGO [+ Evento] │
│ ┌────────────────────────────────────────────┐ │
│ │ ⚽ 23' — Mehdi Taremi (FC Porto) │ │
│ │ 🟨 31' — João Mário (Benfica) │ │
│ │ ⚽ 67' — Gonçalo Ramos (Benfica) │ │
│ │ ⚽ 71' — Evanilson (FC Porto) │ │
│ └────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────┘
```
#### Funcionalidades:
- **Cronómetro:** Inicia ao clicar "Iniciar Jogo", mostra minuto atual
- **Botões de golo:** `+Golo` abre modal para selecionar jogador + minuto
- **Outros eventos:** Cartão amarelo, cartão vermelho, substituição
- **Desfazer:** Botão de undo no último evento (até 30 segundos)
- **Intervalo:** Pausa o cronómetro, muda estado para "Intervalo"
- **Terminar:** Confirma resultado final, fecha o jogo
#### Modal de Golo:
- Selecionar jogador (do clube que marcou, lista filtrada)
- Minuto (pré-preenchido com minuto atual, editável)
- Tipo: Golo normal / Penálti / Autogolo
- Assistência (opcional, select com jogadores)
- Botão "Confirmar Golo" → Firestore transaction
#### Firestore Transaction no Golo:
```
1. Adicionar evento ao subcollection games/:id/events
2. Incrementar game.score.home ou game.score.away
3. Incrementar player.stats.goals
4. Se assistência: incrementar player.stats.assists
5. Recalcular standings para ambos os clubes
```
---
## Módulo 3: Clubes
**Rota:** `/clubs`
**Prioridade:** Média
### Lista de Clubes
- Grid de cards com: escudo, nome, cidade, nº de jogadores
- Barra de pesquisa
- Botão "Novo Clube"
### Criar/Editar Clube
**Campos:**
- Nome do clube
- Abreviatura (3 letras, ex: "FCP")
- Cidade
- Estádio
- Cores (principal + secundária — color pickers)
- Escudo (upload de imagem — Firebase Storage)
- Ano de fundação
### Detalhe do Clube (`/clubs/:id`)
- Info do clube
- Lista de jogadores do clube (com link para edição)
- Estatísticas: jogos, vitórias, empates, derrotas, golos
---
## Módulo 4: Jogadores
**Rota:** `/players`
**Prioridade:** Média
### Lista de Jogadores
- Tabela com: foto, nome, clube (badge), posição, nº camisola, golos, assistências
- Filtro por clube
- Filtro por posição (GR, DEF, MED, ATA)
- Barra de pesquisa
- Botão "Novo Jogador"
### Criar/Editar Jogador
**Campos:**
- Nome completo
- Nome curto (para scoreboards)
- Data de nascimento
- Nacionalidade
- Clube (select)
- Posição (GR / DEF / MED / ATA)
- Número de camisola
- Foto (upload — Firebase Storage)
- Estado (ativo / lesionado / suspenso)
---
## Módulo 5: Classificação
**Rota:** `/standings`
**Prioridade:** Alta
### Tabela de Classificação
- Posição, clube (escudo + nome), J, V, E, D, GM, GS, DG, Pts
- Linha a separar lugares de Champions/Europa/Descida (configurável)
- Atualização em tempo real
- Possibilidade de **editar manualmente** (override) um valor (com confirmação)
### Recálculo Automático
A classificação é recalculada automaticamente sempre que um jogo é finalizado. Pode também ser acionado manualmente por "Recalcular Classificação".
---
## Módulo 6: Artilheiros / Estatísticas
**Rota:** `/scorers`
**Prioridade:** Média
### Artilheiros
- Posição, jogador (foto + nome), clube, golos, assistências
- Filtro por tipo (golos / assistências / cartões)
### Cartões
- Tabela de jogadores com mais cartões (amarelos e vermelhos)
- Destaque para jogadores suspensos
---
## Módulo 7: Jornadas
**Rota:** `/rounds`
**Prioridade:** Média
### Gestão de Jornadas
- Lista de jornadas (1 a N)
- Criar nova jornada
- Ver jogos de cada jornada
- Marcar jornada como atual
---
## Funcionalidades Transversais
### Autenticação
- Login com email/password (Firebase Auth)
- Proteção de todas as rotas (exceto `/login`)
- Sessão persistente
- Logout
### Notificações (Toast)
- Sucesso ao guardar dados
- Erro com mensagem descritiva
- Confirmação de ações destrutivas (modal de confirmação)
### Confirmação de Ações Destrutivas
Sempre que o admin vai:
- Apagar um jogo, clube ou jogador
- Terminar um jogo
- Fazer override na classificação
→ Aparece modal de confirmação com texto descritivo do que vai acontecer
### Auditoria (Nice to Have — v2)
Guardar log de todas as alterações: quem fez, o quê, quando.