🏉 Rugby M12 · Tucumán Lawn Tennis
App de gestión de jugadores para el staff de la división M12 de rugby infantil.
Funciona desde el celular y la PC (es una web app; se puede "agregar a la
pantalla de inicio" del teléfono y queda como una app más).
Funciones
- Jugadores (ABM): altas, bajas y modificaciones. Datos personales, tutor,
posición, estado (activo / lesionado / inactivo) y ficha médica.
- Ficha de seguimiento evolutivo: entradas por fecha y área (técnica, física,
táctica, actitudinal, social) con valoración de 1 a 5 estrellas y comentarios.
- Entrenamientos: toma rápida de asistencia (presente / ausente, ausente
por defecto) y porcentajes por jugador. Cada entrenamiento se marca como
de rutina (lunes y miércoles de 19:30 a 21:00) o extra, y se puede
suspender indicando el motivo (clima, feriado u otro) y una nota libre;
lo suspendido no cuenta para los porcentajes. Al tomar asistencia se puede
marcar a un jugador como golpeado o
lesionado: los dos quedan como recordatorio en Jugadores para hacerles
el seguimiento (al lesionado hay que cargarle la lesión en la ficha; el
aviso del golpe se va solo a las dos semanas), y los dos se descuentan del
resumen "Presentes por puesto" —siguen contando como presentes en la
asistencia, pero ya no están para entrenar— (en los partidos eso se marca
en la cancha, desde Partidos). Cada entrenamiento tiene además su
planificación técnica: qué aspectos se trabajan ese día (técnica
colectiva e individual, con la posibilidad de sumar otros al catálogo y de
corregirles el nombre después, con el lápiz de su fila, sin perder lo ya
trabajado) y cuántos minutos lleva cada uno; los que no se cargan a mano se reparten la
hora de técnica, y sin ningún aspecto marcado el día queda registrado como
"sin planificación". Al planificar, cada aspecto muestra al lado su historia
del año (cuánto hace de la última vez, cuántas veces y cuántos minutos
acumula), con un aviso en los que hace más de tres semanas que no se tocan;
la pantalla de Entrenamientos resume lo mismo en un gráfico de barras,
Qué se viene entrenando, con los minutos de cada aspecto y la lista de
los que todavía no se trabajaron.
- Partidos: al entrar se abre el último partido cargado, y "Listado de partidos"
lleva a la lista de todos, del más próximo al más viejo, con los detalles
de cada uno a la vista (rival, hora de convocatoria y lugar de cada
bloque, suspensiones y bloques sin cerrar). Cada partido se crea y se
convoca desde su pestaña
Convocatoria (quién avisa que va), y de ahí sigue el resto del día:
asignación de los convocados a los bloques que presenta el club (normalmente
2, pero al crear el partido se puede elegir de 1 a 6). La suspensión de un
partido es por bloque: puede caerse uno y jugarse el otro. Los campos de
rival y lugar de juego autocompletan con lo ya cargado: se escriben unas
letras y aparecen las coincidencias. Cada
bloque guarda además el grado de dificultad del rival (bueno / regular /
malo).
- Equipos por tiempo: cada bloque juega 4 a 6 tiempos; se arma el equipo de
cada tiempo y la app avisa qué chicos todavía no jugaron ningún tiempo.
- Viajes: las giras a otras provincias. De cada viaje se carga quiénes
van (elegidos del plantel), el staff que acompaña, el precio y las cuotas.
En Alojados se arman las casas: cada una es una familia del club
anfitrión (nombre, teléfono, dirección, notas) que recibe a uno o más
chicos; la hoja se imprime o se baja en CSV para el club que recibe. En
Managers se lleva el checklist de papeles de cada chico (autorización
firmada, fotocopia del DNI, devolución del DNI al volver), los pagos
de cada familia (seña, cuotas, saldo, con medio de pago y quién lo
registró) y las observaciones que la familia anfitriona tiene que saber
(alergias, medicación). El listado y la ficha del viaje muestran cuánto
falta cobrar y quiénes tienen papeles pendientes.
Arquitectura
- Frontend: React + Vite, CSS propio, mobile-first (
src/).
- API: funciones serverless de Vercel (
api/ + server/), en el mismo repo.
- Base de datos: PostgreSQL propio en Neon (plan
gratuito). Esquema en
db/schema.sql.
- Acceso: login con email y contraseña. Solo pueden entrar los emails
cargados en la tabla
staff desde la pestaña Staff de la app (los suma,
con su rol, la cabeza de división). En el primer ingreso, cada persona crea
su contraseña. Las sesiones usan JWT (60 días).
- Roles: entrenadores, preparadores físicos y la cabeza de división ven
toda la app. Los managers (principal y asistente) solo entran a lo
administrativo: Padrón (contacto, DNI, ficha médica), la convocatoria de
los partidos (marcar quién va), Viajes y sus avisos;
la API les cierra todo lo demás (asistencia, evaluaciones, entrenamientos,
partidos, lesiones, tests, boletines).
Puesta en marcha (una sola vez)
1. Base de datos en Neon
- Entrá a console.neon.tech con tu cuenta.
- Creá un proyecto nuevo (ej.
rugby-m12, región AWS São Paulo).
- Copiá la connection string (botón "Connect", incluye
?sslmode=require).
- Creá las tablas. Opción A — desde tu PC:
DATABASE_URL='postgresql://...' npm run db:init
Opción B — pegá el contenido de db/schema.sql en el SQL Editor de Neon.
2. Hosting en Vercel
- En vercel.com → Add New → Project → importá este
repositorio (igual que hiciste con finanzas-familia).
- En Environment Variables agregá:
DATABASE_URL: la connection string de Neon.
JWT_SECRET: una frase larga y aleatoria (por ej. 40 caracteres).
- Deploy. Cada push a
main redeploya solo.
3. Primer ingreso
Entrá con [email protected] (ya está cargado como staff en el esquema):
la app te pide crear tu contraseña. Después sumá al resto del staff desde la
pestaña Staff.
Desarrollo local
npm install
npm run dev:api # API con base en memoria (PGLITE=1) en :3001
npm run dev # frontend en :5173, proxy /api → :3001
Para desarrollar contra la base real: DATABASE_URL='postgresql://...' node scripts/dev-server.mjs.