5. Ventas (POS)
Cubre sales, sale_items, payments, el flujo de órdenes en espera + KDS (kitchen_status), return_orders, el uso de gift_cards como método de pago, promociones/descuentos aplicados en el carrito, y el pedido público por carta online (menu).
Historial de ejecución
| Ciclo | Fecha | Ejecutado por | Casos ejecutados | Resultado |
|---|---|---|---|---|
| 1 | — | — | — | Pendiente |
Venta simple
CP VTA-01: Venta de un solo producto, pago en efectivo exacto
- Resultado esperado:
change=0,status="paid", descuenta inventario del producto vendido.- Resultado obtenido: Pendiente.
CP VTA-02: Venta con pago en efectivo mayor al total (calcular vuelto)
- Pasos: total $23.500, pago con $25.000.
- Resultado esperado:
change=1.500calculado y mostrado correctamente en el recibo.- Resultado obtenido: Pendiente.
CP VTA-03: Venta con
paid_amountmenor altotal(venta a crédito/pendiente)
- Resultado esperado: debe poder guardarse con
statusdistinto de"paid"(ej."outstanding"), y aparecer como pendiente en reportes.- Resultado obtenido: Pendiente.
CP VTA-04: Vender un producto sin stock suficiente
- Objetivo: confirmar si el sistema bloquea la venta o la permite y deja el inventario en negativo (el ajuste de stock vía evento usa
max(0, ...), lo cual podría ocultar sobreventas en vez de advertirlas).- Pasos: producto con 2 unidades de stock → vender 5.
- Resultado esperado a verificar: ¿hay alguna advertencia antes de confirmar la venta, o se vende igual y el inventario simplemente queda en 0 sin indicar que se vendieron 3 de más?
- Resultado obtenido: Pendiente.
CP VTA-05: Vender un producto tipo
combo
- Precondición: combo creado en PROD-03.
- Resultado esperado: confirmar si descuenta inventario de los productos componentes del combo o no descuenta nada (el evento de venta solo recorre
sale_items, que registra el combo como una sola línea — es probable que no descuente los componentes, lo cual sería un hallazgo real a reportar).- Resultado obtenido: Pendiente.
CP VTA-06: Vender un producto que consume un ingrediente vía receta
- Precondición: producto con
recipe_itemsde PROD-05.- Resultado esperado a verificar: mismo caso que VTA-05 — ¿el sistema descuenta el ingrediente de la receta, o solo tiene efecto visual en el formulario sin lógica real de descuento?
- Resultado obtenido: Pendiente.
Descuentos y promociones aplicadas
CP VTA-07: Aplicar un descuento manual dentro del límite permitido por la política (
discount_policies.max_discount_pct)
- Resultado esperado: se aplica correctamente al subtotal de la línea o la venta completa (confirmar a cuál).
- Resultado obtenido: Pendiente.
CP VTA-08: Intentar un descuento manual mayor al
max_discount_pctpermitido para el rol del cajero
- Resultado esperado: debe bloquearse o requerir aprobación — confirmar comportamiento real (¿el backend valida esto en
sales, o solo el frontend lo sugiere sin forzarlo?).- Resultado obtenido: Pendiente.
CP VTA-09: Promoción
is_auto_apply=trueque aplica automáticamente al agregar el producto correspondiente
- Resultado esperado: el descuento aparece sin que el cajero haga nada.
- Resultado obtenido: Pendiente.
CP VTA-10: Dos promociones que compiten por el mismo producto (prioridad distinta)
- Resultado esperado: debe aplicarse solo la de mayor
priority, no ambas acumuladas (salvo que el diseño sea explícitamente acumulativo — confirmar cuál es el comportamiento real y si coincide con lo esperado por el negocio).- Resultado obtenido: Pendiente.
Pago mixto / gift card
CP VTA-11: Pagar una venta combinando efectivo + tarjeta
- Pasos: registrar dos
paymentspara la misma venta, unomethod="cash"y otromethod="card", que sumen el total.- Resultado esperado: la venta queda marcada como pagada solo cuando la suma de pagos cubre el total — confirmar si esta suma la valida el backend o es responsabilidad del frontend.
- Resultado obtenido: Pendiente.
CP VTA-12: Pagar con gift card que no tiene saldo suficiente
- Resultado esperado: debe rechazarse o cobrar solo el saldo disponible, nunca dejar la gift card en saldo negativo (el repositorio limita a
max(0, ...)al restar, igual que el inventario).- Resultado obtenido: Pendiente.
CP VTA-13: Pagar con una gift card ya vencida (
expiry_dateen el pasado)
- Resultado esperado a verificar: ¿el sistema valida la fecha de vencimiento al usarla como pago, o solo es un dato informativo que no bloquea nada?
- Resultado obtenido: Pendiente.
Órdenes en espera y pantalla de cocina (KDS)
CP VTA-14: Crear una orden
status="held"(mesa) y confirmar que llega a la pantalla de cocina
- Pasos: crear venta con
status: "held", mesa asignada (table_name) → abrir la pantalla KDS de esa tienda.- Resultado esperado: la orden aparece en tiempo real vía SSE (
/sse/kds), conkitchen_status="new".- Resultado obtenido: Pendiente.
CP VTA-15: Avanzar el estado de cocina (
new→acknowledged→preparing→ready→served)
- Resultado esperado: cada transición se refleja en tiempo real; un valor fuera de ese
oneof(ej."lista"en español) debe rechazarse con 400.- Resultado obtenido: Pendiente.
CP VTA-16: “Re-hold” de una orden ya servida (volver a abrir la mesa con los mismos productos)
- Objetivo: el código respeta
kitchen_statussi el cliente lo envía explícitamente al crear, en vez de forzar siempre"new"para órdenesheld— confirmar que esto sirve para no re-enviar a cocina algo que ya se preparó.- Resultado obtenido: Pendiente.
CP VTA-17: Dos pantallas KDS de la misma tienda abiertas en paralelo
- Resultado esperado: ambas deben recibir la actualización en tiempo real cuando se marca una orden como lista, sin necesidad de refrescar.
- Resultado obtenido: Pendiente.
Devoluciones
CP DEV-01: Devolución total de una venta, referenciando el
sale_id
- Resultado esperado: debe aumentar nuevamente el inventario de los productos devueltos.
- Resultado obtenido: Pendiente.
CP DEV-02: Devolución parcial (solo uno de los productos de una venta de varios ítems)
- Resultado esperado: solo ese producto recupera inventario; el resto de la venta queda sin cambios.
- Resultado obtenido: Pendiente.
CP DEV-03: Devolución con cantidad mayor a la comprada originalmente
- Resultado esperado a verificar: ¿el backend valida que la cantidad devuelta no exceda la vendida? Si no, se podría “inventar” inventario devolviendo de más.
- Resultado obtenido: Pendiente.
CP DEV-04: Devolución sin referenciar ninguna venta (
sale_idnulo, solosale_referencede texto libre)
- Resultado esperado a verificar: el DTO permite devoluciones “sueltas” sin venta real asociada — confirmar si esto es intencional (ej. para mercancía dañada sin venta previa) o es una laguna de validación.
- Resultado obtenido: Pendiente.
Carta online (pedido público)
CP VTA-18: Cliente hace un pedido por QR sin iniciar sesión
- Pasos: escanear/abrir
/public/menu/:slug, agregar productos con modificadores, enviar pedido.- Resultado esperado: se crea una venta
heldasociada a la tienda correcta, visible en el KDS.- Resultado obtenido: Pendiente.
CP VTA-19: Pedido por carta online de un producto marcado
show_in_menu=false
- Resultado esperado: no debería ni aparecer en la carta pública; si se fuerza el
product_iddirectamente en la petición, el backend debería rechazarlo igual.- Resultado obtenido: Pendiente.
CP VTA-20: Pedido por carta online con un
slugque no existe
- Resultado esperado: página de error clara (“tienda no encontrada”), no una pantalla en blanco o un crash.
- Resultado obtenido: Pendiente.
Notas de usabilidad y sugerencias
Se completa durante la ejecución. Prestar especial atención a VTA-05/VTA-06 (combos e ingredientes) — si no descuentan inventario correctamente, es un hallazgo de negocio importante, no solo de UI.