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
Crear dos inventarios.
Con el cajero A, abrir caja en el inventario 1.
Con el cajero B (en otra sesión del navegador), abrir caja en el inventario 2.
Con el cajero B, registrar una venta en efectivo.
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 Carlos2026-10-02 20:06:20 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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
cash_movementy elinventory_movementcreados.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
CashSessionProviderdevuelve la primera sesión constatus === "open"deGET /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
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?
Antes de abrir