Provisioning d'une organisation
Processus de création d'une nouvelle organisation sur la plateforme.
Prérequis
- Permission
organization.manage(rôle plateformeadministrateur) - Un
sluget unshort_codeuniques
1. Validation du slug
Le slug est converti en nom de schéma via tenant_schema_name() : il ne peut contenir que des lettres minuscules, des chiffres et des tirets, et les tirets deviennent des underscores. Le préfixe du schéma est tenant_.
| Slug | Schéma généré | Valide ? |
|---|---|---|
cours-lumiere | tenant_cours_lumiere | ✅ |
acme-corp | tenant_acme_corp | ✅ |
ecole2025 | tenant_ecole2025 | ✅ |
2eme-ecole | tenant_2eme_ecole | ✅ (chiffres autorisés) |
Cours Lumière | — | ❌ (majuscules, espaces, accents) |
cours_lumiere | — | ❌ (underscore non autorisé) |
2. Appel API
POST /api/v1/admin/system/organizations
Authorization: Bearer {admin_token}
Content-Type: application/json
{
"slug": "cours-lumiere",
"short_code": "CL",
"name": "Cours Lumière",
"legal_name": "École Cours Lumière SARL",
"contact_email": "admin@courslumiere.tg",
"contact_phone": "+22890123456",
"card_range_start": 1,
"card_range_end": 99999
}
| Champ | Requis | Description |
|---|---|---|
slug | Oui | Identifiant unique (minuscules, chiffres, tirets) |
short_code | Oui | Code court 2-5 caractères (préfixe des codes publics) |
name | Oui | Nom d'affichage |
legal_name | Non | Raison sociale |
contact_email | Non | Email de contact |
contact_phone | Non | Téléphone |
card_range_start | Non | Début plage de numéros (défaut 1) |
card_range_end | Non | Fin plage de numéros (défaut 99999) |
Pas d'admin N1 automatique
Il n'existe pas de champ admin_email : les utilisateurs de l'organisation (dont le premier gestionnaire) se créent ensuite via POST /admin/org/users.
3. Processus interne
sequenceDiagram
participant API
participant PG
API->>PG: INSERT INTO public.organizations (status: active, currency: XOF)
API->>PG: CREATE SCHEMA tenant_cours_lumiere
API->>PG: Appliquer les migrations tenant (tables, fonctions, vues)
API->>PG: seed_tenant_roles()
Note over PG: 5 rôles système N1 (is_system_role = true)
API->>PG: INSERT roles: gestionnaire, superviseur, caissier, vendeur, porteur
Note over PG: Assignation des permissions par rôle
API->>PG: INSERT role_permissions (...)
Le provisioning :
- Enregistre l'organisation dans
public.organizations(statutactive, deviseXOF, seuil d'anomalie30000). - Crée le schéma
tenant_{slug}et applique les migrations tenant. - Appelle
seed_tenant_roles()pour créer les 5 rôles système et leur assigner leurs permissions par défaut. - Configure la
notification_configpar défaut (email activé, routageanomaly_detected → email).
4. Vérification
-- Schéma créé
SELECT schema_name FROM information_schema.schemata
WHERE schema_name = 'tenant_cours_lumiere';
-- Rôles seedés
SELECT name, is_system_role FROM public.roles
WHERE organization_id = (SELECT id FROM public.organizations WHERE slug = 'cours-lumiere');
Attendu : 5 rôles (gestionnaire, superviseur, caissier, vendeur, porteur).
Rollback
DROP SCHEMA tenant_cours_lumiere CASCADE;
DELETE FROM public.roles
WHERE organization_id = (SELECT id FROM public.organizations WHERE slug = 'cours-lumiere');
DELETE FROM public.organizations WHERE slug = 'cours-lumiere';
danger
Opération irréversible : toutes les données de l'organisation seront perdues.
Configuration post-provisioning
- Sites —
POST /admin/org/sites(horaires et timezone repris de l'organisation) - Catégories —
POST /admin/org/product-categories - Produits —
POST /admin/org/productsou import en lot - Utilisateurs N1 —
POST /admin/org/users, puis assignation de rôles viaPOST /admin/org/users/{id}/roles - Points de vente —
POST /admin/org/points-of-sale - Notifications — ajuster
notification_configviaPUT /admin/org/settings - Seuil d'anomalie —
PUT /admin/system/organizations/{id}(default_anomaly_threshold_cents)