Aller au contenu

13 — Rôles & permissions

Dans un produit où des closers indépendants se partagent des leads et où de l'argent circule, « qui voit quoi » est une fonctionnalité, pas un réglage technique. Un closer ne doit pas voir le portefeuille de son collègue, ni ses leads.

Les rôles

Quatre rôles sont assignables dans un workspace, plus un rôle interne à la plateforme :

Rôle Qui Portée
Owner (propriétaire) Le créateur du workspace Tout, dans son workspace
Admin Un bras droit Large — gestion de l'équipe et du contenu
Manager Un responsable d'équipe Son équipe : ses closers et leurs opportunités
Closer Un commercial Ses propres opportunités
Staff L'équipe ikloze Interne à la plateforme, non assignable dans un workspace

Le rôle Staff est réservé à l'exploitation de la plateforme : il ne peut pas être attribué à un membre depuis un workspace client.

L'adhésion : le lien membre ↔ workspace

Un utilisateur n'est pas « dans » ikloze : il est membre d'un ou plusieurs workspaces. Son adhésion porte tout ce qui est spécifique à ce workspace :

Élément Rôle
Rôle Owner, Admin, Manager ou Closer
Manager Le responsable hiérarchique du membre — le lien qui structure les équipes
Taux de commission Son taux dans ce workspace
Permissions accordées Droits ajoutés à titre individuel
Permissions refusées Droits retirés à titre individuel

Conséquence produit : une même personne peut être closer à 12 % chez un client et manager à 6 % chez un autre. Les deux contextes ne se mélangent jamais.

Le workspace actif

Un utilisateur multi-workspace travaille dans un workspace à la fois — le workspace actif, indiqué à chaque requête. Ses droits, ses leads et ses statistiques sont ceux de ce workspace-là.

Ce contexte n'est jamais mémorisé côté serveur : il est déterminé à chaque requête. Deux onglets ouverts sur deux workspaces différents fonctionnent donc sans interférence.


Le modèle de permissions

Des droits nommés

Chaque action sensible est adossée à une permission nommée, au format module.action_ressource — par exemple payments.create_payment_link ou withdrawals.review_withdrawal_admin. Le produit en compte une soixantaine, couvrant :

projets · formulaires · leads · opportunités · règles d'affectation · paiements · portefeuilles · retraits · KYC · analytics · membres · groupes · invitations · annonces · missions · réglages de plateforme

Deux permissions couvrent le recrutement sur la marketplace :

Permission Ce qu'elle autorise
announcements.manage_announcement Écrire, publier et clôturer une annonce ; trier les candidatures reçues
missions.propose_mission Proposer, révoquer et terminer une mission ; déposer un avis sur un closer

Comment un droit est résolu

L'utilisateur est-il superutilisateur de la plateforme ?  ──▶ OUI : autorisé
                        │ NON
Est-il propriétaire du workspace actif ?                  ──▶ OUI : autorisé
                        │ NON
Union des permissions de son rôle
   + permissions accordées individuellement
   − permissions refusées individuellement                ──▶ décision

Deux règles structurent ce modèle :

  • Le refus l'emporte. Une permission explicitement retirée à un membre ne peut pas être ré-accordée par son rôle. C'est le mécanisme qui permet de restreindre un individu sans créer un rôle sur mesure.
  • Il n'existe pas de droit joker. Les raccourcis superutilisateur et propriétaire sont des règles du code, pas une permission « tout » stockée quelque part. On ne peut donc pas s'attribuer l'omnipotence par erreur de configuration.

Ajuster un membre sans créer un rôle

Ouvrir les analytics de l'équipe à un closer expérimenté ? On lui accorde cette permission sur son adhésion. Interdire à un admin d'annuler des liens de paiement ? On la lui refuse. Pas besoin de multiplier les rôles.

Ce qui n'est pas une permission de workspace

