Dos personas, un mismo horario
Si dos clientes reservan el mismo turno al mismo tiempo, la base de datos rechaza al segundo. No es una validación del frontend: es una restricción real en la tabla.
Caso de estudio · Full-stack
Turnos online y panel de administración para una barbería real en San Nicolás. Lo diseñé, desarrollé y sigo manteniendo en producción de punta a punta: base de datos, seguridad, frontend y despliegue.
La reserva: el cliente elige el día y ve, en el momento, los horarios realmente libres — ni pasados, ni ocupados, ni bloqueados a mano.
Luciano, el barbero, coordinaba todos sus turnos por WhatsApp: cada cliente preguntaba disponibilidad, él revisaba su agenda a mano y contestaba uno por uno. Necesitaba que los clientes pudieran reservar solos, sin choques de horario ni ida y vuelta de mensajes, y un panel propio para ver su día, bloquear horarios y cargar los clientes que vienen siempre a la misma hora.
Full-stack, solo: diseño del esquema de base de datos y de las políticas de seguridad en Supabase, el sitio público de turnos, el panel de administración con login real, la lógica de disponibilidad en tiempo real, el flujo de confirmación y cancelación por WhatsApp, y la app instalable (PWA) tanto para el sitio como para el panel.
El mismo enfoque que en Lumil: sitio estático sin build step, con Supabase como backend completo y Row Level Security como única capa de seguridad real. Por defecto no se puede leer ni ejecutar nada; el cliente solo tiene acceso a un puñado de funciones puntuales (ver disponibilidad, reservar, cancelar), nunca a las tablas directamente.
git push a master despliega el sitio y el panel automáticamente.Problemas que resolví
Si dos clientes reservan el mismo turno al mismo tiempo, la base de datos rechaza al segundo. No es una validación del frontend: es una restricción real en la tabla.
Una sola función cruza el horario comercial del día, la hora actual, los turnos ocupados, los bloqueos manuales y los clientes fijos, y devuelve qué horarios están realmente libres.
Un cliente que viene todas las semanas, cada dos o cada cuatro, se carga una sola vez. Si un día no puede venir, se libera ese horario puntual sin tocar el resto de la serie.
Cada turno tiene un enlace propio de cancelación por WhatsApp, con un token único. Pasado el límite de horas antes del turno, el enlace deja de funcionar solo.
Con o sin 0, con o sin 15, con o sin +54: el número se normaliza siempre al mismo formato, para que nunca queden cargados dos números distintos de la misma persona.
Qué día es "hoy" y qué turno ya "pasó" se calcula explícitamente en huso horario de Buenos Aires, sin depender de dónde esté corriendo el servidor.
El panel: acceso autenticado con Supabase Auth. Sin login válido, Row Level Security bloquea cualquier consulta a los turnos reales.
master¿Te sirve algo así?
Si tu negocio necesita turnos online, un panel propio o algo a medida, te cuento cómo lo encararía.
Contame tu proyecto