ShopCart no guarda en qué sesión de caja ni en qué inventario se hizo la venta, ni a qué día de operación pertenece (apps/api/src/prisma/contract.prisma). Toda relación entre una venta y su caja se reconstruye por fechas o se adivina.
Qué estamos pagando hoy
La devolución tiene que adivinar el inventario y toma el primero que tenga el producto (#1).
"Ventas del día" en reportes usa la fecha del navegador (reportes/page.tsx:46, isToday) en lugar del día de operación.
Los cortes de caja no pueden listar las ventas que les corresponden.
Arreglo propuesto
Agregar sessionId (FK a CashRegisterSession) a ShopCart; el inventario y el día de operación se obtienen a través de la sesión
Migración: definir qué hacer con las ventas existentes (dejar sessionId nullable o asignarlo por fecha)
Guardar sessionId al crear la venta
Usar sessionId en devoluciones, "Ventas del día" y cortes de caja
Techo de esta ronda
Solo el vínculo venta → sesión y su uso en devoluciones, reportes del día y cortes. Fuera: mover la venta al servidor (#3), que debería guardar sessionId dentro de la misma transacción.
Superficie
Contrato Prisma (apps/api/src/prisma)
Módulos
Base de datos / contrato Prisma, Punto de venta (POS), Caja / sesiones de caja, Día de operación, Reportes
Esfuerzo
M — un PR, un día
Riesgo de no tocarlo
Alto (seguridad, datos, o bloquea el próximo corte)
### Qué es la deuda
`ShopCart` no guarda en qué sesión de caja ni en qué inventario se hizo la venta, ni a qué día de operación pertenece (`apps/api/src/prisma/contract.prisma`). Toda relación entre una venta y su caja se reconstruye por fechas o se adivina.
### Qué estamos pagando hoy
- La devolución tiene que adivinar el inventario y toma el primero que tenga el producto (#1).
- "Ventas del día" en reportes usa la fecha del navegador (`reportes/page.tsx:46`, `isToday`) en lugar del día de operación.
- Los cortes de caja no pueden listar las ventas que les corresponden.
### Arreglo propuesto
- [ ] Agregar `sessionId` (FK a `CashRegisterSession`) a `ShopCart`; el inventario y el día de operación se obtienen a través de la sesión
- [ ] Migración: definir qué hacer con las ventas existentes (dejar `sessionId` nullable o asignarlo por fecha)
- [ ] Guardar `sessionId` al crear la venta
- [ ] Usar `sessionId` en devoluciones, "Ventas del día" y cortes de caja
### Techo de esta ronda
Solo el vínculo venta → sesión y su uso en devoluciones, reportes del día y cortes. Fuera: mover la venta al servidor (#3), que debería guardar `sessionId` dentro de la misma transacción.
### Superficie
Contrato Prisma (apps/api/src/prisma)
### Módulos
Base de datos / contrato Prisma, Punto de venta (POS), Caja / sesiones de caja, Día de operación, Reportes
### Esfuerzo
M — un PR, un día
### Riesgo de no tocarlo
Alto (seguridad, datos, o bloquea el próximo corte)
Nolberto
was assigned by Carlos2026-10-02 20:06:18 +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é es la deuda
ShopCartno guarda en qué sesión de caja ni en qué inventario se hizo la venta, ni a qué día de operación pertenece (apps/api/src/prisma/contract.prisma). Toda relación entre una venta y su caja se reconstruye por fechas o se adivina.Qué estamos pagando hoy
reportes/page.tsx:46,isToday) en lugar del día de operación.Arreglo propuesto
sessionId(FK aCashRegisterSession) aShopCart; el inventario y el día de operación se obtienen a través de la sesiónsessionIdnullable o asignarlo por fecha)sessionIdal crear la ventasessionIden devoluciones, "Ventas del día" y cortes de cajaTecho de esta ronda
Solo el vínculo venta → sesión y su uso en devoluciones, reportes del día y cortes. Fuera: mover la venta al servidor (#3), que debería guardar
sessionIddentro de la misma transacción.Superficie
Contrato Prisma (apps/api/src/prisma)
Módulos
Base de datos / contrato Prisma, Punto de venta (POS), Caja / sesiones de caja, Día de operación, Reportes
Esfuerzo
M — un PR, un día
Riesgo de no tocarlo
Alto (seguridad, datos, o bloquea el próximo corte)