Metodo FIFO (First-in, First-out)

Metodo FIFO (First-in, First-out)












Home » Risorse » Qui
di Joannès Vermorel, Luglio 2016

Il metodo FIFO (first-in, first-out) è un metodo secondo cui le merci acquistate per prime sono anche le prime a essere rivendute. Può essere considerato come un modello teorico del flusso di merci reale, usato a fini finanziari o di contabilità, oppure come strategia di gestione del magazzino, volta a limitare la scadenza o l'obsolescenza dei prodotti tenuti a magazzino. Un'analisi FIFO del magazzino consente di calcolare "l'età" dei prodotti, così come di identificare i prodotti di lento rigiro e lo stock morto. In questa pagina vedremo come eseguire un'analisi FIFO nella pratica, per poi evidenziarne i limiti, sia teorici che pratici.

Il metodo FIFO dal punto di vista "fisico"

Dal punto di vista di una gestione di magazzino basata sul flusso reale di merci, è considerata buona regola spedire per prime le merci che sono state acquistate per prime. Seguendo questa logica, è possibile ridurre il write off dei prodotti scaduti, a patto che le scorte non siano eccessive, o limitare i problemi causati dall'obsolescenza dei prodotti tenuti a magazzino per lungo tempo (es. confezioni ingiallite o invecchiate).

Ad esempio, nell'e-commerce nel settore della moda, i resi possono arrivare a costituire quasi il 50% delle merci spedite. In questi casi, è bene rispedire prima le merci che sono state restituite. Questa regola, che funge da corollario al metodo FIFO, consente di prendere in adeguata considerazione anche i resi: il metodo FIFO contribuisce quindi ad agevolare la gestione dei canali di vendita secondari una volta raccolte le unità di prodotto.

Molti sistemi di gestione dei magazzini non differenziano le varie unità che vengono spedite: in questo modo, viene ogni volta spedita un'unità presa a caso, invece che quella più vecchia. Questa pratica non verrà però analizzata in questa sede.

Analisi FIFO

A differenza del metodo FIFO applicato al magazzino "fisico", l'analisi FIFO adotta una prospettiva teorica al magazzino, partendo dal presupposto che le unità acquistate per prime siano spedite per prime, indipendentemente dal flusso reale di merci. In questo modo, il metodo FIFO semplifica enormemente l'analisi finanziaria del magazzino.

Tutto ciò che serve per eseguire un'analisi FIFO è conoscere:

  • i livelli attuali di scorte;
  • gli ordini di acquisto passati, con le date di consegna.

Sulla base di questi dati, l'analisi FIFO consente di calcolare:

  • stima dell'inventario, tenendo conto delle variazioni dei prezzi di acquisto;
  • margine lordo atteso, secondo i prezzi di acquisto;
  • età media delle scorte (e valori estremi).

Qui di seguito vedremo come calcolare, a livello pratico, tali quantità.

Analisi FIFO con Envision

Lokad ha messo a punto Envision, un linguaggio di programmazione pensato proprio per agevolare l'ottimizzazione della catena logistica. Envision offre una funzione fifo(), specifica, appunto, per l'analisi FIFO.

Senza entrare nei dettagli tecnici, dati il livello attuale di scorte e la lista degli ordini di acquisto passati, il metodo fifo() restituisce, in un modo o nell'altro, una composizione dettagliata delle scorte a magazzino, comprensiva dell'età di ogni unità ancora in stock. Ogni unità viene associata a una e una sola riga di ordine di acquisto. Questo è possibile perché per ogni riga di ordine di acquisto viene calcolato quante unità sono ancora invendute sulla base dei livelli attuali di scorte.

A partire da queste quantità invendute, desumere i KPI rilevanti a livello finanziario diventa piuttosto semplice. Vediamo come la funzione fifo() calcola esattamente le quantità invendute associate a ogni riga di ordine di acquisto:
read "/sample/Lokad_Items.tsv"
read "/sample/Lokad_PurchaseOrders.tsv" as PO

PO.Unsold = fifo(StockOnHand, PO.Date, PO.Quantity)
show table "Unsold" with Id, PO.Date, PO.Unsold
Lo script qui sopra inizia con la lettura di due file: la lista degli articoli e la lista degli ordini di acquisto, ottenuti dal nostro set di dati campione. Quindi, alla riga 4, viene eseguita una chiamata alla funzione fifo(). La funzione richiede tre argomenti:

  • il livello attuale di scorte;
  • la data dell'ordine di acquisto, che solitamente si fa corrispondere alla data di consegna;
  • la quantità associata all'ordine di acquisto.

Alla riga 5, l'assegnamento show table (mostra tabella) mostra i risultati del calcolo.

