Documentación / Inventory Module Documentation

Inventory Module Documentation

Documentación del Módulo de Inventario

Versión: 1.0
Fecha: 2026-01-12


1. Resumen Ejecutivo

El módulo de Inventario es el componente central para la gestión de productos, almacenes, ubicaciones y control de stock en la organización. Su propósito es mantener un registro preciso de las existencias, automatizar los movimientos de inventario y proporcionar trazabilidad completa de las operaciones de stock.

Valor para el Negocio:

  • Control de Stock Real: Seguimiento preciso de niveles de inventario en tiempo real por almacén y ubicación.
  • Trazabilidad Completa: Historial detallado de todos los movimientos de stock con origen polimórfico.
  • Gestión Multi-Almacén: Soporte para múltiples almacenes con estructura jerárquica de ubicaciones.
  • Transferencias Entre Almacenes: Flujo controlado de mercancías con validación de stock y estados.
  • Ajustes de Inventario: Proceso de conteo físico con aprobación y generación automática de movimientos.
  • Integración Contable: Vinculación con cuentas contables para valorización de inventario.

2. Arquitectura del Módulo

2.1. Componentes Principales

graph TB subgraph "Catálogo de Productos" PC[ProductCategory] P[Product] UOM[UnitOfMeasure] end subgraph "Infraestructura de Almacenes" W[Warehouse] L[Location] BR[Branch] end subgraph "Niveles de Stock" SL[StockLevel] SM[StockMove] end subgraph "Operaciones de Inventario" SA[StockAdjustment] SAL[StockAdjustmentLine] ST[StockTransfer] STL[StockTransferLine] end subgraph "Integración Contable" COA[ChartOfAccount] end PC --> P P --> UOM P --> COA PC --> COA BR --> W W --> L L --> L P --> SL W --> SL L --> SL P --> SM W --> SM L --> SM W --> SA SA --> SAL SAL --> P SAL --> L W --> ST ST --> STL STL --> P STL --> L

3. Flujos de Proceso

3.1. Flujo de Transferencia de Stock (StockTransfer)

stateDiagram-v2 [*] --> BORRADOR BORRADOR --> LISTO: Validar Stock LISTO --> BORRADOR: Revertir LISTO --> EN_TRANSITO: Despachar LISTO --> CANCELADO: Cancelar EN_TRANSITO --> COMPLETADO: Recibir EN_TRANSITO --> CANCELADO: Cancelar (Revierte Movimientos) BORRADOR --> CANCELADO: Cancelar note right of LISTO Valida stock disponible en almacén origen end note note right of EN_TRANSITO Genera movimientos negativos en almacén origen end note note right of COMPLETADO Genera movimientos positivos en almacén destino end note

Estados de StockTransfer:

Estado Valor Descripción Acciones Permitidas
BORRADOR borrador Estado inicial, en edición Marcar Listo, Cancelar
LISTO listo Stock validado, listo para envío Despachar, Revertir, Cancelar
EN_TRANSITO en_transito Mercancía en tránsito Recibir, Cancelar
COMPLETADO completado Transferencia finalizada - (Estado final)
CANCELADO cancelado Transferencia cancelada - (Estado final)

3.2. Flujo de Ajuste de Inventario (StockAdjustment)

stateDiagram-v2 [*] --> BORRADOR BORRADOR --> APROBADO: Aprobar APROBADO --> COMPLETADO: Completar note right of BORRADOR Registro de conteo físico por producto y ubicación end note note right of APROBADO Revisión gerencial Registra aprobador end note note right of COMPLETADO Genera StockMoves automáticamente end note

Estados de StockAdjustment:

Estado Valor Descripción Acciones Permitidas
BORRADOR borrador En edición, puede modificarse Aprobar
APROBADO aprobado Revisado, listo para aplicar Completar
COMPLETADO completado Movimientos generados - (Estado final)

3.3. Flujo de Movimiento de Stock (StockMove)

stateDiagram-v2 [*] --> BORRADOR BORRADOR --> REALIZADO: Confirmar BORRADOR --> ANULADO: Anular REALIZADO --> ANULADO: Anular note right of REALIZADO Actualiza StockLevel vía boot hooks end note

Estados de StockMove:

