Aller au contenu

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.

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.

  1. Lots relus sous verrou : statut, stock, produit, RG-156.
  2. 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 par ventes.verdictChaine.
  3. Un maillon qui ne peut pas revendiquer bloque toujours (D6) : chaine_certificat_refusee, avec la raison (certificat_expire…) et les maillons ; un constat AV1-03 (issue « bloquer ») est conservé.
  4. Portée du certificat de l’opérateur (produit vendu, producteurs remontés) : hors portée, le mode du réglage vente.certificat_mode décide, « bloquer » par défaut (D6) ; en « signaler », un constat et la validation continue. Réglage écrit par PUT /v1/reglages/vente.certificat_mode ({ "mode": "bloquer" | "signaler" }).
  5. 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.
  6. Mouvement expedition, lot passé à consomme quand son solde tombe à zéro, expédition validée, vente soldée quand tout ce qui était engagé est parti.

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).