Il existe un design séduisant où close_quote renvoie 409 Conflict si une ligne manque de stock. Propre. Sûr. Faux.
L'attrait est évident: ne promettez jamais ce que vous ne pouvez pas livrer. Chaque ligne d'un devis clôturé est adossée à du stock physique. Le système est prudent, l'entrepôt est satisfait, et rien ne passe jamais en négatif. Mais ce design repose sur une hypothèse cachée — que le stock est statique et que l'équipe commerciale ne sait rien que le système ignore. Ces deux hypothèses sont fausses.
Pourquoi c'est une erreur La vente précède la mise à jour de l'entrepôt. Un commercial clôture un devis un vendredi soir; la réception du stock entrant a lieu le mardi. Le devis est légitime, le client paie, l'équipe sait que le produit est en route. Bloquer la clôture impose une danse de replanification qui crée plus de problèmes qu'elle n'en résout.
La conséquence concrète d'un contrôle strict du stock au moment de la clôture est que les équipes commerciales élaborent des contournements. Elles créent des produits « factices » pour absorber la réservation. Elles clôturent le devis dans un environnement de test et envoient le PDF par e-mail. Elles notent la commande sur papier et la saisissent à l'arrivée du stock. Chaque contournement est pire que le problème: il crée du stock fantôme, des engagements non suivis et un système parallèle que le vrai système ne peut pas voir.
La réponse de Quotery
POST /api/quotes/{id}/close/ ne renvoie jamais 409 pour cause de disponibilité. Il fonctionne toujours, réserve ce qui est disponible et renvoie un tableau shortages avec chaque produit sous-approvisionné. Le frontend affiche un bandeau clair; le commercial agit avec des informations, non des erreurs.
Le tableau shortages est la clé. Ce n'est pas seulement un simple indicateur de « stock insuffisant » — c'est une liste structurée des produits exacts qui manquent et de la quantité manquante. Le frontend affiche un bandeau jaune: « 3 produits ont un stock disponible insuffisant. Déficit total: 47 unités auprès de 2 fournisseurs. » Le commercial peut cliquer pour voir chaque produit, sa quantité disponible actuelle, la quantité réservée et l'écart. Il peut alors décider: poursuivre et passer un bon de commande, scinder le devis entre ce qui est disponible maintenant et ce qui est en commande, ou appeler le client et ajuster.
Où nous faisons OUI appliquer
La livraison est différente. Un bon de livraison qui ferait passer on_hand en négatif EST rejeté au moment de la création. Vous pouvez réserver ce qui n'existe pas; vous ne pouvez pas expédier ce qui n'existe pas. C'est là que la contrainte doit se trouver — une étape plus loin, une transition plus avant.
C'est la distinction essentielle. La réservation est une promesse; la livraison est l'exécution. Les promesses peuvent être faites contre du stock futur. L'exécution ne peut avoir lieu que contre du stock physique. En plaçant la contrainte forte à la livraison plutôt qu'au devis, nous donnons de la flexibilité à l'équipe commerciale sans laisser l'entrepôt expédier un produit qu'il ne possède pas. Les deux opérations ont des invariants différents parce qu'elles servent des objectifs différents. Le système applique chacun au bon endroit.