Estado Valor Afecta Stock Descripción
BORRADOR borrador No Movimiento pendiente
REALIZADO realizado Movimiento efectivo
ANULADO anulado No Movimiento cancelado

4. Lógica de Negocio y Reglas

4.1. Reglas de Productos

  • SKU Único: Cada producto debe tener un SKU único en el sistema.
  • Tipo de Producto: Define si el producto es almacenable, consumible o servicio.
  • Cuenta Contable Efectiva: Si el producto no tiene cuenta asignada, hereda de su categoría.
  • Stock Mínimo/Máximo: Alertas configurables por producto para gestión de reposición.
  • Lote/Serie: Productos pueden requerir trazabilidad por lote o número de serie.
  • Vencimiento: Productos pueden requerir control de fecha de expiración.

4.2. Reglas de Almacenes

  • Eliminación Bloqueada: No se puede eliminar un almacén si tiene:
    • Movimientos de stock asociados
    • Transferencias de stock (origen o destino)
    • Ajustes de inventario
    • Ubicaciones con stock positivo
  • Vinculación a Sucursal: Cada almacén pertenece a una sucursal específica.

4.3. Reglas de Ubicaciones

  • Estructura Jerárquica: Las ubicaciones pueden tener ubicaciones hijas (árbol).
  • Herencia de Almacén: La ubicación hija hereda automáticamente el warehouse_id del padre.
  • Cálculo de Path: El path se construye automáticamente: padre.path/hijo.code.
  • Profundidad Automática: depth = padre.depth + 1.
  • Capacidad Física: Las ubicaciones pueden definir dimensiones y peso máximo.

4.4. Reglas de Transferencias

  • Validación de Stock: Al marcar como LISTO, se valida que exista stock suficiente.
  • Despacho: Genera movimientos negativos en el almacén origen.
  • Recepción: Genera movimientos positivos en el almacén destino.
  • Cancelación en Tránsito: Revierte los movimientos negativos ya generados.
  • Edición Limitada: Solo se puede editar en estados BORRADOR y LISTO.

4.5. Reglas de Ajustes

  • Diferencia Calculada: diferencia = cantidad_contada - cantidad_teórica.
  • Clasificación Automática:
    • Diferencia > 0: Sobrante (genera movimiento positivo)
    • Diferencia < 0: Faltante (genera movimiento negativo)
    • Diferencia = 0: Sin cambio (no genera movimiento)
  • Aprobación Requerida: Los ajustes deben ser aprobados antes de completarse.
  • Registro de Aprobador: Se registra quién aprobó el ajuste.

4.6. Sincronización de Stock

El modelo StockMove sincroniza automáticamente los niveles de stock vía hooks en boot():

StockMove::boot()
    ├── created() → Si state = 'realizado' → syncStockLevel()
    └── updated() → Si cambió state/quantity/location → syncStockLevel()
                        ↓
              Recalcula StockLevel (product_id, warehouse_id, location_id)
                        ↓
              Actualiza quantity y last_movement_at

5. Modelo de Datos Detallado

5.1. Entidades de Productos

Entidad Descripción Atributos Clave
Product Producto o Servicio sku, name, product_type, unit_of_measure_id, purchase_price, sale_price, min_stock_level, max_stock_level, requires_lot_serial, requires_expiration
ProductCategory Categoría de productos name, code, stock_account_id, expense_account_id, income_account_id, sort_order, is_active

5.2. Entidades de Infraestructura

Entidad Descripción Atributos Clave
Warehouse Almacén físico name, code, branch_id, address, is_active
Location Ubicación dentro de almacén warehouse_id, parent_id, name, code, depth, path, length, width, height, max_weight, max_volume, status, allowed_product_types

5.3. Entidades de Stock

Entidad Descripción Atributos Clave
StockLevel Nivel de stock denormalizado warehouse_id, location_id, product_id, quantity, reserved_quantity, last_movement_at
StockMove Movimiento individual de stock product_id, warehouse_id, location_id, quantity, move_date, lot_serial_number, expiration_date, origin_type, origin_id, unit_cost, total_cost, state

5.4. Entidades de Operaciones

