# Proposition - Dashboard Administrateur pour les Inscriptions ## 📊 Vue d'ensemble Dashboard permettant aux administrateurs de visualiser, filtrer, rechercher et gĂ©rer toutes les inscriptions du systĂšme avec des statistiques en temps rĂ©el. --- ## 🎯 Objectifs 1. **Visualisation** : Afficher toutes les inscriptions avec leurs statuts 2. **Filtrage** : Filtrer par Ă©vĂ©nement, statut, date, formule, etc. 3. **Recherche** : Rechercher par nom, email, tĂ©lĂ©phone 4. **Statistiques** : Afficher des mĂ©triques clĂ©s (totaux, par statut, par Ă©vĂ©nement) 5. **Actions** : Permettre certaines actions (changer statut, voir dĂ©tails, exporter) --- ## đŸ—ïž Architecture ProposĂ©e ### 1. Backend (Laravel) #### A. Controller : `AdminRegistrationController` **Localisation** : `api/app/Http/Controllers/Admin/RegistrationController.php` **MĂ©thodes proposĂ©es** : ```php class AdminRegistrationController extends Controller { // Liste paginĂ©e avec filtres public function index(Request $request): JsonResponse // DĂ©tails d'une inscription public function show(Registration $registration): JsonResponse // Statistiques globales public function stats(Request $request): JsonResponse // Changer le statut d'une inscription public function updateStatus(Request $request, Registration $registration): JsonResponse // Exporter les inscriptions (CSV/Excel) public function export(Request $request): Response } ``` #### B. Routes API **Localisation** : `api/routes/api.php` ```php // Routes admin pour inscriptions Route::middleware(['auth:sanctum', 'role:admin'])->prefix('admin/registrations')->group(function () { Route::get('/', [Admin\RegistrationController::class, 'index']); // Liste avec filtres Route::get('/stats', [Admin\RegistrationController::class, 'stats']); // Statistiques Route::get('/{registration}', [Admin\RegistrationController::class, 'show']); // DĂ©tails Route::patch('/{registration}/status', [Admin\RegistrationController::class, 'updateStatus']); // Changer statut Route::get('/export/csv', [Admin\RegistrationController::class, 'export']); // Export CSV }); ``` #### C. Resource API : `AdminRegistrationResource` **Localisation** : `api/app/Http/Resources/AdminRegistrationResource.php` **DonnĂ©es incluses** : - Toutes les donnĂ©es de `RegistrationResource` existant - Informations utilisateur complĂštes (email_verified_at, rĂŽles) - Informations de vĂ©rification (si inscription publique) - Historique des changements de statut (si table d'audit existe) - Informations de paiement (payments liĂ©s) #### D. Request Validation : `UpdateRegistrationStatusRequest` **Localisation** : `api/app/Http/Requests/UpdateRegistrationStatusRequest.php` **Validation** : - `status` : requis, enum RegistrationStatus - `notes` : optionnel, string (pour justifier le changement) #### E. Service (optionnel) : `AdminRegistrationService` **Localisation** : `api/app/Services/AdminRegistrationService.php` **MĂ©thodes** : - `getFilteredRegistrations($filters)` : Logique de filtrage complexe - `calculateStats($filters)` : Calcul des statistiques - `updateStatus($registration, $newStatus, $notes)` : Changer statut avec audit --- ### 2. Frontend (React) #### A. Structure des fichiers ``` frontend/src/ ├── pages/ │ └── admin/ │ └── RegistrationsDashboard.tsx # Page principale ├── components/ │ └── admin/ │ ├── registrations/ │ │ ├── RegistrationsTable.tsx # Tableau des inscriptions │ │ ├── RegistrationFilters.tsx # Barre de filtres │ │ ├── RegistrationStats.tsx # Cartes statistiques │ │ ├── RegistrationDetails.tsx # Modal dĂ©tails │ │ └── StatusBadge.tsx # Badge de statut │ └── layout/ │ └── AdminLayout.tsx # Layout admin (sidebar, header) ├── lib/ │ └── api/ │ ├── services/ │ │ └── adminRegistrations.ts # Service API │ └── hooks/ │ └── useAdminRegistrations.ts # Hook React └── routes/ └── admin.tsx # Routes admin ``` #### B. Page principale : `RegistrationsDashboard.tsx` **FonctionnalitĂ©s** : - Layout avec sidebar navigation - Section statistiques en haut (cartes) - Barre de filtres/recherche - Tableau paginĂ© des inscriptions - Actions rapides (voir dĂ©tails, changer statut) #### C. Composants **RegistrationsTable** : - Colonnes : ID, Nom, Email, ÉvĂ©nement, Formule, Statut, Date crĂ©ation, Actions - Tri par colonne - Pagination - SĂ©lection multiple (optionnel) **RegistrationFilters** : - Filtre par Ă©vĂ©nement (select) - Filtre par statut (checkboxes) - Filtre par date (date range) - Filtre par formule (select) - Recherche texte (nom, email, tĂ©lĂ©phone) - Bouton "RĂ©initialiser" **RegistrationStats** : - Cartes avec mĂ©triques : - Total inscriptions - En attente (draft) - Soumises (submitted) - PayĂ©es (paid) - Par Ă©vĂ©nement (graphique) **RegistrationDetails** : - Modal avec toutes les informations - Onglets : Informations, Paiement, Historique - Actions : Changer statut, Exporter PDF --- ## 🔍 FonctionnalitĂ©s DĂ©taillĂ©es ### 1. Filtrage et Recherche **Filtres proposĂ©s** : - **ÉvĂ©nement** : Dropdown avec tous les Ă©vĂ©nements actifs - **Statut** : Multi-select (draft, submitted, paid, etc.) - **Date de crĂ©ation** : Date range picker - **Date de soumission** : Date range picker - **Formule** : Dropdown (A, B, C, D) - **Type d'inscription** : Public / AuthentifiĂ©e - **Pays** : Dropdown - **Leader Haggai** : Checkbox (is_haggai_leader) **Recherche** : - Recherche globale (nom, prĂ©nom, email, tĂ©lĂ©phone) - Recherche avec debounce (300ms) ### 2. Statistiques **MĂ©triques proposĂ©es** : - **Total inscriptions** : Nombre total - **Par statut** : RĂ©partition (draft, submitted, paid, etc.) - **Par Ă©vĂ©nement** : Graphique en barres - **Par formule** : Graphique en camembert - **Évolution temporelle** : Graphique linĂ©aire (inscriptions par jour) - **Inscriptions publiques vs authentifiĂ©es** : Comparaison - **Taux de vĂ©rification email** : % d'inscriptions publiques vĂ©rifiĂ©es ### 3. Actions Administrateur **Actions proposĂ©es** : - ✅ **Voir dĂ©tails** : Modal avec toutes les informations - ✅ **Changer statut** : Dropdown avec validation - ⚠ **Rejeter** : Avec raison (notes) - ⚠ **Annuler** : Avec raison - 📧 **Renvoyer email** : Si inscription publique non vĂ©rifiĂ©e - 📄 **Exporter** : CSV/Excel avec filtres appliquĂ©s - 🔍 **Voir utilisateur** : Lien vers profil utilisateur (si page existe) **Contraintes** : - Seuls les admins peuvent changer les statuts - Logging de toutes les actions (qui, quand, quoi) - Validation des transitions de statut (ex: draft → paid impossible) ### 4. Affichage des DonnĂ©es **Colonnes du tableau** : 1. ID (avec lien vers dĂ©tails) 2. Nom complet (first_name + last_name) 3. Email (avec badge si vĂ©rifiĂ©) 4. TĂ©lĂ©phone 5. ÉvĂ©nement (nom + annĂ©e) 6. Formule (code + titre) 7. Statut (badge colorĂ©) 8. Date crĂ©ation 9. Date soumission 10. Actions (menu dropdown) **Badges de statut** : - `draft` : Gris (En attente) - `submitted` : Bleu (Soumise) - `pending_payment` : Orange (Paiement en attente) - `paid` : Vert (PayĂ©e) - `rejected` : Rouge (RejetĂ©e) - `cancelled` : Gris foncĂ© (AnnulĂ©e) - `refunded` : Jaune (RemboursĂ©e) --- ## 🔐 SĂ©curitĂ© et Permissions ### Backend 1. **Middleware** : ```php Route::middleware(['auth:sanctum', 'role:admin']) ``` 2. **Policy** : CrĂ©er `AdminRegistrationPolicy` - `viewAny` : Seulement admin - `view` : Admin peut voir toutes - `updateStatus` : Seulement admin 3. **Audit Trail** : Logger toutes les actions - Qui a changĂ© le statut - Quand - Ancien statut → Nouveau statut - Notes/raison ### Frontend 1. **Protection de route** : VĂ©rifier le rĂŽle admin 2. **Masquer les actions** : Si pas admin, ne pas afficher les boutons 3. **Validation cĂŽtĂ© client** : VĂ©rifier les permissions avant les appels API --- ## 📊 Exemple de RĂ©ponse API ### GET /api/admin/registrations?event_id=1&status=submitted&page=1 ```json { "data": [ { "id": 1, "status": "submitted", "first_name": "John", "last_name": "Doe", "email": "john@example.com", "phone": "+22670123456", "country": "Burkina Faso", "event": { "id": 1, "name": "Sommet Haggai Francophone 2026", "slug": "sommet-haggai-franco-2026" }, "pricing_plan": { "id": 1, "code": "A", "title": "Formule A - Sans hĂ©bergement" }, "submitted_at": "2026-01-19T10:00:00Z", "user": { "id": 1, "email_verified_at": "2026-01-19T10:05:00Z", "roles": ["participant"] }, "is_public_registration": true, "created_at": "2026-01-19T09:00:00Z" } ], "meta": { "current_page": 1, "per_page": 20, "total": 150, "last_page": 8 }, "filters_applied": { "event_id": 1, "status": "submitted" } } ``` ### GET /api/admin/registrations/stats?event_id=1 ```json { "total": 150, "by_status": { "draft": 10, "submitted": 80, "pending_payment": 30, "paid": 25, "rejected": 3, "cancelled": 2 }, "by_event": { "sommet-haggai-franco-2026": 100, "seminaire-regional-hybride": 50 }, "by_plan": { "A": 40, "B": 35, "C": 20, "D": 5 }, "public_vs_authenticated": { "public": 120, "authenticated": 30 }, "verification_rate": 85.5, "timeline": [ {"date": "2026-01-19", "count": 15}, {"date": "2026-01-18", "count": 12} ] } ``` --- ## 🎹 Design UI/UX ### Style - **CohĂ©rence** : Utiliser la mĂȘme charte graphique que le reste de l'app - **Responsive** : Tableau scrollable horizontalement sur mobile - **AccessibilitĂ©** : Contraste, navigation clavier, ARIA labels ### Composants Tailwind - Utiliser les composants UI existants (`Button`, etc.) - CrĂ©er de nouveaux composants rĂ©utilisables : - `DataTable` : Tableau gĂ©nĂ©rique avec pagination - `FilterBar` : Barre de filtres rĂ©utilisable - `StatsCard` : Carte de statistique - `StatusBadge` : Badge de statut colorĂ© --- ## 📈 Phases d'ImplĂ©mentation ### Phase 1 : Backend de base (MVP) 1. ✅ CrĂ©er `AdminRegistrationController` avec `index()` et `show()` 2. ✅ CrĂ©er `AdminRegistrationResource` 3. ✅ Ajouter routes avec middleware admin 4. ✅ ImplĂ©menter filtres de base (event_id, status) ### Phase 2 : Frontend de base (MVP) 1. ✅ CrĂ©er page `RegistrationsDashboard` 2. ✅ CrĂ©er composant `RegistrationsTable` 3. ✅ CrĂ©er composant `RegistrationFilters` (filtres de base) 4. ✅ IntĂ©grer avec API ### Phase 3 : Statistiques 1. ✅ Backend : Endpoint `/stats` 2. ✅ Frontend : Composant `RegistrationStats` 3. ✅ Graphiques (Chart.js ou Recharts) ### Phase 4 : Actions avancĂ©es 1. ✅ Changer statut 2. ✅ Modal dĂ©tails 3. ✅ Export CSV ### Phase 5 : AmĂ©liorations 1. ⚠ Recherche avancĂ©e 2. ⚠ Filtres additionnels 3. ⚠ Audit trail complet 4. ⚠ Notifications (si changement de statut) --- ## 🔄 IntĂ©gration avec l'Existant ### RĂ©utilisation 1. **RegistrationResource** : Étendre pour admin (plus de donnĂ©es) 2. **RegistrationPolicy** : Ajouter mĂ©thodes admin 3. **ExportController** : RĂ©utiliser la logique d'export 4. **Composants UI** : RĂ©utiliser `Button`, etc. ### CompatibilitĂ© - Ne pas casser les routes existantes - Les routes admin sont sĂ©parĂ©es (`/admin/registrations`) - Les utilisateurs non-admin ne voient pas ces routes --- ## 📝 Questions Ă  Valider 1. **Permissions** : Seulement `admin` ou aussi `treasurer` ? 2. **Actions** : Quelles actions sont autorisĂ©es ? (changer statut, rejeter, etc.) 3. **Export** : Format prĂ©fĂ©rĂ© ? (CSV, Excel, PDF) 4. **Pagination** : Nombre d'Ă©lĂ©ments par page ? (20, 50, 100) 5. **Graphiques** : BibliothĂšque prĂ©fĂ©rĂ©e ? (Chart.js, Recharts, autre) 6. **Audit** : Besoin d'une table d'audit dĂ©diĂ©e ou logs suffisent ? 7. **Notifications** : Notifier l'utilisateur si statut change ? --- ## ✅ Avantages de cette Approche 1. **SĂ©paration claire** : Routes admin distinctes 2. **RĂ©utilisable** : Composants frontend rĂ©utilisables 3. **Extensible** : Facile d'ajouter de nouvelles fonctionnalitĂ©s 4. **SĂ©curisĂ©** : Middleware et policies en place 5. **Performant** : Pagination, filtres cĂŽtĂ© serveur 6. **Maintenable** : Code organisĂ© et documentĂ© --- ## 🚀 Prochaines Étapes (aprĂšs validation) 1. Valider cette proposition 2. CrĂ©er les todos dĂ©taillĂ©s 3. Commencer par Phase 1 (Backend MVP) 4. Tester avec des donnĂ©es rĂ©elles 5. ItĂ©rer selon les retours --- **Document créé le** : 2026-01-XX **Auteur** : Assistant IA **Statut** : ⏳ En attente de validation