Método de inventario FIFO


Por Joannès Vermorel, julio de 2016

El método de inventario FIFO (primero en entrar, primero en salir, por sus siglas en inglés) alude a que los primeros productos que se compran también serán los primeros que se vendan. El inventario FIFO puede verse como un modelo teórico del flujo real de productos, utilizado en el contexto de la contabilidad o las finanzas. El inventario FIFO también puede considerarse como un práctica de cadena de suministro, diseñada para limitar los problemas de vencimiento u obsolescencia, que tienen un impacto negativo sobre los productos almacenados. El análisis de inventario FIFO permite calcular la antigüedad del stock, así como identificar inventario de baja rotación o muerto. Esta página documenta el modo en que se lleva a cabo el análisis FIFO en la práctica y explica los límites, tanto teóricos como prácticos, de este método.

FIFO físico

Desde el punto de vista de la cadena de suministro que se concentra en el flujo real de los productos, generalmente se considera una buena práctica enviar primero los productos que se compraron primero. Al implementar este proceso, las empresas generalmente logran mitigar la mayoría de las pérdidas por vencimientos, siempre que no haya stock excedente de los bienes. Esta práctica también puede limitar la obsolescencia menor de los productos asociada con períodos de almacenamiento prolongados (ej. empaquetamiento dañado).

Por ejemplo, en los e-commerce de moda, las devoluciones de producto pueden representar alrededor del 50 % de los bienes que se envían. En este contexto, a menudo se considera como mejor práctica reenviar primero los bienes que han sido devueltos previamente. Esta regla es una extensión del método FIFO en la que las devoluciones se tienen debidamente en cuenta. Este método facilita la gestión de canales de ventas secundarios al final de la colección de un producto.

Muchos sistemas de almacén no diferencian en absoluto qué unidades se envían, y envían una unidad de stock aleatoria en lugar de la más antigua. El análisis de esta práctica excede los objetivos de este documento.

Análisis FIFO

A diferencia del FIFO físico, el análisis FIFO adopta una perspectiva teórica del inventario, suponiendo que las unidades que se han comprado primero se envían primero, independientemente del flujo físico real de productos. La perspectiva FIFO simplifica enormemente el análisis financiero del inventario.

En la práctica, esto es lo que se necesita para realizar un análisis FIFO:

  • los niveles de stock actuales,
  • el historial de pedidos de compra con fechas de entrega.

Sobre la base de estos datos, el análisis FIFO proporciona una manera de calcular lo siguiente:

  • valoración de inventario, teniendo en cuenta los precios de compra variables;
  • margen bruto esperado, que depende de los precios de compra;
  • antigüedad promedio del inventario (y también extremos).

En la sección siguiente, ilustramos el modo en que puede calcularse lo anterior desde un punto de vista práctico.

Envision y el análisis FIFO

Lokad utiliza un lenguaje de scripting llamado Envision destinado a la optimización cuantitativa de la cadena de suministro. Y Envision proporciona una función fifo() diseñada específicamente para el análisis FIFO.

Intuitivamente, dados los niveles actuales de stock y las órdenes de compra pasadas, el método fifo() debería devolver, de un modo u otro, una composición detallada del stock, indicando la antigüedad de cada unidad almacenada. Resulta ser que cada unidad está asociada con una —y solo una— línea de orden de compra. Este dato estratégico es un tanto sutil, pero da lugar a un método que consiste en calcular, para cada línea de orden de compra, cuántas unidades aún no se vendieron considerando los niveles de stock actuales.

Como consecuencia, resulta claro cómo estas cantidades no vendidas pueden utilizarse para derivar los KPI financieros relevantes. Veamos cómo la función fifo() calcula realmente las cantidades no vendidas asociadas a cada línea de orden de compra:
read "/sample/Lokad_Items.tsv"
read "/sample/Lokad_PurchaseOrders.tsv" as PO with
"Quantity" as Qty

PO.Unsold = fifo(StockOnHand, PO.Date, PO.Qty)
show table "Unsold" with Id 
PO.Date 
PO.Unsold
El script anterior comienza con la lectura de dos archivos: la lista de artículos y la lista de órdenes de compra, obtenidos del conjunto de datos de ejemplo. Luego, en la línea 5, se realiza una llamada a la función fifo(). Esta función toma tres argumentos:

  • el nivel de stock actual;
  • la fecha del pedido de compra, generalmente la fecha de entrega;
  • la cantidad asociada con la orden de compra.

En la línea 6, la instrucción show table muestra los resultados del cálculo.

Valoración del inventario

La valoración del inventario es sencilla de calcular con el siguiente script:
read "/sample/Lokad_Items.tsv"
read "/sample/Lokad_PurchaseOrders.tsv" as PO with
"Quantity" as Qty

