Skip to main content

Descripción General

Los permisos de caja son por usuario (no basados en roles) y controlan operaciones críticas del módulo de cajas:
  • Apertura de caja
  • Cierre de caja
  • Autorización de cierres
  • Rechazo de cierres
  • Registro de movimientos
  • Visualización de reportes
Estos permisos son independientes del sistema de roles. Un usuario puede tener caja.view en su rol pero sin permisos específicos de caja no podrá realizar operaciones.

Tabla de Permisos de Caja

database/migrations/2026_03_04_000009_create_permisos_caja_table.php
CREATE TABLE permisos_caja (
  id_permiso BIGINT PRIMARY KEY AUTO_INCREMENT,
  id_usuario BIGINT NOT NULL,
  id_empresa INT NOT NULL,
  puede_abrir_caja BOOLEAN DEFAULT 0,
  puede_cerrar_caja BOOLEAN DEFAULT 0,
  puede_autorizar_cierre BOOLEAN DEFAULT 0,
  puede_rechazar_cierre BOOLEAN DEFAULT 0,
  puede_registrar_movimientos BOOLEAN DEFAULT 0,
  puede_ver_reportes BOOLEAN DEFAULT 0,
  created_at TIMESTAMP,
  updated_at TIMESTAMP,
  
  FOREIGN KEY (id_usuario) REFERENCES users(id) ON DELETE CASCADE,
  FOREIGN KEY (id_empresa) REFERENCES empresas(id_empresa) ON DELETE CASCADE,
  UNIQUE (id_usuario, id_empresa)
);
Cada usuario tiene un único registro por empresa. El constraint UNIQUE (id_usuario, id_empresa) previene duplicados.

Permisos Disponibles

puede_abrir_caja

Permite al usuario abrir una caja para iniciar operaciones del día:
POST /api/cajas/{id}/abrir

puede_cerrar_caja

Permite al usuario solicitar el cierre de caja al finalizar el turno:
PUT /api/cajas/{id}/cierre
El cierre queda en estado PENDIENTE hasta que un supervisor con puede_autorizar_cierre lo autorice.

puede_autorizar_cierre

Permite autorizar cierres solicitados por otros usuarios (rol de supervisor):
POST /api/cajas/{id}/autorizar

puede_rechazar_cierre

Permite rechazar cierres con inconsistencias:
POST /api/cajas/{id}/rechazar

puede_registrar_movimientos

Permite registrar movimientos de efectivo (ingresos/egresos):
POST /api/cajas/{id}/movimientos

puede_ver_reportes

Permite acceder a reportes detallados de caja:
  • Resumen de operaciones
  • Ventas por método de pago
  • Auditoría de movimientos
  • Arqueo de caja
GET /api/cajas/{id}/resumen

API de Gestión

Obtener Permisos de un Usuario

GET /api/cajas/permisos/{usuario_id}
usuario_id
integer
required
ID del usuario
curl -X GET "https://tu-dominio.com/api/cajas/permisos/5" \
  -H "Authorization: Bearer {token}"

Actualizar Permisos de un Usuario

POST /api/cajas/permisos/{usuario_id}
Solo usuarios con permiso caja.autorizar pueden modificar permisos de caja.
puede_abrir_caja
boolean
Permitir apertura de caja
puede_cerrar_caja
boolean
Permitir solicitar cierre
puede_autorizar_cierre
boolean
Permitir autorizar cierres (supervisor)
puede_rechazar_cierre
boolean
Permitir rechazar cierres
puede_registrar_movimientos
boolean
Permitir registrar ingresos/egresos
puede_ver_reportes
boolean
Permitir acceso a reportes detallados
curl -X POST "https://tu-dominio.com/api/cajas/permisos/5" \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "puede_abrir_caja": true,
    "puede_cerrar_caja": true,
    "puede_autorizar_cierre": false,
    "puede_rechazar_cierre": false,
    "puede_registrar_movimientos": true,
    "puede_ver_reportes": false
  }'

Flujo de Trabajo: Apertura y Cierre

1

Cajero abre caja

Usuario con puede_abrir_caja abre la caja ingresando:
  • Monto inicial en efectivo
  • Desglose de billetes y monedas
  • Observaciones del turno
Estado: ABIERTA
2

Operaciones del día

Usuario registra:
  • Ventas (automáticas desde módulo de facturación)
  • Movimientos manuales (si tiene puede_registrar_movimientos)
  • Ingresos y egresos diversos
3

Cajero solicita cierre

Usuario con puede_cerrar_caja solicita cierre:
  • Cuenta el efectivo físico
  • Ingresa desglose de billetes
  • Sistema calcula diferencias
Estado: PENDIENTE CIERRE
4

Supervisor revisa

