Méthode de gestion des stocks FIFO (premier entré, premier sorti)

Méthode de gestion des stocks FIFO (premier entré, premier sorti)










Accueil » Ressources » Ici
« Par Joannes Vermorel, juillet 2016 »

La méthode de gestion des stocks FIFO (premier entré, premier sorti) consiste à vendre en premier les marchandises achetées également en premier. Elle peut être considérée comme une modélisation des flux de marchandises réels utilisée à des fins comptables ou financières. Elle est également appliquée dans le domaine logistique pour éviter les problèmes de péremption ou d’obsolescence qui surviennent lorsque les produits sont stockés trop longtemps. Une analyse FIFO des stocks permet de calculer leur ancienneté et d’identifier les stocks morts ou à rotation lente. Le présent article décrit le déroulement pratique d’une telle analyse et en présente les principales limites théoriques et pratiques.

Approche FIFO physique

Les professionnels de la logistique, en tant que responsables des flux de marchandises réels, recommandent généralement de mettre en vente en priorité les premiers produits stockés. Ce fonctionnement permet aux entreprises de limiter la plupart des pertes dues à des dépassements de dates de péremption, si les stocks n’ont pas été surestimés. Les cas d’obsolescence mineure consécutifs à de longues période de stockage (emballage abîmé par exemple) peuvent ainsi également être évités.

Dans la vente en ligne de vêtements, les retours peuvent représenter près de 50 % des articles expédiés. Dans ce contexte, il est souvent souhaitable de réexpédier en priorité les articles renvoyés précédemment. Cette règle découle de la méthode FIFO et permet de prendre en compte correctement les retours. La gestion de canaux de vente secondaires, à la fin d’une collection de produits, est également facilitée par cette méthode.

De nombreux systèmes de gestion d’entrepôt ne différencient pas les articles expédiés, qui sont sélectionnés au hasard et non pas en fonction de leur ancienneté. L’étude de ce fonctionnement n’est pas le sujet du présent article.

Analyse FIFO

À la différence de l’approche FIFO physique, l’analyse FIFO adopte un point de vue théorique sur la gestion des stocks et fait l’hypothèse que les marchandises achetées en premier sont expédiées en premier, quels que soient les flux de marchandises réels. Ce point de vue simplifie grandement l’analyse financière des stocks.

En pratique, il suffit de disposer :

  • des niveaux de stock en cours ;
  • de l’historique des commandes d’achat avec les dates de livraison.

À partir de ces données, l’analyse FIFO permet de calculer :

  • la valeur des stocks, en prenant en compte les variations des prix d’achat ;
  • la marge brute attendue, fonction des prix d’achat ;
  • la durée moyenne de stockage (et les valeurs extrêmes également).

Dans la section suivante, nous illustrons comment les données ci-dessus peuvent être calculées en pratique.

Envision et l’analyse FIFO

Lokad utilise un langage de script appelé Envision conçu pour l’optimisation logistique quantitative. Envision dispose de la fonction fifo(), dédiée à l’analyse FIFO.

De prime abord, on pourrait penser que la méthode fifo() renvoie, à partir des niveaux de stock en cours et des commandes d’achats passées, la composition détaillée des stocks ainsi que l’ancienneté de chaque article stocké. Mais il se trouve que chaque article est associé à une et une seule ligne de commande d’achat. Cette information, l’air de rien, autorise de développement d’une méthode qui consiste à calculer, pour chaque ligne de commande d’achat, le nombre d’articles « invendus », à partir des niveaux de stock en cours.

L’utilisation de ces quantités invendues dans des KPI financiers est ensuite évidente. Voyons comment la fonction fifo() calcule ces quantités pour chaque ligne de commande d’achat :
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
Le script ci-dessus commence par la lecture de deux fichiers : la liste des articles et celle des commandes d’achat issues de l’échantillon de données. Puis, à la ligne 4, la fonction fifo() est appelée. Elle reçoit trois arguments :

  • le niveau de stock en cours ;
  • la date associée à la commande d’achat, généralement la date de livraison ;
  • la quantité de la commande d’achat.