Stima dell'inventario

La stima dell'inventario può essere calcolata facilmente con lo script seguente:
read "/sample/Lokad_Items.tsv"
read "/sample/Lokad_PurchaseOrders.tsv" as PO

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

show table "Total stock value" with sum(StockValue)
Lo script qui sopra moltiplica le quantità invendute (PO.Unsold) per il prezzo unitario di acquisto pagato in origine, calcolato come PO.NetAmount / PO.Quantity.

Prezzo medio di acquisto

Il prezzo medio di acquisto può essere calcolato attraverso il metodo FIFO. Lo script qui sotto è una variante di quello visto prima, adattata a questo scopo:
read "/sample/Lokad_Items.tsv"
read "/sample/Lokad_PurchaseOrders.tsv" as PO

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

where PP > 0 // filtra gli articoli senza ordine di acquisto
  show table "Purchase prices" with Id, Name, PP
Il vettore PP contiene i prezzi di acquisto per tutti gli articoli. Poiché usiamo l'operatore di divisione /., che restituisce zero se il denominatore è zero, alla riga 7 filtriamo tutti gli articoli per cui non può essere calcolato alcun prezzo di acquisto per mancanza di un ordine di acquisto corrispondente.

Età delle scorte

È relativamente facile calcolare anche l'età delle scorte, che però richiede un altro dato chiave: la data del presente. Nella realtà, succede talvolta che i dati sulle scorte siano già vecchi di qualche giorno e che la data attuale del calendario non sia quella corretta per eseguire l'analisi. A tal proposito, nell'esempio sotto introduciamo la variabile `oggi`, che può essere ulteriormente regolata per adattarsi meglio alle situazioni della vita reale.
read "/sample/Lokad_Items.tsv"
read "/sample/Lokad_PurchaseOrders.tsv" as PO

today := max(PO.Date) + 1 // ultima data osservabile

PO.Unsold = fifo(StockOnHand, PO.Date, PO.Quantity)
PO.Age = (today - PO.Date) // età in giorni
Age = sum(PO.Unsold * PO.Age) /. sum(PO.Unsold)

show table "Stock age" with Id, Name, Age order by Age desc
Nello script qui sopra, troviamo una lista di tutti gli articoli a magazzino ordinati per età delle scorte, dalle meno recenti alle più recenti. Il calcolo è eseguito alle righe 6-8, calcolando l'età media di ogni ordine di acquisto rispetto alle quantità invendute di tale ordine.

Limiti dell'analisi FIFO

Se l'analisi FIFO è così espressiva, è grazie alle ipotesi sul flusso di merci che ne sono alla base. Tuttavia, quando i dati o il flusso reale di merci divergono da queste ipotesi, i risultati sono inevitabilmente di qualità più scarsa. Vediamo, quindi, quali sono le possibili divergenze e quali problemi possono creare all'analisi FIFO.

Storico degli acquisti troncato

Per eseguire un'analisi FIFO accurata non serve certo disporre di tutti i dati storici sugli acquisti della propria attività commerciale. È vero, però, che a volte le scorte meno recenti risalgono a un ordine di acquisto non più disponibile: ad esempio, in alcuni settori, come l'aeronautica, si trovano spesso pezzi di ricambio acquistati 10 anni prima, ma tornare agli ordini di acquisto di 10 anni prima può essere un'impresa quasi impossibile.

Ricalcolo delle rotture di stock

Se sono disponibili sia gli ordini di acquisto che gli ordini di vendita storici, potrebbe essere forte la tentazione di ricalcolare tutte le passate rotture di stock, rielaborando in sequenza tutti gli acquisti e le vendite in ordine di tempo. A livello teorico, in una simulazione come questa, tutti i livelli di scorte a un certo punto potrebbero essere ricalcolati, ma tutti i periodi che presentano scorte pari a zero verrebbero considerati come rotture di stock.

La nostra esperienza con Lokad ci ha insegnato che questo approccio non funziona quasi mai: anzi, ogni minima discrepanza nell'inventario (anche solo un'unità saltata) può mandare a monte l'intera analisi, poiché le rotture di stock non corrispondono quasi mai a zero scorte, ma piuttosto a quantità minime (positive o negative) che non possono essere usate per identificare positivamente le rotture di stock.

Inventario in serie

Quando tutte le unità hanno uno stesso numero di serie, e tutti i movimenti all'interno del magazzino sono identificati attraverso questo numero di serie, allora l'analisi FIFO diventa nient'altro che un'approssimazione. Se l'inventario può essere tenuto sotto controllo, a livello fisico, attraverso il numero di serie (S/N), quasi sicuramente potrà essere analizzato attraverso gli altri dettagli forniti dai numeri di serie.