Skip to content

Resumen del alcance — Módulo Caja

Análisis Funcional: Módulo Caja — parte 1 de 7. Índice · Siguiente: Modelo de saldos →

El módulo Caja le agrega a la web app el control del efectivo físico de cada punto de venta: cuánta plata hay en el cajón, quién la puso, quién la sacó y contra qué transacción salió.

No reemplaza nada de lo que ya hacía la app — el Análisis Funcional original sigue vigente tal cual. Es una capa nueva que se enciende por país.

0.1 Qué problema resuelve y para quién

En Ecuador, cuando el cajero paga una transacción de Soterex, el efectivo lo controla el EPOS: el sistema propio de punto de venta que CIS ya opera ahí. La web app no necesita saber nada del cajón — le alcanza con descontar el prefondeo en USD y marcar la transacción como PAID.

Guatemala no tiene EPOS. Sin un sistema que lleve el efectivo del PDV, el cajero quedaba pagando contra un saldo que la app no conocía: la app sabía que la transacción se pagó, pero no si en el cajón había plata para pagarla ni cuánta quedó después. Eso es exactamente lo que el módulo Caja cubre.

Consecuencia de diseño, y es la regla más importante de todo el módulo:

El módulo Caja es opcional por país (flag countries.modulo_caja, apagado por default). Con la bandera apagada, la app se comporta exactamente como antes de que el módulo existiera: no hay cajas, no hay apertura ni cierre, y el pago no valida ni escribe nada de caja. — Decisión #2 del plan v2 (2026-07-28), ADR-005. ✅ Implementado (TransactionController::pay() entra a la rama de caja solo si $country->modulo_caja).

Ecuador, que está en producción con su EPOS, no lo activa. Guatemala sí.

0.2 Qué incluye el módulo

CapacidadEstado
Varias cajas por sucursal, numeradas automáticamente — Caja 1, Caja 2…✅ Implementado
Apertura y cierre de caja, con sesión abierta como precondición para operar✅ Implementado
Fondeo: sumar efectivo a una caja, con motivo✅ Implementado
Ajuste: corregir el saldo registrado contra el arqueo físico, en más o en menos, con motivo✅ Implementado
Descuento automático de la caja al pagar una transacción✅ Implementado
Tipo de cambio por país, con historial inmutable y auditoría✅ Implementado
Listado de movimientos por caja + export Excel/PDF con membrete✅ Implementado
Reporte de Cajas en Reportes: resumen por caja + detalle de movimientos, exportables✅ Implementado
Prefondeo País como capa propia, y el pago validando solo la caja✅ Implementado
Moneda de pago configurable por país — Guatemala paga en dólares✅ Implementado
Catálogo cerrado de motivos de fondeo y ajuste, con filtro en listado y export✅ Implementado en la pantalla de Caja; falta el filtro por motivo en Reportes → Cajas

