Stock physique, stock virtuel et inventaire dans Dolibarr

Ce qui fait bouger le stock physique et le stock virtuel de Dolibarr 24, six raisons testées pour lesquelles le stock virtuel paraît faux, et l'inventaire intégré pas à pas, avec le bug du bouton de clôture en 24.0.2.

Versions concernées
Dolibarr 24.0.2 (testé : image Docker officielle 24.0.1 dont le code a été remplacé par celui de la 24.0.2, absente de Docker Hub au 14/10/2026 ; MariaDB 11.4)
Ce qui a été vérifié
Tests du 14/10/2026 sur une instance neuve de Dolibarr 24.0.2, actions faites dans l'interface : règles de stock (aucune, validation des commandes, validation des expéditions, clôture des expéditions, validation des réceptions), commandes clients validées, expédiées en partie, classées livrées ou annulées, changement de règle avec une commande en cours, commande fournisseur et réceptions partielles, kit, inventaire complet avec stock initial et vente pendant l'inventaire, module Lots/Séries. Lecture du code de Dolibarr 24.0.2 (Product::load_virtual_stock, load_stats_*, Inventory, product/inventory/inventory.php).

Dolibarr affiche deux chiffres sur l’onglet Stock d’un produit, et c’est le second qui fait poser le plus de questions :

  • le stock physique : ce qui est dans vos entrepôts. Il est enregistré en base et ne change que par des mouvements de stock (automatiques ou manuels) ;
  • le stock virtuel : ce qu’il restera quand les commandes en cours seront livrées et reçues. Il n’est enregistré nulle part : Dolibarr le recalcule à chaque affichage à partir des commandes, expéditions et réceptions en cours.

Un stock virtuel « qui ne se met pas à jour » n’est donc jamais un calcul en retard : il n’y a rien à recalculer. Quand il paraît faux, c’est qu’un document en cours est compté, ou ne l’est pas. Ce guide montre lesquels, avec des chiffres relevés le 14 octobre 2026 sur Dolibarr 24.0.2.

D’abord : quand le stock bouge-t-il ?

Tout se règle dans Accueil › Configuration › Modules/Applications, carte Stock, roue crantée. La page propose deux listes : une règle de décrémentation (sorties) et une règle d’incrémentation (entrées). On n’en choisit qu’une par liste : en cocher une décoche les autres.

Sorties : décrémenter les stocks physiques… Entrées : incrémenter les stocks physiques…
sur validation des factures/avoirs clients sur validation des factures/avoirs fournisseurs
sur validation des commandes clients sur approbation des commandes fournisseurs
sur validation des expéditions sur validation des réceptions
au classement “clôturée” de l’expédition lorsque la réception est classée “Close”

Sur une installation neuve, aucune règle n’est cochée. Rien ne bouge tout seul : le stock ne change que par Corriger le stock ou Transférer stock sur la fiche du produit, ou par un inventaire. Et le stock virtuel reste égal au stock physique : dans notre test, une commande de 3 stylos validée laissait le stock virtuel à 10 sur 10. C’est la première chose à vérifier quand « le stock virtuel ne bouge pas ».

Si vous utilisez les expéditions, la règle sur validation des expéditions est la plus lisible : le stock physique baisse quand le colis part, et le stock virtuel anticipe les commandes à livrer. Avec le module Numéros de Lot/Série, Dolibarr grise d’ailleurs les règles liées aux factures et aux commandes : il ne reste que celles des expéditions et des réceptions.

La page signale aussi qu’un module de point de vente peut ignorer ces règles et décrémenter le stock à sa façon : vérifiez sa propre configuration si vous en utilisez un.

Ce que le stock virtuel additionne

Le calcul dépend de la règle choisie. Ce que nous avons vérifié :

Règle « sur validation des expéditions » (ou « clôturée ») : stock virtuel = stock physique − (quantités des commandes clients validées ou en cours − ce qui en a déjà été expédié).

Étape (stock de départ : 10) Physique Virtuel
Commande de 3 validée 10 7
Expédition de 2 créée, en brouillon 10 7
Expédition de 2 validée 8 7
Commande classée livrée (le dernier stylo ne partira pas) 8 8

Les commandes en brouillon ne comptent pas, les commandes annulées non plus : une commande de 4 validée faisait tomber le virtuel à 4, l’annuler l’a remis à 8.

Avec la règle « au classement “clôturée” de l’expédition », une expédition validée mais pas clôturée ne change rien au stock physique ; c’est le bouton Clôturer de l’expédition qui le fait baisser. Dans notre test, clôturer une expédition qui couvrait toute la commande a aussi classé la commande comme livrée.

Règle « sur validation des commandes clients » : le stock physique baisse dès la validation (la boîte de confirmation demande l’entrepôt), et le stock virtuel est égal au stock physique. Les expéditions ne touchent plus au stock.