Entidad Descripción Atributos Clave
StockAdjustment Cabecera de ajuste warehouse_id, adjustment_date, reason, notes, status, created_by, approved_by
StockAdjustmentLine Línea de ajuste stock_adjustment_id, product_id, location_id, theoretical_quantity, counted_quantity, lot_serial_number, unit_cost
StockTransfer Cabecera de transferencia source_warehouse_id, destination_warehouse_id, source_branch_id, destination_branch_id, transfer_date, status, created_by, processed_by, received_by
StockTransferLine Línea de transferencia stock_transfer_id, product_id, source_location_id, destination_location_id, quantity_demanded, quantity_done, lot_serial_number, unit_cost

6. Casos de Uso

6.1. Gestión de Productos

  • CU-01: Creación de Producto: Registro de nuevo producto con SKU, precios y configuración de stock.
  • CU-02: Categorización: Asignación de productos a categorías con cuentas contables heredables.
  • CU-03: Configuración de Alertas: Definición de niveles mínimos y máximos de stock.
  • CU-04: Consulta de Stock: Visualización de stock por almacén y ubicación.

6.2. Gestión de Almacenes

  • CU-05: Creación de Almacén: Registro de nuevo almacén vinculado a sucursal.
  • CU-06: Creación de Ubicaciones: Estructura jerárquica de ubicaciones dentro del almacén.
  • CU-07: Gestión de Capacidad: Definición de dimensiones y límites por ubicación.

6.3. Operaciones de Inventario

  • CU-08: Transferencia Entre Almacenes: Movimiento de productos entre almacenes con validación.
  • CU-09: Ajuste de Inventario: Conteo físico con registro de diferencias y aprobación.
  • CU-10: Consulta de Movimientos: Historial detallado de movimientos por producto.

7. Guía de Configuración

7.1. Tipos de Producto (ProductType)

Tipo Código Descripción Gestiona Stock
Almacenable almacenable Producto físico que ocupa inventario
Consumible consumible Producto que no se rastrea en stock No
Servicio servicio Servicio intangible No

7.2. Estados de Ubicación (LocationStatus)

Estado Código Color Descripción
Disponible disponible Verde Ubicación libre
Parcial parcial Amarillo Parcialmente ocupada
Ocupado ocupado Rojo Sin espacio disponible
Reservado reservado Azul Reservada para uso específico

7.3. Configuración de Categorías

Las categorías definen cuentas contables por defecto que los productos heredan:

Cuenta Descripción Clase Contable
stock_account_id Cuenta de valorización de inventario Activo (Clase 2)
expense_account_id Cuenta de costo de ventas Gasto (Clase 6)
income_account_id Cuenta de ingresos por ventas Ingreso (Clase 7)

8. Sincronización de Stock (Model Hooks)

8.1. StockMove Boot Hooks

Siguiendo la guía de implementación del proyecto, la lógica de sincronización está en el modelo StockMove vía boot():

Evento Condición Acción
created Estado es realizado syncStockLevel()
updated Cambió state syncStockLevel()
updated Cambió quantity/warehouse/location + estado realizado syncStockLevel()

Método syncStockLevel:

protected static function syncStockLevel(StockMove $stockMove): void
{
    $stockLevel = StockLevel::firstOrNew([...]);
    $totalQuantity = static::where('state', StockMoveState::REALIZADO)->sum('quantity');
    $stockLevel->quantity = $totalQuantity;
    $stockLevel->last_movement_at = now();
    $stockLevel->save();
}

Nota: Esta arquitectura sigue la guía: "La lógica de negocio vive en el Modelo, NO en Observers externos."


9. Matriz de Roles y Permisos (RBAC)

Recurso Super-Admin Inventario Manager Almacenero
Productos Total Total Ver
Categorías Total Total Ver
Almacenes Total Total Ver
Ubicaciones Total Total Ver/Editar
Stock Levels Ver Ver Ver
Stock Moves Ver Total Ver
Transferencias Total Total + Aprobar Crear/Despachar
Ajustes Total Total + Aprobar Crear

10. Reportes y Exportación

10.1. Exportadores Disponibles

Exportador Recurso Descripción
ProductExporter Productos Catálogo de productos con stock
ProductCategoryExporter Categorías Catálogo de categorías
WarehouseExporter Almacenes Lista de almacenes
LocationExporter Ubicaciones Estructura de ubicaciones
StockMoveExporter Movimientos Historial de movimientos
StockAdjustmentExporter Ajustes Ajustes de inventario
StockTransferExporter Transferencias Transferencias entre almacenes