0.3 Qué explícitamente NO incluye

  • No hay conteo de denominaciones. El cierre es por monto total, no por billetes y monedas (decisión #14 del plan v2). Un arqueo que no cuadra se resuelve con un AJUSTE, no contando en pantalla.
  • No hay aprobación de pagos por Supervisor. Se decidió explícitamente no implementarla (decisión #7 del plan v2). No es una omisión: el flujo de pago no tiene paso de autorización.
  • Tampoco hay autorización de Supervisor para abrir o cerrar caja. La hubo hasta E4b y se eliminó en la revisión del 2026-08-05: el control quedó en el ledger inmutable, no en una firma en el momento (ver 0.4).
  • No hay borrado ni edición de movimientos. El ledger es inmutable; un error se corrige con un movimiento nuevo que lo compensa, nunca editando el anterior (ver Modelo de saldos §1.8).
  • No hay baja de cajas. Se agregan, no se dan de baja ni se renombran — la numeración nunca se reutiliza.
  • No gestiona la logística del efectivo. Los blindados, las transferencias bancarias y la relación con el banco viven afuera; la app registra que la plata llegó a la caja, no cómo viajó. Teresa fue explícita: "no va a haber un lugar donde se pongan los blindados, simplemente el blindado va a estar cuando llegue a la caja" (reunión 2026-08-05).
  • No emite todavía los comprobantes membretados de apertura y cierre. Están decididos (decisiones #14 y #15 del plan v2) y las columnas existen en la base, pero nadie los genera hoy — llegan con E5, junto con la papeleta. Ver Preguntas Abiertas #7.
  • No toca la integración con Soterex. El módulo Caja es control interno; lo que se le reporta a Soterex sale de la capa Holding, no de la caja.

0.4 Reglas de negocio de más alto nivel

Cada regla dice de dónde sale. Las diecisiete rigen hoy en main: las R9 a R17 llegaron con E4b, mergeada el 2026-08-06.

#ReglaEstadoFuente
R1El módulo se activa por país; apagado, cero cambios de comportamientoDecisión #2 del plan v2, 2026-07-28 · ADR-005
R2Ningún saldo se almacena — todos se derivan sumando su ledgerADR-005, 2026-07-31
R3Los movimientos de caja son inmutables: se corrige compensando, nunca editandoADR-005, 2026-07-31
R4La comisión nunca toca la caja — de la caja sale solo el principalDecisión #10 del plan v2, corregida 2026-07-31
R5Solo Supervisor y Admin pueden fondear o ajustar una cajaDecisión #11 del plan v2 · RoleSeeder (fondeo_caja)
R6No se puede pagar con la caja cerrada — hace falta una sesión abierta a nombre del operadorE4-multi, decisión #3, 2026-08-04
R7Cada pago descuenta la caja que abrió el propio operador, no "la caja del PDV"E4-multi, decisión #3, 2026-08-04
R8El cierre es por monto total: registra el saldo final y no genera ningún movimiento — la plata se queda en la cajaDecisión #14 del plan v2 · ADR-007 §5
R9El saldo inicial de apertura se hereda del cierre anterior de esa caja — no se tipea, ni siquiera como sugerenciaReunión 2026-08-05 · ADR-007 §5
R10La apertura y el cierre los hace un solo usuario, sin autorización de SupervisorReunión 2026-08-05 · ADR-007 §4
R11El prefondeo tiene tres capas: Holding, País y CajaReunión 2026-08-05 · ADR-007 §1
R12Al pagar se valida solo la caja; el prefondeo deja de bloquearReunión 2026-08-05 · ADR-007 §2
R13El prefondeo del país admite saldo negativo — es información contable, no un errorReunión 2026-08-05 · ADR-007 §2
R14Fondear una caja por encima del prefondeo del país avisa, no bloqueaReunión 2026-08-05 · ADR-007 §3
R15La moneda de pago es configurable por país; Guatemala paga en dólaresReunión 2026-08-05 · ADR-007 §6
R16Los motivos de fondeo y ajuste salen de una lista cerrada, no de texto libreReunión 2026-08-05 · plan E4b, C8
R17Un usuario puede tener una sola caja abierta a la vez; un cambio de turno es cerrar y volver a abrirADR-007 §5b, 2026-08-06 · índice cash_sessions_one_open_per_user

Sobre R10 y R9, que son las que más cambian la operatoria diaria, vale citar de dónde salieron:

  • Diego Sánchez descartó la autorización del Supervisor al ver que cada movimiento queda auditado y es inmutable. Carlos lo cerró así en la reunión: "Sacamos los validadores para abrir caja y cerrar caja por parte de los supervisores".
  • El saldo inicial heredado lo pidió Diego ("que le tome como saldo inicial el saldo del día anterior con el que haya cerrado esta caja") y Teresa lo justificó: "el que comience con el mismo saldo final del día anterior me parece que le da más seguridad al manejo del dinero". Ante la pregunta de Carlos de si convenía ofrecerlo como sugerencia editable, Diego fue tajante: "que lo tome automáticamente, no debería ser como sugerencia".

0.5 Actores

ActorQué hace en este móduloPermisos (seed real, RoleSeeder)
Backoffice / cajeroAbre su caja, paga transacciones contra ella, la cierra al terminar el turno. Es quien tiene el efectivo en la mano.caja L·E · apertura_cierre_caja L·E · tipo_cambio L · sin fondeo_caja
SupervisorLe suma efectivo a las cajas (fondeo) y corrige descuadres (ajuste). Edita el tipo de cambio. Ve todo lo del cajero.caja L·E · apertura_cierre_caja L·E · fondeo_caja L·E · tipo_cambio L·E
AdminEnciende el módulo en el país, define la moneda local, agrega cajas a una sucursal, y puede hacer todo lo anterior.Todo, con Borrar
Tesorería (Teresa, Diego — CIS-EC)Carga el prefondeo, concilia el saldo del país contra el extracto bancario, revisa los ajustes. Es el destinatario real de los reportes.⚠️ No es un rol del sistema. Hoy opera con rol Supervisor o Admin — ver Preguntas Abiertas #3

La matriz completa, con todos los módulos y no solo los de Caja, vive en Matriz de Roles y Permisos §2.1.

0.6 Glosario del dominio

Son términos que se parecen entre sí y se confunden fácil. Vale leerlos antes de seguir — el resto del paquete los usa sin volver a definirlos.

TérminoQué es
Prefondeo HoldingPool en USD de la sociedad holding, que es a quien Soterex le transfiere la plata. Es el ledger que ya existe (prefunding_entries). Descuenta principal + comisión de cada pago.
Prefondeo PaísPool en USD del país operativo. Descuenta solo el principal; nunca ve comisiones. Puede quedar negativo. Es lo que tesorería concilia contra el extracto bancario del país.
Caja operativa (o simplemente "caja")El efectivo físico de una caja de un PDV. Su saldo es la suma de sus movimientos. Una sucursal puede tener varias.
FondeoMovimiento que suma efectivo a una caja: llegó plata nueva. Siempre positivo. Solo Supervisor/Admin.
AjusteMovimiento que corrige el saldo registrado para que coincida con la plata realmente contada. Puede ser positivo o negativo. Solo Supervisor/Admin. Carlos lo separó de fondeo en la reunión: "ojo, que esto es solo fondeo, todo aumenta; después están los ajustes, que esto puede ser positivo o negativo".
AperturaAbrir la sesión de trabajo de una caja. Sin sesión abierta no se puede operar ni pagar. El saldo inicial se hereda del cierre anterior y no genera ningún asiento: la plata nunca salió de la caja.
CierreCerrar la sesión. Registra el saldo final y no genera ningún asiento: la caja no queda en cero, el efectivo sigue ahí y la próxima apertura arranca con ese mismo saldo.
ArqueoEl conteo físico del efectivo del cajón. La app no lo hace: recibe su resultado en forma de ajuste (Faltante de arqueo / Sobrante de arqueo).
BlindadoEl transporte de caudales que lleva efectivo hasta el PDV. En la app es un motivo de fondeo, no una entidad propia.
MTCNNúmero de control de la transacción de Soterex. En Caja aparece en la línea de cada movimiento de tipo PAGO, para poder rastrear de qué transacción salió esa plata.
PrincipalEl monto de la transacción que se le entrega al beneficiario — transactions.amount. Es lo único que sale de la caja.
ComisiónLo que Soterex le paga a CIS por la transacción — transactions.fee. La calcula y la devuelve Soterex, CIS no la configura (ADR-005). Es información restringida: nunca aparece en pantallas operativas, solo en Reportes y en el Dashboard de Supervisor. Nunca toca la caja ni el prefondeo del país.
TC (tipo de cambio)Unidades de moneda local por 1 USD. Historial inmutable por país: editar es insertar un registro nuevo, nunca sobreescribir. Solo aplica al pago.

0.7 Cómo sigue

El documento que sigue, Modelo de saldos, es el más importante del paquete: explica cómo se mueve la plata entre las capas, con el ejemplo numérico que el cliente validó en la reunión. Si vas a tocar el módulo o a operarlo, empezá por ahí.


Análisis Funcional: Módulo Caja — parte 1 de 7. Índice · Siguiente: Modelo de saldos →

Documentación viva — se actualiza junto con el código, no es un anexo aparte.