Procurations et organisations complexes
Procurations et organisations complexes
Cette page explique comment une organisation agit pour le compte d'une autre grâce à une procuration : quels droits obtient une personne quand elle bascule, ce qu'elle voit dans l'espace personnel et qui reçoit les emails. Tout est illustré sur une organisation fictive, avec deux simulateurs. Elle complète Calcul des droits d'accès, Rôles et autorisations et Notifications et emails.
PROCURATION est actif sur la boutique principale de l'organisation. Sans ce flag, une procuration reste une simple relation « peut agir pour » : elle vaut délégation Admin et ne change pas les destinataires des emails. Mi-octobre 2026, le flag est actif en recette sur Agorastore et inactif en production.L'essentiel
| Notion | Définition |
|---|---|
| Organisation mandante | Organisation qui donne la procuration : une autre organisation peut agir pour elle |
| Organisation délégataire | Organisation qui reçoit la procuration et agit pour la mandante |
| Droits délégués | Admin (tous les droits de la mandante, dans la limite de ceux du délégataire) ou une sélection de rôles métier |
| Mode de notification | Partage : la mandante et le délégataire reçoivent les emails. Transfert : seul le délégataire les reçoit |
| Organisation active | Organisation pour laquelle la personne agit dans sa session, choisie avec « Changer d'organisation » |
- Chacun agit d'abord pour son organisation. Ses droits sont ceux ouverts par les contrats de son organisation, limités par son profil : Admin, rôles métier ou accès personnalisés.
- Pour agir pour une autre organisation, on bascule. « Changer d'organisation » propose son organisation, ses organisations descendantes et les organisations qui ont donné une procuration à la sienne. Rien d'autre.
- Une procuration relie une mandante à un délégataire. Elle porte des droits délégués et un mode de notification.
- Après bascule, on n'obtient jamais plus que chez soi. Les droits sont l'intersection du profil de la personne, des contrats des deux organisations et des droits délégués.
- Les rôles délégués choisissent aussi les emails. Ils décident quels emails de la mandante arrivent chez le délégataire. Chaque personne reste ensuite filtrée par ses propres préférences.
L'organisation d'exemple : la Métropole de Valbrune
La Métropole vend ses biens réformés. Deux services possèdent des biens à vendre : le Parc auto et les Espaces verts. Trois services transverses font le travail pour eux : le Pôle Enchères prépare et publie les ventes, la Régie des retraits gère l'après-vente, la Trésorerie suit la facturation. Tous sont des organisations enfants de la Métropole, sur la même boutique, et héritent de son contrat vendeur.
flowchart TD
mere["Métropole de Valbrune"] --> parc["Parc auto"]
mere --> verts["Espaces verts"]
mere --> ench["Pôle Enchères"]
mere --> regie["Régie des retraits"]
mere --> treso["Trésorerie"]
| Mandante | Délégataire | Droits délégués | Mode | En pratique |
|---|---|---|---|---|
| Parc auto | Pôle Enchères | Fiches produits + Ventes | Partage | Le Pôle prépare et publie les lots du Parc ; les deux reçoivent les emails de mise en vente |
| Espaces verts | Pôle Enchères | Admin | Transfert | Le Pôle gère tout pour les Espaces verts ; les emails vendeur ne vont plus qu'au Pôle |
| Parc auto | Régie des retraits | Post-vente | Transfert | La Régie gère l'après-vente du Parc ; elle reçoit seule la confirmation de paiement |
| Espaces verts | Régie des retraits | Post-vente | Partage | La Régie gère aussi l'après-vente des Espaces verts, qui restent informés |
| Parc auto | Trésorerie | Finance | Partage | La Trésorerie suit les factures et les rétributions du Parc |
| Espaces verts | Trésorerie | Finance | Partage | Idem pour les Espaces verts |
| Personne | Organisation | Profil | Peut basculer vers |
|---|---|---|---|
| Claire Morel, DGS | Métropole de Valbrune | Admin | Les cinq services (organisations descendantes) |
| Hugo Bastien, chef du parc | Parc auto | Admin | Son organisation uniquement |
| Inès Ferrand | Parc auto | Fiches produits | Son organisation uniquement |
| Léa Fontaine | Espaces verts | Fiches produits | Son organisation uniquement |
| Sofia Lemaire | Pôle Enchères | Fiches produits + Ventes | Parc auto, Espaces verts |
| Théo Garnier | Pôle Enchères | Fiches produits | Parc auto, Espaces verts |
| Nadia Benali | Pôle Enchères | Organisation | Parc auto, Espaces verts |
| Malik Ouali | Régie des retraits | Post-vente | Parc auto, Espaces verts |
| Julie Perrin | Régie des retraits | Personnalisé : assigner les lots | Parc auto, Espaces verts |
| Paul Renaud | Trésorerie | Finance | Parc auto, Espaces verts |
Qui peut faire quoi
Les droits d'une personne se calculent en trois couches. Chacune ne peut que retirer des accès, jamais en ajouter.
Les contrats de l'organisation
Ce qu'une organisation peut faire vient de ses contrats actifs, plus ceux de ses organisations parentes lorsqu'ils sont transférés aux organisations filles (voir Héritage entre organisations d'un même groupe). Une organisation sans contrat vendeur ne peut pas publier de lot, quel que soit le profil de ses membres.
Le profil de la personne
| Profil | Réglage | Accès obtenus |
|---|---|---|
| Admin de l'organisation | Aucun rôle métier, aucun accès personnalisé | Tous les accès des contrats de l'organisation |
| Rôles métier | Un ou plusieurs rôles (Fiches produits, Ventes, Post-vente, Finance, Organisation, Achats) | L'union des accès de ses rôles, dans la limite des contrats |
| Personnalisé | Accès cochés un à un sur la fiche | Exactement les accès cochés ; ce mode prime sur les rôles |
La liste exacte des accès de chaque rôle est dans Rôles et autorisations.
Le contexte : pour qui la personne agit
| Contexte | Exemple | Calcul |
|---|---|---|
| Son organisation | Inès dans le Parc auto | Profil ∩ contrats du Parc auto |
| Une organisation descendante | Claire bascule dans le Parc auto | Profil ∩ contrats de la Métropole ∩ contrats du Parc auto ; aucun filtre de rôle |
| Une organisation mandante | Sofia bascule dans le Parc auto | Profil ∩ contrats des deux organisations ∩ accès des rôles délégués ; une délégation Admin ne filtre rien de plus |
Accès après bascule = accès du profil de la personne
∩ accès des contrats de son organisation (et des parents en transfert)
∩ accès des contrats de l'organisation active (et des parents en transfert)
∩ accès des rôles délégués (sauf délégation Admin et organisation descendante)
Sofia (Pôle Enchères, Fiches produits + Ventes) bascule dans le Parc auto
Procuration du Parc auto : Fiches produits + Ventes
→ 8 accès : fiches produit (créer, modifier, supprimer), séances, événements,
publication, retrait de la vente, assignation, factures de vente
Nadia (Pôle Enchères, rôle Organisation) bascule dans le Parc auto
Procuration du Parc auto : Fiches produits + Ventes
→ aucun accès : ses accès (adresses, utilisateurs, documents…) ne font pas partie des rôles délégués
Nadia bascule dans les Espaces verts
Procuration des Espaces verts : Admin
→ ses 7 accès Organisation, sans filtre supplémentaire
Claire (Métropole, Admin) bascule dans la Trésorerie
Organisation descendante : pas de procuration, aucun filtre de rôle
→ tous les accès ouverts par les contrats des deux organisations
- persons
src/helpers/retrieveSessionAccessRights.js:retrieveSessionAccessRights(person, activeOrganisationShortId, roles)appelleoperatesInOwnOrganisationouoperatesInOtherOrganisation(intersection shop par shop), puisrestrictToProcurationRoles. Aucun filtre si l'organisation de la personne figure parmi les ancêtres de l'organisation active ; sinonfilterRightsByRolessur les rôles de la procuration,ADMINlaissant tout passer. - Profil :
getRestrictivePersonAccess(même fichier) retientaccessKeys[organisationShortId]s'il existe, même vide, sinon les accès desmeta.businessRoless'ils sont non vides, sinonnull(admin de l'organisation). Les fronts testentaccessKeys[org]?.length, d'où l'affichage Admin d'un profil personnalisé vide. - Rôles → accès :
BusinessRolesdans access-managersrc/constants/accessKeys.js. - Flag :
isProcurationModelEnabled(personssrc/helpers/procurationsHelper.js) lit le flagPROCURATIONde la boutiquemeta.mainShopShortIdde l'organisation. Sans flag,retrieveHeldProcurationslit l'ancienne colonneorganisations.procurationset traite chaque procuration commeADMIN. - Session (réponse
loggeduser) :switchableOrganisations[].procuration = { roles, rights }pour les mandantes (absent pour les descendantes),descendantOrganisations,activeOrganisationShortId. Le changement d'organisation est contrôlé parassertProcurationAllowed: organisation propre, descendante ou mandante, non bloquée.
Simulateur de bascule
Choisissez une personne, puis cliquez sur une organisation dans son sélecteur, comme dans l'espace personnel. Le détail du calcul et les accès obtenus s'affichent à droite.
Cliquez une organisation pour basculer, comme avec « Changer d’organisation ».
- Profil de Sofia : Rôles métierAccès des rôles Fiches produits + Ventes
- Contrats de Pôle EnchèresContrat vendeur hérité de la Métropole : ne retire rien dans cet exemple
- Contrats de Parc autoMême contrat hérité : ne retire rien dans cet exemple
- Procuration Fiches produits + VentesLes rôles délégués couvrent déjà tous ses accès
Sofia dans Parc auto : 8 accès
Exemples d’effets visibles
- Formulaire de fiche produit (disponible)
- Bascule de publication (disponible)
- Factures de vente (disponible)
- Invitation et gestion des utilisateurs (indisponible)
- Documents de l’organisation (indisponible)
- Carnet d’adresses (indisponible)
- Formulaire d’enchère (indisponible)
Hypothèse : toutes les organisations ont le même contrat vendeur, hérité de la Métropole. La couche « contrats » ne retire donc rien dans cet exemple.
Configurer une procuration
Les procurations se gèrent depuis la fiche organisation de l'admin, section « Hiérarchie ». Une matrice affiche, pour chaque organisation de la hiérarchie, la relation avec l'organisation courante : aucune, donne à, reçoit de ou réciproque. Ses colonnes « Peut agir pour » et « Agit pour nous » séparent les procurations détenues de celles accordées.
Quand le flag est actif, chaque case ouvre une fenêtre « Nouvelle procuration : délégataire agit pour mandante » :
| Champ | Choix |
|---|---|
| Droits délégués | Admin (« Tous les droits de mandante ») ou Rôles métier (« Uniquement les rôles choisis ») |
| Rôles délégués | Au moins un rôle parmi Fiches produits, Ventes, Post-vente, Finance, Organisation et Achats |
| Emails et notifications | Partage (« mandante et délégataire reçoivent les emails ») ou Transfert (« Seule délégataire reçoit les emails ») |
| Action | Règle |
|---|---|
| Créer, modifier, retirer | Droit de gérer l'organisation (ORGANISATION.ORGANISATION.MANAGE) sur la boutique et appartenance à la mandante, ou profil admin ; la modification s'enregistre avec le formulaire de la section |
| Réglage par défaut | Une procuration ajoutée sans autre réglage est créée en Admin et Partage |
| Hors hiérarchie | Les procurations avec des organisations absentes de la hiérarchie affichée restent modifiables dans la rubrique « Hors de cette hiérarchie » |
| Unicité | Une seule procuration par couple mandante–délégataire ; une organisation ne peut pas se donner procuration à elle-même |
| Effet immédiat | Les sessions des personnes du délégataire sont recalculées. Si la procuration disparaît pendant qu'une personne agit pour la mandante, sa session revient sur sa propre organisation |
| Statut des organisations | Seules les organisations validées ou à valider comptent ; une organisation bloquée ne peut pas être activée |
L'assistant d'onboarding d'organisation de l'espace personnel propose aussi cette matrice, limitée aux relations : il ne règle ni les droits délégués ni le mode, et une procuration ajoutée par ce biais est créée en Admin et Partage.
- admin-front :
components/entities/organisations/procurations/OrganisationProcurationEditor.vue, réglage par défautDEFAULT_ORGANISATION_PROCURATION_GRANT(entities/organisations/procurations/constants.ts) ; le flag est lu parprocurationModelEnabled(entities/organisations/detail/loader.ts). - api : routes
GET/POST /procurationsetPUT/DELETE /procurations/:procurationShortId(src/controllers/procurations/), gardeassertCanManageGranter, recalcul des sessions parhelpers/refreshProcurationSessions. - persons : table
procurations(granterOrganisationShortId,granteeOrganisationShortId,roles,mode), erreursSAME_ORGANISATIONetPROCURATION_ALREADY_EXISTS;add-procurations/remove-procurationsécrivent dans la table quand le flag est actif (réglage par défautDEFAULT_GRANT).
Ce que voit l'espace personnel
Le sélecteur « Changer d'organisation »
- Il est affiché en haut du menu avec le nom de l'organisation active ; il n'est cliquable que si la personne a au moins deux organisations possibles.
- Il contient son organisation, ses organisations descendantes et ses organisations mandantes, présentées en arbre selon la hiérarchie, triées par nom, avec une recherche.
- N'y figurent pas les organisations bloquées, archivées ou supprimées (seuls les statuts « validée » et « à valider » comptent), ni les organisations internes déclarées sur la boutique.
- Rien ne distingue visuellement une organisation obtenue par procuration d'une organisation descendante.
Après la bascule
- L'espace s'affiche au nom de l'organisation choisie ; les menus et les boutons suivent les accès calculés pour ce contexte.
- Les listes de lots et de brouillons couvrent l'organisation active et ses organisations descendantes ; la liste des factures couvre l'organisation active seule.
- Quand l'organisation active fait partie d'une hiérarchie (parent ou enfants), la liste des brouillons affiche une colonne « Propriétaire ».
- À la création d'un brouillon en libre-service, la personne choisit l'organisation pour laquelle elle dépose ; choisir une organisation mandante bascule la session dessus avant la création (voir Workflow item).
Sans bascule
La lecture ne passe pas par les procurations. Sans bascule, l'espace ne montre que les objets dont l'organisation de la personne, ou une de ses organisations descendantes, est vendeuse, propriétaire, opératrice ou créatrice. Pour travailler sur le catalogue du Parc auto, Sofia bascule. Seule exception : le référentiel de marques et de modèles propre à une organisation mandante reste consultable par le délégataire.
- customer-front :
components/layout/OrganisationSwitcher.vue, arbrebuildOrganisationSwitchTree(entities/organisation/utils.ts), donnéesuserStore.switchableOrganisations. persons :retrieveSessionOrganisationLists(procurations et descendantes valides, hors organisations de la boutique). - Lecture api :
enforceItemOrganisationFilters(organisation de session et descendantes, sursellers,owners,operators,creators),prepareInvoiceSearch(organisation de session seule),assertDraftAccess(rôlesSELLER,OWNER,OPERATOR,CREATOR, viaisOrgMember). Exception :manufacturersetmodelsacceptenthasProcurationFrom. - Écriture api :
canPerformOnResource→ access-managercanPerformActionOnResource. L'objet doit être lié à une organisation avec un rôle autorisé (brouillons et lots :OWNERouSELLER; création de brouillon :OWNER). Si cette organisation est « membre » (propre, active ou descendante), l'accès de session suffit ; sinon la procuration doit couvrir l'accès (hasProcuration), et seulement hors bascule (isSwitched()).
Les notifications
Quand un événement concerne une organisation (une publication soumise, un paiement confirmé…), l'email part en trois étapes.
- Quelles organisations ? L'organisation concernée, plus chaque délégataire dont les rôles délégués couvrent cet email. Une procuration Post-vente couvre « Paiement de l'acheteur confirmé », pas « Publication soumise ».
- Partage ou transfert ? Si au moins une procuration concernée est en Transfert, l'organisation concernée ne reçoit plus cet email. Filet de sécurité : si aucun délégataire n'a de destinataire, l'email revient à l'organisation concernée.
- Quelles personnes ? Dans chaque organisation retenue, chaque personne est filtrée par ses préférences d'emails et par son statut (les comptes bloqués sont exclus). Pour les emails de vérification KYB, seules les personnes qui peuvent gérer les documents de leur organisation sont retenues. Une même adresse ne reçoit l'email qu'une fois.
| Mode | Qui reçoit | Exemple |
|---|---|---|
| Partage | La mandante et le délégataire | Parc auto ✓ · Pôle Enchères ✓ |
| Transfert | Le délégataire seul ; le transfert l'emporte même si d'autres délégataires sont en partage | Espaces verts ✗ · Pôle Enchères ✓ |
| Repli | Transfert sans aucun destinataire chez le délégataire : la mandante reçoit l'email | Espaces verts ✓ · Pôle Enchères ∅ |
Seuls les rôles Fiches produits, Ventes, Post-vente et Finance transmettent des emails par procuration. Une délégation Admin les transmet tous. Les rôles Organisation et Achats ne transmettent aucun email.
| Rôles concernés | Particularité | |
|---|---|---|
Publication soumise (self-submitted) | Fiches produits | |
Publication refusée (self-refused) | Fiches produits | |
Modification de la publication demandée (self-requestModify) | Fiches produits | |
Nouvelle question reçue (question-submitted-seller-notification) | Fiches produits | |
Aucune enchère sur votre vente (self-noBidsSeller) | Fiches produits, Ventes | |
Invendus remis en vente (resale-unsoldItems) | Fiches produits, Ventes | |
Validation de mise en vente demandée (sale-validation-requested) | Ventes | |
Acceptation de la vente (self-acceptanceSale) | Ventes | |
Vente impayée par l'acheteur (self-unpaidSeller) | Ventes | |
Vérification KYB : authentification requise (seller-kyb-sca-required) | Organisation, Ventes, Finance | Réservé aux personnes qui peuvent gérer les documents |
Paiement de l'acheteur confirmé (self-confirmPaidSeller) | Post-vente, Finance | Envoyé aussi aux organisations opératrices de la facture |
Relevé de facturation disponible (self-invoiceSlip) | Finance | |
Confirmation de votre rétribution (self-confirmRetribution) | Finance | |
Versement de votre rétribution confirmé (full-confirmRetribution) | Finance |
Les mêmes listes servent à pré-régler les préférences d'une personne : quand on lui attribue des rôles métier ou qu'on les change, les emails désactivables étrangers à ses rôles sont exclus de ses préférences. Ces préférences se modifient ensuite depuis le back-office. Repasser une personne en Admin ne réinitialise pas ses préférences.
- persons
GET /persons?organisationShortId=X&include=procurationsrenvoie{ persons, procurations: [{ granteeOrganisationShortId, granteeName, mode, notifications }], operatorNotifications };personsinclut les personnes des délégataires. notifications: templates deNOTIFICATION_PRESETS_BY_ROLE(src/helpers/getRolePresetNotificationOptOuts.js) pour les rôles de la procuration limités àPROCURATION_NOTIFIED_ROLES(src/helpers/retrieveNotificationProcurations.js). Vide si le flag de la mandante est inactif ; seuls les délégataires validés ou à valider sont retenus.- backend-utils
resolveNotificationRecipients(≥ 1.0.97) : groupesPRINCIPAL,PRINCIPAL_FALLBACK,PROCURATION,OPERATOR, optionsincludeBlockedetrequireDocumentManage, dédoublonnage par email. - Envoi : jobs
resources/emailSender.js(sendUserNotifications), apihelpers/getNotificationRecipientPersons.js(self-submitted,seller-kyb-sca-required), commentshelpers/commentNotification.js(question d'un acheteur). - Diagnostic : log
NOTIFICATION_RECIPIENTS_RESOLVED(organisation, raison, mode, nombre de destinataires par groupe). - Presets : recalculés à la mise à jour d'une personne seulement si
meta.businessRoleschange et reste non vide (personssrc/controllers/persons/index.js).
Simulateur d'emails
Choisissez l'organisation concernée par l'événement et l'email : le simulateur indique qui le reçoit, et pourquoi. Dans la configuration de la boutique Agorastore en recette, tous les emails proposés sont désactivables.
Procurations données
- Pôle EnchèresFiches produitsVentesPartagenon concernée
- Régie des retraitsPost-venteTransfertconcernée par cet email
- TrésorerieFinancePartageconcernée par cet email
Cet email part aussi vers les organisations opératrices de la facture, qui ne figurent pas dans cet exemple.
- ✗Hugo Bastien · organisation court-circuitée par le transfert
- ✗Inès Ferrand · organisation court-circuitée par le transfert
- ✓Malik Ouali · mail prévu par ses rôles
- ✓Julie Perrin · sans rôle métier : préférences complètes
- ✓Paul Renaud · mail prévu par ses rôles
3 destinataires · envoyé par le service jobs
Trois cas à retenir :
- Le transfert l'emporte. « Paiement de l'acheteur confirmé » pour le Parc auto : la Régie des retraits est en Transfert et la Trésorerie en Partage. Le Parc auto ne reçoit rien ; Malik, Julie et Paul reçoivent.
- Le rôle ne suffit pas. « Vérification KYB : authentification requise » pour le Parc auto : le Pôle Enchères est concerné grâce au rôle Ventes, mais seule Nadia peut gérer les documents. Sofia et Théo ne reçoivent rien.
- Les préférences restent individuelles. « Validation de mise en vente demandée » pour le Parc auto : au Pôle Enchères, Sofia (Ventes) reçoit l'email, Théo (Fiches produits seul) non.
Cas particuliers et limites
| Sujet | Ce qui se passe |
|---|---|
Flag PROCURATION inactif | Les procurations existantes valent délégation Admin ; aucun email n'est routé par procuration |
| Même boutique | Les procurations sont établies entre organisations d'une même boutique |
Coordonnées bancaires d'une filiale à valider (parent-bank-info-to-validate) | L'email figure dans les rôles Ventes et Finance, mais il est encore envoyé à la seule organisation concernée |
Décision du vendeur requise (full-sellerDecision) | L'email ne figure dans aucun rôle : aucun délégataire ne le reçoit |
| Emails KYB (validé, refusé, à modifier, IBAN modifié…) | Ils relèvent du rôle Organisation, qui ne transmet pas d'emails par procuration |
| Organisations opératrices d'une facture | « Paiement de l'acheteur confirmé » leur est aussi envoyé, avec ou sans procuration et indépendamment du flag |
| Profil Personnalisé vide | Aucun accès, mais affiché Admin ou Rôles dans les écrans d'accès |
| Libellés des rôles | La description du rôle Fiches produits mentionne la publication et l'assignation, qui relèvent des rôles Ventes et Post-vente |
Références techniques
| Sujet | Service | Où regarder |
|---|---|---|
| Calcul des droits de session | persons | src/helpers/retrieveSessionAccessRights.js |
| Organisations proposées, statuts valides, flag | persons | src/helpers/procurationsHelper.js |
| Table des procurations | persons | src/controllers/procurations/ |
| Presets d'emails par rôle | persons | src/helpers/getRolePresetNotificationOptOuts.js |
| Emails transmis par procuration | persons | src/helpers/retrieveNotificationProcurations.js |
| Rôles métier → accès | access-manager | src/constants/accessKeys.js (BusinessRoles) |
| Contrôles d'appartenance et de procuration | access-manager | src/AccessRights.js (isOrgMember, canPerformActionOnResource, hasProcurationFrom) |
| Routes procurations, recalcul des sessions | api | src/controllers/procurations/, src/helpers/refreshProcurationSessions.js |
| Résolution des destinataires | backend-utils | src/persons/resolveNotificationRecipients.js |
| Envoi des emails vendeur | jobs, api, comments | src/resources/emailSender.js, src/helpers/getNotificationRecipientPersons.js, src/helpers/commentNotification.js |
| Éditeur de procurations | tars admin-front | components/entities/organisations/procurations/ |
| Sélecteur d'organisation | tars customer-front | components/layout/OrganisationSwitcher.vue |
Jira : US RA20-6565 (procurations à rôles) et RA20-6566 (emails par rôle), rattachées à RA20-6507.