Usuario con puede_autorizar_cierre revisa:
  • Compara monto físico vs. sistema
  • Verifica movimientos sospechosos
  • Decide autorizar o rechazar
5

Cierre final

Si se autoriza:
  • Estado: CERRADA
  • Se genera reporte de arqueo
  • No se pueden registrar más movimientos
Si se rechaza:
  • Estado: ABIERTA (vuelve a estado anterior)
  • Cajero debe revisar y corregir

Perfiles de Usuario Recomendados

Cajero Junior

{
  "puede_abrir_caja": true,
  "puede_cerrar_caja": true,
  "puede_autorizar_cierre": false,
  "puede_rechazar_cierre": false,
  "puede_registrar_movimientos": false,
  "puede_ver_reportes": false
}
Operaciones permitidas:
  • Abrir su caja al inicio del turno
  • Procesar ventas
  • Solicitar cierre al finalizar

Cajero Senior

{
  "puede_abrir_caja": true,
  "puede_cerrar_caja": true,
  "puede_autorizar_cierre": false,
  "puede_rechazar_cierre": false,
  "puede_registrar_movimientos": true,
  "puede_ver_reportes": true
}
Operaciones adicionales:
  • Registrar ingresos/egresos manuales
  • Ver reportes detallados de su caja

Supervisor de Caja

{
  "puede_abrir_caja": true,
  "puede_cerrar_caja": true,
  "puede_autorizar_cierre": true,
  "puede_rechazar_cierre": true,
  "puede_registrar_movimientos": true,
  "puede_ver_reportes": true
}
Operaciones completas:
  • Todas las operaciones de cajero
  • Autorizar/rechazar cierres de otros usuarios
  • Supervisar todas las cajas

Auditor (Solo Lectura)

{
  "puede_abrir_caja": false,
  "puede_cerrar_caja": false,
  "puede_autorizar_cierre": false,
  "puede_rechazar_cierre": false,
  "puede_registrar_movimientos": false,
  "puede_ver_reportes": true
}
Operaciones limitadas:
  • Solo visualización de reportes
  • Sin capacidad de modificar datos

Validaciones de Seguridad

No puede abrir caja ya abierta

Error
{
  "success": false,
  "message": "La caja ya está abierta",
  "code": "CAJA_YA_ABIERTA"
}

No puede cerrar sin permiso

Error
{
  "success": false,
  "message": "No tienes permiso para cerrar cajas",
  "code": "PERMISO_DENEGADO"
}

No puede autorizar su propio cierre

Error
{
  "success": false,
  "message": "No puedes autorizar tu propio cierre de caja",
  "code": "AUTO_AUTORIZACION_PROHIBIDA"
}

Diferencia de efectivo excede el umbral

Warning
{
  "success": false,
  "message": "La diferencia de S/ 150.00 excede el umbral permitido (S/ 10.00)",
  "code": "DIFERENCIA_EXCESIVA",
  "data": {
    "diferencia": 150.00,
    "umbral": 10.00,
    "porcentaje": 3.5
  }
}

Relación con Permisos de Rol

Los permisos de caja complementan (no reemplazan) los permisos de rol:
Permiso de RolPermiso de CajaResultado
caja.viewpuede_ver_reportes = true✅ Puede ver reportes
caja.viewpuede_ver_reportes = false❌ No puede ver reportes
Sin caja.viewpuede_ver_reportes = true❌ Rol lo bloquea primero
caja.createpuede_abrir_caja = true✅ Puede abrir caja
caja.editpuede_cerrar_caja = true✅ Puede cerrar caja
caja.autorizarpuede_autorizar_cierre = true✅ Puede autorizar
Flujo de validación:
  1. Se verifica permiso de rol (middleware permission:)
  2. Se verifica permiso específico de caja (lógica del controlador)
  3. Ambos deben ser verdaderos para permitir la operación

Códigos de Error

CódigoMensajeCausa
401No autenticadoToken inválido
403No tienes permiso para cerrar cajasUsuario sin puede_cerrar_caja
403No puedes autorizar tu propio cierreIntento de auto-autorización
404Permisos de caja no encontradosUsuario sin registro en permisos_caja
422Diferencia excesiva en arqueoDiferencia > umbral configurado
500Error al actualizar permisosError de base de datos

Mejores Prácticas

Principio de Segregación

Ningún usuario debe tener permisos para abrir, cerrar Y autorizar. Separa responsabilidades.

Rotación de Cajas

Asigna diferentes cajeros a diferentes cajas cada día para prevenir fraudes.

Auditoría Regular

Usuarios con puede_ver_reportes deben revisar diariamente las diferencias de arqueo.

Límites de Movimientos

Establece montos máximos para movimientos manuales sin autorización superior.

Build docs developers (and LLMs) love