L'argent d'une personne, son identité, ses moyens de paiement et sa vie sur la marketplace ne passent pas par ce modèle : retirer sa commission, soumettre son KYC, enregistrer un compte Mobile Money, publier son profil closer, postuler à une annonce ou répondre à une proposition de mission ne dépend d'aucun rôle et d'aucun workspace. Un workspace n'a pas de titre à bloquer ce qu'un closer a gagné, ni à contrôler s'il cherche ailleurs. Les permissions d'arbitrage correspondantes restent côté plateforme, suffixées _admin (withdrawals.review_withdrawal_admin, kyc.review_kyc_admin).

C'est une nécessité technique autant qu'un principe : un closer entre deux missions n'est membre d'aucun workspace. Un modèle où tout droit découlerait d'une adhésion lui interdirait purement et simplement de chercher une mission.


Le cloisonnement des données

Au-delà des permissions, le produit applique un cloisonnement par rôle sur ce que chacun voit. Deux personnes ayant le même droit « voir les liens de paiement » ne voient pas le même périmètre.

Rôle Périmètre visible
Owner / Admin Tout le workspace
Manager Ses propres éléments + ceux des closers qu'il supervise
Closer Ses propres éléments uniquement

Ce cloisonnement s'applique aux opportunités, aux liens de paiement, aux statistiques, ainsi qu'aux annonces et aux propositions de mission : un manager cloisonné ne voit que les annonces qu'il a écrites, les candidatures qui s'y rattachent et les missions qu'il a proposées.

Deux exceptions assumées côté marketplace :

  • Terminer une mission active échappe au cloisonnement. Une mission en cours est une relation de tout le workspace ; la réserver à son proposeur laisserait les missions d'un manager parti sans personne pour y mettre fin.
  • Déposer un avis aussi, et pour la même raison : qui peut engager et rompre un contrat peut dire comment il s'est passé.

Le filtrage est appliqué côté serveur

Le périmètre n'est pas masqué dans l'interface : il est appliqué à la requête en base. Un closer qui tenterait d'accéder directement à l'identifiant d'une opportunité qui n'est pas la sienne obtient une réponse « introuvable » — et non « interdit », ce qui l'empêcherait de déduire l'existence de la ressource.

Les statistiques suivent la même logique, via trois permissions distinctes : voir tout le workspace, voir son équipe, voir soi-même.


Le cycle de vie d'un membre

L'invitation

Le propriétaire ou un admin invite par email. L'invité peut avoir un compte ikloze ou non : dans les deux cas il reçoit un lien d'invitation, qu'il accepte pour rejoindre le workspace. L'invitation expire et peut être annulée ou renvoyée.

La vie du membre

Son rôle, son manager, son taux de commission et ses permissions individuelles sont modifiables à tout moment par qui en a le droit. Un membre peut aussi quitter un workspace de lui-même.

Le départ

Quand un membre est retiré, ses opportunités ne sont pas perdues : elles sont réaffectées, et le motif transfer_on_member_removal est inscrit dans l'historique. On sait donc toujours d'où vient un lead réattribué.

Les commissions déjà acquises restent sur son portefeuille : quitter un workspace ne fait pas perdre l'argent gagné.

Si le membre était arrivé par la marketplace, son départ termine automatiquement ses missions en cours — qu'il ait été retiré ou qu'il soit parti de lui-même. Les statuts d'une mission ne peuvent jamais contredire l'appartenance réelle au workspace. Voir 11 — La mission.

La propriété du workspace

La propriété est transférable à un autre membre. C'est une opération sensible : elle déplace le raccourci « propriétaire » — donc l'accès total au workspace. Les deux parties sont notifiées.


En résumé

  • Les droits vivent sur l'adhésion, pas sur l'utilisateur — le multi-workspace est natif.
  • Le refus l'emporte sur l'attribution par rôle.
  • Le cloisonnement est appliqué en base, pas seulement dans l'interface.
  • Aucun droit joker : les bypass sont des règles explicites du code.

Détail technique : Architecture › Permissions (RBAC) et Multi-tenant.