Cómo abrir el selector de mesas
Abre la pantalla independiente del selector de mesas para un plano de la ubicación actual, revisa zonas y mesas sobre el plano y marca una selección local sin guardar todavía una asignación de reserva.
En este artículo
El selector de mesas ayuda al equipo de sala a decidir, sobre el plano real del local, qué mesas encajan con una reserva o con una operación concreta. En el demo ES de Grupo Marea Demo se abre para Marea Gran Via con el plano `${BOOKING_TABLES_SELECTOR_LAYOUT_ID}` y permite seleccionar mesas como `C1`, `C2` y `C3`.
Esta pantalla lee el layout, calcula capacidad y combinaciones, y puede conservar un borrador local si la ruta incluye `sessionId`. La selección no se guarda en backend ni actualiza por sí sola una asignación de reserva.
Antes de empezar
- Sesión iniciada en Grupo Marea Demo con la ubicación Marea Gran Via seleccionada o incluida en la ruta contextual.
- Acceso a `/:orgId/:locationId/reservations/tables/select?layoutId=:layoutId`.
- `layoutId` presente, no vacío, perteneciente a la ubicación actual y no borrado.
- Permiso suficiente para entrar en la pantalla y permiso efectivo `layout:view` para cargar el plano.
Instrucciones
- 1.
Abre el selector con un plano válido
Entra por la ruta contextual del selector con `layoutId`. Si falta la organización, la ubicación o el `layoutId`, la pantalla muestra `No encontramos el plano solicitado.` y no carga el plano.
- 2.
Espera la carga del layout
La pantalla carga zonas, mesas, tipos de mesa y combinaciones desde `GET /api/app/{orgId}/{locationId}/layouts/{layoutId}`. Mientras carga aparece `Cargando selector de mesas...`; si la lectura falla, aparece `No pudimos cargar el plano de mesas.`
- 3.
Oriéntate en el plano
Usa el plano a pantalla completa para localizar zonas y mesas. Puedes desplazar, hacer zoom y restaurar el zoom; si el layout no contiene mesas, el selector muestra `No hay mesas para seleccionar.`
- 4.
Selecciona o quita mesas
Toca una mesa para seleccionarla y vuelve a tocarla para quitarla. En la captura planificada del demo ES se seleccionan `C1`, `C2` y `C3`; si la ruta incluye `sessionId`, cada cambio se conserva en un borrador local en memoria.
- 5.
Revisa capacidad y combinación
La tarjeta inferior muestra `Capacidad maxima`, el total de pax y el conteo de mesas. Si varias mesas no coinciden con una combinación exacta configurada, aparece `Combinacion no configurada`, pero la selección no se bloquea.
- 6.
Restaura la selección inicial si hace falta
El botón de restaurar vuelve al estado con el que se montó el selector. Permanece deshabilitado hasta que la selección actual cambia respecto a esa selección inicial.
- 7.
Vuelve al flujo anterior
Pulsa `Volver` para salir. Si la ruta incluía `occurrenceId`, se usa solo para volver al detalle de la ocurrencia; esta pantalla no lo envía como `occurrence_id` al cargar el layout.
- 8.
Ten claro el alcance
Esta acción sirve para elegir mesas sobre el plano. No llama a `PUT /api/app/{orgId}/{locationId}/reservations/{reservationId}/tables` y no crea ni actualiza `reservation_table_assignment`.
Validaciones y límites
- `layoutId`, `occurrenceId` y `sessionId` se aceptan solo como strings y se normalizan con `trim()`.
- La carga del layout solo se habilita cuando existen organización, ubicación, `layoutId` y permisos de entrada.
- La UI puede permitir entrar con permisos de reservas o layout, pero la lectura real del plano exige `layout:view`.
- El backend rechaza `layoutId` vacío, layouts borrados o layouts de otra ubicación.
- El selector conserva solo IDs de mesas existentes en el layout cargado y deduplica la selección.
- Una selección múltiple solo se considera combinación válida si coincide exactamente con `layout_table_combination.table_ids`.
- Sin combinación exacta, la UI muestra la suma de capacidades y el aviso `Combinacion no configurada`.
- El borrador asociado a `sessionId` vive en memoria del frontend y se pierde al recargar la app.
Resultado esperado
El equipo sale con una selección local de mesas revisada sobre el plano y con la capacidad visible, sin haber guardado todavía una asignación de reserva.