Le ledger de stock

Inklura tient le stock dans un ledger signé, c'est-à-dire un journal de mouvements dont la somme donne le stock comptable. Ce stock comptable fait autorité et peut devenir négatif. Le stock affiché n'en est que le miroir ramené à zéro : stock affiché = max(0, stock comptable). Cette page décrit le modèle, l'anatomie d'un mouvement, la façon dont le réapprovisionnement lit le stock et les contrôles qui gardent l'ensemble cohérent.

Pour le flux de bout en bout (stock → réapprovisionnement → email fournisseur), voir la vue d'ensemble ; pour chaque action qui écrit le stock, voir les chemins d'écriture.

Deux valeurs, un contrat

Chaque produit suivi porte deux valeurs :

Valeur Rôle Peut être négative ?
Stock comptable Autorité signée : ouverture + Σ réceptions − Σ livraisons ± corrections. Une valeur négative signale une sortie enregistrée avant l'entrée qui la couvre (livraison client confirmée avant la réception fournisseur). Oui
Stock affiché Miroir montré dans les écrans et les listes du back office : max(0, stock comptable). Non

Chaque mouvement physique enregistre dans le ledger le vrai delta signé, même s'il fait passer le stock comptable sous zéro. La réception suivante compense ce négatif au lieu de s'ajouter à un compteur bloqué à 0.

Un mouvement physique (réception, livraison, comptage, mouvement manuel) met à jour le journal et les deux valeurs dans la même opération. Toute modification du stock d'un produit suivi laisse une ligne au journal, et les contrôles quotidiens signalent un éventuel écart.

Pourquoi un stock signé

Dans une activité en flux tendu, le stock physique reste souvent à 0 entre deux réceptions. Un compteur qui refuse de descendre sous zéro perd de l'information à chaque fois : une livraison client de 5 unités enregistrée alors que le compteur vaut 2 ne retire que 2, les 3 autres disparaissent. La réception suivante crée alors du stock fantôme (des unités qui existent dans l'application mais pas sur l'étagère), et le bon fournisseur d'après est sous-dimensionné.

Le stock signé rend ce cas impossible : la livraison de 5 est enregistrée en entier (stock comptable −3), et la réception de 10 amène le stock à 7, pas à 10.

Anatomie d'un mouvement

Chaque mouvement, réel ou prévu, est une ligne du journal des mouvements de stock (écran Mouvements, /manage/ecommerce/inventory/stock-actions) :

Information Rôle
Type Entrée ou sortie. Le journal connaît aussi des types descriptifs (casse, perte, trouvé…) qui n'ont pas d'effet sur le stock comptable
Origine Correction manuelle, livraison client, réception fournisseur, comptage d'inventaire, commande client (sorties prévues), synchronisation de la boutique, stock d'ouverture, système, API. Une réception ou une livraison validée automatiquement garde l'origine réception fournisseur ou livraison client, avec une note qui l'identifie
Statut Prévu (projection, « En attente » à l'écran), appliqué (compté dans le stock comptable, « Terminé » à l'écran) ou annulé
Avant / variation / après Stock comptable réel avant le mouvement, variation signée, stock comptable après. On a toujours variation = après − avant.
Référence L'objet métier d'origine : commande client, livraison, bon fournisseur, comptage…
Date métier La date de l'objet d'origine (livraison prévue ou réelle d'un bon fournisseur, date de livraison d'une commande client), distincte de la date de saisie du mouvement

Seuls les mouvements appliqués comptent : le stock comptable est la somme des variations des entrées et sorties appliquées du produit. Les mouvements prévus sont des projections (l'entrée attendue d'un bon fournisseur envoyé, la sortie attendue d'une commande client) : ils ne touchent ni le stock comptable ni le stock affiché.

Cycle de vie et annulation

stateDiagram-v2
    [*] --> PREVU : projection créée (bon envoyé, commande client)
    PREVU --> APPLIQUE : confirmé au mouvement physique
    PREVU --> ANNULE : source annulée ou recalculée (sans effet stock)
    APPLIQUE --> [*] : suppression avec inversion exacte
    ANNULE --> [*]
    note right of APPLIQUE
        Seul état qui modifie le stock.
        Avant et après sont recalculés
        sur le stock comptable réel.
    end note
  • Prévu → appliqué : au moment de la confirmation, les quantités sont recalculées à partir du stock comptable courant. Les valeurs de la projection ne sont jamais reprises telles quelles.
  • Prévu → annulé : aucun effet sur le stock. C'est le sort normal d'une projection dont la source est annulée ou recalculée.
  • Un mouvement appliqué n'est jamais annulé en silence. Le supprimer retire exactement sa variation du stock comptable, puis recalcule le stock affiché à partir du résultat. Cela reste juste même pour un mouvement qui a fait passer le stock sous zéro.

Produits suivis et non suivis

Le réglage de gestion du stock d'un produit sépare deux comportements :

Stock géré Stock non géré
Mouvements de stock Enregistrés, avec leur ligne au journal Aucun : le stock reste à 0
Lecture par le réapprovisionnement Stock comptable, avec les garde-fous ci-dessous 0 : le bon couvre toute la demande client
Projections (mouvements prévus) Oui Jamais, sauf pour un produit générique

Un produit non suivi n'a pas de vérité de stock : le réapprovisionnement le traite comme une demande pleine. Seule exception aux projections : un produit générique, qui porte les lignes des bons fournisseurs, reçoit les entrées prévues de ces bons même sans gestion du stock.

Comment le réapprovisionnement lit le stock

Le moteur de commandes fournisseurs ne déduit pas aveuglément le chiffre affiché. Il décide combien d'unités en stock peuvent réellement couvrir la demande :

flowchart TD
    A[Produit] --> C{Stock géré ?}
    C -->|non| Z0["retient 0"]
    C -->|oui| D{"Fournisseur en flux tendu<br/>et stock non validé ?"}
    D -->|oui| Z0
    D -->|non| H["valeur = max(0, stock comptable)"]
    H --> J["− livraisons client promises<br/>pas encore enregistrées"]
    J --> K["+ colis en route réservés<br/>à aucun client"]
    K --> L["retient max(0, résultat)"]

Les garde-fous, un par un :

  • Stock non géré ⇒ 0. Un produit non suivi n'apporte aucune couverture.
  • Flux tendu ⇒ 0. Un fournisseur qui ne tient pas de stock n'a pas de rayon réel ; son stock est traité comme nul, sauf si vous l'avez validé en le comptant ou en le saisissant vous-même.
  • Stock négatif ⇒ 0. Un stock comptable négatif signale une entrée qui n'a jamais été enregistrée, pas un besoin à venir : il est toujours ramené à 0 pour le calcul et n'augmente jamais le prochain bon. Ce comportement n'est pas un réglage.
  • Sorties dues. Les livraisons client déjà promises qu'aucun prochain créneau fournisseur ne peut servir (parties sans être enregistrées, ou prévues avant la prochaine arrivée) sont retirées du stock disponible : ces unités ne sont plus libres.
  • Entrées en route. Les unités déjà commandées qu'aucune commande client ne réclame (le reste d'un conditionnement entier, par exemple) comptent comme du stock pour le créneau suivant.

