Aller au contenu principal

Permissions

Matrice RBAC avec 143 permissions granulaires sur 7 rôles.

Sommaire

Vue d'ensemble

HeartCo utilise un système de contrôle d'accès basé sur les rôles (RBAC) défini dans un fichier unique qui sert de source de vérité.

Fichier : src/lib/permissions/matrix.ts

Hiérarchie des rôles

ADMIN (0) ─── Accès total
  │
DIRECTION (1) ─── Lecture étendue, validation
  │
MANAGER (2) ─── Gestion opérationnelle
  │
HR (3) / ACCOUNTANT (3) ─── Fonctions spécialisées
  │
COLLABORATOR (4) ─── Accès limité (ses données)
  │
CLIENT (99) ─── Portail uniquement (0 permission)

HR et ACCOUNTANT sont au même niveau hiérarchique mais avec des jeux de permissions différents.

Matrice complète par catégorie

Facturation (9 permissions)

PermissionADMINDIRECTIONMANAGERHRACCOUNTANTCOLLAB
facturation:read✅✅✅—✅—
facturation:read_own✅✅✅—✅✅
facturation:create✅—✅———
facturation:edit✅—✅———
facturation:delete✅—————
facturation:send✅—✅———
facturation:mark_paid✅✅✅—✅—
facturation:export✅✅——✅—
facturation:void✅—————

Devis (6 permissions)

PermissionADMINDIRECTIONMANAGERHRACCOUNTANTCOLLAB
devis:read✅✅✅———
devis:create✅—✅———
devis:edit✅—✅———
devis:delete✅—————
devis:send✅—✅———
devis:convert_to_invoice✅—✅———

Comptabilité (3 permissions)

PermissionADMINDIRECTIONMANAGERHRACCOUNTANTCOLLAB
comptabilite:read✅✅——✅—
comptabilite:export_fec✅———✅—
comptabilite:reconcile✅———✅—

Clients (5 permissions)

PermissionADMINDIRECTIONMANAGERHRACCOUNTANTCOLLAB
clients:read✅✅✅——✅
clients:create✅—✅———
clients:edit✅—✅———
clients:delete✅—————
clients:export✅✅————

CRM (5 permissions)

PermissionADMINDIRECTIONMANAGERHRACCOUNTANTCOLLAB
crm:read✅✅✅——✅
crm:create✅—✅———
crm:edit✅—✅———
crm:delete✅—————
crm:assign✅—✅———

Notes de frais (6 permissions)

PermissionADMINDIRECTIONMANAGERHRACCOUNTANTCOLLAB
notes_frais:read_own✅✅✅✅✅✅
notes_frais:read_all✅✅✅—✅—
notes_frais:create✅✅✅✅—✅
notes_frais:edit_own✅✅✅✅—✅
notes_frais:approve✅✅✅———
notes_frais:export✅✅——✅—

Projets (4 permissions)

PermissionADMINDIRECTIONMANAGERHRACCOUNTANTCOLLAB
project:read✅✅✅——✅
project:create✅—✅———
project:edit✅—✅———
project:delete✅—————

Bons de travail (4 permissions)

PermissionADMINDIRECTIONMANAGERHRACCOUNTANTCOLLAB
workorder:read✅✅✅——✅
workorder:create✅—✅———
workorder:edit✅—✅———
workorder:delete✅—————

Rapports terrain (6 permissions)

PermissionADMINDIRECTIONMANAGERHRACCOUNTANTCOLLAB
rapports:read_own✅✅✅——✅
rapports:read_all✅✅✅———
rapports:create✅—✅——✅
rapports:edit_own✅—✅——✅
rapports:finalize✅—✅———
rapports:sign✅✅————

RH (6 permissions)

PermissionADMINDIRECTIONMANAGERHRACCOUNTANTCOLLAB
rh:read_own✅✅✅✅—✅
rh:read_all✅✅—✅——
rh:manage_leaves✅——✅——
rh:manage_payslips✅——✅——
rh:manage_profiles✅——✅——
rh:export_dsn✅——✅——

Membres (4 permissions)

PermissionADMINDIRECTIONMANAGERHRACCOUNTANTCOLLAB
membres:read✅✅✅✅——
membres:invite✅—✅———
membres:edit_roles✅—————
membres:deactivate✅—————

Feuilles de temps (4 permissions)

PermissionADMINDIRECTIONMANAGERHRACCOUNTANTCOLLAB
timesheets:read_own✅✅✅✅—✅
timesheets:read_all✅✅✅✅——
timesheets:create✅✅✅✅—✅
timesheets:approve✅✅✅✅——

Settings (6 permissions)

