Lot 0 bis, séquence L0-2 — Activités et modules
02/10/2026. Mise en œuvre de la séquence L0-2 du plan d’alignement, d’après la note d’amendement (AM-04, AM-05, AM-06). Décision : EC-094 ; écart ouvert : EC-095.
- L’opérateur déclare ses activités ; BioTrace en déduit les modules à proposer. La direction décide : une proposition n’active rien.
- Monolithe modulaire : toutes les tables restent déployées pour tous. Un module s’active par organisation, avec date, auteur et motif, en ajout seul.
- La base garde l’autorité sur les dépendances, par un déclencheur ; le domaine (
modules) donne la même réponse avant l’écriture. - Les gardes de l’API et des commandes, les menus et les permissions par module sont livrés en L0-3. Depuis L0-3,
collectedépend aussi demembres_foncier(EC-095).
Migration db/migrations/20261002100000_lot0bis_l02_activites_modules.sql.
| Table | Portée | Rôle |
|---|---|---|
app.activite |
Globale | Catalogue fermé des types d’activité, sur trois niveaux. Premier niveau seulement : les 13 activités de la note, rangées dans les cinq regroupements du cahier §2.2. Les types de niveaux 2 et 3 sont arrivés en L1-4, provisoires (EC-108) |
app.module |
Globale | 11 modules, dont le noyau, toujours actif |
app.module_dependance |
Globale | sci → membres_foncier, paiements → collecte : les seules dépendances écrites dans la note (EC-095) |
app.module_activite |
Globale | Activités qui proposent chaque module, d’après le tableau de la note |
app.organisation_module |
Organisation, ajout seul | Activations et désactivations : état, motif, auteur, horodatage |
app.organisation_activite |
Organisation, ajout seul | Activités déclarées, pour toute l’organisation ou pour un site. noeud vaut le code de l’activité en L0-2 ; il portera le chemin d’un nœud du pack en L1-4 |
app.module_en_vigueur, app.activite_en_vigueur |
Vues | État courant : la ligne la plus récente |
app.pack.type |
Colonne | filiere (par défaut) ou referentiel (AM-06) |
Les catalogues ne s’écrivent que par migration : biotrace_app n’y a ni INSERT ni UPDATE. Les historiques n’acceptent aucun UPDATE ni DELETE.
Même code dans la base (DETAIL de l’erreur), dans le domaine et dans l’API (409, sauf mention).
| Refus | Code |
|---|---|
| Activer ou désactiver le noyau | module_toujours_actif |
| Activer un module dont un module requis est inactif | dependance_inactive (details.modules) |
| Désactiver un module dont dépend un module actif | module_requis (details.modules) |
| Demander l’état courant (un module jamais activé est inactif) | etat_inchange |
| Module inconnu | module_inconnu (404) |
| Déclarer un nœud qui n’est pas une activité de premier niveau | noeud_non_pris_en_charge (base) ; activite_inconnue (API, 404) |
Deux changements simultanés dans la même organisation sont sérialisés par un verrou consultatif : ils ne peuvent pas contourner une dépendance.
Domaine : modules
Section intitulée « Domaine : modules »etatModules(catalogue, historique, instant): modules actifs à un instant, le noyau compris.verifierChangement(catalogue, actifs, code, etat): les refus ci-dessus, avant l’écriture.modulesProposes(catalogue, actifs, activitesActives): modules suggérés par les activités déclarées et pas encore actifs.
API (contrat 1.10.0)
Section intitulée « API (contrat 1.10.0) »| Route | Droit | Rend |
|---|---|---|
GET /v1/activites |
membre actif | Les 13 activités, leur état pour l’organisation, le dernier changement, les sites où elles sont déclarées à part |
POST /v1/activites/{code}/etat |
modules.manage |
L’activité après le changement (etat, motif, site_id facultatif) |
GET /v1/modules |
membre actif | Les modules, leur état, leurs dépendances, les activités qui les proposent, l’indicateur « proposé » |
POST /v1/modules/{code}/etat |
modules.manage |
Le module après le changement (etat, motif) |
Droit modules.manage (EC-094) : nouveau, donné par défaut aux ensembles direction et administrateur_client.
Jeu de démonstration
Section intitulée « Jeu de démonstration »L’exportateur d’ananas déclare collecte_membres, stockage, conditionnement_etiquetage et exportation, et active membres_foncier, collecte et sci (activites.json, modules.json). L’organisation de démonstration n’a pas d’ensemble de permissions en base : il n’y a rien à y ajouter.
| Test | Ce qu’il vérifie |
|---|---|
db/tests/l0bis-2.sql |
Catalogues (13 activités, 5 regroupements), écriture interdite aux catalogues, les quatre refus, ajout seul, état par site, site d’une autre organisation refusé, journal, RLS entre deux organisations, type de pack |
SB-01, SB-13, db/verifier-rls.sh |
Les quatre tables globales rejoignent la liste des tables sans RLS |
| VT-MOD-001 à 015 | verifierChangement, etatModules, modulesProposes |
apps/api/test/activation.test.ts |
Déclaration, propositions, refus de dépendance, désactivation bloquée, noyau, droit manquant (403), historique journalisé |