Côté achats (règle « sur validation des réceptions ») : le stock virtuel ajoute les quantités des commandes fournisseurs passées (bouton Passer commande) ou reçues partiellement, moins ce qui en a déjà été reçu.

Étape (stock de départ : 20) Physique Virtuel
Commande fournisseur de 10 validée et approuvée 20 20
Passer commande 20 30
Réception de 4 validée 24 30
Réceptions du reste validées 30 30

Le diagnostic en dix secondes : l’infobulle

Sur l’onglet Stock du produit, passez la souris sur le petit « i » à droite du chiffre du stock virtuel. Dolibarr affiche Explication de l’écart stock physique-virtuel : quantités en commandes clients ouvertes (et en brouillon), déjà expédiées, en commandes fournisseurs ouvertes (et en brouillon ou approuvées mais pas encore passées), déjà reçues. Presque tous les cas ci-dessous se lisent là.

Six raisons pour lesquelles le stock virtuel paraît faux

Chacune a été reproduite sur notre instance de test.

1. Aucune règle n’est active

Voir plus haut : sans règle, le stock virtuel ignore les commandes. Cochez une règle de sortie et une règle d’entrée.

2. Une commande validée n’a jamais été soldée

Une commande expédiée en partie, dont le reste ne partira jamais, continue de « réserver » le reliquat : le stock virtuel reste plus bas que le stock physique, indéfiniment. Même chose pour une commande validée puis oubliée. Ouvrez la commande et cliquez Classer livrée (ou Annuler la commande si rien n’est parti) : le stock virtuel revient aussitôt.

3. La commande fournisseur est approuvée mais pas « passée »

Une commande fournisseur validée et approuvée ne compte pas dans le stock virtuel. Elle ne compte qu’après Passer commande. Dans l’infobulle, elle apparaît entre parenthèses : « commandes brouillons ou approuvées, mais pas encore passées ».

4. Une réception en brouillon fait baisser le stock virtuel

C’est le cas « stock virtuel incorrect après une réception ». Sur une commande fournisseur de 10 déjà reçue à 4, nous avons créé une deuxième réception de 3, sans la valider :

Physique Virtuel
Après la 1re réception (4) validée 24 30
2e réception (3) créée, en brouillon 24 27
2e réception validée 27 30

L’infobulle indiquait « déjà reçu : 7 » alors que 4 seulement étaient entrés en stock. La raison, dans le code : pour une commande déjà reçue en partie, Dolibarr compte toutes les lignes de réception, brouillons compris. Sur la toute première réception (commande pas encore reçue en partie), le brouillon n’a rien changé. Remède : validez la réception, ou supprimez le brouillon.

5. La règle a changé alors que des commandes étaient en cours

Avec la règle « sur validation des commandes clients », une commande de 2 validée a fait passer le stock de 5 à 3. Nous avons ensuite basculé sur la règle « sur validation des expéditions » : le stock virtuel est tombé à 1, puis l’expédition de cette même commande a retiré 2 de plus. Résultat : 2 stylos sortis deux fois, une fois à la validation de la commande, une fois à l’expédition (les deux mouvements sont dans la liste des mouvements du produit).

Changez de règle quand plus aucune commande n’est en cours, ou corrigez ensuite le stock. Un inventaire le fait proprement (voir plus bas : c’est ce que nous avons fait).

6. Les kits

Avec les kits activés (configuration du module Produits : « Activer les kits (ensemble de plusieurs produits) »), nous avons créé un kit contenant 2 boîtes d’agrafes, puis validé une commande d’un kit. Le stock virtuel des agrafes n’a pas bougé (10 sur 10) : par défaut, les commandes d’un kit ne comptent pas pour ses composants. C’est le « stock virtuel produit fils non décrémenté sur commande » du forum.

Une option sans case à cocher le change : dans Configuration › Divers, ajoutez la constante PRODUCT_STATS_WITH_PARENT_PROD_IF_INCDEC avec la valeur 1. Le stock virtuel des agrafes est alors passé à 8. D’après le code, cette option ajoute aussi les documents du kit aux statistiques du composant (onglet Objets référents).

À l’expédition du kit, ce sont les composants qui sortent du stock (agrafes : 108) ; le kit lui-même n’a pas de stock propre, et son stock virtuel peut s’afficher en négatif.

L’inventaire intégré, pas à pas

