Lot 2, séquence L2-5 — Ventes et expéditions
03/10/2026. Mise en œuvre de la séquence L2-5 du plan d’exécution du Lot 2. Règles : RG-080 à RG-083, RG-156, AV1-03. Écart : EC-121 (lectures provisoires) et EC-122 (RG-304 et RG-305 non implémentées).
- La vente est l’engagement, l’expédition est le mouvement. Valider une vente ne bouge aucun stock ; valider une expédition débite les lots (mouvement de nature
expedition, crédit du compte technique du même nom, invariant I1). Il n’y a pas de nature de lot « vente ». - Une vente sans contrat est « spot ». Avec contrat, il doit être de vente, actif, du même client, avec une ligne pour le produit ; sa tolérance s’ajoute à la quantité engagée.
- Figée dès sa validation : seuls changent son statut et sa validation. Elle ne s’annule plus quand une de ses expéditions est validée.
- Un lot validé seulement (RG-081) : un lot en attente, rejeté, annulé, consommé ou en quarantaine n’est pas affectable. Le contrôle se refait sous verrou à la validation : un lot mis en quarantaine entre la préparation et la validation ne sort pas (I5).
- On ne vend pas mieux que ce que l’on détient (RG-156, SR-21) : le référentiel revendiqué est satisfait par tous les lots, c’est-à-dire que chacun porte, pour ce référentiel, un état revendicable (
lot_qualite). Un lot sans qualité pour ce référentiel est refusé : aucune qualité n’est déduite. - Un PV de nettoyage valable est exigé : celui du véhicule chargé, signé, tous points contrôlés, daté au plus tard le jour de l’expédition.
Base de données
Section intitulée « Base de données »Migration lot2_l5_ventes_expeditions (une seule, via app.installer_table, COMMENT ON en français) : vehicule, pv_nettoyage_vehicule (ajout seul), vente, expedition, expedition_ligne (ajout seul), vue vente_solde (engagé, expédié, reste : calculés), cinq variables vente.* au dictionnaire. Les refus portent un code stable dans le DETAIL : lot_non_affectable, produit_different, stock_insuffisant, quantite_depasse_engagement, pv_nettoyage_invalide, vente_non_validee, vente_figee, vente_avec_expedition, expedition_figee, expedition_sans_ligne… Test : sh db/tests/lancer.sh l2-5.
Module ventes (packages/domain, fonctions pures, entiers) : peutVendre (RG-081, RG-156), soldeVente (plafond = engagé + tolérance), transitionVente, verdictChaine (AV1-03 : la chaîne ne revendique que si chaque maillon le peut ; la raison retenue suit l’ordre de déclaration des raisons de refus). certification.ecartsDePortee accepte désormais produits et unites (portée d’un lot) et rend ecarts_elements. Vecteurs VT-VENT-001 à 021 et VT-CERT-053 à 056.
Neuf routes (contrat d’API 1.24.0, ajouts) : GET /v1/ventes, GET /v1/ventes/{id}, POST /v1/ventes, POST /v1/ventes/{id}/valider (sales.manage), POST /v1/vehicules, POST /v1/vehicules/{id}/pv-nettoyage, POST /v1/expeditions, POST /v1/expeditions/{id}/valider (shipping.manage), GET /v1/expeditions/{id} (fiche : expédition, vente, véhicule, PV, chaîne). Module commercialisation. Ensembles par défaut : « commercial » reçoit sales.manage, « magasinier » shipping.manage, l’administrateur client les deux.
Validation d’une expédition (une transaction)
Section intitulée « Validation d’une expédition (une transaction) »- Lots relus sous verrou : statut, stock, produit, RG-156.
- Chaîne de certificats (AV1-03), à la date de l’expédition : pour chaque lot, remontée des mouvements de création jusqu’aux lots racines (CTE récursive) ; chaque racine est reliée à sa réception (producteur : statut de conformité et certificats du groupement ; fournisseur : ses certificats) ; l’opérateur est un maillon (son certificat). Chaque maillon est jugé par
certification.peutRevendiquer, la chaîne parventes.verdictChaine. - Un maillon qui ne peut pas revendiquer bloque toujours (D6) :
chaine_certificat_refusee, avec la raison (certificat_expire…) et les maillons ; un constatAV1-03(issue « bloquer ») est conservé. - Portée du certificat de l’opérateur (produit vendu, producteurs remontés) : hors portée, le mode du réglage
vente.certificat_modedécide, « bloquer » par défaut (D6) ; en « signaler », un constat et la validation continue. Réglage écrit parPUT /v1/reglages/vente.certificat_mode({ "mode": "bloquer" | "signaler" }). - Point d’accroche
vente.avant_expedition: cinq variables (vente.produit,vente.quantite_expediee_g,vente.nombre_lots,vente.nombre_maillons_non_couverts,vente.nombre_ecarts_portee) ; seule l’issue « bloquer » refuse (expedition_bloquee), les autres restent des constats. Aucune règle de pack n’est livrée. - Mouvement
expedition, lot passé àconsommequand son solde tombe à zéro, expédition validée, vente soldée quand tout ce qui était engagé est parti.
Hors périmètre (EC-121, EC-122)
Section intitulée « Hors périmètre (EC-121, EC-122) »Aucun document produit (bordereau, PV imprimé, facture, fiche COI : données seulement, document.avant_emission non câblé) ; aucune facturation ni statut de règlement ; pas de numéro officiel de vente ni d’expédition ; RG-304 et RG-305 non implémentées (aucun texte dans les sources) ; aucun écran (recette navigateur reportée à L2-8).