# SIHO PMS Master — Fase 5

## Protección contra duplicados y operaciones parciales

Se incorporó idempotencia de servidor y transacciones atómicas para:

- Apertura de caja.
- Cierre de caja.
- Venta directa.
- Consumo/venta a habitación.

Cada formulario crítico recibe un UUID `operation_token`. La base de datos mantiene una restricción única por token y tipo de operación en `siho_operation_requests`. Si el navegador reenvía la solicitud por doble clic, retraso, recarga o reintento, el servidor devuelve el resultado ya confirmado sin crear otro registro.

## Concurrencia

- Las cajas abiertas usan `open_guard = 1` con índice único: sólo puede existir una caja abierta.
- Caja, reserva y productos se consultan con `lockForUpdate()` durante operaciones críticas.
- Venta, detalles, consumo, descuento de inventario e idempotencia se confirman en una sola transacción.
- Si falla cualquier paso, todo se revierte.
- Se reintentan hasta tres veces las transacciones ante bloqueos transitorios.

## Interfaz

Los formularios con `operation_token` deshabilitan el botón de envío al primer submit y muestran `PROCESANDO...`. Esta es una barrera visual; la protección definitiva está en el servidor y en la base de datos.

## Instalación

Para actualizar una instalación existente, ejecutar una sola vez:

`database/master/patches/PHASE5_IDEMPOTENCY_AND_TRANSACTION_SAFETY.sql`

Después limpiar cachés de Laravel.
