Files
btpxpress-frontend/services/permissionService.ts
dahoud a8825a058b Fix: Corriger toutes les erreurs de build du frontend
- Correction des erreurs TypeScript dans userService.ts et workflowTester.ts
- Ajout des propriétés manquantes aux objets User mockés
- Conversion des dates de string vers objets Date
- Correction des appels asynchrones et des types incompatibles
- Ajout de dynamic rendering pour résoudre les erreurs useSearchParams
- Enveloppement de useSearchParams dans Suspense boundary
- Configuration de force-dynamic au niveau du layout principal

Build réussi: 126 pages générées avec succès

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-18 13:23:08 +00:00

536 lines
18 KiB
TypeScript

import { UserRole } from '../types/auth';
interface Permission {
id: string;
name: string;
description: string;
resource: string;
action: string;
category: 'ADMIN' | 'GESTION' | 'COMMERCIAL' | 'TECHNIQUE' | 'CONSULTATION';
}
interface Role {
id: string;
name: string;
displayName: string;
description: string;
permissions: string[];
level: number; // Niveau hiérarchique (plus élevé = plus de permissions)
}
// TODO: Move to types/auth.ts
const ROLE_PERMISSIONS: Record<UserRole, string[]> = {
[UserRole.ADMIN]: ['*'], // All permissions
[UserRole.MANAGER]: ['chantiers:*', 'clients:*', 'employes:read', 'rapports:*'],
[UserRole.GESTIONNAIRE_PROJET]: ['chantiers:read', 'chantiers:update', 'clients:read', 'clients:update'],
[UserRole.CHEF_CHANTIER]: ['chantiers:read', 'chantiers:update', 'phases:*'],
[UserRole.COMPTABLE]: ['factures:*', 'devis:*', 'rapports:read'],
[UserRole.OUVRIER]: ['chantiers:read', 'phases:read', 'phases:update'],
[UserRole.CLIENT]: ['chantiers:read', 'devis:read', 'factures:read']
};
class PermissionService {
/**
* Obtenir toutes les permissions disponibles
*/
getAllPermissions(): Permission[] {
return [
// Permissions administratives
{
id: 'users:read',
name: 'Consulter utilisateurs',
description: 'Voir la liste des utilisateurs',
resource: 'users',
action: 'read',
category: 'ADMIN'
},
{
id: 'users:write',
name: 'Gérer utilisateurs',
description: 'Créer, modifier les utilisateurs',
resource: 'users',
action: 'write',
category: 'ADMIN'
},
{
id: 'users:delete',
name: 'Supprimer utilisateurs',
description: 'Supprimer des utilisateurs',
resource: 'users',
action: 'delete',
category: 'ADMIN'
},
{
id: 'attribution:read',
name: 'Consulter attributions',
description: 'Voir les attributions client-gestionnaire',
resource: 'attribution',
action: 'read',
category: 'ADMIN'
},
{
id: 'attribution:write',
name: 'Gérer attributions',
description: 'Modifier les attributions client-gestionnaire',
resource: 'attribution',
action: 'write',
category: 'ADMIN'
},
// Permissions de gestion
{
id: 'clients:read',
name: 'Consulter clients',
description: 'Voir la liste des clients',
resource: 'clients',
action: 'read',
category: 'GESTION'
},
{
id: 'clients:write',
name: 'Gérer clients',
description: 'Créer, modifier les clients',
resource: 'clients',
action: 'write',
category: 'GESTION'
},
{
id: 'clients:delete',
name: 'Supprimer clients',
description: 'Supprimer des clients',
resource: 'clients',
action: 'delete',
category: 'GESTION'
},
{
id: 'assigned_clients:read',
name: 'Consulter clients attribués',
description: 'Voir ses clients attribués',
resource: 'assigned_clients',
action: 'read',
category: 'GESTION'
},
{
id: 'assigned_clients:write',
name: 'Gérer clients attribués',
description: 'Modifier ses clients attribués',
resource: 'assigned_clients',
action: 'write',
category: 'GESTION'
},
// Permissions chantiers
{
id: 'chantiers:read',
name: 'Consulter chantiers',
description: 'Voir tous les chantiers',
resource: 'chantiers',
action: 'read',
category: 'TECHNIQUE'
},
{
id: 'chantiers:write',
name: 'Gérer chantiers',
description: 'Créer, modifier les chantiers',
resource: 'chantiers',
action: 'write',
category: 'TECHNIQUE'
},
{
id: 'chantiers:delete',
name: 'Supprimer chantiers',
description: 'Supprimer des chantiers',
resource: 'chantiers',
action: 'delete',
category: 'TECHNIQUE'
},
{
id: 'assigned_chantiers:read',
name: 'Consulter chantiers attribués',
description: 'Voir ses chantiers attribués',
resource: 'assigned_chantiers',
action: 'read',
category: 'TECHNIQUE'
},
{
id: 'assigned_chantiers:write',
name: 'Gérer chantiers attribués',
description: 'Modifier ses chantiers attribués',
resource: 'assigned_chantiers',
action: 'write',
category: 'TECHNIQUE'
},
// Permissions phases
{
id: 'phases:read',
name: 'Consulter phases',
description: 'Voir les phases des chantiers',
resource: 'phases',
action: 'read',
category: 'TECHNIQUE'
},
{
id: 'phases:write',
name: 'Gérer phases',
description: 'Modifier les phases des chantiers',
resource: 'phases',
action: 'write',
category: 'TECHNIQUE'
},
// Permissions commerciales
{
id: 'devis:read',
name: 'Consulter devis',
description: 'Voir tous les devis',
resource: 'devis',
action: 'read',
category: 'COMMERCIAL'
},
{
id: 'devis:write',
name: 'Gérer devis',
description: 'Créer, modifier les devis',
resource: 'devis',
action: 'write',
category: 'COMMERCIAL'
},
{
id: 'devis:delete',
name: 'Supprimer devis',
description: 'Supprimer des devis',
resource: 'devis',
action: 'delete',
category: 'COMMERCIAL'
},
{
id: 'assigned_devis:read',
name: 'Consulter devis attribués',
description: 'Voir ses devis attribués',
resource: 'assigned_devis',
action: 'read',
category: 'COMMERCIAL'
},
{
id: 'assigned_devis:write',
name: 'Gérer devis attribués',
description: 'Modifier ses devis attribués',
resource: 'assigned_devis',
action: 'write',
category: 'COMMERCIAL'
},
// Permissions factures
{
id: 'factures:read',
name: 'Consulter factures',
description: 'Voir toutes les factures',
resource: 'factures',
action: 'read',
category: 'COMMERCIAL'
},
{
id: 'factures:write',
name: 'Gérer factures',
description: 'Créer, modifier les factures',
resource: 'factures',
action: 'write',
category: 'COMMERCIAL'
},
{
id: 'factures:delete',
name: 'Supprimer factures',
description: 'Supprimer des factures',
resource: 'factures',
action: 'delete',
category: 'COMMERCIAL'
},
{
id: 'assigned_factures:read',
name: 'Consulter factures attribuées',
description: 'Voir ses factures attribuées',
resource: 'assigned_factures',
action: 'read',
category: 'COMMERCIAL'
},
{
id: 'assigned_factures:write',
name: 'Gérer factures attribuées',
description: 'Modifier ses factures attribuées',
resource: 'assigned_factures',
action: 'write',
category: 'COMMERCIAL'
},
// Permissions budget
{
id: 'budget:read',
name: 'Consulter budgets',
description: 'Voir les informations budgétaires',
resource: 'budget',
action: 'read',
category: 'GESTION'
},
{
id: 'budget:write',
name: 'Gérer budgets',
description: 'Modifier les budgets',
resource: 'budget',
action: 'write',
category: 'GESTION'
},
// Permissions planning
{
id: 'planning:read',
name: 'Consulter planning',
description: 'Voir le planning des chantiers',
resource: 'planning',
action: 'read',
category: 'TECHNIQUE'
},
{
id: 'planning:write',
name: 'Gérer planning',
description: 'Modifier le planning',
resource: 'planning',
action: 'write',
category: 'TECHNIQUE'
},
// Permissions dashboard
{
id: 'dashboard:read',
name: 'Accès dashboard',
description: 'Accéder au tableau de bord',
resource: 'dashboard',
action: 'read',
category: 'CONSULTATION'
},
{
id: 'client_dashboard:read',
name: 'Accès espace client',
description: 'Accéder à l\'espace client',
resource: 'client_dashboard',
action: 'read',
category: 'CONSULTATION'
},
// Permissions spécifiques clients
{
id: 'own_chantiers:read',
name: 'Consulter ses chantiers',
description: 'Voir ses propres chantiers',
resource: 'own_chantiers',
action: 'read',
category: 'CONSULTATION'
},
{
id: 'own_phases:read',
name: 'Consulter ses phases',
description: 'Voir les phases de ses chantiers',
resource: 'own_phases',
action: 'read',
category: 'CONSULTATION'
},
{
id: 'own_devis:read',
name: 'Consulter ses devis',
description: 'Voir ses propres devis',
resource: 'own_devis',
action: 'read',
category: 'CONSULTATION'
},
{
id: 'own_factures:read',
name: 'Consulter ses factures',
description: 'Voir ses propres factures',
resource: 'own_factures',
action: 'read',
category: 'CONSULTATION'
},
{
id: 'own_documents:read',
name: 'Consulter ses documents',
description: 'Voir ses documents',
resource: 'own_documents',
action: 'read',
category: 'CONSULTATION'
},
// Permissions messages
{
id: 'messages:read',
name: 'Consulter messages',
description: 'Voir les messages',
resource: 'messages',
action: 'read',
category: 'CONSULTATION'
},
{
id: 'messages:write',
name: 'Envoyer messages',
description: 'Envoyer des messages',
resource: 'messages',
action: 'write',
category: 'CONSULTATION'
},
// Permissions documents
{
id: 'documents:read',
name: 'Consulter documents',
description: 'Voir tous les documents',
resource: 'documents',
action: 'read',
category: 'CONSULTATION'
},
{
id: 'documents:write',
name: 'Gérer documents',
description: 'Uploader, modifier les documents',
resource: 'documents',
action: 'write',
category: 'CONSULTATION'
},
// Permissions paramètres
{
id: 'settings:write',
name: 'Gérer paramètres',
description: 'Modifier les paramètres système',
resource: 'settings',
action: 'write',
category: 'ADMIN'
}
];
}
/**
* Obtenir tous les rôles avec leurs descriptions
*/
getAllRoles(): Role[] {
return [
{
id: UserRole.ADMIN,
name: UserRole.ADMIN,
displayName: 'Administrateur',
description: 'Accès complet au système, gestion des utilisateurs et paramètres',
permissions: ROLE_PERMISSIONS[UserRole.ADMIN],
level: 100
},
{
id: UserRole.MANAGER,
name: UserRole.MANAGER,
displayName: 'Responsable',
description: 'Gestion opérationnelle, supervision des gestionnaires et chantiers',
permissions: ROLE_PERMISSIONS[UserRole.MANAGER],
level: 80
},
{
id: UserRole.GESTIONNAIRE_PROJET,
name: UserRole.GESTIONNAIRE_PROJET,
displayName: 'Gestionnaire de Projet',
description: 'Gestion des clients attribués et de leurs projets',
permissions: ROLE_PERMISSIONS[UserRole.GESTIONNAIRE_PROJET],
level: 60
},
{
id: UserRole.CHEF_CHANTIER,
name: UserRole.CHEF_CHANTIER,
displayName: 'Chef de Chantier',
description: 'Gestion opérationnelle des chantiers et des équipes',
permissions: ROLE_PERMISSIONS[UserRole.CHEF_CHANTIER],
level: 50
},
{
id: UserRole.COMPTABLE,
name: UserRole.COMPTABLE,
displayName: 'Comptable',
description: 'Gestion financière, devis, factures et budgets',
permissions: ROLE_PERMISSIONS[UserRole.COMPTABLE],
level: 40
},
{
id: UserRole.OUVRIER,
name: UserRole.OUVRIER,
displayName: 'Ouvrier',
description: 'Consultation des chantiers et mise à jour des phases',
permissions: ROLE_PERMISSIONS[UserRole.OUVRIER],
level: 30
},
{
id: UserRole.CLIENT,
name: UserRole.CLIENT,
displayName: 'Client',
description: 'Consultation de ses projets, devis et factures',
permissions: ROLE_PERMISSIONS[UserRole.CLIENT],
level: 10
}
];
}
/**
* Vérifier si un utilisateur a une permission spécifique
*/
hasPermission(userRole: UserRole, permission: string): boolean {
const rolePermissions = ROLE_PERMISSIONS[userRole];
return rolePermissions.includes(permission);
}
/**
* Vérifier si un utilisateur a toutes les permissions requises
*/
hasAllPermissions(userRole: UserRole, permissions: string[]): boolean {
return permissions.every(permission => this.hasPermission(userRole, permission));
}
/**
* Vérifier si un utilisateur a au moins une des permissions
*/
hasAnyPermission(userRole: UserRole, permissions: string[]): boolean {
return permissions.some(permission => this.hasPermission(userRole, permission));
}
/**
* Obtenir les permissions d'un rôle groupées par catégorie
*/
getPermissionsByCategory(role: UserRole): Record<string, Permission[]> {
const allPermissions = this.getAllPermissions();
const rolePermissions = ROLE_PERMISSIONS[role];
const userPermissions = allPermissions.filter(p =>
rolePermissions.includes(p.id)
);
return userPermissions.reduce((acc, permission) => {
const category = permission.category;
if (!acc[category]) {
acc[category] = [];
}
acc[category].push(permission);
return acc;
}, {} as Record<string, Permission[]>);
}
/**
* Comparer deux rôles (retourne true si role1 >= role2 en niveau)
*/
compareRoles(role1: UserRole, role2: UserRole): boolean {
const roles = this.getAllRoles();
const level1 = roles.find(r => r.id === role1)?.level || 0;
const level2 = roles.find(r => r.id === role2)?.level || 0;
return level1 >= level2;
}
/**
* Obtenir le niveau hiérarchique d'un rôle
*/
getRoleLevel(role: UserRole): number {
const roles = this.getAllRoles();
return roles.find(r => r.id === role)?.level || 0;
}
}
export default new PermissionService();