PO.Unsold = fifo(StockOnHand, PO.Date, PO.Qty)
StockValue = sum(PO.Unsold * PO.NetAmount / PO.Qty)

show table "Total stock value" with sum(StockValue)
El script anterior multiplica la cantidad no vendida PO.Unsold por el precio unitario de compra original, calculado como PO.NetAmount / PO.Qty.

Precio de compra promediado

El precio de compra puede promediarse utilizando el método FIFO. El script a continuación es una variante del anterior, adaptado para este fin:
read "/sample/Lokad_Items.tsv"
read "/sample/Lokad_PurchaseOrders.tsv" as PO with
"Quantity" as Qty

PO.Unsold = fifo(StockOnHand, PO.Date, PO.Qty)
StockValue = sum(PO.Unsold * PO.NetAmount / PO.Qty) 
PP = StockValue /. sum(PO.Unsold)

where PP > 0 // filtrado de artículos sin órdenes de compra
  show table "Purchase prices" with 
Id 
Name 
PP
El vector PP contiene los precios de compra de todos los artículos. Debido a que utilizamos el operador de división /. (que devuelve cero si el denominador es cero), todos los artículos para los que no puede calcularse el precio de compra se filtran en la línea 9 debido a la falta de órdenes de compra correspondientes.

Antigüedad del stock

La antigüedad del stock también es relativamente sencilla de calcular; sin embargo, requiere un ingrediente adicional: la fecha que refleja el presente. De hecho, los datos del inventario a veces pueden tener algunos días de antigüedad, y la fecha calendario actual puede no ser la fecha correcta para realizar el análisis. En el ejemplo a continuación, introducimos una variable llamada 'today' (hoy), que puede adaptarse más en una situación real.
read "/sample/Lokad_Items.tsv"
read "/sample/Lokad_PurchaseOrders.tsv" as PO

with "Quantity" as Qty

// última fecha observada en los datos
today := max(PO.Date) + 1

PO.Unsold = fifo(StockOnHand, PO.Date, PO.Qty)
PO.Age = (today - PO.Date) // antigüedad en días
Age = sum(PO.Unsold * PO.Age) /. sum(PO.Unsold)

show table "Stock age" with Id, Name, Age order by Age desc
El script anterior muestra la lista de todos los artículos en stock ordenados por antiguedad, colocando los artículos más viejos al comienzo de la lista. Este cálculo se realiza en las líneas 8-10 promediando la antiguedad de cada orden de compra con respecto a las cantidades no vendidas.

Límites del análisis FIFO

La expresividad del análisis FIFO proviene de sus suposiciones subyacentes sobre el flujo de inventario. Sin embargo, cuando los datos o el flujo físico real de los productos difieren de esas suposiciones, la calidad de los resultados tiende a verse afectada. En esta sección, veremos los problemas más comunes asociados con el análisis FIFO.

Historial de compra truncado

Si bien puede no ser necesario contar con el historial de compra completo desde el inicio para realizar un análisis FIFO preciso, es habitual que las unidades almacenadas más antiguas estén presentes en stock durante más tiempo que el detalle disponible del historial de compra. Si bien en algunos sectores, como el aeronáutico, tener piezas de más de 10 años no es raro, la extracción de 10 años de historial de compra de los sistemas de una empresa puede ser todo un desafío.

La re-ejecución de desabastecimientos es peligrosa

Si estuvieran disponibles tanto el historial de órdenes de compra como el de órdenes de venta, podría resultar tentador considerar que el historial completo de desabastecimientos puede recalcularse volviendo a ejecutar toda la secuencia de órdenes de compra y venta en orden cronológico. En teoría, a través de una simulación de este tipo, todos los niveles de inventario en cualquier punto en el tiempo podrían recalcularse, lo que marcaría todos los períodos en los que los niveles de inventario hayan sido cero como equivalente de desabastecimientos.

Lamentablemente, la experiencia de Lokad indica que este método casi nunca funciona. En este caso, la menor discrepancia en el inventario —como, por ejemplo, una sola unidad no computada— causaría un desastre en todo el análisis debido a que los períodos de desabastecimiento casi nunca se correlacionarán con un valor cero, sino que consistirán en pequeñas cantidades (positivas o negativas) que no pueden utilizarse para identificar efectivamente los desabastecimientos.

Inventario serial

Cuando las unidades tienen un número de serie único, y cuando los movimientos de inventario se identifican a través de él, el análisis FIFO generalmente debería considerarse una aproximación imprecisa. Si vale la pena rastrear físicamente el inventario a nivel de número de serie (N/S), seguramente valga la pena analizarlo aprovechando el nivel adicional de detalle proporcionado por los números de serie.