Turnos fijos y reservas recurrentes

El grupo que juega todos los martes no genera una reserva por semana: genera una regla. Y toda regla necesita poder romperse en una fecha puntual sin desarmarse entera, que es exactamente donde la mayoría de las implementaciones se complica.

El problema

El feriado que nadie previó

Hay veinte grupos con horario fijo. Cae un feriado en martes. Ninguno de los cinco grupos de ese día va a venir, y todos lo dan por sabido sin avisar.

Si esos turnos existen como registros generados, alguien tiene que entrar y cancelar cinco reservas una por una para liberar las canchas. Si no existen —si el horario fijo es sólo una anotación— nadie los tiene que cancelar, pero tampoco hay forma de venderle esas cinco horas a otro, porque el sistema no sabe que ese día quedaron libres.

Las dos alternativas obvias fallan por el mismo motivo: tratan la recurrencia como si fuera todo o nada. O es una regla rígida sin excepciones, o son reservas sueltas sin ningún vínculo entre sí.

La regla y las instancias, las dos cosas

más del 70%
de los turnos de Tercer Tiempo nace de una plantilla, sin que nadie toque el teclado

La estructura que funciona guarda dos objetos distintos. Por un lado la plantilla, que dice qué recurso, qué día de la semana, qué horario y desde cuándo. Por otro, las instancias concretas que esa plantilla produce, cada una con su fecha, su estado y su cobro.

La plantilla no aparece en ninguna grilla; lo que se ve son las instancias. Y cada instancia se puede mover, cancelar o cobrar sin que la plantilla se entere, porque la relación es de origen y no de dependencia permanente.

En Tercer Tiempo hay más de 60 plantillas de turno fijo activas, y la mayoría de los turnos del complejo nace de ellas sin que nadie toque el teclado.

Hasta dónde generar por adelantado

Las instancias no se pueden generar hasta el infinito: hay que elegir un horizonte. Poco horizonte y la grilla del mes que viene aparece vacía cuando alguien quiere reservar con anticipación. Mucho horizonte y cualquier cambio en la plantilla obliga a revisar cientos de instancias futuras.

El equilibrio razonable es generar unas semanas hacia adelante y correr el horizonte con una tarea que se ejecuta sola, de madrugada. Así el sistema siempre tiene las próximas semanas materializadas y nunca acumula un año de turnos que quizás no existan.

Esa tarea tiene que ser idempotente: si por algún motivo corre dos veces el mismo día, no puede duplicar turnos. Suena obvio y es el error que más veces aparece en implementaciones que funcionaron bien durante meses.

Cuando la excepción es de una sola fecha

Un feriado, una semana de vacaciones, un partido que se corre una hora. Cada una de esas cosas afecta a una o pocas instancias y no debería tocar la plantilla.

Por eso conviene poder cancelar en bloque por fecha: elegir un día y liberar todas las instancias de turno fijo de esa jornada de una sola vez, dejando la plantilla intacta para la semana siguiente. Es una operación de treinta segundos que reemplaza veinte cancelaciones manuales.

El horario que se libera así queda disponible para reservar como cualquier otro, y esa es la mitad del valor: un feriado deja de ser un día perdido y pasa a ser un día con cinco horas a la venta.

Cuando el turno fijo se termina

Los grupos se disuelven, las temporadas terminan y la gente deja de venir. Lo que no puede pasar es que el horario siga bloqueado por inercia.

Desactivar la plantilla frena la generación de instancias nuevas, pero hay que decidir qué pasa con las que ya están creadas: normalmente conviene liberar sólo las futuras y dejar intacto el historial, porque esas instancias pasadas tienen cobros asociados que forman parte de la contabilidad.

Ese es el motivo por el que la plantilla se desactiva en lugar de borrarse. Borrarla dejaría instancias históricas sin origen, y en algún momento alguien va a querer saber de dónde salió un turno de hace ocho meses.

Caso real

Ocho canchas, dos deportes y una caja que cerraba a mano

En Tercer Tiempo los clientes con horario fijo se cargaban de nuevo cada semana, uno por uno. Hoy se definen una vez y el sistema genera la semana completa antes de que alguien abra el local.

Ver el caso completo

Preguntas frecuentes

¿El cliente fijo tiene que confirmar cada semana?

No, y ese es el punto. El turno existe hasta que alguien diga lo contrario. Pedirle confirmación semanal a quien viene hace dos años es agregar una tarea que nadie va a hacer.

¿Puedo tener un precio distinto para los fijos?

Sí. La plantilla puede llevar su propio precio, que suele ser menor al del turno suelto porque asegura ocupación. Y una instancia puntual puede cobrarse distinto sin que eso cambie el precio de las demás.

¿Qué pasa si un fijo quiere cambiar su horario?

Se desactiva la plantilla vieja desde una fecha y se crea la nueva. Las instancias ya generadas del horario anterior se liberan y las del nuevo se materializan, sin tocar el historial de lo que ya se jugó y se cobró.

¿Sirve esto fuera de un complejo deportivo?

Sí. La misma estructura resuelve una clase semanal, una sesión de kinesiología que se repite tres veces por semana o un servicio con visitas programadas. Cambia el vocabulario, no el modelo.

¿Puedo ver qué horarios fijos tengo ocupados?

Sí. Las plantillas activas se listan aparte de la grilla, así se puede ver de un vistazo qué franjas están comprometidas de forma permanente y cuáles quedan libres para vender.

¿Y si el fijo debe varias semanas?

Como cada instancia tiene su propio estado de cobro, el saldo pendiente de un cliente fijo se ve acumulado sin necesidad de revisar semana por semana. Esa es una de las razones para materializar los turnos en vez de calcularlos al vuelo.

Seguir leyendo

Si tenés clientes con horario fijo y los cargás a mano, en 30 minutos te mostramos cómo se resuelve. Sin costo.