Eliminar reserva
Elimina definitivamente una reserva desde el detalle operativo de una ocurrencia y mantiene coherentes la lista, las asignaciones, la ocurrencia y la optimización relacionada.
En este artículo
Eliminar reserva retira una reserva real del servicio, no solo la marca como cancelada. En la demo de Marea Gran Via, el caso principal parte de Javier Martin y la entrada alternativa parte de Sara Molina en Lista de espera.
El punto clave del flujo es el modal de confirmación. Cerrar el modal no cambia datos; confirmar Eliminar ejecuta el borrado y la pantalla refresca la ocurrencia para que reservas, mesas, Lista de espera y optimización no queden en un estado incoherente.
Antes de empezar
- Abrir el detalle de la ocurrencia desde /:orgId/:locationId/reservations/:occurrenceId.
- Trabajar en la misma location_id que contiene la reserva; para la demo localizada, Marea Gran Via.
- Tener reservation:manage en la ubicación. reservation:view permite consultar la ocurrencia, pero no borrar reservas.
- Usar una reserva no cancelada para la entrada visual principal, porque la acción Eliminar se deshabilita en filas cancelled.
- Para capturas, usar RESERVATION_OCCURRENCE_ID y BOOKING_DETAIL_RESERVATION_LABEL; para Lista de espera, BOOKING_WAITLIST_OCCURRENCE_ID y BOOKING_WAITLIST_RESERVATION_LABEL.
Instrucciones
- 1.
Abrir la ocurrencia
Entra en el detalle operativo de reservas de la ocurrencia de servicio. En Marea Gran Via, RESERVATION_OCCURRENCE_ID abre la lista de reservas del servicio de comidas.
- 2.
Elegir la reserva
Busca la reserva en la tabla operativa. Para el ejemplo principal, localiza Javier Martin y abre la acción Eliminar desde su fila.
- 3.
Revisar la confirmación
La aplicación muestra el modal ¿Qué quieres hacer con esta reserva? con el nombre del cliente o Sin cliente. Antes de seguir, comprueba que esa reserva debe desaparecer definitivamente.
- 4.
Confirmar el borrado
Pulsa Eliminar en el modal. La pantalla envía DELETE /api/app/{orgId}/{locationId}/reservations/{reservationId} solo con el id de la reserva; si todo termina correctamente, el backend responde 204 No Content.
- 5.
Comprobar el resultado
Tras el borrado, la reserva deja de aparecer. La UI refresca reservations, elimina la query de detalle de esa reserva, actualiza la ocurrencia y limpia editor, modal, swipe y selección de Lista de espera relacionados.
- 6.
Usar Lista de espera cuando aplique
Si la reserva está en Lista de espera, usa la acción Eliminar sobre la fila, como en el caso de Sara Molina. La entrada visual cambia, pero llega al mismo modal y al mismo DELETE.
Validaciones y límites
- Sin reservation:manage, la tabla no expone acciones de fila y el handler de borrado retorna sin actuar.
- Eliminar se deshabilita mientras hay un envío en curso o si la reserva de la tabla está en status cancelled.
- Cerrar o descartar el modal limpia la selección y no llama al endpoint.
- El modal no es dismissable durante isSubmitting; el botón Eliminar muestra carga mientras deleteReservation.isPending.
- buildBackendPath exige ctx.orgId y ctx.locationId antes de construir /api/app/{orgId}/{locationId}/reservations/{reservationId}.
- El endpoint DELETE solo se acepta en /reservations/{reservationId}; otras formas terminan en método no permitido o ruta no válida.
- El backend verifica que la reserva pertenece a la location_id activa; si pertenece a otra ubicación, responde como no encontrado.
- El borrado es físico sobre reservations. reservation_table_assignments se limpia por ON DELETE CASCADE y tickets.reservation_id queda en NULL si existía un ticket vinculado.
- Después del borrado se invalida la optimización de la ocurrencia; si aplica reoptimización post_cancel y esa corrida falla, el borrado ya confirmado sigue devolviendo éxito.
Resultado esperado
La reserva queda eliminada de la ocurrencia, las asignaciones de mesa dejan de apuntar a ella, los tickets vinculados quedan desvinculados y la ocurrencia se refresca con el estado de Lista de espera y optimización recalculado.