Explicado sencillo · sales-floating-shifts-cash-management · Abril 2026 · BCPOS
En RMH el turno se llama Batch y está amarrado al registro (terminal). Cuando abres un batch en Register 1, todo lo que pase ahí es del Batch #47 — no importa quién esté operando.
| Hora | Register | Batch | Acción al cambiar |
|---|---|---|---|
| 8:00 – 10:30 | Register 1 | Batch #47 | Cerrar + contar cash drawer |
| 10:30 – 2:00 | Register 5 | Batch #48 | Cerrar + contar cash drawer |
| 2:00 – 4:00 | Register 9 | Batch #49 | Cerrar + contar cash drawer |
Resultado:
RMH auto-crea el batch cuando cierras el anterior. Si cierras el lunes a las 10pm, el nuevo batch abre con fecha del lunes. Pero ese batch se usa todo el martes. Cuando SAP/contabilidad lee la fecha de apertura, piensa que es del lunes. Dolor de cabeza contable que ya conocemos bien.
Dos conceptos nuevos:
Batch #47 → Register 1 (8:00–10:30)
Batch #48 → Register 5 (10:30–2:00)
Batch #49 → Register 9 (2:00–4:00)
3 conteos, 3 reportes, 0 visión unificada
Segment 1 → Terminal 1 (8:00–10:30)
Segment 2 → Terminal 5 (10:30–2:00)
Segment 3 → Terminal 9 (2:00–4:00)
1 conteo, 1 reporte, 1 responsable
Al final del día, María cuenta una sola vez: "$347.50". El sistema esperaba $345.00. Over/short: +$2.50. Una línea en el reporte. Una vista de productividad.
QIIUB tiene un campo BusinessDate que se calcula a partir de la primera venta del turno (ajustado por BusinessDayEndTime del Location). SAP/contabilidad lee BusinessDate, no OpenedAtUtc. Problema resuelto — ya no importa a qué hora se abrió el turno.
No todos los negocios manejan el cash drawer igual. QIIUB soporta 3 políticas por terminal:
| Política | Cómo funciona | Tracking de efectivo | Industria típica |
|---|---|---|---|
| CarryDrawer | El cajero se lleva la bandeja del cash drawer cuando cambia de terminal. Un solo pool de efectivo. | A nivel de Shift únicamente | Supermercados, retail, farmacias, gasolineras |
| FixedDrawer | El cash drawer se queda fijo en la terminal. Cuando el empleado llega o se va, se hace un conteo de traspaso (handoff). | Snapshot por segmento (StartingCash / EndingCash) | Cadenas alto volumen, ferreterias, bares |
| NoDrawer | No hay cash drawer físico. El mesero carga su propio efectivo, o es terminal de tarjeta solamente. | Ninguno en terminal. Fondo del mesero al cierre. | Restaurantes (meseros), kioscos, terminales solo tarjeta |
La política se configura por terminal (TerminalSetting.CashDrawerPolicy) con un default por location. El mismo schema, diferente comportamiento según el negocio.
Esto es lo más interesante del diseño. El POS de QIIUB funciona offline-first: cada terminal tiene su base de datos local y puede operar sin internet.
Merged (tombstone).El Connector traduce cada batch de RMH a un shift de QIIUB, pero de forma simple y 1:1:
| RMH | QIIUB (via Connector) | |
|---|---|---|
| 1 Batch | → | 1 Shift + 1 ShiftSegment |
| BatchStatus (bitmask) | → | ShiftStatus enum + IsBlindClose + IsExported |
| OpeningTime | → | OpenedAtUtc |
| CashierID | → | EmployeeId |
| RegisterID | → | CurrentTerminalId + ShiftSegment.TerminalId |
| (no existe) | → | BusinessDate (calculado de primera venta) |
| (no existe) | → | SourceSystem = ConnectorRMH, SourceId = "Batch#48" |
SourceSystem != NativeQIIUB).IsBlindClose, IsExported, Status legibles.SourceSystem y SourceId siempre identifican de dónde vino el dato.QIIUB soporta 3 patrones de cierre, configurables por location y terminal:
| Tipo | Qué pasa | Quién cuenta | Status final |
|---|---|---|---|
| Full Close | El cajero ve el monto esperado, cuenta el cash drawer, ingresa el monto real. | El cajero | Closed |
| Blind Close | El POS oculta el monto esperado. El cajero cuenta a ciegas e ingresa su conteo. | El cajero (sin ver esperado) | Closed + IsBlindClose |
| Deferred Count (patrón Bargain City) |
El cajero NO cuenta en la terminal. El cash drawer va directo a la caja fuerte. El manager cuenta después. | El manager (desde la caja fuerte) | PendingCount → Closed |
Si un shift queda en PendingCount más de MaxPendingCountHours (default: 24h), el sistema genera una alerta.
Un shift puede pasar por estos estados:
| Estado | Significado | Transición posible |
|---|---|---|
| Open | Empleado trabajando activamente, puede hacer ventas | Suspended, PendingCount, Closed, Voided |
| Suspended | En break o almuerzo. Puede resumir en la misma o diferente terminal. | Open (resume) |
| PendingCount | Blind closeout — cash drawer en la caja fuerte, pendiente que el manager cuente | Closed (manager cuenta) |
| Closed | Totalmente reconciliado, monto de cierre ingresado | Estado final — no cambia |
| Merged | Absorbido por otro shift durante reconciliación offline (tombstone) | Estado final — no cambia |
| Voided | Cancelado por manager — solo si tiene cero transacciones | Estado final — no cambia |
RMH: el batch pertenece a la terminal. 3 terminales = 3 batches = 3 conteos.
QIIUB nativo: el shift pertenece al empleado. 3 terminales = 1 shift, 3 segmentos, 1 conteo.
RMH vía Connector: cada batch se traduce a 1 shift simple (read-only, sin floating).
Pero ganan BusinessDate corregido, campos explícitos, y reportes unificados.
Floating = cuando migran al POS nativo de QIIUB.
Companion: Diagramas técnicos (sales-floating-shifts-cash-management)