PermissionADMINDIRECTIONMANAGERHRACCOUNTANTCOLLAB
settings:read✅✅✅———
settings:edit_org✅—————
settings:edit_billing✅—————
settings:manage_webhooks✅—————
settings:view_audit_log✅✅————
settings:manage_permissions✅—————

Marketing (3 permissions)

PermissionADMINDIRECTIONMANAGERHRACCOUNTANTCOLLAB
marketing:read✅✅✅———
marketing:create✅—✅———
marketing:send_campaigns✅—————

E-facturation (2 permissions)

PermissionADMINDIRECTIONMANAGERHRACCOUNTANTCOLLAB
e_invoicing:read✅✅——✅—
e_invoicing:submit✅—————

IA & Copilote (3 permissions)

PermissionADMINDIRECTIONMANAGERHRACCOUNTANTCOLLAB
ia:use_basic✅✅✅✅✅✅
ia:use_advanced✅✅✅———
ia:view_insights✅✅————

Automatisations (2 permissions)

PermissionADMINDIRECTIONMANAGERHRACCOUNTANTCOLLAB
automation:read✅✅✅———
automation:manage✅—————

Stock (3 permissions)

PermissionADMINDIRECTIONMANAGERHRACCOUNTANTCOLLAB
stock:read✅✅✅———
stock:write✅—✅———
stock:export✅✅————

Analytics (2 permissions)

PermissionADMINDIRECTIONMANAGERHRACCOUNTANTCOLLAB
analytics:read_own✅✅✅——✅
analytics:read_org✅✅————

Superadmin (1 permission)

PermissionADMINDIRECTIONMANAGERHRACCOUNTANTCOLLAB
superadmin:access——————

superadmin:access n'est attribuée à aucun rôle par défaut. Elle est réservée à l'administration plateforme.

Résumé par rôle

RôleNombre de permissions
ADMIN~60+ (toutes sauf superadmin)
DIRECTION~26 (lecture étendue + validation)
MANAGER~36 (CRUD opérationnel)
HR~14 (RH, temps, congés)
ACCOUNTANT~13 (comptabilité, exports)
COLLABORATOR~12 (ses propres données)
CLIENT0 (portail uniquement)

Fonctions utilitaires

import {
  hasPermission,
  hasAnyPermission,
  hasAllPermissions,
  getRolePermissions,
  isRoleAtLeast,
  canManageRole,
} from "~/lib/permissions/matrix";
 
// Vérifier une permission
hasPermission("MANAGER", "facturation:create"); // true
hasPermission("COLLABORATOR", "facturation:create"); // false
 
// Vérifier au moins une permission parmi plusieurs
hasAnyPermission("MANAGER", ["facturation:read", "devis:read"]); // true
 
// Vérifier la hiérarchie
isRoleAtLeast("MANAGER", "COLLABORATOR"); // true (2 ≤ 4)
isRoleAtLeast("COLLABORATOR", "MANAGER"); // false (4 > 2)
 
// Vérifier si un rôle peut gérer un autre
canManageRole("ADMIN", "MANAGER"); // true
canManageRole("MANAGER", "ADMIN"); // false

Utilisation dans les routers tRPC

Permission unique

export const facturationRouter = createTRPCRouter({
  create: requirePermission("facturation:create")
    .input(schema)
    .mutation(async ({ ctx, input }) => {
      // Seuls ADMIN et MANAGER arrivent ici
    }),
});

Plusieurs permissions (au moins une)

export const analyticsRouter = createTRPCRouter({
  overview: requireAnyPermission(["analytics:read_own", "analytics:read_org"])
    .query(async ({ ctx }) => {
      // ADMIN, DIRECTION, MANAGER ou COLLABORATOR
    }),
});

Ajouter une nouvelle permission

1. Définir la permission

Dans src/lib/permissions/matrix.ts, ajouter la chaîne au type Permission et dans la matrice de chaque rôle :

// Type Permission — ajouter la nouvelle entrée
type Permission = ... | "mon_module:read" | "mon_module:create" | "mon_module:edit" | "mon_module:delete";
 
// Matrice ADMIN — ajouter les permissions
ADMIN: [..., "mon_module:read", "mon_module:create", "mon_module:edit", "mon_module:delete"],
MANAGER: [..., "mon_module:read", "mon_module:create", "mon_module:edit"],
// etc.

2. Utiliser dans le router

requirePermission("mon_module:create")

3. (Optionnel) Vérifier côté client

const { data: session } = useSession();
const canCreate = hasPermission(session?.user.role, "mon_module:create");

◀ Modules · Sommaire · Paiements ▶