Acceso: Botón "Exportar" en la cabecera de las tablas correspondientes.

10.2. Indicadores Clave

Indicador Descripción
Stock Bajo Productos con cantidad ≤ nivel mínimo
Stock Alto Productos con cantidad ≥ nivel máximo
Valor Total de Stock Suma de (cantidad × costo unitario) por almacén
Transferencias Pendientes Transferencias en estado LISTO o EN_TRANSITO

11. Solución de Problemas (Troubleshooting)

Error: "No se puede eliminar el almacén porque tiene movimientos de stock asociados"

  • Causa: El almacén tiene StockMoves registrados.
  • Solución: Los almacenes con historial no pueden eliminarse. Considere desactivarlo (is_active = false).

Error: "No se puede eliminar el almacén porque tiene ubicaciones asociadas"

  • Causa: Existen ubicaciones vinculadas al almacén.
  • Solución: Elimine primero todas las ubicaciones del almacén.

Error: "No se puede eliminar el almacén porque tiene niveles de stock positivo"

  • Causa: Existen productos con stock > 0 en el almacén.
  • Solución: Realice transferencias para vaciar el almacén antes de eliminarlo.

Error: "Stock insuficiente para la transferencia"

  • Causa: El almacén origen no tiene suficiente stock del producto.
  • Solución: Verifique el stock disponible y ajuste las cantidades de la transferencia.

Error: "No se puede editar, la transferencia está EN_TRANSITO"

  • Causa: La mercancía ya fue despachada.
  • Solución: Complete la recepción o cancele la transferencia (revertirá los movimientos).

Error: "El ajuste debe tener al menos una línea"

  • Causa: Se intenta aprobar un ajuste sin líneas de conteo.
  • Solución: Agregue líneas de ajuste con productos y cantidades contadas.

12. Integraciones

12.1. Integración con Contabilidad

Los productos y categorías se vinculan con cuentas contables:

  • Cuenta de Stock: Para valorización del inventario (Activo).
  • Cuenta de Gasto: Para costo de ventas (Gasto).
  • Cuenta de Ingreso: Para ingresos por ventas (Ingreso).

12.2. Integración con Ventas

Los movimientos de stock se generan automáticamente desde:

  • Facturas de Venta: Movimientos negativos al confirmar venta.
  • Facturas de Compra: Movimientos positivos al recibir mercancía.

12.3. Origen Polimórfico de Movimientos

El campo origin_type / origin_id permite rastrear el origen de cada movimiento:

Tipo de Origen Descripción
stock_adjustment Ajuste de inventario
stock_transfer Transferencia entre almacenes
sales_invoice Factura de venta
purchase_invoice Factura de compra

13. Anexos

13.1. Enums del Módulo

Enum Valores
ProductType almacenable, consumible, servicio
LocationStatus disponible, parcial, ocupado, reservado
StockMoveState borrador, realizado, anulado
StockAdjustmentStatus borrador, aprobado, completado
StockTransferStatus borrador, listo, en_transito, completado, cancelado

13.2. Diagrama de Relaciones

erDiagram ProductCategory ||--o{ Product : "tiene" Product ||--o{ StockLevel : "tiene" Product ||--o{ StockMove : "genera" Branch ||--o{ Warehouse : "contiene" Warehouse ||--o{ Location : "contiene" Location ||--o{ Location : "padre-hijo" Warehouse ||--o{ StockLevel : "almacena" Location ||--o{ StockLevel : "ubica" Warehouse ||--o{ StockAdjustment : "realiza" StockAdjustment ||--o{ StockAdjustmentLine : "contiene" StockAdjustmentLine }o--|| Product : "ajusta" StockAdjustmentLine }o--|| Location : "en" Warehouse ||--o{ StockTransfer : "origen/destino" StockTransfer ||--o{ StockTransferLine : "contiene" StockTransferLine }o--|| Product : "transfiere" StockTransferLine }o--|| Location : "desde/hacia" StockMove }o--|| Product : "mueve" StockMove }o--|| Warehouse : "en" StockMove }o--|| Location : "ubica" ChartOfAccount ||--o{ ProductCategory : "cuentas" ChartOfAccount ||--o{ Product : "cuentas"

Documentación generada automáticamente el 2026-01-12. Versión 1.0.