# Guide de Migration - Inscriptions Publiques ## 📋 État Actuel **Migrations en attente** : - ✅ `2026_01_20_000000_create_public_registration_tokens_table` - Pending - ✅ `2026_01_20_100000_add_seminar_fields_to_registrations_table` - Pending - ⚠ `2024_01_15_090000_create_cache_table` - Pending (optionnel, pour cache Laravel) **RĂŽle 'guest'** : - ✅ DĂ©jĂ  ajoutĂ© dans `RoleSeeder.php` - ⚠ À crĂ©er en base si pas encore fait --- ## 🚀 ÉTAPES DE MIGRATION ### Étape 1 : VĂ©rifier l'Ă©tat actuel ```bash cd d:\dev\eventshbf\api php artisan migrate:status ``` ### Étape 2 : ExĂ©cuter les migrations ```bash # ExĂ©cuter toutes les migrations en attente php artisan migrate # OU si vous voulez forcer en production (sans confirmation) php artisan migrate --force ``` **Migrations qui seront exĂ©cutĂ©es** : 1. `create_public_registration_tokens_table` - Table pour tokens de vĂ©rification email 2. `add_seminar_fields_to_registrations_table` - Champs SĂ©minaire dans registrations 3. `create_cache_table` - Table cache Laravel (optionnel) ### Étape 3 : CrĂ©er le rĂŽle 'guest' ```bash # ExĂ©cuter le seeder pour crĂ©er le rĂŽle 'guest' php artisan db:seed --class=RoleSeeder ``` **OU** si vous voulez exĂ©cuter tous les seeders : ```bash php artisan db:seed ``` ### Étape 4 : VĂ©rifier que tout est OK ```bash # VĂ©rifier l'Ă©tat des migrations php artisan migrate:status # VĂ©rifier que le rĂŽle 'guest' existe php artisan tinker # Puis dans tinker : # \Spatie\Permission\Models\Role::all()->pluck('name'); # Devrait afficher : ["admin", "treasurer", "delegate_lead", "participant", "guest"] ``` ### Étape 5 : VĂ©rifier la structure de la table registrations ```bash php artisan tinker # Puis : # \Illuminate\Support\Facades\Schema::getColumnListing('registrations'); # Devrait inclure : nationality, is_haggai_leader, seminar_intent, etc. ``` --- ## 🔍 VÉRIFICATIONS POST-MIGRATION ### 1. VĂ©rifier la table `public_registration_tokens` ```sql -- Dans MySQL/HeidiSQL DESCRIBE public_registration_tokens; -- Devrait avoir : id, registration_id, token, expires_at, used_at, timestamps ``` ### 2. VĂ©rifier les colonnes ajoutĂ©es Ă  `registrations` ```sql DESCRIBE registrations; -- Devrait inclure : -- nationality -- is_haggai_leader -- seminar_intent -- seminar_question_or_concern -- recommended_full_name -- recommended_profession -- recommended_residence_country -- recommended_phone_whatsapp -- recommended_email ``` ### 3. VĂ©rifier l'index pour dĂ©duplication ```sql SHOW INDEXES FROM registrations WHERE Key_name = 'idx_email_event'; -- Devrait exister ``` ### 4. VĂ©rifier le rĂŽle 'guest' ```sql SELECT * FROM roles WHERE name = 'guest'; -- Devrait retourner 1 ligne ``` --- ## ⚠ POINTS D'ATTENTION ### Migration `add_seminar_fields_to_registrations_table` **⚠ IMPORTANT** : Cette migration ajoute des colonnes **nullable**, donc : - ✅ Pas de perte de donnĂ©es - ✅ Pas de breaking change - ✅ Les inscriptions existantes continuent de fonctionner **Si des doublons existent** : - La migration peut Ă©chouer si vous activez la contrainte unique `(user_id, event_id)` - Pour l'instant, cette contrainte est **commentĂ©e** dans la migration - À activer manuellement aprĂšs nettoyage des doublons si nĂ©cessaire ### Migration `create_public_registration_tokens_table` - ✅ Table créée uniquement si `REGISTRATION_PUBLIC_REQUIRE_EMAIL_VERIFICATION=true` - ✅ Peut rester vide si vĂ©rification email dĂ©sactivĂ©e --- ## đŸ§Ș TESTS POST-MIGRATION ### Test 1 : VĂ©rifier que les nouvelles colonnes existent ```bash php artisan tinker ``` ```php $registration = \App\Models\Registration::first(); $registration->nationality = 'Test'; $registration->save(); // Si pas d'erreur, les colonnes existent ✅ ``` ### Test 2 : VĂ©rifier le rĂŽle guest ```php $role = \Spatie\Permission\Models\Role::where('name', 'guest')->first(); // Devrait retourner un objet Role ✅ ``` ### Test 3 : VĂ©rifier la table tokens ```php \Illuminate\Support\Facades\DB::table('public_registration_tokens')->count(); // Devrait retourner 0 (table vide au dĂ©but) ✅ ``` --- ## 📝 COMMANDES COMPLÈTES (Copier-Coller) ```bash # 1. Aller dans le dossier API cd d:\dev\eventshbf\api # 2. ExĂ©cuter les migrations php artisan migrate # 3. CrĂ©er le rĂŽle 'guest' php artisan db:seed --class=RoleSeeder # 4. VĂ©rifier l'Ă©tat php artisan migrate:status # 5. (Optionnel) Tester avec tinker php artisan tinker # Puis dans tinker : # \Spatie\Permission\Models\Role::where('name', 'guest')->exists(); // true # \Illuminate\Support\Facades\Schema::hasColumn('registrations', 'nationality'); // true ``` --- ## 🔄 ROLLBACK (Si nĂ©cessaire) Si vous devez annuler les migrations : ```bash # Annuler la derniĂšre batch de migrations php artisan migrate:rollback # OU annuler un nombre spĂ©cifique php artisan migrate:rollback --step=2 ``` **⚠ ATTENTION** : Le rollback supprimera : - Les colonnes ajoutĂ©es Ă  `registrations` - La table `public_registration_tokens` - Les donnĂ©es dans ces colonnes/tables --- ## ✅ CHECKLIST FINALE - [ ] Migrations exĂ©cutĂ©es sans erreur - [ ] RĂŽle 'guest' créé en base - [ ] Colonnes SĂ©minaire prĂ©sentes dans `registrations` - [ ] Table `public_registration_tokens` créée - [ ] Index `idx_email_event` créé - [ ] Tests tinker passent - [ ] Aucune erreur dans les logs --- ## 🚹 EN CAS D'ERREUR ### Erreur : "Column already exists" - Les colonnes existent dĂ©jĂ  → Migration peut ĂȘtre ignorĂ©e - Solution : Commenter les lignes dans la migration ou utiliser `Schema::hasColumn()` ### Erreur : "Table already exists" - La table existe dĂ©jĂ  → Migration peut ĂȘtre ignorĂ©e - Solution : Utiliser `Schema::hasTable()` dans la migration ### Erreur : "Duplicate entry for key" - Doublons dans la base → Nettoyer avant d'activer la contrainte unique - Solution : VĂ©rifier et supprimer les doublons manuellement --- **Document gĂ©nĂ©rĂ© le** : 2026-01-XX **Version** : 1.0