Lot 1 bis — Routes d'écriture et recette automatisée
03/10/2026. Séquence L1-6, étape 2, du plan d’alignement. Écarts : EC-082 à EC-087 (droits, routes livrées pour 085 à 087), EC-112 (ce qui reste ouvert).
Les écrans B3 étaient en lecture. Six routes ajoutent les écritures que les scénarios SR-L1 exigent, chacune sous le droit de son domaine. Le contrat d’API passe à 1.17.0. La recette est un fichier de test, apps/api/test/recette-l1.test.ts, qui rejoue chaque scénario par HTTP contre la vraie base. Le parcours navigateur n’est pas fait : il est reporté à la recette d’un lot ultérieur.
| Route | Droit | Effet | Refus |
|---|---|---|---|
POST /v1/contrats |
contracts.manage |
Crée un brouillon avec lignes et primes | corps_invalide (400), contrat_refuse (409) |
POST /v1/contrats/{id}/activer |
contracts.manage |
Active un brouillon, rend la fiche | contrat_inconnu (404), activation_refusee (409) |
POST /v1/rendements |
capacity.propose |
Ajoute une version du rendement, avec motif (RG-023) | cible_invalide (400), cible_introuvable (404), rendement_refuse (409) |
POST /v1/capacites |
capacity.propose |
Propose une capacité ; la base calcule (surface mesurée × rendement) | polygone_absent, polygone_invalide, chevauchement_non_leve, producteur_en_controle, rendement_inconnu, campagne_cloturee (409) |
POST /v1/conformite/statuts |
certification.manage |
Ajoute une ligne à l’historique ; toute révision exige un motif (RG-150) | unite_introuvable (404), statut_refuse (409) |
POST /v1/fournisseurs |
certification.manage |
Crée le fournisseur et son certificat en une transaction (EC-053) | fournisseur_refuse (409) |
Les routes de capacité sont rattachées au module Membres et foncier, les autres au noyau. La validation d’une capacité reste sous capacity.approve : l’auteur ne valide pas.
Un refus de la base (contrainte, déclencheur) annule la transaction et devient un code 409 générique, avec le message de la base en détail (refusDeBase). Rien n’est écrit à moitié.
Résultat par scénario
Section intitulée « Résultat par scénario »| Scénario | Règle | Résultat |
|---|---|---|
| SR-L1-01 | AV1-01 | Passé : sans polygone, polygone invalide, sans rendement, cible inconnue |
| SR-L1-02 | AV1-02 | Passé : contrôle ouvert, capacité refusée (producteur_en_controle) |
| SR-L1-03 | RG-004 | Passé : activité déclarée puis retirée avec motif ; 403 sans modules.manage |
| SR-L1-04 | RG-005 | Passé : jeton sans organisation ou d’une organisation inconnue refusé |
| SR-L1-05 | RG-012 | Réserve : seul l’état de départ est vérifié ; le refus à la collecte est du Lot 3 (EC-112) |
| SR-L1-06 | RG-013 | Passé : fournisseur et certificat ensemble, rien en cas de refus |
| SR-L1-07 | RG-015 | Passé pour la route unique : sans certificat, rien n’est créé. Le deuxième point d’entrée (la réception) est du Lot 2 |
| SR-L1-08 | RG-016 | Passé : « en vigueur » puis « expiré » selon la date de lecture ; aucune colonne d’expiration |
| SR-L1-09 | RG-020 | Passé : capacité = surface mesurée × rendement, jamais la surface déclarée ; validée après direction et RSCI |
| SR-L1-10 | RG-023 | Passé : versions 1 et 2 du rendement avec leur motif ; motif vide refusé |
| SR-L1-11 | RG-150 | Passé : révision sans motif refusée, historique conservé, la conversion ne se revendique pas |
Le même fichier couvre la création et l’activation d’un contrat (EC-086).
Ce qui reste
Section intitulée « Ce qui reste »- Parcours navigateur avec
admin.demo: reporté à la recette d’un lot ultérieur. Le critère D6 (démonstration depuis le back-office) n’est donc pas encore atteint. - Campagnes et produits : droits existants, aucune route (EC-112).
- Producteurs et parcelles : posés par la connexion des migrations, faute de gestionnaires de commande (Lot 3).
| Test | Ce qu’il vérifie |
|---|---|
apps/api/test/recette-l1.test.ts |
14 tests, un describe par SR-L1-01 à 11, plus les contrats |
openapi.test.ts |
Concordance du registre et des routes montées |
i18n.test.ts |
Les codes d’erreur ajoutés existent en français et en anglais |