La plupart des outils traitent le devis comme un PDF. On l'écrit, on l'envoie, on l'oublie. Si le client dit oui, on ressaisit les éléments importants dans un autre système. S'il dit non, on supprime le PDF.
Cette déconnexion entre l'outil de devis et l'outil d'exécution est de loin la transmission la plus coûteuse dans la distribution. L'équipe commerciale clôture dans un système, l'équipe d'entrepôt prépare dans un autre, et l'écart entre les deux est comblé par des e-mails, des messages Slack et des Post-it. Rien ne reste synchronisé parce que rien n'a été conçu pour l'être.
Des états qui ont du sens Le système de devis de Quotery repose sur un enum de statuts : brouillon → envoyé → clôturé → partiellement_livré → livré, avec des branches d'annulation depuis brouillon / envoyé / clôturé. Chaque transition est un service call qui impose des invariants.
La machine à états du devis n'est pas cosmétique. brouillon signifie que rien n'est réservé et que rien n'est visible pour le client. envoyé signifie que le client a accès au devis via son lien de portail client. clôturé signifie que le client a accepté et que le stock est désormais réservé. partiellement_livré signifie qu'au moins un bon de livraison a été enregistré contre ce devis. livré signifie que chaque ligne a été entièrement expédiée. Chaque état limite des actions précises — on ne peut pas livrer depuis brouillon, on ne peut pas annuler depuis livré, et on ne peut pas modifier les prix sur un devis clôturé.
Clôturer réserve le stock Au moment où vous clôturez un devis, Quotery réserve le stock sur chaque ligne. S'il n'y en a pas assez, la réponse vous indique exactement quels produits manquent — le devis se clôture quand même. L'équipe commerciale reçoit des informations, pas des frictions.
C'est la décision de conception délibérée que nous détaillons dans l'article sur la sur-réservation. L'opération de clôture ne se solde jamais par un échec pour cause de disponibilité. Elle réserve ce qui est disponible, signale ce qui manque, et laisse l'équipe commerciale décider. Certains poursuivront quand même — le stock entrant arrive mardi et le client n'a pas besoin de la livraison avant vendredi. D'autres appelleront le client et ajusteront les quantités. Le rôle de l'outil est d'éclairer la décision, pas de la prendre à la place.
Annuler est une transaction Annuler un devis clôturé écrit des lignes RELEASE au grand livre pour défaire la réservation. Annuler un devis partiellement livré est refusé — on enregistre à la place une note de retour. Les règles sont encodées, pas mémorisées.
Chaque transition d'état est une transaction de base de données unique. Le changement de statut, les écritures au grand livre et les mises à jour de cache sont tous validés ensemble, ou tous annulés ensemble. Il n'existe pas d'état partiel. Il n'existe pas de scénario où « le statut indique clôturé mais le stock n'a pas été réservé ». Si la base de données tombe en plein milieu de la transaction, tout se déroule à rebours et l'appelant réessaie. L'atomicité n'est pas une option — c'est la seule façon honnête de construire une machine à états qui déplace de l'argent et des produits.
