Ir al contenido

Agenda

/player/agenda te muestra la semana actual (lunes a domingo) con las sesiones que tenés agendadas. Es una vista deliberadamente simple: hora, lugar, MD-N y un título genérico. No ves el tipo de sesión (entrenamiento, partido, recovery, etc.) — eso es decisión del cuerpo técnico (PR #35).

  • Una tarjeta por sesión con tres datos:
    • Horario (hora de inicio y, si está cargado, fin).
    • Lugar (campo, gimnasio, estadio).
    • MD-N: el día relativo al partido más cercano dentro de una ventana de [-3, +7] días. Soporta MD, MD-1, MD-2, MD-3, MD-4, MD-5, MD+1, MD+2. En empate (mismo día de distancia), gana el partido futuro sobre el pasado. Si no hay match en la ventana, aparece “Libre”.
  • Título genérico: “Entrenamiento” o “Partido”. No distingue entre “fuerza”, “video”, “regenerativo”, etc. — esa info la maneja el staff internamente.
  • Día actual marcado con badge “Hoy” y resaltado en azul.
  • Días pasados quedan grises (podés repasar lo que entrenaste en la semana).
  • Sin sesiones: si un día no tiene nada cargado, te aparece “Sin sesiones”.

¿Por qué tan minimalista? Porque la planificación táctica y de carga la maneja el PF. Vos necesitás saber dónde estar y a qué hora, no qué tipo de estímulo hay detrás. Si querés más detalle, preguntá por Mensajes.

  • Calendario. El staff carga las sesiones desde /dashboard/calendario (mes/semana). Lo que ellos marcan como “training” o “match” se traduce a tu vista como “Entrenamiento” / “Partido”.
  • Convocatorias. En el estado actual, la agenda del jugador muestra todos los eventos de la organización dentro de la semana (filtrados por organization_id con defensa en profundidad sobre la RLS calendar_player_select de migration-046). El helper loadPlayerCalendarEvents no aplica filtro por convocatoria/ausencia — si en el futuro se quiere ocultar eventos según session_absences, hay que sumarlo acá.
  • Microciclo (MD-N). El RPC get_microcycle_day(p_org_id, p_date) busca el event_type = 'match' más cercano a la fecha dentro de [-3, +7] días sobre calendar_events. No requiere configuración adicional desde Settings — el rango está hardcodeado en la función (migration-024 + migration-075).
  • Tabla: calendar_events (filtrada por organization y semana actual, lunes–domingo).
  • RPC: get_microcycle_day(p_org_id, p_date) — devuelve MD-N o Libre. Es SECURITY INVOKER, así que corre bajo RLS del caller — un jugador no puede leer eventos de otra org.
  • Helper: loadPlayerCalendarEvents agrega filtro explícito por organization_id como defensa en profundidad sobre la RLS.
  • Calendario staff (/dashboard/calendario) → único punto de entrada de eventos.
  • i18n: los labels “Entrenamiento”, “Partido”, “Hoy”, “Sin sesiones”, “Libre” están traducidos en messages/es.json, en.json, pt.json.
  • Vista semanal fija — no hay navegación a semanas anteriores ni futuras. Si necesitás ver el plan de la semana siguiente, esperá al lunes o preguntá por Mensajes.
  • No hay confirmación de asistencia desde la agenda. Las ausencias las carga el staff en su lado (session_absences).
  • Los eventos no-match (training/meeting/travel/other) comparten el label genérico “Entrenamiento”. Solo event_type = 'match' se muestra como “Partido”. Es intencional, no un bug.
  • No hay filtro de convocatoria todavía — el jugador ve todos los eventos de la org. Falta integrar session_absences o un campo de attendees explícito si se quiere ocultar.