Organisations et unités métier
L'écran Organisations et unités métier permet de construire la hiérarchie du tenant : les organisations, les unités
métier qui leur appartiennent (avec une unité parente facultative), leur statut et leur description. Chaque changement
est versionné et audité. Chemin dans le portail : /admin/organizations. Il sert aux administrateurs du tenant
(tenant_admin) ; les autres membres du tenant le lisent.
Ce que montre l'écran
Deux tableaux, l'un sous l'autre.
Organisations, avec Actualiser et Nouvelle organisation (affiché à tenant_admin seulement) :
| Colonne | Contenu |
|---|---|
| Slug | Identifiant de l'organisation. |
| Nom | Nom affiché. |
| Description | Texte libre (2000 caractères au plus). |
| Statut | active ou archived. |
| Version | Numéro de version, incrémenté à chaque changement. |
| Modifié par | Auteur du dernier changement. |
| Mis à jour | Date du dernier changement. |
Unités métier, avec les filtres Organisation et Unité parente (identifiants) et le bouton Filtrer, puis
Actualiser et Nouvelle unité métier (affiché à tenant_admin seulement) :
| Colonne | Contenu |
|---|---|
| Slug | Identifiant de l'unité. |
| Nom | Nom affiché. |
| Organisation | Identifiant de l'organisation de l'unité. |
| Unité parente | Identifiant de l'unité parente, vide pour une unité de premier niveau. |
| Statut | active ou archived. |
| Version | Numéro de version. |
| Mis à jour | Date du dernier changement. |
Un clic sur une ligne ouvre un panneau latéral avec la ligne elle-même (il n'y a pas de route de détail). Les deux listes sont paginées par slug. États vides : Aucune organisation et Aucune unité métier.
Actions
| Bouton ou action | Ce qu'il fait | Appel d'API | Rôles |
|---|---|---|---|
| Ouverture de l'écran, Actualiser | Lit les organisations. | GET /v1/organizations | Membre du tenant |
| Nouvelle organisation puis Créer | Formulaire Slug (obligatoire), Nom (obligatoire), Description, Métadonnées (JSON, {} par défaut). | POST /v1/organizations | tenant_admin |
| Modifier (organisation) | Boîte de dialogue Nom, Description, Statut (active, archived), Version attendue, puis Modifier. | PATCH /v1/organizations/{id} | tenant_admin |
| Organisation, Unité parente puis Filtrer | Restreint les unités métier à une organisation ou à une unité parente. | GET /v1/business-units | Membre du tenant |
| Nouvelle unité métier puis Créer | Formulaire Organisation (obligatoire, suggérée parmi les organisations), Unité parente (suggérée parmi les unités), Slug (obligatoire), Nom (obligatoire), Description, Métadonnées (JSON). | POST /v1/business-units (suggestions : GET /v1/organizations, GET /v1/business-units) | tenant_admin |
| Modifier (unité métier) | Même boîte de dialogue que pour une organisation. | PATCH /v1/business-units/{id} | tenant_admin |
| Clic sur une ligne | Affiche la ligne dans un panneau latéral. | aucun | Membre du tenant |
Version attendue protège contre les changements concurrents : quand elle est remplie et diffère de la version
courante, le serveur refuse le changement avec version_conflict.
Rôles
D'après services/control-plane/src/eai/domains/tenancy/hierarchy.py : les listes exigent un principal rattaché à un
tenant (require_tenant) ; la création et les changements exigent tenant_admin (platform_admin passe toujours). Le
portail masque les boutons de création aux autres rôles (create.roles: ["tenant_admin"]) mais affiche Modifier à
tous ; le serveur le refuse avec forbidden.
Tâches courantes
Créer une organisation et ses unités métier
- Créer l'organisation. Bouton Nouvelle organisation : Slug (
retail), Nom, Description, puis Créer. Résultat attendu : le message Créé et une ligne en version 1. En cas d'échec :conflict(HTTP 409) si le slug existe ;invalid_metadata(HTTP 422) si les métadonnées sont refusées. - Créer une unité de premier niveau. Bouton Nouvelle unité métier : choisissez l'Organisation, laissez
Unité parente vide, saisissez Slug et Nom, puis Créer. Résultat attendu : une nouvelle ligne dont
l'Unité parente est vide. En cas d'échec :
not_foundsi l'identifiant d'organisation est inconnu. - Créer une unité enfant. Même formulaire avec Unité parente sur l'unité créée ci-dessus. Résultat attendu :
une ligne avec son parent. En cas d'échec :
invalid_hierarchy(HTTP 422) si le parent appartient à une autre organisation.
Archiver une organisation sans perdre un changement concurrent
- Lire la version courante. Regardez la colonne Version de la ligne. Résultat attendu : un nombre, par exemple
3. En cas d'échec : cliquez Actualiser. - Modifier avec la version attendue. Menu de la ligne > Modifier, mettez Statut à
archivedet Version attendue à3, puis Modifier. Résultat attendu : le message Terminé, statutarchived, version4. En cas d'échec :version_conflict(HTTP 409) signifie qu'une autre personne l'a modifiée entre-temps ; rechargez et recommencez.
Lister les unités d'une organisation
- Filtrer. Collez l'identifiant de l'organisation dans Organisation et cliquez Filtrer. Résultat attendu :
seules les unités de cette organisation. En cas d'échec :
not_foundsi l'identifiant n'est pas valide.
Dépannage
| Symptôme | Cause | Correction |
|---|---|---|
| Pas de bouton Nouvelle organisation | Vos rôles ne contiennent pas tenant_admin. | Adressez-vous à un administrateur du tenant. |
forbidden (HTTP 403) sur Modifier | Seul tenant_admin modifie la hiérarchie. | Adressez-vous à un administrateur du tenant. |
version_conflict (HTTP 409) | Version attendue diffère de la version courante. | Actualisez, lisez la nouvelle version, appliquez de nouveau votre changement. |
invalid_hierarchy (HTTP 422) | L'unité parente appartient à une autre organisation. | Choisissez un parent de la même organisation. |
invalid_metadata (HTTP 422) | Les métadonnées violent une contrainte de la base. | Corrigez le JSON de Métadonnées. |
conflict (HTTP 409) sur Créer | Le slug existe déjà. | Choisissez un autre slug. |