[bug] El POS toma la primera sesión de caja abierta del sistema, no la del cajero #8

Open
opened 2026-10-02 18:37:03 +00:00 by Carlos · 0 comments
Member

Qué pasa

El punto de venta toma la primera sesión de caja abierta de todo el sistema, sin filtrar por usuario ni por inventario (apps/web/src/app/pos/_components/cash-session-context.tsx:20). Con dos cajas abiertas, un cajero puede vender contra la sesión de otro: el efectivo entra a la caja equivocada y el stock se descuenta del inventario equivocado.

Entorno

local

Módulos

Web / frontend, Punto de venta (POS), Caja / sesiones de caja, Inventario / almacenes

Severidad

Bloquea un flujo

Pasos para reproducir

  1. Crear dos inventarios.
  2. Con el cajero A, abrir caja en el inventario 1.
  3. Con el cajero B (en otra sesión del navegador), abrir caja en el inventario 2.
  4. Con el cajero B, registrar una venta en efectivo.
  5. Revisar el cash_movement y el inventory_movement creados.

Esperado

La venta del cajero B usa su propia sesión: el movimiento de caja va a la sesión de B y el stock sale del inventario 2.

Actual

CashSessionProvider devuelve la primera sesión con status === "open" de GET /cash-register-sessions. Dependiendo del orden, B ve la sesión de A, y la venta se registra contra la caja de A y el inventario 1.

Evidencia

Encontrado en auditoría de código; no reproducido en ejecución.

// cash-session-context.tsx:20
const session = sessions === undefined ? undefined : (sessions.find((s) => s.status === "open") ?? null);

Arreglo sugerido: elegir la sesión abierta por el usuario actual (openedById === user.id) o la del inventario seleccionado. A mediano plazo, que el servidor resuelva la sesión del usuario autenticado (#5).

¿Está también en producción?

  • Sí — este issue no basta; hay que abrir un Incidente / hotfix
  • No — solo local / staging
  • No sé

Antes de abrir

  • Busqué un issue duplicado
### Qué pasa El punto de venta toma la **primera sesión de caja abierta de todo el sistema**, sin filtrar por usuario ni por inventario (`apps/web/src/app/pos/_components/cash-session-context.tsx:20`). Con dos cajas abiertas, un cajero puede vender contra la sesión de otro: el efectivo entra a la caja equivocada y el stock se descuenta del inventario equivocado. ### Entorno local ### Módulos Web / frontend, Punto de venta (POS), Caja / sesiones de caja, Inventario / almacenes ### Severidad Bloquea un flujo ### Pasos para reproducir 1. Crear dos inventarios. 2. Con el cajero A, abrir caja en el inventario 1. 3. Con el cajero B (en otra sesión del navegador), abrir caja en el inventario 2. 4. Con el cajero B, registrar una venta en efectivo. 5. Revisar el `cash_movement` y el `inventory_movement` creados. ### Esperado La venta del cajero B usa su propia sesión: el movimiento de caja va a la sesión de B y el stock sale del inventario 2. ### Actual `CashSessionProvider` devuelve la primera sesión con `status === "open"` de `GET /cash-register-sessions`. Dependiendo del orden, B ve la sesión de A, y la venta se registra contra la caja de A y el inventario 1. ### Evidencia ```shell Encontrado en auditoría de código; no reproducido en ejecución. // cash-session-context.tsx:20 const session = sessions === undefined ? undefined : (sessions.find((s) => s.status === "open") ?? null); ``` Arreglo sugerido: elegir la sesión abierta por el usuario actual (`openedById === user.id`) o la del inventario seleccionado. A mediano plazo, que el servidor resuelva la sesión del usuario autenticado (#5). ### ¿Está también en producción? - [ ] Sí — este issue no basta; hay que abrir un Incidente / hotfix - [ ] No — solo local / staging - [x] No sé ### Antes de abrir - [x] Busqué un issue duplicado
Nolberto was assigned by Carlos 2026-10-02 20:06:20 +00:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RynextTechnologies/PDV#8