Prevención de asientos huérfanos
Un asiento libre entre dos ocupados casi nunca se vende. Desde la versión 1.72.0 la plataforma puede rechazar la selección que lo crea. Si los asientos que elige el comprador dejan solo a un asiento vecino, sin ningún asiento libre al lado, el mapa amplía la selección hasta ese vecino o rechaza el clic. La regla mira una fila cada vez y solo reacciona ante el asiento solitario que crea la propia selección.
Cómo activarla
Necesitas el rol de administrador de la organización. No hacen falta permisos de administrador global.
Abre Configuración > Organización. El campo Prevención de asientos huérfanos lleva la ayuda Bloquea selecciones que dejarían un único asiento libre en una fila. y ofrece tres valores. Activado aplica la regla a todos los eventos de la organización. Desactivado la apaga para todos ellos. Heredar (actualmente activado) o Heredar (actualmente desactivado) deja la decisión al nivel superior y te dice qué responde ese nivel ahora mismo. El valor se guarda en cuanto lo eliges.
El valor desciende por cinco niveles que empiezan en el valor por defecto de la plataforma y siguen por el tenant, la organización, el esquema y el evento. El nivel que fija un valor anula todo lo que está por encima, y el nivel que queda en Heredar pasa la decisión hacia abajo. Todos los niveles empiezan apagados, así que nada cambia para tus compradores hasta que alguien activa la regla.
Cómo anularla para un solo evento
Abre un evento existente desde la sección Eventos. El mismo campo está en el diálogo del evento debajo de ID externo y se guarda junto con el resto del formulario. Un evento recién creado todavía no muestra el campo. Crea el evento primero y vuelve a abrirlo después.
Cuándo surte efecto un cambio
El servicio de reservas guarda en caché el valor resuelto durante 30 segundos, de modo que un cambio llega a los compradores en medio minuto aproximadamente. El mapa y la llamada de compra lo reciben a la vez. No hace falta volver a publicar el esquema ni reiniciar nada.
Cómo lee la regla una fila
La regla trabaja con la geometría de la fila. Ordena los asientos por sus coordenadas, así que una fila numerada del 23 al 12 se lee igual que la fila de delante numerada del 1 al 11. Los nombres de los asientos no entran en el cálculo.
Un pasillo corta la serie. Cuando el hueco entre dos vecinos supera 1,5 veces el paso mediano de esa fila, o supera 3 veces el paso medido en todo el recinto, la regla trata el hueco como pasillo y deja de contar ahí. Un asiento junto a un pasillo nunca queda retenido por un asiento del otro lado.
Solo se rechaza el asiento solitario que crea tu cambio. Una fila que ya tenía un asiento libre solitario antes de que nadie la tocara sigue siendo reservable, y ese asiento se vende como cualquier otro. Los asientos ocultos se ignoran.
Liberar asientos nunca se bloquea. Quitar un bloqueo y revertir una venta salen adelante con cualquier resultado, porque rechazar una liberación solo dejaría asientos fuera de la venta.
Qué ve el comprador
El renderizador dibuja un contorno punteado alrededor de la pareja de asientos que hay que tomar junta. El contorno solo orienta. Los asientos de dentro siguen siendo clicables y el comprador puede pulsar cualquiera de los dos.
Un clic en cualquiera de esos dos asientos sale adelante por defecto. El renderizador añade el segundo asiento por su cuenta y el carrito acaba con los dos. Quitar un asiento del carrito, en cambio, se rechaza, porque el ajuste retiraría asientos que el comprador ya había elegido. Un clic con groupSize mayor que uno se rechaza por la misma razón.
Los contornos desaparecen cuando el comprador se aleja hasta la vista general del recinto. A esa escala una línea punteada alrededor de dos asientos parece una mancha y ya no orienta.
Para integraciones
Implementa el callback onOrphanSeatsBlocked si prefieres decidir tú en lugar del comportamiento por defecto. El callback recibe los asientos que intentó tomar el comprador, los asientos que quedarían solos y el ajuste que evita el problema. Devuelve true para aceptar el ajuste y false para rechazar el cambio.
Los métodos de carrito que llamas tú mismo informan de lo mismo en su valor de retorno. initCart, addSeatsToCart, removeSeatsFromCartByIds y removeSeatsFromCartByKeys ahora devuelven un ICartChangeResult en vez de nada. Lee applied para saber si el carrito cambió y orphaned para saber si el cambio deja un asiento solo. Una eliminación informa applied: true junto con un orphaned no vacío, porque se aplica y deja un asiento solo de todos modos.
Si tu proceso de compra bloquea los asientos de uno en uno, envía en cartSeatIds de la petición v2 los identificadores que el comprador ya tiene. El servidor juzga esos asientos y los de la petición como una sola selección, y un carrito correcto no se rechaza a mitad de montaje. El campo admite hasta 1000 identificadores y lo leen lock, sale y directsale.
La firma completa del callback y los ejemplos de código están en Programmatic Cart Changes and Orphan Prevention, dentro de la documentación del renderizador.
Qué responde la compra
La regla también corre en el servidor, así que un carrito montado sin comprobar nada se la encuentra otra vez al pagar. La respuesta depende de la ruta que llames, y las dos formas difieren lo bastante como para que una instalación propia tenga que saber cuál le toca.
En la ruta de reserva v2 la petición falla entera. lock, sale y directsale responden HTTP 422 con el código ORPHAN_SEATS_REFUSED y nombran los asientos rechazados. No se bloquea ni se vende nada.
En la vía de venta v1 la llamada responde HTTP 200 y los asientos conflictivos vuelven en la lista de selecciones fallidas. El resto de la selección se vende. Hay que leer esa lista, porque aquí un 200 no significa que hayan pasado todos los asientos.
El servidor solo comprueba los asientos que pasan a LOCKED o SOLD. Una liberación pasa intacta.
Si falla la propia comprobación
La comprobación falla en abierto. Si no se puede leer la configuración, no se puede cargar una fila o la regla lanza un error, el cambio se permite y la venta sale adelante. Un comprador nunca pierde un asiento por un fallo dentro de la comprobación.