Aller au contenu principal

Permissions

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

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");