El módulo de Inventario proporciona una pista de auditoría completa de cada cambio de stock en Tiendas Mi Cholo. Cada vez que se registra una venta, se recibe una compra o se anula cualquiera de ambas operaciones, el sistema crea automáticamente un registro de movimiento en la tablaDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/interezante456-pixel/Miercoles-Proyecto/llms.txt
Use this file to discover all available pages before exploring further.
inventario. Estos registros son inmutables: no se editan ni eliminan, solo se crean. Esto garantiza que siempre sea posible reconstruir el historial de existencias de cualquier producto desde el primer movimiento hasta el estado actual.
Tipos de Movimiento
ENTRADA
Se genera cuando una compra pasa a estado
RECIBIDA. También cuando se anula una venta (el stock regresa al almacén). El stockNuevo es mayor que el stockAnterior.SALIDA
Se genera al registrar una venta exitosa. Por cada producto en el detalle de la venta se crea un movimiento de tipo SALIDA. El
stockNuevo es menor que el stockAnterior.AJUSTE
Reservado para correcciones manuales de inventario. No se genera automáticamente en ningún flujo de ventas o compras.
Tipos de Referencia (referenciaTipo)
Cada movimiento incluye el campo referenciaTipo que indica el origen de la operación y el referenciaId con el ID del documento de origen:
referenciaTipo | referenciaId apunta a | Cuándo se crea |
|---|---|---|
VENTA | ventas.id | Al registrar o anular una venta |
COMPRA | compras.id | Al recibir una orden de compra |
AJUSTE | N/A | Ajuste manual (uso futuro) |
Campos de un Movimiento
La entidadInventario (tabla inventario) almacena los siguientes datos:
| Campo | Tipo | Descripción |
|---|---|---|
id | Long | Identificador del movimiento |
tipo | Enum | ENTRADA, SALIDA o AJUSTE |
cantidad | Integer | Unidades movidas (siempre positivo) |
stockAnterior | Integer | Stock del producto antes del movimiento |
stockNuevo | Integer | Stock del producto después del movimiento |
motivo | String (max 300) | Descripción del motivo (ej. "Venta V-2024-0001", "Recepción compra C-2024-0003") |
referenciaId | Long | ID del documento origen (venta o compra) |
referenciaTipo | String (max 20) | VENTA, COMPRA o AJUSTE |
producto | Producto | Producto al que pertenece el movimiento |
usuario | Usuario | Usuario que desencadenó la operación |
fecha | LocalDateTime | Fecha y hora exacta del movimiento (asignada por el servidor) |
Endpoints de la API
Listar todos los movimientos
ms.reverse()) para mostrar los más recientes primero.
Movimientos por producto
fecha descendente (más reciente primero) directamente desde la base de datos.
| Parámetro | Tipo | Descripción |
|---|---|---|
productoId | Long | ID del producto a consultar |
Ejemplo de Respuesta
El siguiente es el formato estándar de un movimiento devuelto por ambos endpoints:Cómo leer un movimiento
- SALIDA (Venta)
- ENTRADA (Compra recibida)
- ENTRADA (Anulación de venta)
El campo
cantidad indica cuántas unidades salieron. Para verificar la operación: stockAnterior - cantidad = stockNuevo. El referenciaId apunta al id de la venta; puedes cruzar datos con GET /api/ventas/{referenciaId} para ver los detalles completos de la transacción.Interfaz de Usuario
La pantalla Inventario en el frontend muestra una tabla con los siguientes campos para cada movimiento:| Columna | Fuente en la API |
|---|---|
| Fecha | fecha (formateada dd/MM/yyyy HH:mm) |
| Producto | producto.nombre |
| Tipo | tipo con badge de color (verde=ENTRADA, rojo=SALIDA, amarillo=AJUSTE) |
| Cantidad | cantidad prefijado con + o − según el tipo |
| Stock Ant. | stockAnterior |
| Stock Nuevo | stockNuevo (en rojo si ≤ 5) |
| Motivo | motivo |
| Referencia | referenciaTipo con badge |
| Usuario | usuario.nombre |
Control de Acceso
El módulo de inventario es de solo lectura para todos los roles. No existe un endpoint para crear movimientos manualmente a través de la API pública — los movimientos solo se generan de forma automática por el sistema al procesar ventas y compras.| Rol | Ver movimientos |
|---|---|
| ADMIN | ✅ |
| VENDEDOR | ✅ |
| ALMACENERO | ✅ |
Para auditar el stock de un producto específico, usa
GET /api/inventario/producto/{productoId}. Los registros llegan ordenados por fecha descendente, por lo que el primer elemento siempre es el último movimiento registrado y su stockNuevo debe coincidir exactamente con el stockActual actual del producto.