Por Joannès Vermorel, julio de 2016El 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.