Menu Produits › Stocks › Inventaires. Le module Stock suffit, il n’y a rien à installer.

  1. Nouvel inventaire : une Réf., un Libellé, l’Entrepôt (ou un seul produit, ou des produits par catégorie), puis Créer.
  2. Valider (Start) (le libellé n’est pas traduit dans l’interface française) : Dolibarr remplit la liste avec les produits qui ont déjà du stock enregistré dans l’entrepôt. La colonne Qté attendue est le stock physique actuel.
  3. Saisissez la Quantité réelle comptée, puis Enregistrer. Ce bouton enregistre seulement les quantités : aucun mouvement de stock n’est créé à ce stade.
    • champ vide : le produit n’est pas touché (dans notre test, le carnet laissé vide a gardé son stock) ;
    • 0 : le stock est remis à zéro ;
    • Remplir la quantité réelle avec la quantité prévue recopie la quantité attendue partout : pratique, mais un produit oublié sera alors confirmé tel quel.
  4. Générer les mouvements et fermer, puis Oui. Dolibarr crée un mouvement par écart, nommé « Inventaire INV-2026-10 » (code INV- suivi de la référence), et l’inventaire passe à Clôturé.

Saisir le stock initial

Un produit qui n’a jamais eu de stock dans l’entrepôt n’apparaît pas à l’étape 2. Ajoutez-le avec la ligne du haut du tableau : entrepôt, produit, quantité, Ajouter. Nous avons ainsi saisi 15 classeurs : à la clôture, un mouvement de +15. Pour un seul produit, Corriger le stock sur l’onglet Stock de sa fiche fait la même chose.

Le même inventaire a corrigé l’erreur de la raison 5 : Dolibarr croyait avoir 1 stylo, nous en avons compté 3, le mouvement de +2 a remis le stock juste.

Le piège : les ventes pendant l’inventaire

À la clôture, Dolibarr ne rejoue pas l’écart constaté au comptage : il fixe le stock à la quantité comptée. Le mouvement vaut « quantité réelle − stock au moment de la clôture ».

Dans notre test, 8 boîtes d’agrafes comptées et enregistrées, puis une boîte vendue et expédiée avant la clôture (stock : 7). À la clôture, Dolibarr a créé un mouvement de +1 et le stock est revenu à 8 : la boîte vendue est réapparue. L’aide de la colonne Qté attendue le dit d’ailleurs : continuer à faire des mouvements pendant l’inventaire n’est pas recommandé.

Comptez, saisissez et clôturez sans expédier ni réceptionner entre-temps, ou inventoriez par entrepôt ou par catégorie pour que chaque inventaire reste court.

En 24.0.2, le bouton de clôture affiche une erreur

Dans Dolibarr 24.0.2, cliquer sur Générer les mouvements et fermer enregistre bien les quantités saisies, puis affiche une page blanche avec ce message :

Access to this page this way (POST method or GET with a sensible value for 'action' parameter) is refused by CSRF protection in main.inc.php. Token not provided.

L’inventaire n’est pas clôturé et aucun mouvement n’est créé. La cause : la redirection faite par ce bouton n’envoie pas le jeton de sécurité, que Dolibarr exige par défaut depuis la version 24.0. Le correctif est dans la branche 24.0 de Dolibarr depuis le 10/10/2026, mais pas dans la 24.0.2, la dernière version publiée au 14/10/2026.

Le contournement que nous avons testé :

  1. Enregistrer les quantités ;
  2. ouvrir le bouton Générer les mouvements et fermer dans un nouvel onglet (clic du milieu, ou clic droit › ouvrir dans un nouvel onglet) : le lien contient, lui, le jeton ;
  3. dans ce nouvel onglet, confirmer par Oui.

L’inventaire est alors clôturé et les mouvements créés normalement. Ne modifiez pas $dolibarr_nocsrfcheck ni le niveau de protection pour contourner l’erreur.

Avec les lots et les dates de péremption

Si vous suivez des numéros de lot ou de série (module Numéros de Lot/Série, avec DLC et DMD/DLUO), l’inventaire se fait lot par lot : une colonne Lot/Série s’ajoute au tableau.

En résumé

  • Stock virtuel « figé » : vérifiez qu’une règle de stock est cochée.
  • Stock virtuel trop bas : une commande validée jamais soldée, ou une réception en brouillon.
  • Stock virtuel trop haut : une commande fournisseur passée mais jamais reçue en entier.
  • Composants d’un kit : constante PRODUCT_STATS_WITH_PARENT_PROD_IF_INCDEC.
  • Stock physique faux : un changement de règle en cours de route, ou des ventes pendant un inventaire. Un inventaire bien clôturé le remet d’aplomb.

Avant de changer de règle de stock ou de lancer un gros inventaire, faites une sauvegarde : Sauvegarder et restaurer Dolibarr.

Si votre stock reste incompréhensible malgré tout, le diagnostic à 90 € consiste à regarder votre instance avec vous pendant une heure, puis à vous remettre par écrit ce qui fausse le calcul et ce que coûterait la correction.

Dolibarrstockstock virtuelstock physiqueinventaireentrepôtexpéditionréceptioncommande fournisseurkit