Aller au contenu

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.ecartsDePortee conclut, 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ôle CHECK), 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.perimetre est 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).

  • GET /v1/certificats : chaque certificat porte sa portee, 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.

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