Servicio de Historial de Inventario
Este servicio permite consultar el historial de cambios en el inventario asociados a un usuario o empresa, dependiendo de su tipo de cuenta (INDIVIDUAL
o EMPRESARIAL
).
🔍 Ubicación
src/services/historial.service.ts
📦 Dependencias
prisma
: Cliente ORM para interactuar con la base de datos.HistorialInventarioDTO
: Tipo de datos que define la estructura del historial devuelto.
🧩 Función: async obtenerHistorialInventario(idUsuario: number)
Obtiene el historial de cambios en el inventario asociado a un usuario específico, ya sea individual o empresarial.
Parámetros:
idUsuario
:number
— Identificador único del usuario que solicita el historial.
Retorna:
Promise<HistorialInventarioDTO[]>
— Lista de registros de historial que incluyen:id
: Identificador del historial.productoId
: ID del producto.nombreProducto
: Nombre del producto.accion
: Tipo de cambio realizado.cantidad_anterior
ycantidad_nueva
: Cambios de cantidad.precio_anterior
yprecio_nuevo
: Cambios de precio.fechaCambio
: Fecha y hora del cambio.
Flujo de ejecución:
-
Obtención del usuario
- Consulta en la tabla
users
el tipo de usuario y elempresaId
asociado.
- Consulta en la tabla
-
Identificación de productos
- Si es
INDIVIDUAL
: se listan los productos cuyousuarioId
coincida con elidUsuario
. - Si es
EMPRESARIAL
:- Se usa
empresaId
del usuario, o el propioidUsuario
si está nulo. - Se listan todos los productos cuyo usuario pertenezca a la empresa.
- Se usa
- Si es
-
Consulta de historial
- Busca en
histInv
todos los registros relacionados con losproductosIds
encontrados. - Incluye el nombre del producto (
producto.nombre
). - Ordena los resultados por
fechaCambio
de forma descendente.
- Busca en
-
Transformación de datos
- Mapea cada registro para ajustarse al tipo
HistorialInventarioDTO
, convirtiendo los precios a tiponumber
.
- Mapea cada registro para ajustarse al tipo
Casos especiales:
- Si el usuario no existe en la base de datos, retorna un arreglo vacío.
- Si no hay productos asociados, retorna un arreglo vacío.
✅ Validación y reglas
- Se valida que el usuario exista antes de procesar el historial.
- Para cuentas empresariales se controla el caso en que
empresaId
seanull
. - El historial siempre se devuelve ordenado del más reciente al más antiguo.
🧪 Ejemplo de uso
import { obtenerHistorialInventario } from "./services/historial.service";
const historial = await obtenerHistorialInventario(5);
console.log(historial);
/*
[
{
id: 12,
productoId: 3,
nombreProducto: "Laptop Dell",
accion: "ACTUALIZACIÓN",
cantidad_anterior: 10,
cantidad_nueva: 8,
precio_anterior: 1200,
precio_nuevo: 1150,
fechaCambio: 2025-08-06T14:32:00.000Z
},
...
]
*/