Turnos de caja
ShiftManager administra turnos de trabajo como horarios recurrentes: un nombre,
una hora de inicio y de término (HH:mm) y los días de la semana en que aplican. No
es un registro de sesión de caja con dinero: la apertura y el cierre con montos viven
en CashFlowManager, y el estado abierto/cerrado de una caja en CashRegisterManager.
Modelo: ShiftDocument
Sección titulada «Modelo: ShiftDocument»Extiende BaseDocument (provee _id, _rev, createdAt, updatedAt, version).
| Campo | Tipo | Descripción |
|---|---|---|
type | 'shift' | Discriminador del documento. |
companyId | string | Identificador de compañía (aislamiento multi-tenant). |
name | string | Nombre del turno (p. ej. Mañana, Noche). |
startTime | string | Hora de inicio en formato HH:mm (24h). |
endTime | string | Hora de término en formato HH:mm (24h). |
daysOfWeek | ('Mon' | 'Tue' | 'Wed' | 'Thu' | 'Fri' | 'Sat' | 'Sun')[] | Días en que aplica el turno. |
isActive | boolean | Si el turno está vigente. Por defecto true al crear. |
metadata.syncStatus | 'pending' | 'synced' | 'error' | Estado de sincronización del documento. |
API de ShiftManager
Sección titulada «API de ShiftManager»El manager se apoya en BaseManager (caché y reactividad), conservando una API con
validación de horario y errores explícitos.
create tiene dos firmas. La clásica recibe los campos sueltos; la nueva recibe el
objeto de datos. Ambas validan startTime y endTime.
// Firma clásicaawait shiftManager.create( 'Mañana', // name '08:00', // startTime (HH:mm) '16:00', // endTime (HH:mm) ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'], // daysOfWeek true // isActive? (default true));
// Firma por objetoawait shiftManager.create({ name: 'Noche', startTime: '16:00', endTime: '23:59', daysOfWeek: ['Fri', 'Sat'], isActive: true, companyId: 'company-123',});Consultar
Sección titulada «Consultar»await shiftManager.getById(id); // ShiftDocument | nullawait shiftManager.getAll(); // ShiftDocument[]await shiftManager.getActive(); // find({ isActive: true })await shiftManager.getDeleted(); // soft-deletedActualizar y cambiar vigencia
Sección titulada «Actualizar y cambiar vigencia»// Lanza SHIFT_NOT_FOUND si el id no existe; valida HH:mm si vienen los camposawait shiftManager.update(id, { endTime: '17:00' });
await shiftManager.deactivate(id); // update(id, { isActive: false })await shiftManager.activate(id); // update(id, { isActive: true })Eliminar
Sección titulada «Eliminar»await shiftManager.delete(id); // soft delete (por defecto)await shiftManager.delete(id, true); // hard delete; lanza SHIFT_INVALID si no existeReactividad
Sección titulada «Reactividad»ShiftManager reexpone las utilidades reactivas de BaseManager:
shiftManager.getAll$(); // Observable<ShiftDocument[]>shiftManager.listenToChanges((doc) => {/* ... */}); // SubscriptionshiftManager.invalidateCache();shiftManager.dispose();Errores
Sección titulada «Errores»| Código | Cuándo |
|---|---|
SHIFT_INVALID_TIME | startTime/endTime no cumplen HH:mm. |
SHIFT_NOT_FOUND | update sobre un id inexistente. |
SHIFT_INVALID | Hard delete de un documento inexistente o sin _rev. |
Relación con cajas y flujo de efectivo
Sección titulada «Relación con cajas y flujo de efectivo»El turno establece la franja horaria de operación; el dinero se controla en otras dos entidades:
-
Caja registradora (
CashRegisterManager): cada caja tienestatus: 'open' | 'closed',currentBalance,currency,lastOpenedAt/lastClosedAty uncash_flow_idapuntando al flujo de efectivo activo. -
Flujo de efectivo (
CashFlowManager): la apertura con monto inicial (openingAmount/opening_amount) y el cierre con monto final (closingAmount) ocurren aquí, junto con los movimientos de ingreso y egreso.
Es decir, un operador “abre su turno” en la práctica abriendo un flujo de efectivo en
una caja durante la franja horaria que define el ShiftDocument.
Aislamiento multi-tenant
Sección titulada «Aislamiento multi-tenant»Como todos los documentos del SDK, los turnos viven en la base de datos prefijada por
compañía (company_<id>_...) y llevan companyId explícito. Ver
Finanzas para el panorama del módulo.