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_anteriorycantidad_nueva: Cambios de cantidad.precio_anterioryprecio_nuevo: Cambios de precio.fechaCambio: Fecha y hora del cambio.
Flujo de ejecución:
-
Obtención del usuario
- Consulta en la tabla
usersel tipo de usuario y elempresaIdasociado.
- Consulta en la tabla
-
Identificación de productos
- Si es
INDIVIDUAL: se listan los productos cuyousuarioIdcoincida con elidUsuario. - Si es
EMPRESARIAL:- Se usa
empresaIddel usuario, o el propioidUsuariosi está nulo. - Se listan todos los productos cuyo usuario pertenezca a la empresa.
- Se usa
- Si es
-
Consulta de historial
- Busca en
histInvtodos los registros relacionados con losproductosIdsencontrados. - Incluye el nombre del producto (
producto.nombre). - Ordena los resultados por
fechaCambiode 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
empresaIdseanull. - 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
},
...
]
*/