Files
app-padel/docs/roadmap/FASE-03.md
Ivan Alcaraz 6494e2b38b FASE 3 COMPLETADA: Torneos y Ligas
Implementados 3 módulos con agent swarm:

1. SISTEMA DE TORNEOS
   - Tipos: Eliminación, Round Robin, Suizo, Consolación
   - Categorías: Masculina, Femenina, Mixta
   - Inscripciones con validación de niveles
   - Gestión de pagos y estados

2. CUADROS Y PARTIDOS
   - Generación automática de cuadros
   - Algoritmos: Circle method (Round Robin), Swiss pairing
   - Avance automático de ganadores
   - Asignación de canchas y horarios
   - Registro y confirmación de resultados

3. LIGAS POR EQUIPOS
   - Creación de equipos con capitán
   - Calendario round-robin automático
   - Tabla de clasificación con desempates
   - Estadísticas por equipo

Modelos DB:
- Tournament, TournamentParticipant, TournamentMatch
- League, LeagueTeam, LeagueTeamMember, LeagueMatch, LeagueStanding

Nuevos endpoints:
- /tournaments/* - Gestión de torneos
- /tournaments/:id/draw/* - Cuadros
- /tournaments/:id/matches/* - Partidos de torneo
- /leagues/* - Ligas
- /league-teams/* - Equipos
- /league-schedule/* - Calendario
- /league-standings/* - Clasificación
- /league-matches/* - Partidos de liga

Datos de prueba:
- Torneo de Verano 2024 (Eliminatoria)
- Liga de Invierno (Round Robin)
- Liga de Club 2024
2026-01-31 08:38:54 +00:00

240 lines
7.2 KiB
Markdown

# Fase 3: Torneos y Ligas
## Estado: ✅ COMPLETADA
### ✅ Tareas completadas:
#### 3.1.1: Creación de Torneos
- [x] Formulario de creación de torneo
- [x] Configurar formato (eliminación, liga, suizo, consolación)
- [x] Definir categorías (masculina, femenina, mixta)
- [x] Configurar niveles permitidos
- [x] Establecer fechas y canchas asignadas
#### 3.1.2: Inscripciones
- [x] Inscripción online individual/parejas
- [x] Pago de inscripción integrado
- [x] Lista de inscritos visible
- [x] Cierre de inscripciones automático/manual
#### 3.1.3: Sorteos y Cuadros
- [x] Sorteo automático de emparejamientos
- [x] Generación de cuadro visual (bracket)
- [x] Cuadro de consolación automático
- [x] Publicación de cuadros en la app
#### 3.1.4: Gestión de Partidos de Torneo
- [x] Asignación de horarios y canchas
- [x] Registro de resultados
- [x] Avance automático en el cuadro
- [x] Notificaciones a jugadores
#### 3.2.1: Ligas por Equipos
- [x] Creación de equipos
- [x] Inscripción de equipos en liga
- [x] Configurar formato de jornadas
- [x] Generación automática de calendario
#### 3.2.2: Clasificaciones
- [x] Tabla de clasificación automática
- [x] Criterios de desempate configurables
- [x] Estadísticas de equipos (partidos, sets, puntos)
- [x] Historial de resultados por jornada
---
## 📊 Resumen de Implementación
### Modelos de Base de Datos
| Modelo | Descripción |
|--------|-------------|
| Tournament | Torneos con tipo, categoría, niveles, fechas |
| TournamentParticipant | Inscripciones con estado de pago |
| TournamentMatch | Partidos de torneo con relaciones de avance |
| League | Ligas por equipos |
| LeagueTeam | Equipos participantes |
| LeagueTeamMember | Miembros de cada equipo |
| LeagueMatch | Partidos de la liga |
| LeagueStanding | Clasificación actualizada automáticamente |
### Tipos de Torneo Soportados
| Tipo | Descripción |
|------|-------------|
| ELIMINATION | Eliminación simple con cuadro |
| ROUND_ROBIN | Todos contra todos |
| SWISS | Sistema suizo sin eliminación |
| CONSOLATION | Cuadro de consolación para perdedores 1ra ronda |
### Sistema de Puntos - Ligas
| Resultado | Puntos |
|-----------|--------|
| Victoria | 3 |
| Empate | 1 |
| Derrota | 0 |
### Criterios de Desempate
1. Puntos totales
2. Diferencia de sets
3. Diferencia de games
4. Enfrentamiento directo
---
## 🔌 Endpoints de Torneos
```
# Gestión de Torneos
GET /api/v1/tournaments - Listar torneos
POST /api/v1/tournaments - Crear torneo (admin)
GET /api/v1/tournaments/:id - Ver torneo
PUT /api/v1/tournaments/:id - Actualizar (admin)
DELETE /api/v1/tournaments/:id - Cancelar (admin)
POST /api/v1/tournaments/:id/open - Abrir inscripciones (admin)
POST /api/v1/tournaments/:id/close - Cerrar inscripciones (admin)
# Inscripciones
POST /api/v1/tournaments/:id/register - Inscribirme
DELETE /api/v1/tournaments/:id/register - Desinscribirme
GET /api/v1/tournaments/:id/participants - Listar participantes
PUT /api/v1/tournaments/participants/:id/pay - Confirmar pago (admin)
# Cuadros y Partidos
POST /api/v1/tournaments/:id/draw/generate - Generar cuadro (admin)
GET /api/v1/tournaments/:id/draw - Ver cuadro
GET /api/v1/tournaments/:id/matches - Listar partidos
GET /api/v1/tournaments/:id/matches/:matchId - Ver partido
PUT /api/v1/tournaments/:id/matches/:matchId/schedule - Programar (admin)
PUT /api/v1/tournaments/:id/matches/:matchId/result - Registrar resultado
PUT /api/v1/tournaments/:id/matches/:matchId/confirm - Confirmar resultado
```
## 🔌 Endpoints de Ligas
```
# Ligas
GET /api/v1/leagues - Listar ligas
POST /api/v1/leagues - Crear liga (admin)
GET /api/v1/leagues/:id - Ver liga
PUT /api/v1/leagues/:id - Actualizar (admin)
DELETE /api/v1/leagues/:id - Eliminar (admin)
POST /api/v1/leagues/:id/start - Iniciar liga (admin)
POST /api/v1/leagues/:id/finish - Finalizar liga (admin)
# Equipos
GET /api/v1/league-teams - Listar equipos
POST /api/v1/league-teams - Crear equipo
GET /api/v1/league-teams/:id - Ver equipo
PUT /api/v1/league-teams/:id - Actualizar equipo (capitán)
DELETE /api/v1/league-teams/:id - Eliminar equipo
POST /api/v1/league-teams/:id/members - Agregar miembro
DELETE /api/v1/league-teams/:id/members/:userId - Quitar miembro
# Calendario
GET /api/v1/league-schedule/:leagueId - Calendario completo
GET /api/v1/league-schedule/:leagueId/matchday/:n - Jornada específica
POST /api/v1/league-schedule/:leagueId/generate - Generar calendario (admin)
PUT /api/v1/league-matches/:id/schedule - Programar partido
# Clasificación
GET /api/v1/league-standings/:leagueId - Tabla de clasificación
GET /api/v1/league-standings/:leagueId/top - Top equipos
# Partidos de Liga
PUT /api/v1/league-matches/:id/result - Registrar resultado
PUT /api/v1/league-matches/:id/confirm - Confirmar resultado
```
---
## 🚀 Cómo probar
```bash
cd backend
npm run dev
```
### Crear un torneo (admin)
```bash
curl -X POST http://localhost:3000/api/v1/tournaments \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Torneo Test",
"type": "ELIMINATION",
"category": "MIXED",
"maxParticipants": 8,
"price": 2000
}'
```
### Inscribirse en torneo
```bash
curl -X POST http://localhost:3000/api/v1/tournaments/ID/register \
-H "Authorization: Bearer TOKEN"
```
### Generar cuadro (admin)
```bash
curl -X POST http://localhost:3000/api/v1/tournaments/ID/draw/generate \
-H "Authorization: Bearer TOKEN"
```
---
## 📁 Archivos creados en esta fase
```
backend/src/
├── services/
│ ├── tournament.service.ts
│ ├── tournamentDraw.service.ts
│ ├── tournamentMatch.service.ts
│ ├── league.service.ts
│ ├── leagueTeam.service.ts
│ ├── leagueSchedule.service.ts
│ ├── leagueStanding.service.ts
│ └── leagueMatch.service.ts
├── controllers/
│ ├── tournament.controller.ts
│ ├── tournamentDraw.controller.ts
│ ├── tournamentMatch.controller.ts
│ ├── league.controller.ts
│ ├── leagueTeam.controller.ts
│ ├── leagueSchedule.controller.ts
│ ├── leagueStanding.controller.ts
│ └── leagueMatch.controller.ts
├── routes/
│ ├── tournament.routes.ts
│ ├── tournamentDraw.routes.ts
│ ├── tournamentMatch.routes.ts
│ ├── league.routes.ts
│ ├── leagueTeam.routes.ts
│ ├── leagueSchedule.routes.ts
│ ├── leagueStanding.routes.ts
│ └── leagueMatch.routes.ts
├── validators/
│ ├── tournament.validator.ts
│ └── league.validator.ts
├── utils/
│ └── tournamentDraw.ts
└── ...
```
---
## 🎯 Datos de prueba creados
| Entidad | Nombre | Descripción |
|---------|--------|-------------|
| Torneo | Torneo de Verano 2024 | Eliminación, Mixto, Abierto |
| Torneo | Liga de Invierno | Round Robin, Hombres |
| Liga | Liga de Club 2024 | Liga por equipos |
---
*Completada el: 2026-01-31*