Registrar cada venta real durante la ventana de observación.
| Campo | Valor |
|---|---|
| Hora | HH:MM |
| Usuario | |
| Rol | admin/supervisor/operador/vendedor |
| Producto | nombre |
| Cantidad | N |
| Precio mostrado UI | $ |
| Total mostrado UI | $ |
| Stock antes | N |
| Stock después | N |
| Venta ID | UUID |
| Movimiento stock ID | UUID |
| Verificación | Resultado |
|---|---|
venta.total = venta_items.subtotal |
|
venta_items.precio_unitario = productos.precio (DB) |
|
venta.total = precio DB × cantidad |
|
stock_anterior - cantidad = stock_nuevo |
|
movimientos_stock.referencia = venta.id |
|
movimientos_stock.usuario_id = public.usuarios.id correcto |
|
| No apareció venta duplicada | |
| No apareció movimiento duplicado | |
| Venta visible en página Ventas | |
| Venta visible en Dashboard | |
| Venta visible en Reportes | |
| Caja refleja la venta | |
| Stock actualizado en página Stock |
| Intento | Hora | Key | Resultado | Venta ID |
|---|---|---|---|---|
| 1er clic | OK / ERROR | |||
| 2do clic | misma key | OK_IDEMPOTENTE / ERROR |
Esperado: una sola venta, un solo descuento de stock, un solo movimiento.
| Intento | Hora | Key | Resultado | Venta ID |
|---|---|---|---|---|
| 1er intento (timeout) | UUID-A | sin respuesta | ||
| 2do intento (retry) | UUID-A | OK / OK_IDEMPOTENTE |
Esperado: una sola venta, mismo venta_id en ambos casos.
Cerrar cuando se confirmen en producción:
Cierre formal: SPRINT 0.2-C — APROBADO
| Item | Estado |
|---|---|
| Implementación | ✅ |
| Pruebas (13/13 PASS) | ✅ |
| Producción controlada | 🟢 AUTORIZADA |
| Cierre definitivo | ⏸ pendiente observación real |
| Legacy | ✅ conservado |
| Sprint 0.2-D | ⏸ esperar |