À la ligne 5, l’instruction show table affiche les résultats du calcul.

Évaluation des stocks

Les stocks sont simples à évaluer grâce au script suivant :
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)
Le script ci-dessus multiplie les quantités invendues PO.Unsold par le prix d’achat des articles, calculé avec PO.NetAmount / PO.Quantity.

Prix d’achat moyen

La méthode FIFO permet d’obtenir le prix d’achat moyen. Le script ci-dessous est une variante du précédent adaptée à ce calcul :
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 // exclure les articles sans commande d’achat
  show table "Purchase prices" with Id, Name, PP
Le vecteur PP contient les prix d’achat de tous les articles. L’opérateur de division /. étant utilisé (renvoie zéro si le dénominateur est nul), tous les articles pour lesquels aucun prix d’achat ne peut être calculé — car la commande d’achat correspondante est manquante — sont exclus à la ligne 7.

Durée de stockage

La durée de stockage est aussi relativement simple à calculer. Un élément supplémentaire est cependant nécessaire : la date qui indique le « présent ». En effet, les données de stock peuvent avoir quelques jours et la date du jour peut ne pas être celle à laquelle l’analyse doit être effectuée. Dans l'exemple ci-dessous, nous ajoutons une variable appelée « today » qui peut être ajustée au différents cas concrets.
read "/sample/Lokad_Items.tsv"
read "/sample/Lokad_PurchaseOrders.tsv" as PO

today := max(PO.Date) + 1 // dernière date observée dans les données

PO.Unsold = fifo(StockOnHand, PO.Date, PO.Quantity)
PO.Age = (today - PO.Date) // durée en jour
Age = sum(PO.Unsold * PO.Age) /. sum(PO.Unsold)

show table "Stock age" with Id, Name, Age order by Age desc
Le script ci-dessus affiche la liste de tous les articles en stock classés par durée de stockage décroissante. Ce calcul est effectué aux lignes 6-8, en déterminant l’âge moyen de chaque commande d’achat par rapport à aux quantités d’articles invendus.

Les limites de l’analyse FIFO

Le caractère informatif de l’analyse FIFO vient de l’hypothèse sous-jacente qui porte sur les flux de stock. Cependant, lorsque les données ou les flux de marchandises réels s’écartent de cette hypothèse, la qualité des résultats diminue. Dans cette section, nous passons en revue les problèmes les plus communément rencontrés avec l’analyse FIFO.

Historique d’achat tronqué

Même si une analyse FIFO précise ne requiert pas nécessairement un historique complet des achats, la durée de stockage des articles les plus anciens est souvent plus importante que la profondeur de l’historique disponible. Ainsi, dans certains secteurs, comme l’aéronautique, il n’est pas rare de stocker des pièces pendant 10 ans. L’extraction d’un historique des achats sur une telle durée peut s’avérer compliquée.

Déduction hasardeuse des ruptures de stock

Si l’historique des commandes d’achat et celui des commandes client sont disponibles, l’historique complet des ruptures de stock pourrait, en théorie, être calculer en déroulant toutes les commandes dans l’ordre chronologique. Tous les niveaux de stock pourraient ainsi être recalculés et les périodes de rupture de stock identifiées.

Malheureusement, l’expérience de Lokad a montré que cette approche ne fonctionne presque jamais. En effet, la plus infime incohérence au niveau du stock — un seul article non inventorié par exemple — rend caduque toute l’analyse : les niveaux calculés ne sont jamais exactement nuls mais correspondent à de petites quantités, positives ou négatives, qui ne permettent pas d’identifier positivement les ruptures de stock.

Stock géré avec les numéros de série

Si tous les articles ont un numéro de série unique et si tous les mouvements de stock sont identifiés par ce dernier, alors l’analyse FIFO peut généralement être considérée comme très approximative. En effet, si le stock a une valeur telle qu’il doit être suivi au niveau des numéros de série alors il doit être analysé en exploitant le niveau de détail ainsi obtenu.