Para qué sirve y para quién
Reservas es el libro de reservas del restaurante o del bar: decide cuándo y para cuántos se acepta reservar (franjas horarias con un máximo de reservas y, si se quiere, de comensales, dentro del horario del negocio; y días bloqueados), apunta cada reserva con su cliente y su mesa, la lleva de Pendiente a Completada y guarda en una lista de espera a quien no cabe.
Quién la usa:
- El empleado que coge el teléfono o atiende la puerta (el anfitrión o el camarero) apunta, confirma, sienta, cambia y cancela reservas y lleva la lista de espera.
- El responsable de sala, además, crea las franjas, bloquea días y cambia las reglas.
- El administrador y el propietario, además, borran reservas para siempre.
Reservas no pinta el plano (eso es Mesas: aparta la mesa de cada reserva confirmada), no cobra (eso es Ventas) y no es la agenda de citas de una peluquería (eso es Citas).
Referencia adoptada
ERPlora no inventa flujos: adopta los que el mercado ya probó (OpenTable, Resy, SevenRooms, Toast Tables, Square, Lightspeed, TouchBistro, Tablein, TablesReady, CoverManager, TheFork Manager, Odoo). Las dudas abiertas del producto actual se resolvieron así; la investigación, con sus fuentes, está en «Investigación de mercado», al final de este manual.
- Libro por día y por servicio, con los cubiertos del día y cuánto queda libre en la próxima franja; la franja agotada se ve atenuada y marcada «Lleno», no se esconde (OpenTable, Resy).
- Ciclo de la reserva: pendiente → confirmada → sentada → completada, más cancelada y no presentada; no se vuelve atrás.
- El anfitrión gestiona la reserva entera (duda 1): el empleado de sala confirma, sienta, cambia, cancela y marca no presentados, y lleva la lista de espera; lo del responsable son las franjas, los bloqueos y las reglas.
- El aforo de la franja se cuenta en reservas y, si se quiere, también en comensales (duda 2): el máximo de reservas de siempre y un máximo de comensales opcional; la franja se cierra con el primero que se alcanza, como ResDiary, OpenTable y HostMe.
- Sentar la reserva sienta la mesa (duda 3): «Sentar» abre la cuenta de su mesa en Mesas y Ventas en el mismo paso. Una mesa ocupada se rechaza (hay que liberarla o pasar la reserva a otra mesa), salvo que ese mismo grupo ya se sentara en ella desde el plano: entonces solo se marca la reserva.
- En la lista están todas las acciones (duda 4): editar (también la mesa), confirmar, sentar, completar, cancelar con motivo, no presentado y borrar.
- Una mesa no se reserva dos veces a la misma hora (duda 5): al elegir mesa se ofrecen las libres a esa hora que caben al grupo; dos reservas a la vez sobre la misma mesa y hora dejan una. El mercado avisa y deja sobrevender la mesa al personal; aquí manda el encargo de Ioan (una sola reserva por mesa y hora), y queda señalado como contradicción. La asignación automática y juntar mesas no entran (ver «Lo que queda fuera»).
- La lista de espera es para un día y una hora (duda 6), hoy o más adelante, en el orden en que se apuntó; cuando hay sitio se convierte en reserva con un toque. El mercado separa la cola de la puerta (con espera estimada y SMS) de la lista para días llenos; sin mensajería, aquí es una lista para las dos cosas (ver «Lo que queda fuera»).
- El teléfono es obligatorio de fábrica en la reserva (duda 7), y siempre el mismo (el producto actual no lo pedía hasta que se guardaba cualquier ajuste); el correo, no. La lista de espera no pide nada más que el nombre: el teléfono solo sirve para llamar.
- Las reglas de reserva son del cliente que reserva solo (duda 8): comensales mínimos y máximos, antelación mínima, días máximos y la franja llena atan a las reservas por internet o por WhatsApp. El personal reserva desde ya (nunca una hora pasada), cualquier grupo y cualquier fecha, y una franja llena la puede llenar a sabiendas: el sistema avisa y pide «Reservar igualmente».
- Mesa reservada desde una hora antes (duda 8, decidida por Mesas, TABLE-F25): antes la mesa sigue libre y enseña «Ana · 21:00».
Antes de empezar
- Reservas necesita Mesas (la mesa de cada reserva y su retención en el plano), Clientes (la ficha de cada cliente) y Horarios (el horario del negocio). Se encienden con ella y no se apagan mientras Reservas esté encendida. Mesas trae con ella Ventas.
- Las horas son las del negocio: en esta fase, Europe/Madrid. Una reserva guarda su día y su hora de pared («el jueves a las 21:00»), como se dicen por teléfono.
- Franjas: sin una franja para ese día de la semana no se puede reservar nada. Es la causa número uno de «no hay disponibilidad».
- Horario del negocio: una reserva tiene que empezar con el negocio abierto según Horarios: sus días especiales y cambios temporales siempre, y su semana habitual en cuanto el negocio la guarda o la confirma. La semana por defecto de Horarios (de lunes a viernes de 09:00 a 18:00), sin confirmar, no limita: si no, un restaurante que nunca abrió Horarios no podría reservar ninguna cena.
- Reglas de fábrica: la reserva dura 120 minutos, nace Pendiente, el teléfono es obligatorio, el correo no, y una pendiente se libera 15 minutos después de su hora. Para las reservas por internet o WhatsApp, además: grupos de 1 a 20, al menos 1 hora de antelación y hasta 30 días vista.
Configuración inicial, paso a paso:
- En Horarios, pon el horario del negocio (si no lo tienes ya).
- Abre Reservas → Disponibilidad, sección Franjas horarias, y crea las franjas de cada día de servicio (RESERVATION-F01).
- En Fechas bloqueadas, añade los días o las horas en que no aceptas reservas (RESERVATION-F02).
- Si quieres otras reglas, cámbialas en Reservas → Ajustes (RESERVATION-F03, F04).
- En Mesas, dibuja la sala: las reservas se asignan a sus mesas.
- Crea una reserva de prueba y comprueba en Disponibilidad → Ocupación que su franja baja en uno.
Pantallas
El menú Reservas tiene tres entradas: Reservas, Lista de espera y Disponibilidad. Abajo, las pestañas de las tres más Ajustes (esta, solo a quien puede cambiarlos). Los botones que el perfil no puede usar no salen.
Reservas
Menú Reservas → Reservas. Arriba, la barra del día: «Día anterior», la fecha, «Día siguiente» y «Hoy» cuando se está en otro día; el día en letra; y tres cifras: cubiertos (personas que vienen, sin canceladas ni no presentadas), reservas y próxima franja (la primera que no ha terminado, con cuántas reservas quedan «libres» o «Lleno»; o «No queda servicio hoy», «Sin servicio este día», «Cerrado este día»). «Hoy» es el del reloj del negocio, no el del dispositivo.
Debajo, la tabla del día por hora: Fecha, Hora, Cliente, Teléfono, Pax, Mesa, Estado; buscador «Buscar cliente, teléfono o correo…» que busca en todo el libro (resultados por día y hora); filtros por hora, comensales, mesa y estado; vista tabla o tarjetas. Acción principal «Nueva reserva» y, por fila, según su estado: «Confirmar», «Sentar», «Completar», «Cancelar», «No presentado», «Editar» y «Borrar» (solo el administrador). Tocar una fila la abre para editarla.
Vacía: «No hay reservas este día», con explicación y «Nueva reserva». Buscando sin resultados: «Ninguna reserva coincide con la búsqueda» y «Limpiar filtros». Cargando: «Cargando…» y las cifras en gris. Error: el mensaje y «Reintentar»; un fallo de una acción de fila sale encima de la tabla y uno del formulario, dentro del formulario.
Formulario de reserva («Nueva reserva» / «Editar reserva»): Cliente (el buscador de Clientes, por nombre o teléfono, con «+ Nuevo cliente»), Nombre, Teléfono, Correo, Fecha, Hora, Comensales, Duración (minutos), Mesa (las libres a esa hora, con su aforo y su zona; las que no caben al grupo, avisadas), Origen (Teléfono, En el local), Notas del cliente y Notas internas.
Lista de espera
Menú Reservas → Lista de espera. Tabla, en el orden en que se apuntaron (por día y hora preferida): Fecha, Hora pref., Cliente, Teléfono, Pax, Contactado, Estado (En espera, Convertida); buscador y filtros (fecha, contactado, convertida). Acción principal «Añadir cliente» (Cliente, Nombre, Teléfono, Fecha, Hora, Pax, Notas → «Añadir a la lista de espera»); por fila «Contactado», «Convertir» y «Quitar». Vacía: «La lista de espera está vacía.». Cargando: «Cargando…». Error: el mensaje de la tabla con «Reintentar».
Disponibilidad
Menú Reservas → Disponibilidad. Tres secciones apiladas: - Ocupación: una fecha (hoy por defecto) y, por cada franja de ese día, Franja, Reservadas, Máx, Comensales y Disponibles; la franja sin hueco se ve atenuada con la marca «Lleno», y la que cae fuera del horario del negocio, marcada «Fuera de horario». Encima, el horario del negocio de ese día y, si el día está bloqueado, su motivo. Se refresca sola cuando entra, cambia o se cancela una reserva. Vacía: «Sin servicio ese día (sin franjas).». - Franjas horarias: Día, Desde, Hasta, Máx. reservas, Máx. comensales; «Añadir franja» (Día, Desde, Hasta, Máx. reservas, Máx. comensales → «Crear franja») y «Quitar» por fila. Vacía: «Sin franjas horarias.». - Fechas bloqueadas: Fecha, Motivo, Horas (Todo el día, o desde–hasta); «Añadir fecha bloqueada» (Fecha, Motivo, Todo el día, Desde, Hasta → «Bloquear fecha») y «Quitar». Vacía: «Sin fechas bloqueadas.». Cada sección pinta su propio «Cargando…» y su error con reintento.
Ajustes
Pestaña Ajustes (solo quien puede cambiarlos). Comensales mínimos y máximos, antelación mínima (horas, para internet y WhatsApp), días máximos de antelación, duración por defecto, confirmar solas las reservas nuevas, teléfono obligatorio, correo obligatorio y minutos tras la hora para liberar una pendiente. «Guardar».
Estados de cada pantalla
| Pantalla | Cargando | Vacía | Error | Sin permiso | App apagada |
|---|---|---|---|---|---|
| Reservas | «Cargando…», cifras en gris | «No hay reservas este día» + «Nueva reserva» | mensaje + «Reintentar» | aviso en lugar de la tabla | aviso en lugar de la tabla |
| Lista de espera | «Cargando…» | «La lista de espera está vacía.» | mensaje + «Reintentar» | aviso | aviso |
| Disponibilidad | «Cargando…» por sección | un texto por sección | mensaje + «Reintentar» por sección | aviso | aviso |
| Ajustes | «Cargando…» | — | mensaje + «Reintentar» | aviso | aviso |
Mientras se recupera la conexión en vivo, «Reconectando…» encima, sin borrar lo pintado.
Flujos
| ID | Flujo | Estado |
|---|---|---|
| RESERVATION-F01 | Crear y quitar franjas horarias | hecho |
| RESERVATION-F02 | Bloquear un día o unas horas | hecho |
| RESERVATION-F03 | Ajustar las reglas de reserva | hecho |
| RESERVATION-F04 | Elegir si las reservas se confirman solas | hecho |
| RESERVATION-F05 | Consultar cuánto queda libre en un día | hecho |
| RESERVATION-F06 | Tomar una reserva a mano (teléfono o mostrador) | hecho |
| RESERVATION-F07 | Confirmar una reserva | hecho |
| RESERVATION-F08 | Modificar una reserva (día, hora, comensales, mesa) | hecho |
| RESERVATION-F09 | Cancelar una reserva | hecho |
| RESERVATION-F10 | Marcar que no se presentaron | hecho |
| RESERVATION-F11 | Sentar a la reserva | hecho |
| RESERVATION-F12 | Completar la reserva | hecho |
| RESERVATION-F13 | Liberar las reservas pendientes que nadie confirmó | declarado; en fase 1 el worker no ejecuta relay ni tareas (a mano, por el asistente o la API, sí) |
| RESERVATION-F14 | Apuntar en la lista de espera | hecho |
| RESERVATION-F15 | Marcar contactado o quitar de la lista de espera | hecho |
| RESERVATION-F16 | Convertir una entrada de la lista de espera en reserva | hecho |
| RESERVATION-F17 | Reserva que llega por WhatsApp | fuera: espera a la app de WhatsApp |
| RESERVATION-F18 | Cambiar o anular la reserva por WhatsApp | fuera: espera a la app de WhatsApp |
| RESERVATION-F19 | Avisar por WhatsApp cuando el restaurante confirma | fuera: espera a la app de WhatsApp |
| RESERVATION-F20 | Borrar una reserva | hecho |
| RESERVATION-F21 | Unir las reservas de dos fichas de cliente | declarado; en fase 1 el worker no ejecuta relay ni tareas |
| RESERVATION-F22 | Borrar los datos personales de un cliente (RGPD) | declarado; en fase 1 el worker no ejecuta relay ni tareas |
| RESERVATION-F23 | Elegir una mesa libre para la reserva | hecho |
RESERVATION-F01 Crear y quitar franjas horarias
Estado: hecho
Actor: responsable
Pantalla: Disponibilidad → Franjas horarias
Pasos:
1. Pulsa «Añadir franja», elige el día de la semana, desde y hasta, el máximo de reservas y, si
quieres, el máximo de comensales. «Crear franja».
2. Para quitarla, «Quitar» en su fila y confirma. Las reservas que ya tenía se quedan.
Entra: día, desde, hasta, máximo de reservas, máximo de comensales (opcional).
Sale: la franja (avisa: reservation.time_slot.created, reservation.time_slot.deleted).
Si falla: «Hasta» antes o igual que «Desde»: «La franja tiene que terminar después de empezar.»; una
franja que se pisa con otra del mismo día: «Esa franja se pisa con otra del mismo día (13:00–16:00).».
RESERVATION-F02 Bloquear un día o unas horas
Estado: hecho
Actor: responsable
Pantalla: Disponibilidad → Fechas bloqueadas
Pasos:
1. Pulsa «Añadir fecha bloqueada», escribe la fecha y el motivo (festivo, cierre, evento privado).
2. Deja «Todo el día» marcado o, para unas horas, quítalo y pon desde y hasta.
3. Ese día (o esas horas) no se aceptan reservas nuevas; las que ya había se quedan.
4. Para levantar el bloqueo, «Quitar» en su fila y confirma.
Entra: fecha, motivo, todo el día o desde–hasta.
Sale: el bloqueo (avisa: reservation.blocked_date.created, reservation.blocked_date.deleted).
Si falla: sin horas cuando no es todo el día, o «hasta» antes que «desde»: lo dice el campo; ese día
ya bloqueado a esa hora: «Esa fecha ya está bloqueada a esa hora.».
RESERVATION-F03 Ajustar las reglas de reserva
Estado: hecho
Actor: responsable
Pantalla: Ajustes
Pasos:
1. Cambia comensales mínimos y máximos, antelación, duración por defecto, teléfono o correo
obligatorios y los minutos para liberar una pendiente. «Guardar».
2. Las reglas valen para las reservas nuevas y para los cambios; las ya hechas no se tocan.
Entra: las reglas.
Sale: las reglas guardadas (avisa: reservation.settings.updated).
Si falla: mínimo de comensales mayor que el máximo: lo dice el campo.
RESERVATION-F04 Elegir si las reservas se confirman solas
Estado: hecho
Actor: responsable
Pantalla: Ajustes
Pasos:
1. Marca «Confirmar solas las reservas nuevas» y guarda.
2. Desde entonces toda reserva nueva (a mano, desde la lista de espera o por internet) nace
Confirmada y retiene su mesa.
Entra: el interruptor.
Sale: el ajuste (avisa: reservation.settings.updated).
RESERVATION-F05 Consultar cuánto queda libre en un día
Estado: hecho Actor: empleado, responsable Pantalla: Disponibilidad → Ocupación; Reservas (barra del día) Pasos: 1. Elige la fecha (hoy por defecto). 2. Cada franja dice cuántas reservas lleva, su máximo, los comensales y las que quedan; la llena sale atenuada con «Lleno» y la que cae fuera del horario del negocio, con «Fuera de horario». 3. Se actualiza sola mientras entran, cambian o se cancelan reservas. Entra: la fecha. Sale: nada (consulta). Cuenta exactamente lo que cuenta la puerta del alta.
RESERVATION-F06 Tomar una reserva a mano (teléfono o mostrador)
Estado: hecho
Actor: empleado, responsable, asistente
Pantalla: Reservas → «Nueva reserva»
Pasos:
1. Busca al cliente por nombre o teléfono; si no está, escribe su nombre y su teléfono (se crea su
ficha en Clientes, o se usa la que ya tiene ese teléfono).
2. Pon la fecha, la hora, los comensales y, si quieres, la mesa (RESERVATION-F23), la duración, el
origen y las notas. «Reservar».
3. La reserva nace Pendiente (o Confirmada, si se confirman solas: entonces retiene su mesa).
4. Por voz: «reserva para 4 mañana a las 21 a nombre de Ana, su teléfono es el 600 111 222, en la mesa
5».
Entra: cliente (o nombre y teléfono), fecha, hora, comensales, mesa, duración, origen, notas.
Sale: la reserva, ligada a la ficha del cliente (avisa: reservation.reservation.created).
Si falla (no se guarda nada y lo escrito se queda), en este orden:
- un teléfono que no es de su país: el motivo de Clientes, en el campo Teléfono (antes que nada más:
nunca después de «¿Reservar igualmente?»);
- sin teléfono (o sin correo) cuando son obligatorios: «Este negocio pide un teléfono en cada reserva.»;
- una hora ya pasada: «Esa hora ya ha pasado.»;
- solo por internet o WhatsApp: comensales fuera de los límites («Ese número de comensales está fuera
de los límites del negocio (1–20 comensales).»), menos antelación de la mínima («Hay que reservar con
al menos 1 h de antelación.») o más allá de los días máximos («Solo se reserva hasta 30 días
vista.»);
- día bloqueado: «Esa fecha está bloqueada (festivo o cierre): ese día no se aceptan reservas.»;
- negocio cerrado a esa hora (Horarios): «A esa hora el negocio está cerrado.»;
- ninguna franja cubre esa hora: «No hay servicio a esa hora: ninguna franja la cubre.»;
- franja llena: «Esa franja ya está completa para ese día.»; al personal se le pregunta «¿Reservar
igualmente?» y, si lo confirma, la reserva entra (por internet o WhatsApp, nunca);
- mesa fuera de servicio: «Esa mesa no se puede reservar: está bloqueada o fuera de servicio.»; mesa
ya reservada a esa hora: «La mesa 5 ya tiene una reserva de 21:00 a 23:00.».
Dos reservas a la vez sobre el último hueco o sobre la misma mesa y hora: entra una y la otra recibe
su motivo (en la franja llena, el personal puede después reservar igualmente; en la mesa, nunca).
RESERVATION-F07 Confirmar una reserva
Estado: hecho
Actor: empleado, responsable
Pantalla: Reservas (fila → «Confirmar»)
Pasos:
1. «Confirmar» en una reserva Pendiente.
2. Pasa a Confirmada y, si tiene mesa, Mesas la retiene: desde una hora antes la mesa sale Reservada
en el plano con el nombre y la hora (TABLE-F25).
Entra: la reserva.
Sale: la reserva confirmada (avisa: reservation.reservation.status_changed).
Si falla: desde otro estado: «Esta reserva está confirmada: no se puede confirmar.»; con su mesa fuera
de servicio (bloqueada, desactivada, borrada o en una zona desactivada), que no se podría retener: «La
mesa 5 (Terraza) no se puede reservar: está bloqueada o fuera de servicio.», y sigue Pendiente.
RESERVATION-F08 Modificar una reserva (día, hora, comensales, mesa)
Estado: hecho
Actor: empleado, responsable, asistente
Pantalla: Reservas (fila → «Editar», o tocar la fila)
Pasos:
1. Cambia el día, la hora, los comensales, la duración, la mesa (o quítala), el contacto o las notas.
«Guardar».
2. El cambio pasa la misma puerta que el alta (sin contar la propia reserva). Si estaba confirmada,
Mesas mueve su retención a la mesa y la hora nuevas, o la suelta si se queda sin mesa (TABLE-F26).
3. Una reserva sentada, completada, cancelada o no presentada solo cambia sus notas.
Entra: los campos cambiados.
Sale: la reserva cambiada (avisa: reservation.reservation.updated).
Si falla: los motivos de F06; en otro estado: «Esta reserva ya no se puede cambiar: solo sus notas.».
RESERVATION-F09 Cancelar una reserva
Estado: hecho
Actor: empleado, responsable, asistente
Pantalla: Reservas (fila → «Cancelar»)
Pasos:
1. «Cancelar» en una reserva Pendiente o Confirmada; escribe el motivo si quieres y confirma.
2. Pasa a Cancelada, deja su hueco libre y Mesas suelta su mesa (TABLE-F27).
Entra: la reserva y el motivo.
Sale: la reserva cancelada (avisa: reservation.reservation.status_changed).
Si falla: desde otro estado: «Esta reserva está sentada: su estado no puede pasar a cancelada.».
RESERVATION-F10 Marcar que no se presentaron
Estado: hecho
Actor: empleado, responsable, asistente
Pantalla: Reservas (fila → «No presentado»)
Pasos:
1. «No presentado» en una reserva Pendiente o Confirmada y confirma.
2. Pasa a No presentada, deja su hueco libre y Mesas suelta su mesa.
Entra: la reserva.
Sale: la reserva no presentada (avisa: reservation.reservation.status_changed).
RESERVATION-F11 Sentar a la reserva
Estado: hecho
Actor: empleado, responsable, asistente
Pantalla: Reservas (fila → «Sentar»)
Pasos:
1. Llega el grupo: «Sentar» en su reserva Pendiente o Confirmada.
2. Pasa a Sentada. Si tiene mesa, se sienta en Mesas con sus comensales y su cliente: se abre la
cuenta de la mesa en Ventas y la retención se gasta (TABLE-F28). Si el grupo ya se sentó en esa mesa
desde el plano (gastando la retención de esta reserva), solo se marca la reserva, con la cuenta de la
mesa.
Entra: la reserva.
Sale: la reserva sentada y, si se pudo, la cuenta de la mesa (avisa:
reservation.reservation.status_changed; Mesas avisa table.session.opened).
Si falla: desde otro estado: «Esta reserva está completada: su estado ya no puede cambiar.»; la mesa
fuera de servicio: «La mesa 5 (Terraza) no se puede reservar: está bloqueada o fuera de servicio.»; la
mesa ocupada por otros (también por el grupo de otra reserva sentado antes, aunque Mesas gastara al
sentarlo la retención de esta): «La mesa 5 (Terraza) está ocupada ahora mismo: libérala, o pasa la
reserva a otra mesa antes de sentarla.»; si Mesas o Ventas rechazan sentar, su motivo. En todos, la
reserva no cambia.
RESERVATION-F12 Completar la reserva
Estado: hecho
Actor: empleado, responsable
Pantalla: Reservas (fila → «Completar»)
Pasos:
1. El grupo se va: «Completar» en su reserva Sentada.
Entra: la reserva.
Sale: la reserva completada (avisa: reservation.reservation.status_changed).
Si falla: sin sentar antes: «Esta reserva está confirmada: no se puede completar sin sentarla antes.».
RESERVATION-F13 Liberar las reservas pendientes que nadie confirmó
Estado: declarado; en fase 1 el worker no ejecuta relay ni tareas (la acción existe y se puede pedir a mano,
por el asistente o la API)
Actor: sistema
Pantalla: ninguna
Pasos:
1. Cada cuarto de hora, las reservas que siguen Pendientes pasados los minutos de los ajustes (15) desde
su hora se cancelan con el motivo «Sin confirmar» y dejan su hueco libre.
2. Las confirmadas, sentadas y las de otros días no se tocan.
Entra: la hora.
Sale: las reservas liberadas (avisa: reservation.reservation.unconfirmed_released, solo si liberó
alguna).
RESERVATION-F14 Apuntar en la lista de espera
Estado: hecho
Actor: empleado, responsable, asistente
Pantalla: Lista de espera → «Añadir cliente»
Pasos:
1. Busca al cliente o escribe su nombre y, si quieres, su teléfono (con teléfono se liga a su ficha como
una reserva), la fecha, la hora que prefiere, los comensales y las notas. «Añadir a la lista de
espera».
Entra: cliente (o nombre y teléfono), fecha, hora preferida, comensales, notas.
Sale: la entrada (avisa: reservation.waitlist.created).
Si falla: sin nombre ni cliente: lo dice el formulario; un teléfono que no es de su país: el motivo de
Clientes.
RESERVATION-F15 Marcar contactado o quitar de la lista de espera
Estado: hecho
Actor: empleado, responsable
Pantalla: Lista de espera (fila → «Contactado», «Quitar»)
Pasos:
1. «Contactado» cuando se le llama; «Quitar» (y confirmar) cuando ya no espera.
Entra: la entrada.
Sale: la entrada contactada o quitada (avisa: reservation.waitlist.updated,
reservation.waitlist.deleted).
RESERVATION-F16 Convertir una entrada de la lista de espera en reserva
Estado: hecho
Actor: empleado, responsable, asistente
Pantalla: Lista de espera (fila → «Convertir»)
Pasos:
1. Hay sitio: «Convertir». Se crea la reserva con los datos de la propia entrada (cliente, fecha, hora
preferida, comensales, notas), con la duración por defecto, y la entrada queda Convertida.
2. La conversión comprueba que la hora no haya pasado, el día bloqueado, el horario del negocio y la
franja con sitio: es el personal quien la hace, a menudo para ahora mismo (sin antelación, días
máximos ni límites de comensales). Con la franja llena, se pregunta «¿Convertir igualmente?».
Entra: la entrada.
Sale: la reserva (origen «Lista de espera») y la entrada convertida (avisa:
reservation.reservation.created, reservation.waitlist.converted).
Si falla: hora pasada, franja llena o día bloqueado: su motivo, y nada cambia; ya convertida: «Esta
entrada ya se convirtió en reserva.».
RESERVATION-F17 Reserva que llega por WhatsApp
Estado: fuera — espera a la app de WhatsApp (whatsapp_inbox), que no está portada. La acción de alta
ya acepta el origen WhatsApp con sus reglas (antelación mínima).
RESERVATION-F18 Cambiar o anular la reserva por WhatsApp
Estado: fuera — espera a la app de WhatsApp (no hecho tampoco en el producto actual).
RESERVATION-F19 Avisar por WhatsApp cuando el restaurante confirma
Estado: fuera — espera a la app de WhatsApp (no hecho tampoco en el producto actual).
RESERVATION-F20 Borrar una reserva
Estado: hecho
Actor: administrador, propietario
Pantalla: Reservas (fila → «Borrar»)
Pasos:
1. «Borrar» y confirma. Mejor cancelar: guarda el motivo.
2. La reserva desaparece del libro y Mesas suelta su mesa.
Entra: la reserva.
Sale: nada (avisa: reservation.reservation.deleted y reservation.reservation.status_changed
con el estado deleted).
RESERVATION-F21 Unir las reservas de dos fichas de cliente
Estado: declarado; en fase 1 el worker no ejecuta relay ni tareas (la reacción existe y está probada)
Actor: sistema
Pantalla: ninguna
Pasos:
1. En Clientes se unen dos fichas de la misma persona.
2. Sus reservas y sus entradas de espera pasan a la ficha que queda; el nombre con el que reservaron
no cambia.
Entra: el aviso customer.customer.merged (id la que queda, absorbed_id la absorbida).
Sale: reservas y entradas re-apuntadas (avisa: reservation.customer.reassigned, solo si movió
alguna). Repetirlo no cambia nada.
RESERVATION-F22 Borrar los datos personales de un cliente (RGPD)
Estado: declarado; en fase 1 el worker no ejecuta relay ni tareas (la reacción existe y está probada)
Actor: sistema
Pantalla: Reservas, Lista de espera
Pasos:
1. En Clientes se borran los datos personales de una ficha.
2. Sus reservas se quedan sin nombre, teléfono, correo, notas, notas internas ni motivo de
cancelación, y sus entradas de espera sin nombre, teléfono, correo ni notas (también las quitadas).
La pantalla dice «Cliente borrado».
3. Se conservan el día, la hora, los comensales, la mesa, el estado y el enlace a la ficha. El nombre
también se borra de los avisos que sus reservas dejaron en el registro de avisos (status_changed y
updated lo llevan para Mesas). Mesas olvida el nombre de sus retenciones por su cuenta (TABLE-F31).
Entra: el aviso customer.customer.erased (id de la ficha).
Sale: reservas y entradas sin datos personales (avisa: reservation.customer.erased, solo si cambió
alguna). Repetirlo no cambia nada.
RESERVATION-F23 Elegir una mesa libre para la reserva
Estado: hecho Actor: empleado, responsable, asistente Pantalla: formulario de reserva → Mesa Pasos: 1. Con la fecha, la hora y los comensales puestos, el campo Mesa ofrece las mesas en servicio que están libres a esa hora (sin otra reserva viva que se pise), primero las que caben al grupo, con su aforo y su zona; las que se quedan pequeñas salen avisadas, y se pueden elegir igual. 2. Por voz: «en la mesa 5» o «en la 4 de la terraza». Entra: fecha, hora, duración, comensales. Sale: nada (consulta).
Reservas: lo que entra y lo que sale
Todo se puede pedir por las pantallas, por el asistente (por voz o por texto, con la sesión de la
propia persona) y por la API, con las mismas reglas y los mismos permisos. Pensado para la voz: una
reserva se nombra por su id o por el nombre o el teléfono del cliente con su fecha («la reserva de Ana
de mañana»); una mesa por su id o por su número («mesa 5»), con la zona si el número se repite; un
cliente por su id, su nombre o su teléfono. Si una referencia casa con varias, se rechaza diciendo
cuáles (409 *_ambiguous).
Lo que ofrece: consultas (leen, no cambian nada)
| Qué da | Quién puede | Flujos | Servicio |
|---|---|---|---|
| Las reservas de unos días (o de todo el libro buscando), con filtros, orden y páginas (hasta 100) | ver reservas | F05–F12 | reservation.reservation.list |
| Una reserva | ver reservas | F08 | reservation.reservation.get |
| Un día: cubiertos, reservas, bloqueos, horario del negocio y ocupación de cada franja | ver reservas | F05 | reservation.availability.day |
| Las mesas libres para una fecha, hora, duración y grupo | ver reservas | F23 | reservation.availability.tables |
| Las franjas horarias, con filtros y páginas | ver franjas | F01 | reservation.time_slot.list |
| Las fechas bloqueadas, con filtros y páginas | ver bloqueos | F02 | reservation.blocked_date.list |
| La lista de espera, en orden de llegada, con búsqueda, filtros y páginas | ver lista de espera | F14–F16 | reservation.waitlist.list |
| Las reglas (con la zona horaria del negocio) | ver ajustes | F03, F04 | reservation.settings.get |
Todas se pueden seguir en vivo.
Lo que ofrece: acciones (cambian datos)
| Qué hace | Quién puede | Flujos | Servicio |
|---|---|---|---|
Apunta una reserva (overbook llena a sabiendas una franja llena, solo el personal) |
apuntar reservas | F06 | reservation.reservation.create |
| Cambia una reserva | cambiar reservas | F08 | reservation.reservation.update |
| Confirma, sienta, completa, cancela o marca no presentada | cambiar reservas | F07, F09–F12 | reservation.reservation.confirm, .seat, .complete, .cancel, .no_show |
| Borra una reserva | borrar reservas | F20 | reservation.reservation.delete |
| Libera las pendientes vencidas | cambiar reservas | F13 | reservation.reservation.release_unconfirmed |
| Crea o quita una franja | cambiar franjas | F01 | reservation.time_slot.create, .delete |
| Bloquea o desbloquea una fecha | cambiar bloqueos | F02 | reservation.blocked_date.create, .delete |
| Apunta, marca contactada, convierte (también a sabiendas en una franja llena) o quita una entrada de espera | cambiar lista de espera | F14–F16 | reservation.waitlist.create, .update, .convert, .delete |
| Guarda las reglas | cambiar ajustes | F03, F04 | reservation.settings.update |
Solo para la plataforma (sin ruta en la API, como sistema): reservation.customer.reassign y
reservation.customer.erase (reacciones a Clientes).
Lo que avisa
| Aviso | Cuándo | Qué lleva |
|---|---|---|
reservation.reservation.created |
Alta (también desde la lista de espera) | id, status, table_id, date, time, party_size |
reservation.reservation.status_changed |
Confirmar, sentar, completar, cancelar, no presentado, borrar | id, status (deleted al borrar), previous_status, table_id, date, time, duration_minutes, party_size, guest_name, customer_id |
reservation.reservation.updated |
Cambiar | id y los campos que cambiaron (table_id, date, time, duration_minutes, party_size, guest_name); table_id vacío = sin mesa |
reservation.reservation.deleted |
Borrar | id |
reservation.reservation.unconfirmed_released |
Liberar pendientes | count |
reservation.time_slot.created, .deleted |
Franjas | id |
reservation.blocked_date.created, .deleted |
Bloqueos | id, date |
reservation.waitlist.created, .updated, .converted, .deleted |
Lista de espera | id (reservation_id al convertir) |
reservation.settings.updated |
Guardar las reglas | los campos cambiados |
reservation.customer.reassigned, reservation.customer.erased |
Reacciones a Clientes | id (y absorbed_id) |
status_changed y updated llevan el nombre del cliente y su ficha porque es la carga que Mesas
necesita para pintar la retención (su contrato, TABLE-F25–F27); los demás, solo ids y números.
A qué reacciona
| Aviso | De | Qué hace | Servicio |
|---|---|---|---|
customer.customer.merged |
Clientes | Pasa sus reservas y entradas a la ficha que queda (F21) | reservation.customer.reassign |
customer.customer.erased |
Clientes | Borra sus datos personales de reservas y entradas (F22) | reservation.customer.erase |
Lo que necesita de otras apps
- Mesas (requisito): la mesa de cada reserva (sus mesas, para elegirla y comprobar que está en
servicio) y, en la misma transacción de cada cambio, la retención de su mesa:
table.hold.sync_reservation(confirmar, cancelar, no presentada, borrar),table.hold.move_reservation(quitar la mesa de una confirmada) ytable.hold.release(sentar pronto); sentar llama atable.session.opencon la sesión de quien sienta. - Clientes (requisito): la ficha del cliente (
find_customer), buscarla por teléfono (customer.customer.by_phone) y crearla (customer.customer.create), con la sesión de quien reserva. - Horarios (requisito): el horario del negocio de cada día (
schedule.hours.for_range), leído en nombre de quien reserva aunque no tenga permiso en Horarios.
Quién la usa
| App | Para qué | Servicio |
|---|---|---|
| Mesas | Retener, mover y soltar la mesa de cada reserva | sus avisos y sus acciones de plataforma |
Quién puede qué
| Permiso | Propietario | Administrador | Responsable | Empleado | Servicio |
|---|---|---|---|---|---|
| Ver reservas | sí | sí | sí | sí | reservation.view_reservation |
| Apuntar reservas | sí | sí | sí | sí | reservation.add_reservation |
| Cambiar reservas (y su estado) | sí | sí | sí | sí | reservation.change_reservation |
| Borrar reservas | sí | sí | no | no | reservation.delete_reservation |
| Ver franjas | sí | sí | sí | sí | reservation.view_timeslot |
| Crear y quitar franjas | sí | sí | sí | no | reservation.change_timeslot |
| Ver bloqueos | sí | sí | sí | sí | reservation.view_blockeddate |
| Bloquear y desbloquear fechas | sí | sí | sí | no | reservation.change_blockeddate |
| Ver la lista de espera | sí | sí | sí | sí | reservation.view_waitlistentry |
| Cambiar la lista de espera | sí | sí | sí | sí | reservation.change_waitlistentry |
| Ver ajustes | sí | sí | sí | sí | reservation.view_settings |
| Cambiar ajustes | sí | sí | sí | no | reservation.manage_settings |
Los papeles llegan del SaaS con prefijo (hub_owner, hub_admin, hub_manager, hub_employee).
Sentar pide además «Sentar» de Mesas (table.add_session) y «Montar la cuenta» de Ventas
(sale.add_sale); apuntar con un cliente nuevo, «Gestionar clientes» de Clientes
(customer.manage): los cuatro papeles los tienen.