Transacciones
Las transacciones crean un registro de auditoría inmutable de cada movimiento de inventario, consumo, recepción y ajuste. Las transacciones no pueden ser editadas o eliminadas - las correcciones agregan nuevas transacciones de ajuste.
Tipos de Transacción
Flujo de Transacción:
Recepción Transferencia Consumo Ajuste Recogida
↓ ↓ ↓ ↓ ↓
Nuevo Stock → Sitio A → Sitio B → Trabajo Agota Stock Corrección Manual Retiro de Tarea
(Compra) (Recogida QR) (Reporte Enviado) (Conteo de Ciclo) (Escaneo QR de Recurso)
Página de transacciones mostrando registro de auditoría de todos los movimientos de inventario
Recepción
Nuevo inventario llega a un sitio (compras, devoluciones del campo).
Campos:
toSite- Sitio destinoresource- Qué llegótoVolume- Nuevo saldo de artículo de stock después de recepciónuom- Unidad de medida
Ejemplo: 100m de cable llega al almacén
type: "receipt"
toSite: Almacén Central
resource: Cable Cat6
toVolume: 600m (era 500m, ahora 600m)
Transferencia
El inventario se mueve entre sitios (almacén → trabajador, trabajador → sitio de campo).
Campos:
fromSite- Ubicación fuentetoSite- Ubicación destinoresource- Qué se moviófromVolume- Saldo fuente después de transferenciatoVolume- Saldo destino después de transferenciapickupCode- JWT escaneado (si transferencia basada en QR)scannerUserId- Quién escaneó QRscanMethod- "self" (trabajador) o "staff" (personal de almacén)scanLocation- Coordenadas GPS donde ocurrió el escaneo
Ejemplo: Trabajador recoge 10m de cable vía escaneo QR
type: "transfer"
fromSite: Almacén Central
toSite: Inventario Personal de John
resource: Cable Cat6
fromVolume: 590m (almacén reducido de 600m)
toVolume: 10m (nuevo artículo de stock de John)
pickupCode: "eyJhbGc..." (JWT)
scannerUserId: john_id
scanMethod: "self"
scanLocation: { lat: 40.7128, lng: -74.0060 }
Consumo
El trabajo de campo agota inventario (creación automática cuando se envía reporte).
Campos:
fromSite- De dónde se consumieron materiales (usualmente sitio personal del trabajador)resource- Qué se consumiófromVolume- Saldo restante después del consumoreportId- Enlace a reporte de trabajo (para cálculo de pago)
Ejemplo: Trabajador usa 8m de cable completando tarea
type: "consumption"
fromSite: Inventario Personal de John
resource: Cable Cat6
fromVolume: 2m (reducido de 10m)
reportId: report_abc123
Ajuste
Corrección manual de niveles de stock (conteos de ciclo, daño, pérdida).
Campos:
stockItemId- Qué artículo de stock ajustadoresource- Qué se ajustófromVolume- Saldo anteriortoVolume- Nuevo saldoreason- Explicación requerida (ej. "Corrección de conteo físico", "Dañado en tránsito")
Ejemplo: Conteo de ciclo encuentra discrepancia
type: "adjustment"
stockItemId: stock_xyz
resource: Cable Cat6
fromVolume: 2m (saldo registrado)
toVolume: 0m (conteo físico actual)
reason: "Conteo de ciclo 2026-02-10 - extremo de rollo descartado"
Recogida
Retiro de material en el contexto de una tarea, creado automáticamente cuando un trabajador escanea el código QR de un recurso de tarea.
Una transacción de recogida registra el recurso retirado, el volumen, el sitio de origen, la persona que escaneó (recogedor real) y un enlace a la tarea y a la línea de recurso específica dentro de esa tarea (context: { taskId, taskResourceIdx }). La recogida se diferencia de la Transferencia en que esta última mueve inventario entre sitios de forma genérica; la Recogida es una Transferencia con contexto de tarea — vincula la deducción de stock directamente a un elemento de trabajo planificado específico. El enlace de contexto permite consultar "cuánto de este recurso se ha retirado para la tarea X" agregando transacciones de recogida, en lugar de almacenar un total acumulado en la tarea en sí.
Los códigos QR de recogida son de un solo uso (los intentos de reutilización se rechazan con un error de conflicto). Los códigos pueden anularse (stock devuelto mediante una transacción de return) o regenerarse (nuevo código emitido, código anterior invalidado) de forma independiente.
Campos de Transacción
Comunes a Todos los Tipos:
type- receipt, transfer, consumption, adjustmentresource- Referencia a definición de recursouom- Unidad de medidacreatedAt- Timestamp (auto-generado)createdBy- Usuario que inició (auto-capturado)properties- JSON flexible para datos personalizados
Específicos del Tipo:
fromSite/toSite- Puntos finales del movimientofromVolume/toVolume- Cambios de saldoreportId- Enlace a reporte de trabajo (consumo)pickupCode- JWT escaneado (transferencias protegidas)scannerUserId- Quién escaneó (transferencias)scanMethod- Auto-checkout vs asistido por personalscanLocation- GPS en tiempo de escaneoreason- Explicación (ajustes)
Inmutabilidad de Transacción
No Puede Ser Editada:
- Las transacciones son solo escritura
- No hay operaciones de actualización o eliminación
- Preserva integridad del registro de auditoría
Haciendo Correcciones:
- No intentes editar transacción incorrecta
- Crea nueva transacción
adjustment - Incluye razón detallada explicando corrección
- Ambas transacciones permanecen en historial
Flujo de Corrección de Ejemplo:
Día 1: Recepción muestra 100 unidades llegaron
→ Crea transacción: toVolume = 100
Día 2: Descubre que solo 95 unidades realmente recibidas
→ Crea ajuste: fromVolume = 100, toVolume = 95
→ Razón: "Error de conteo de recepción - solo 95 unidades en envío"
Resultado: Ambas transacciones visibles en registro de auditoría
Creación Automática de Transacción
Desde Envío de Reporte
Cuando trabajador envía reporte con campo consumedFrom:
- Sistema valida disponibilidad de stock en cada artículo de stock
- Crea atómicamente transacciones de consumo para cada recurso
- Enlaza transacciones a reporte vía
reportId - Agota volúmenes de artículos de stock
- Si stock insuficiente → rechaza reporte O solicita consumo parcial
Beneficios:
- Stock siempre preciso (no se puede olvidar registrar consumo)
- Reporte + transacción comprometidos juntos (atómico)
- Cálculo de pago tiene datos confiables
Desde Escaneo de Recogida QR
Cuando trabajador escanea QR de recogida de asignación:
- Valida firma JWT y expiración
- Verifica que escáner es destinatario autorizado O tiene
canFacilitatePickups - Verifica disponibilidad de stock en sitio fuente
- Crea transacción de transferencia automáticamente
- Registra identidad del escáner, método, ubicación GPS
Beneficios:
- No hay entrada manual de transacción
- GPS prueba presencia física
- Registro de auditoría muestra quién autorizó transferencia
Viendo Transacciones
Registro Global de Transacciones:
- Navegar a Inventario → Transacciones
- Filtrar por tipo, rango de fecha, sitio, recurso
- Exportar para conciliación o cumplimiento
Historial de Artículo de Stock:
- Navegar a artículo de stock específico
- "Historial de Transacciones" muestra todos los movimientos que afectan este artículo
- Rastrear linaje (de dónde vinieron los materiales, a dónde fueron)
Consumo de Reporte:
- Navegar a reporte de trabajo
- Sección "Materiales Usados" enlaza a transacciones de consumo
- Verificar qué se agotó realmente del inventario
Actividad de Sitio:
- Navegar a sitio
- "Transacciones Recientes" muestra recepciones, transferencias, consumos
- Monitorear rendimiento del almacén
Casos de Uso
Auditoría de Cumplimiento
- Mostrar todos los movimientos de materiales controlados
- Probar cadena de custodia (recepción → transferencia → consumo)
- Exportar registro de transacciones para reporte regulatorio
Prevención de Pérdidas
- Comparar recepciones con consumos a lo largo del tiempo
- Identificar discrepancias que requieren investigación
- Rastrear patrones de ajuste (ajustes frecuentes = problemas potenciales)
Cálculo de Pago
- Consumos enlazados a reportes vía
reportId - Calcular costos de materiales para trabajo completado
- Verificar que trabajador usó materiales asignados (no stock personal)
Conciliación de Inventario
- Comparar saldos basados en transacciones con conteos físicos
- Identificar contracción o errores de conteo
- Crear ajustes para corregir discrepancias
Responsabilidad del Trabajador
- Ver historial de recogida y consumo de trabajador individual
- Identificar quién escaneó inventario protegido
- Validación GPS muestra dónde se transfirieron materiales
Mejores Prácticas
Siempre Incluir Razón para Ajustes:
- "Corrección de conteo físico" es mejor que sin razón
- "Materiales dañados descartados - evento de tormenta 2026-02-08" aún mejor
- Ayuda a auditores futuros a entender correcciones
Usar Tipos de Transacción Más Pequeños:
- No usar ajustes cuando recepción/transferencia apropiada
- Los ajustes deberían ser excepción, no rutina
- Recepciones/transferencias preservan contexto más rico
Conciliación Regular:
- Semanal: Revisar ajustes (deberían ser raros)
- Mensual: Conteo de ciclo de artículos de stock principales
- Trimestral: Conciliación completa de almacén
Aprovechar GPS para Transferencias:
- Revisar
scanLocationpara inventario protegido - Detectar anomalías (escaneo 100km del almacén)
- Validación de geocerca previene compartir QR remoto
Monitorear Volumen de Transacción:
- Tasa alta de ajuste = problemas de proceso
- Consumo bajo con recogidas altas = acaparamiento o robo
- Desajuste recepción/consumo = problemas de pronóstico de demanda
Permisos de Transacción
Creando Transacciones:
transactionsCreate- Puede crear recepciones, ajustes- Transacciones auto-creadas (de reportes, escaneos QR) no requieren permiso
- Permisos específicos del sitio pueden limitar quién crea recepciones en qué sitios
Viendo Transacciones:
- Todos los usuarios pueden ver transacciones para sus propios artículos de stock
- Restricciones de rol pueden ocultar transacciones para ciertos recursos/sitios
viewDeletedpermite ver transacciones soft-deleted (si alguna vez implementado)
Sin Permiso de Eliminar:
- Las transacciones no pueden ser eliminadas por nadie
- Mantiene integridad del registro de auditoría
- Solo administrador de base de datos podría eliminar (emergencia operacional solo)
Entrada de Transacción Manual con Escaneo de Código QR
Para envíos que llegan a sitios donde los artículos no tienen códigos QR existentes, el personal de campo puede usar el Formulario de Transacción Manual con escaneo QR integrado para aceptar rápidamente inventario usando un libro de referencia físico de códigos QR de recursos.
Creación de un Libro de Referencia Física de Recursos
Configuración de Admin (Una Vez):
- Navegar a Admin → Códigos QR de Recursos (
/admin/resource-qr-codes) - Filtrar por tipo de recurso si es necesario (Material, Mano de obra, Equipo)
- Buscar recursos específicos a incluir
- Hacer clic en Imprimir para generar hoja de códigos QR imprimible
- Imprimir en papel estándar carta/A4
- Laminar páginas y encuadernar en libro de referencia
- Colocar libro en muelle de recepción o estación de almacén
Formato de Código QR: Cada código QR contiene datos JSON:
{
"type": "resource",
"id": "resource_id_123",
"name": "Cable Cat6",
"defaultUom": "m",
"resourceType": "material"
}
Flujo Móvil para Aceptación de Envíos
Proceso del Personal de Campo:
- Abrir Formulario de Transacción Manual
- Navegar a Inventario → Transacciones
- Hacer clic en botón "Agregar Transacción Manual"
- Requiere permiso
canFacilitatePickups
- Habilitar Modo Lote (Opcional pero Recomendado)
- Cambiar interruptor "Modo Lote" en la parte superior del formulario
- Permite escanear e ingresar múltiples artículos antes de envío final
- Ahorra tiempo cuando envío contiene 5+ artículos diferentes
- Escanear Código QR de Recurso
- Hacer clic en botón de escaneo (📷 icono) junto al campo Nombre de Recurso
- Cámara se abre en dispositivo móvil
- Apuntar cámara al código QR en el libro de referencia
- Datos QR se auto-completan: Nombre de Recurso, ID de Recurso, UOM Predeterminado
- Ingresar Detalles de Cantidad
- Campo Volumen: Ingresar cantidad recibida (ej. "50")
- Campo UOM: Pre-llenado desde QR, ajustar si necesario (ej. "m" para metros)
- Sitio: Arrastrar y soltar sitio de destino o usar ubicación actual
- Agregar al Lote (Si Modo Lote Habilitado)
- Hacer clic en botón "Agregar al Lote"
- Artículo aparece en lista de lote abajo
- Formulario se vacía para el siguiente artículo
- Repetir pasos 3-5 para cada artículo en el envío
- Enviar Transacción(es)
- Modo único: Hacer clic en "Enviar" (crea una transacción)
- Modo lote: Hacer clic en "Enviar Lote (N artículos)" (crea N transacciones atómicamente)
- Notificación de éxito muestra cuántos artículos fueron aceptados
- Si algunos artículos fallan, sistema reporta conteo pero no hace rollback de otros
Ejemplo de Flujo de Lote:
Envío llega con 5 materiales diferentes:
1. Escanear "Cable Cat6" QR → Ingresar 50m → Agregar al Lote
2. Escanear "Conducto 1in" QR → Ingresar 20 unidades → Agregar al Lote
3. Escanear "Caja de Empalme" QR → Ingresar 15 unidades → Agregar al Lote
4. Escanear "Abrazadera de Cable" QR → Ingresar 500 unidades → Agregar al Lote
5. Escanear "Cable de Tierra" QR → Ingresar 100m → Agregar al Lote
6. Enviar Lote (5 artículos)
→ Crea 5 artículos de stock + 5 transacciones de recepción instantáneamente
Manejo de Recursos Desconocidos
Si envío contiene artículos no en el libro de referencia:
- Ingresar Nombre de Recurso Manualmente
- Ingresar nombre en campo Nombre de Recurso (sin escaneo QR)
- Sistema busca recurso existente por nombre
- Si no encontrado → coloca automáticamente en recurso "Holding/Staging"
- Flujo Holding/Staging
- Propiedades de transacción incluyen
originalResourceName(lo que usted escribió) - Toast de advertencia: "Recurso no encontrado. Colocado en Holding/Staging"
- Artículo de stock creado con recurso Holding/Staging
- Después: Personal de oficina asigna a recurso apropiado (ver Asignación de Inventario en Espera abajo)
- Propiedades de transacción incluyen
- Ventajas del Auto-Staging
- Aceptación del personal de campo nunca se bloquea
- Inventario se acepta físicamente y rastrea inmediatamente
- Categorización de recursos ocurre de manera asíncrona
- Sin demoras bloqueantes para envíos urgentes
Funciones del Modo Lote
Tabla de Artículos en Línea:
- Muestra todos los artículos escaneados antes de envío
- Muestra: Nombre de Recurso, Volumen, UOM
- Remover artículos individuales con botón X
- Vista visual clara de lo que se comprometerá
Envío:
- Procesamiento de lote atómico (todo-o-nada donde posible)
- Fallos de artículos individuales reportados pero no bloquean otros
- Conteo de éxito: "5 transacciones creadas exitosamente"
- Manejo de fallos parciales: "2 artículos no pudieron procesarse"
Optimización Móvil:
- Gran botón de escaneo táctil
- Acceso a cámara con alternancia de flash
- Funciona sin conexión con almacenamiento en caché PWA
- Guardado automático de lote en localStorage (sobrevive refresco de página)
Asignación de Inventario en Espera
Después de que personal de campo acepta recursos desconocidos en Holding/Staging:
- Navegar a Artículos de Stock
- Filtrar por "Sitio: Holding/Staging" (si implementado)
- Buscar artículos con
isHoldingResource: true
- Abrir Modal de Asignación
- Hacer clic en botón "Asignar Inventario en Espera" en artículo de stock
- Muestra: Volumen actual, Nombre original ingresado por personal de campo
- Seleccionar Recurso Apropiado
- Opción A: Arrastrar recurso existente desde tabla de recursos
- Opción B: Cambiar "Crear Nuevo Recurso" e ingresar detalles
- Ingresar razón de asignación (ej. "Identificado como cable Cat6A, no Cat6")
- Enviar Asignación
- Actualiza atómicamente:
- Campo recurso del artículo de stock (Holding → Apropiado)
- Crea transacción de ajuste con razón de asignación
- Preserva
originalResourceNameen propiedades de transacción
- Actualiza atómicamente:
Ventajas:
- Aceptación en campo nunca se bloquea
- Categorización de oficina preserva registro de auditoría
- Ningún inventario "desaparece" durante transición
- Notas originales del trabajador de campo se preservan
Viendo Transacciones
Registro Global de Transacciones:
- Navegar a Inventario → Transacciones
- Filtrar por tipo, rango de fechas, sitio, recurso
- Exportar para reconciliación o cumplimiento
Historia de Artículo de Stock:
- Navegar a artículo de stock específico
- "Historia de Transacciones" muestra todos los movimientos afectando este artículo
- Rastrear linaje (de dónde vinieron los materiales, a dónde van)
Consumo de Reporte:
- Navegar a reporte de trabajo
- Sección "Materiales Usados" enlaza a transacciones de consumo
- Verificar qué se consumió realmente del inventario
Actividad del Sitio:
- Navegar a sitio
- "Transacciones Recientes" muestra recepciones, transferencias, consumos
- Monitorear rendimiento de almacén
Casos de Uso
Auditoría de Cumplimiento
- Mostrar todos los movimientos de materiales controlados
- Probar cadena de custodia (recepción → transferencia → consumo)
- Exportar registro de transacciones para reporte regulatorio
Prevención de Pérdidas
- Comparar recepciones con consumos a lo largo del tiempo
- Identificar discrepancias requiriendo investigación
- Crear ajustes para corregir discrepancias
Cálculo de Pagos
- Consumos enlazados a reportes vía
reportId - Calcular costos de materiales para trabajo completado
- Verificar que trabajador usó materiales asignados (no stock personal)
Reconciliación de Inventario
- Comparar saldos basados en transacciones con conteos físicos
- Identificar contracción o errores de conteo
- Crear ajustes para corregir discrepancias
Responsabilidad de Trabajador
- Ver historial de retiro y consumo individual de trabajador
- Identificar quién escaneó inventario protegido
- Validación GPS muestra dónde se transfirieron materiales
Mejores Prácticas
Siempre Incluir Razón para Ajustes:
- "Corrección de conteo físico" es mejor que ninguna razón
- "Materiales dañados descartados - evento de tormenta 2026-02-08" aún mejor
- Ayuda a auditores futuros entender correcciones
Usar Tipos de Transacción Más Pequeños:
- No usar ajustes cuando recepción/transferencia apropiada
- Ajustes deberían ser excepción, no rutina
- Recepciones/transferencias preservan contexto más rico
Reconciliación Regular:
- Semanal: Revisar ajustes (deberían ser raros)
- Mensual: Conteo de ciclo de artículos de stock mayores
- Trimestral: Reconciliación completa de almacén
Aprovechar GPS para Transferencias:
- Revisar
scanLocationpara inventario protegido - Detectar anomalías (escaneo 100km del almacén)
- Validación de geofence previene compartir QR remoto
Monitorear Volumen de Transacciones:
- Alto volumen de ajuste = problemas de proceso
- Bajo consumo con retiros altos = acaparamiento o robo
- Desajuste recepción/consumo = problemas de pronóstico de demanda
Permisos de Transacción
Creando Transacciones:
transactionsCreate- Puede crear recepciones, ajustes- Transacciones auto-creadas (de reportes, escaneos QR) no requieren permiso
- Permisos específicos del sitio pueden limitar quién crea recepciones en qué sitios
Viendo Transacciones:
- Todos los usuarios pueden ver transacciones para sus propios artículos de stock
- Restricciones de rol pueden ocultar transacciones para ciertos recursos/sitios
viewDeletedpermite ver transacciones soft-deleted (si alguna vez implementado)
Sin Permiso de Eliminar:
- Las transacciones no pueden ser eliminadas por nadie
- Mantiene integridad del registro de auditoría
- Solo administrador de base de datos podría eliminar (emergencia operacional solo)