/// Énumération centralisée de toutes les permissions de l'application /// Chaque permission contrôle l'accès à une fonctionnalité spécifique enum AppPermission { // ============= ÉVÉNEMENTS ============= /// Permet de voir les événements viewEvents('view_events'), /// Permet de créer de nouveaux événements createEvents('create_events'), /// Permet de modifier les événements existants editEvents('edit_events'), /// Permet de supprimer des événements deleteEvents('delete_events'), /// Permet de voir tous les événements de tous les utilisateurs /// (nécessaire pour le filtre par utilisateur dans le calendrier) viewAllUserEvents('view_all_user_events'), // ============= ÉQUIPEMENTS ============= /// Permet de voir la liste des équipements viewEquipment('view_equipment'), /// Permet de créer, modifier et supprimer des équipements /// Inclut aussi la gestion des prix d'achat/location manageEquipment('manage_equipment'), // ============= CONTENEURS ============= /// Permet de voir les conteneurs viewContainers('view_containers'), /// Permet de créer, modifier et supprimer des conteneurs manageContainers('manage_containers'), // ============= MAINTENANCE ============= /// Permet de voir les maintenances viewMaintenance('view_maintenance'), /// Permet de créer, modifier et supprimer des maintenances manageMaintenance('manage_maintenance'), // ============= UTILISATEURS ============= /// Permet de voir la liste de tous les utilisateurs viewAllUsers('view_all_users'), /// Permet de créer, modifier et supprimer des utilisateurs /// Inclut la gestion des rôles manageUsers('manage_users'), // ============= ALERTES ============= /// Reçoit les alertes de maintenance receiveMaintenanceAlerts('receive_maintenance_alerts'), /// Reçoit les alertes d'événements (création, modification) receiveEventAlerts('receive_event_alerts'), /// Reçoit les alertes de stock faible receiveStockAlerts('receive_stock_alerts'), // ============= NOTIFICATIONS ============= /// Peut recevoir des notifications par email receiveEmailNotifications('receive_email_notifications'), /// Peut recevoir des notifications push dans le navigateur receivePushNotifications('receive_push_notifications'), // ============= PRÉPARATION/CHARGEMENT ============= /// Permet d'accéder aux pages de préparation d'événements accessPreparation('access_preparation'), /// Permet de valider les étapes de préparation validatePreparation('validate_preparation'), // ============= EXPORTS/RAPPORTS ============= /// Permet d'exporter des données (ICS, PDF, etc.) exportData('export_data'), /// Permet de générer des rapports generateReports('generate_reports'); /// L'identifiant de la permission tel qu'il est stocké dans Firestore final String id; const AppPermission(this.id); /// Convertit une string en AppPermission static AppPermission? fromString(String? value) { if (value == null) return null; try { return AppPermission.values.firstWhere((p) => p.id == value); } catch (e) { return null; } } /// Retourne une description lisible de la permission (pour l'UI admin) String get description { switch (this) { // Événements case AppPermission.viewEvents: return 'Voir les événements'; case AppPermission.createEvents: return 'Créer des événements'; case AppPermission.editEvents: return 'Modifier des événements'; case AppPermission.deleteEvents: return 'Supprimer des événements'; case AppPermission.viewAllUserEvents: return 'Voir les événements de tous les utilisateurs'; // Équipements case AppPermission.viewEquipment: return 'Voir les équipements'; case AppPermission.manageEquipment: return 'Gérer les équipements'; // Conteneurs case AppPermission.viewContainers: return 'Voir les conteneurs'; case AppPermission.manageContainers: return 'Gérer les conteneurs'; // Maintenance case AppPermission.viewMaintenance: return 'Voir les maintenances'; case AppPermission.manageMaintenance: return 'Gérer les maintenances'; // Utilisateurs case AppPermission.viewAllUsers: return 'Voir tous les utilisateurs'; case AppPermission.manageUsers: return 'Gérer les utilisateurs'; // Alertes case AppPermission.receiveMaintenanceAlerts: return 'Recevoir les alertes de maintenance'; case AppPermission.receiveEventAlerts: return 'Recevoir les alertes d\'événements'; case AppPermission.receiveStockAlerts: return 'Recevoir les alertes de stock'; // Notifications case AppPermission.receiveEmailNotifications: return 'Recevoir les notifications par email'; case AppPermission.receivePushNotifications: return 'Recevoir les notifications push'; // Préparation case AppPermission.accessPreparation: return 'Accéder aux préparations d\'événements'; case AppPermission.validatePreparation: return 'Valider les préparations'; // Exports case AppPermission.exportData: return 'Exporter des données'; case AppPermission.generateReports: return 'Générer des rapports'; } } /// Retourne la catégorie de la permission (pour l'UI de gestion des rôles) String get category { switch (this) { case AppPermission.viewEvents: case AppPermission.createEvents: case AppPermission.editEvents: case AppPermission.deleteEvents: case AppPermission.viewAllUserEvents: return 'Événements'; case AppPermission.viewEquipment: case AppPermission.manageEquipment: return 'Équipements'; case AppPermission.viewContainers: case AppPermission.manageContainers: return 'Conteneurs'; case AppPermission.viewMaintenance: case AppPermission.manageMaintenance: return 'Maintenance'; case AppPermission.viewAllUsers: case AppPermission.manageUsers: return 'Utilisateurs'; case AppPermission.receiveMaintenanceAlerts: case AppPermission.receiveEventAlerts: case AppPermission.receiveStockAlerts: return 'Alertes'; case AppPermission.receiveEmailNotifications: case AppPermission.receivePushNotifications: return 'Notifications'; case AppPermission.accessPreparation: case AppPermission.validatePreparation: return 'Préparation'; case AppPermission.exportData: case AppPermission.generateReports: return 'Exports & Rapports'; } } } /// Extension pour faciliter les vérifications de permissions extension PermissionListExtension on List { /// Vérifie si la liste contient une permission donnée bool hasPermission(AppPermission permission) { return contains(permission.id); } /// Vérifie si la liste contient toutes les permissions données bool hasAllPermissions(List permissions) { return permissions.every((p) => contains(p.id)); } /// Vérifie si la liste contient au moins une des permissions données bool hasAnyPermission(List permissions) { return permissions.any((p) => contains(p.id)); } } /// Rôles prédéfinis avec leurs permissions class PredefinedRoles { /// Rôle ADMIN : Accès complet à toutes les fonctionnalités static List get admin => AppPermission.values.map((p) => p.id).toList(); /// Rôle TECHNICIEN : Gestion des équipements et préparation static List get technician => [ AppPermission.viewEvents.id, AppPermission.viewEquipment.id, AppPermission.manageEquipment.id, AppPermission.viewContainers.id, AppPermission.manageContainers.id, AppPermission.viewMaintenance.id, AppPermission.manageMaintenance.id, AppPermission.receiveMaintenanceAlerts.id, AppPermission.receiveStockAlerts.id, AppPermission.accessPreparation.id, AppPermission.validatePreparation.id, AppPermission.exportData.id, ]; /// Rôle MANAGER : Gestion des événements et vue d'ensemble static List get manager => [ AppPermission.viewEvents.id, AppPermission.createEvents.id, AppPermission.editEvents.id, AppPermission.deleteEvents.id, AppPermission.viewAllUserEvents.id, AppPermission.viewEquipment.id, AppPermission.viewContainers.id, AppPermission.viewMaintenance.id, AppPermission.viewAllUsers.id, AppPermission.receiveEventAlerts.id, AppPermission.accessPreparation.id, AppPermission.exportData.id, AppPermission.generateReports.id, ]; /// Rôle USER : Consultation uniquement static List get user => [ AppPermission.viewEvents.id, AppPermission.viewEquipment.id, AppPermission.viewContainers.id, AppPermission.receiveEventAlerts.id, ]; }