Le résultat ne descend jamais sous 0.

Le stock fantôme, à relire

Un stock positif qui paraît trop élevé par rapport à la consommation récente n'est pas plafonné par le calcul : il est déduit tel quel. Il est en revanche signalé sur l'écran Écarts de stock (/manage/ecommerce/vendors/orders/phantom-stock ; les liens qui y mènent depuis Commandes fournisseurs et Sorties sans entrée s'intitulent encore « Stock fantôme ») lorsqu'il couvre plus de 8 semaines de consommation (mesurée sur les 8 dernières semaines), ou lorsque le produit n'a eu aucune sortie sur cette période. Recomptez-le, corrigez-le, ou confirmez qu'il est juste : un stock que vous avez compté, saisi vous-même ou validé sort de cette liste.

Les contrôles de cohérence

Inklura vérifie chaque jour que le ledger reste cohérent. Les principaux contrôles :

Contrôle Ce qu'il détecte
Aucun stock affiché négatif Un miroir qui aurait échappé à la règle max(0, …)
Aucun stock non nul sur un produit non géré Une écriture sur un produit non suivi
Aucune projection d'entrée périmée Une réception prévue dont le bon est annulé, ou envoyé et largement dépassé. Un brouillon en attente de relecture est un état normal.
Aucune projection orpheline Un mouvement prévu qui pointe vers un bon fournisseur supprimé
Stock affiché = max(0, somme des mouvements appliqués) Toute modification du stock affiché sans ligne au journal
Stock comptable = somme des mouvements appliqués Un écart sur la valeur que le réapprovisionnement lit réellement
Aucune livraison enregistrée avec une variation nulle Une livraison dont la consommation aurait été perdue

Le stock des déclinaisons qui gèrent leur propre stock est tenu à part, avec ses propres mouvements ; les contrôles ci-dessus et le réapprovisionnement portent sur le stock du produit. Détail des contrôles et des rattrapages : Filets de sécurité.

Exemple : une livraison avant la réception

Le scénario type du flux tendu : une livraison client part avant que la réception qui la couvre soit enregistrée. Suivez les deux valeurs.

Le produit est suivi (stock géré).

Stock comptable Stock affiché
2 2 (= max(0, 2))

La somme des mouvements appliqués vaut +2 (le stock d'ouverture). Tous les contrôles sont au vert.

Vous confirmez la livraison (ou la validation automatique la rattrape plus tard). Le mouvement enregistré :

avant     = 2     (stock comptable réel)
variation = −5    (le vrai delta, sans écrêtage)
après     = −3    (stock comptable signé)
affiché   = max(0, −3) = 0
Stock comptable Stock affiché
−3 0

Le −3 signifie que 3 unités livrées attendent encore leur réception. Un compteur bloqué à zéro n'aurait retiré que 2 unités, et 3 unités de consommation auraient disparu.

Le réapprovisionnement ramène le −3 à 0 : le stock retenu vaut 0 et la demande client non couverte suffit à alimenter le bon fournisseur. Rien n'est perdu, et rien n'est commandé en double pour une livraison déjà partie.

Le bon fournisseur arrive et vous confirmez la réception :

avant     = −3
variation = +10
après     = 7
affiché   = max(0, 7) = 7
Stock comptable Stock affiché
7 7

La réception compense le −3 au lieu de s'ajouter à un compteur bloqué à 0, qui aurait donné 10, soit 3 unités fantômes.

Somme des mouvements appliqués = +2 − 5 + 10 = 7 = stock comptable. Stock affiché = 7 = max(0, 7). Aucune livraison à variation nulle. Chaque unité physique est comptée ; le prochain bon fournisseur part d'un chiffre réel.

Voir aussi