Lot 1 bis — Portée du certificat
02/10/2026. Séquence L1-1+2 du plan d’alignement, partie B, d’après la note d’amendement (AM-07). Décisions appliquées : EC-024 ; écarts ouverts : EC-102 (catégories de produits) et EC-103 (ce que la note laisse ouvert). Suite de la partie A.
- Une portée par certificat. Elle dit ce que l’organisme certifie : activités, produits, sites, unités. Elle remplace le périmètre JSON libre, que personne ne lisait.
- Une ligne par élément, incluse ou exclue. Les clés étrangères sont réelles et la table est en ajout seul. Une exclusion expresse l’emporte sur une inclusion.
- L’écart de portée se calcule dans le domaine. La base fournit les faits ;
certification.ecartsDePorteeconclut, comme pour le verdict de revendication. Aucune fonction SQL du même nom. - Signaler, pas bloquer. L’écart s’affiche sur l’écran Certificats ; il ne bloque aucune action.
Migration db/migrations/20261003110000_lot1bis_certificat_portee.sql :
app.certificat_portee:certificat_id,dimension(activite,produit,site,unite), une seule colonne d’élément renseignée selon la dimension (contrôleCHECK),inclus,cree_par. Un élément n’est déclaré qu’une fois par certificat. Clés composites avec l’organisation : un élément d’une autre organisation est refusé ;certificat.perimetreest supprimée. La migration refuse de s’appliquer si la colonne porte une donnée (aucune ligne de la démonstration ne la renseignait) ;- la table n’est pas synchronisée vers le téléphone (EC-103, point 6).
certification.ecartsDePortee({ activites, certificats, date }), fonction pure :
| Cas | Résultat |
|---|---|
| Activité listée et incluse par un certificat en vigueur | Couverte |
| Activité absente de toutes les portées | Écart activite_hors_portee |
| Activité exclue expressément, sans autre certificat qui la couvre | Écart activite_exclue |
| Activité listée, mais son site est absent de la liste ou exclu | Écart site_hors_portee |
| Certificat sans aucune ligne | Portée non renseignée : aucun écart, certificat listé dans sans_portee |
| Aucun certificat en vigueur à la date | Aucun écart (le verdict de revendication dit certificat_absent) |
Un certificat expiré, suspendu, retiré ou pas commencé n’est jamais considéré. Vecteurs : testdata/domain/certification/ecartsDePortee/ (VT-CERT-041 à 052).
API et écran (contrat 1.14.0)
Section intitulée « API et écran (contrat 1.14.0) »GET /v1/certificats: chaque certificat porte saportee, avec le libellé de chaque élément. Vide : portée non renseignée.GET /v1/conformite/portee?date=: pour chaque référentiel coché et actif, les écarts de portée (activité, site, raison), le nombre de certificats en vigueur et les certificats sans portée renseignée. Route rattachée au module Membres et foncier avec les autres routes de conformité.- Création d’un fournisseur avec son certificat : la portée est un tableau facultatif de lignes (
LignePortee), écrit dans la même transaction. - Écran Certificats : colonne « Portée » (une exclusion porte le mot « exclu », jamais la couleur seule) et bandeau « Écart de portée » en
--terre-texte, sans vert ni couleur de statut réservée.
Démonstration
Section intitulée « Démonstration »Le certificat UE couvre la collecte, le stockage et l’exportation, sur les deux sites, pour l’ananas frais. Il ne couvre pas le conditionnement et l’étiquetage, que l’exportateur déclare : c’est l’écart de portée volontaire de la démonstration. Le certificat NOP, expiré, ne couvre que la collecte.
| Test | Ce qu’il vérifie |
|---|---|
db/tests/l1bis-2.sql |
Une seule colonne d’élément par dimension, élément en double refusé, ajout seul, éléments d’une autre organisation refusés, isolation, périmètre supprimé |
| VT-CERT-041 à 052 | Les cas du tableau ci-dessus, plus l’exclusion contre l’inclusion, un second certificat et le tri des écarts |
apps/api/test/back-office.test.ts (AM-07) |
Portée non renseignée, écart, libellés et exclusion, date sans certificat en vigueur, date invalide |
testdata/demo/togo-ananas/coherence.test.mjs |
L’écart volontaire de la démonstration est bien le seul |