La plupart des systèmes de stock ont un seul nombre qui varie. Quotery dispose d'un mouvement typé pour chaque changement — ainsi « pourquoi ce produit a-t-il diminué de 3 ? » n'est pas un mystère, mais une jointure.
L'approche à nombre unique séduit par sa simplicité. UPDATE stock_item SET quantity = quantity - 3 WHERE sku = 'AB-001'. Une requête, terminé. Mais cette requête ne vous dit rien sur la raison pour laquelle 3 unités ont bougé. Était-ce une vente ? Un retour ? Un ajustement d'entrepôt ? Une correction d'un inventaire erroné du mois dernier ? Le nombre a changé, la raison s'est évaporée. Six mois plus tard, lorsque l'auditeur demande, la réponse est « je ne sais pas — le système dit que nous l'avons expédié. » Le système est exact, mais inutile pour comprendre.
Les six types RESERVE (devis clôturé), RELEASE (devis annulé depuis clôturé), SHIP (bon de livraison validé), RETURN (note de retour validée), RECEIVE (réception de stock validée), ADJUSTMENT (correction manuelle réservée à l'admin). Chaque type a un signe attendu et un document source attendu.
C'est le système de types qui donne au grand livre son pouvoir explicatif. Un mouvement RESERVE signifie quelque chose de différent d'un mouvement SHIP, même s'ils déplacent la même quantité. Le type vous indique l'événement métier qui a causé le mouvement. La FK du document source vous indique exactement quel devis, quelle livraison, quel retour ou quelle réception l'a déclenché. L'horodatage vous indique quand. L'utilisateur qui a initié la transaction vous indique qui. Chaque dimension du « pourquoi » est capturée dans la ligne.
Deltas signés
Un RESERVE écrit on_hand=0, reserved=+N. Un SHIP écrit on_hand=-N, reserved=-N. Le grand livre stocke le delta ; le cache stocke le total courant.
La séparation du delta et du total est ce qui rend le grand livre reconstructible. Chaque ligne est autonome : elle enregistre le changement exact apporté à on_hand et reserved à ce moment-là. Pour calculer l'état à n'importe quel instant, additionnez tous les deltas jusqu'à cet instant. Il n'est pas nécessaire de faire confiance au cache — le cache n'est qu'une vue matérialisée du grand livre, et toute discordance est résolue en resommant, jamais en éditant le grand livre.
Un document source, un mouvement Valider un bon de livraison crée un mouvement SHIP avec l'id du bon de livraison. Annuler un devis clôturé crée un RELEASE avec l'id du devis. La FK n'est optionnelle que pour ADJUSTMENT — et même là, nous exigeons une note non vide.
La note obligatoire sur ADJUSTMENT est la soupape de sécurité. Les corrections manuelles se produisent — les comptages de stock dérivent, les produits sont endommagés, des échantillons sont prélevés pour des tests qualité. Lorsqu'un admin ajuste le stock manuellement, le champ de note capture l'explication humaine : « le comptage physique a trouvé 2 unités de moins que le système — probablement endommagées durant la vague de chaleur de juin. » Cette note est visible dans le grand livre et dans la piste d'audit. Elle ne remplace pas un processus adéquat, mais c'est un enregistrement durable d'un événement exceptionnel.
