Ir al contenido

Calendario

El calendario del staff concentra entrenamientos, partidos y eventos del microciclo. Permite crear/editar sesiones, copiar una sesión modelo a múltiples fechas, marcar ausencias por jugador y registrar convocatorias a selección en bloque. Vive en /dashboard/calendario y se alimenta de calendar_events + session_absences.

  • Problema que resuelve: la mayoría de los clubes planifica en Google Sheets o Excel y los datos no se cruzan nunca con carga, wellness o lesiones. CÉNIT unifica calendario y métricas para que un MD-2 borrado por convocatoria se vea reflejado automáticamente en el ACWR del jugador.
  • Casos de uso típicos: programar la semana, copiar el “entreno de activación” a las próximas 4 semanas en 30 segundos, descontar del cómputo a un jugador que se fue a la selección, dejar nota post-partido (lineup, sustituciones, observaciones).
  • Planes que lo incluyen: todos (esencial, pro, enterprise).
  • Diferenciador: la copia masiva con preservación de hora UTC y el bloque de convocatorias multi-jugador son únicos vs ofertas competidoras genéricas tipo “calendario CRUD”.
  • Lectura: todos los roles del staff.
  • Crear / editar eventos: cualquier staff con sesión activa (createEvent / updateEvent no enforzan rol server-side; la UI oculta el botón para roles no-admin, pero un payload manipulado pasa el guard básico).
  • Copiar eventos a múltiples fechas y marcar convocatoria (national_team) en bulk: hop, dir, sc.
  • Borrar eventos: hop, dir, sc, ss, rtp.
  • Marcar / quitar ausencias individuales: hop, dir, sc, ss, rtp, fisio, med, nut, psi (el quién las registró queda en session_absences.recorded_by).
  • Crear sesión. Botón ”+” en mes/semana → modal con título, tipo de evento, tipo de sesión personalizado (de org_session_types, configurable en Settings), horario, lugar y notas. La fecha/hora se arma en el browser y se manda en ISO con offset para no depender del TZ del runtime SSR.
  • Copiar sesión a múltiples fechas. Desde el modal de una sesión existente → “Copiar” → seleccionar hasta 30 fechas destino. El sistema preserva la hora UTC original y duración, y omite fechas que ya tengan un evento idéntico creado por el mismo usuario.
  • Marcar ausencia individual. Click en el evento → panel de asistencia → “Marcar ausente” → motivo: injury, illness, personal, load_management, tactical, other.
  • Marcar convocatoria a selección (bulk). Botón “Selección” → elegir jugadores (1-50) + rango de fechas → el sistema crea ausencias con motivo national_team en todos los eventos del rango para esos jugadores. Salta los que ya existían.
  • Notas de partido. En eventos tipo partido se puede editar texto libre que queda en calendar_events.match_notes.
  • Tipos de sesión (Settings → Tipos de sesión): cada org define sus propios labels y colores para el campo session_type_id de calendar_events.
  • Microciclo MD-N: el cálculo se hace con get_microcycle_day y se usa en /player/agenda para mostrar al jugador su semana.
  • Hora corrida al copiar: se preserva la hora UTC del evento origen. Si el origen quedó “8 AM Buenos Aires” en invierno y se copia a una fecha en verano, sigue siendo el mismo instante UTC.
  • Convocatoria sin eventos en el rango: la action retorna { created: 0, skipped: 0 } sin error.
  • Cross-tenant guard: la action de selección filtra los playerIds recibidos a los que están en la org del caller antes de crear absences — un payload manipulado no puede tocar otra org.

Player surface: la agenda del jugador (/player/agenda) consume los mismos calendar_events pero oculta event_type (PR #35). Solo muestra horario, MD-N, lugar y un título genérico. Si el jugador tiene una ausencia registrada para un evento, el evento queda con flag visual en su agenda.

  • calendar_events — eventos (title, description, event_type, start_datetime, end_datetime, location, is_all_day, session_type_id, match_notes, created_by, organization_id).
  • session_absences — ausencias (event_id, player_id, reason, source, recorded_by). Constraint único (event_id, player_id).
  • org_session_types — tipos de sesión configurables por org (name, color, sort_order).
  • competition_logos — catálogo de logos de competiciones para partidos.
  • RPC get_microcycle_day — calcula el día del microciclo (MD-N) para una fecha de un evento.
  • Carga GPS: los eventos con session_type_id se usan como referencia para clasificar sesiones GPS importadas.
  • Risk Advisor: las ausencias por injury contribuyen al historial de lesiones del jugador.
  • Informe HoP: el resumen semanal cuenta sesiones y ausencias para matchLoad y injuryRate.
  • No hay sincronización con calendarios externos (Google Calendar, iCal). [NEEDS_USER: ROADMAP confirmar.]
  • No hay recurrencia nativa — el flujo de copia masiva la suple.
  • Las ausencias por national_team se registran como bloque pero no hay reporte agregado de “días perdidos por convocatoria” por jugador. [NEEDS_USER: ROADMAP validar si interesa exponerlo en Informe HoP.]