/// Création comptes staff (gestionnaire / admin) — ticket #161. bool canCreateStaffAccounts(String? role) { final r = (role ?? '').trim().toLowerCase(); return r == 'administrateur' || r == 'super_admin'; } /// Droits d’affichage poubelle — tickets #154 / #160. bool canDeleteMetier(String? role) { final r = (role ?? '').trim().toLowerCase(); return r == 'gestionnaire' || r == 'administrateur' || r == 'super_admin'; } bool canDeleteGestionnaire(String? role) { final r = (role ?? '').trim().toLowerCase(); return r == 'administrateur' || r == 'super_admin'; } bool canDeleteAdministrateur({ required String? currentRole, required String? currentUserId, required String targetUserId, required String targetRole, required int adminCount, }) { final me = (currentRole ?? '').trim().toLowerCase(); if (me != 'administrateur' && me != 'super_admin') return false; if (targetUserId.trim().isEmpty) return false; if (currentUserId != null && currentUserId.trim() == targetUserId.trim()) { return false; } final target = targetRole.trim().toLowerCase(); if (target == 'super_admin') return false; if (adminCount <= 1 && me != 'super_admin') return false; return true; } String? adminDeleteBlockedReason({ required String? currentRole, required String? currentUserId, required String targetUserId, required String targetRole, required int adminCount, }) { if (currentUserId != null && currentUserId.trim() == targetUserId.trim()) { return 'Vous ne pouvez pas supprimer votre propre compte.'; } if (targetRole.trim().toLowerCase() == 'super_admin') { return 'Le super administrateur ne peut pas être supprimé.'; } if (adminCount <= 1 && (currentRole ?? '').trim().toLowerCase() != 'super_admin') { return 'Seul un super administrateur peut supprimer le dernier administrateur.'; } return null; }