# 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*