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

7.2 KiB

Fase 3: Torneos y Ligas

Estado: COMPLETADA

Tareas completadas:

3.1.1: Creación de Torneos

  • Formulario de creación de torneo
  • Configurar formato (eliminación, liga, suizo, consolación)
  • Definir categorías (masculina, femenina, mixta)
  • Configurar niveles permitidos
  • Establecer fechas y canchas asignadas

3.1.2: Inscripciones

  • Inscripción online individual/parejas
  • Pago de inscripción integrado
  • Lista de inscritos visible
  • Cierre de inscripciones automático/manual

3.1.3: Sorteos y Cuadros

  • Sorteo automático de emparejamientos
  • Generación de cuadro visual (bracket)
  • Cuadro de consolación automático
  • Publicación de cuadros en la app

3.1.4: Gestión de Partidos de Torneo

  • Asignación de horarios y canchas
  • Registro de resultados
  • Avance automático en el cuadro
  • Notificaciones a jugadores

3.2.1: Ligas por Equipos

  • Creación de equipos
  • Inscripción de equipos en liga
  • Configurar formato de jornadas
  • Generación automática de calendario

3.2.2: Clasificaciones

  • Tabla de clasificación automática
  • Criterios de desempate configurables
  • Estadísticas de equipos (partidos, sets, puntos)
  • 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

cd backend
npm run dev

Crear un torneo (admin)

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

curl -X POST http://localhost:3000/api/v1/tournaments/ID/register \
  -H "Authorization: Bearer TOKEN"

Generar cuadro (admin)

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