# language: fr Fonctionnalité: Sauvegarde et reprise de progression audio-guide En tant qu'utilisateur Je veux que ma progression soit sauvegardée automatiquement Afin de pouvoir reprendre mon audio-guide là où je me suis arrêté Contexte: Étant donné que l'application RoadWave est démarrée Et que l'utilisateur "jean@example.com" est connecté # 16.5 - Sauvegarde de progression Scénario: Sauvegarde automatique toutes les 10 secondes Étant donné qu'un audio-guide "Visite du Louvre" est en cours Et que la séquence 3 est à la position 1:24 Quand 10 secondes s'écoulent Alors la progression est sauvegardée automatiquement: | donnée | valeur | | audio_guide_id | louvre_123 | | sequence_actuelle | 3 | | position_audio | 1:24 | | timestamp | 2026-01-22 14:35:42 | | sequences_ecoutees | [1, 2] | Scénario: Sauvegarde locale (SQLite) pour rapidité Étant donné qu'une sauvegarde est déclenchée Quand la progression est enregistrée Alors les données sont écrites en SQLite local Et l'écriture prend moins de 50ms Et l'application reste fluide Scénario: Synchronisation cloud en arrière-plan Étant donné qu'une sauvegarde locale est effectuée Quand 30 secondes s'écoulent Alors la progression est synchronisée vers PostgreSQL cloud Et la synchronisation s'effectue en arrière-plan Et elle n'impacte pas les performances Scénario: Sauvegarde immédiate lors de la fermeture Étant donné qu'un audio-guide est en cours à la séquence 4 position 2:15 Quand l'utilisateur ferme l'application Alors la progression est sauvegardée immédiatement (local + cloud) Et les données sont écrites avant la fermeture complète Scénario: Sauvegarde des séquences complétées Étant donné qu'un audio-guide de 12 séquences est en cours Et que les séquences 1, 2, 4, 5 ont été écoutées à >80% Quand la progression est sauvegardée Alors les séquences complétées sont enregistrées: """json { "audio_guide_id": "louvre_123", "completed_sequences": [1, 2, 4, 5], "current_sequence": 6, "current_position": "0:42", "last_played_at": "2026-01-22T14:35:42Z" } """ Scénario: Historique des écoutes pour statistiques Étant donné qu'un utilisateur a écouté 3 séquences d'un audio-guide Quand les données sont sauvegardées Alors l'historique d'écoute inclut: | sequence_id | started_at | completed_at | completion_rate | | 1 | 2026-01-22 14:10:00 | 2026-01-22 14:12:15 | 100% | | 2 | 2026-01-22 14:12:20 | 2026-01-22 14:14:08 | 100% | | 3 | 2026-01-22 14:14:15 | 2026-01-22 14:17:45 | 92% | # 16.6 - Reprise de progression Scénario: Popup de reprise au redémarrage Étant donné que l'utilisateur a quitté l'app à la séquence 6 position 2:34 Quand il rouvre l'audio-guide "Visite du Louvre" Alors une popup s'affiche: """ Continuer où vous vous étiez arrêté ? 📍 Séquence 6/12 : "Vénus de Milo" ⏱️ Position : 2:34 / 4:10 [▶️ Reprendre] [🔄 Recommencer] """ Scénario: Action "Reprendre" - Position exacte restaurée Étant donné qu'une popup de reprise est affichée Quand l'utilisateur clique sur "▶️ Reprendre" Alors la séquence 6 "Vénus de Milo" se charge Et la position exacte 2:34 est restaurée Et la lecture démarre automatiquement après 1 seconde Scénario: Action "Recommencer" - Réinitialisation complète Étant donné qu'une popup de reprise est affichée Quand l'utilisateur clique sur "🔄 Recommencer" Alors l'audio-guide redémarre depuis la séquence 1 position 0:00 Et toutes les séquences sont marquées ⭕ "À écouter" Et l'historique d'écoute est réinitialisé pour cette session Scénario: Reprise après 7 jours d'inactivité Étant donné qu'un utilisateur a arrêté un audio-guide le 15/01/2026 Et qu'il le rouvre le 22/01/2026 (7 jours plus tard) Quand l'audio-guide se charge Alors la popup de reprise s'affiche normalement Et toutes les données de progression sont conservées Scénario: Reprise sur un autre appareil (synchronisation cloud) Étant donné qu'un utilisateur écoute un audio-guide sur iPhone Et qu'il quitte à la séquence 4 position 1:20 Quand il ouvre le même audio-guide sur iPad Alors la popup de reprise s'affiche avec la progression iPhone Et il peut reprendre exactement où il s'était arrêté Scénario: Conflit de synchronisation (dernier appareil gagne) Étant donné qu'un utilisateur écoute sur iPhone à la séquence 3 Et simultanément sur iPad à la séquence 7 Quand les deux appareils synchronisent Alors la progression la plus récente (timestamp) est conservée Et l'appareil avec ancienne progression affiche une notification: """ ℹ️ Progression mise à jour Une écoute plus récente a été détectée. Séquence 7 restaurée. """ Scénario: Mode hors-ligne - Sauvegarde locale uniquement Étant donné qu'un utilisateur écoute un audio-guide hors connexion Et qu'il atteint la séquence 5 Quand la progression est sauvegardée Alors les données sont écrites localement (SQLite) Et une icône "☁️ Non synchronisé" s'affiche discrètement Scénario: Synchronisation automatique à la reconnexion Étant donné que l'utilisateur a écouté hors ligne jusqu'à la séquence 8 Et que 5 progressions locales ne sont pas synchronisées Quand la connexion réseau est rétablie Alors les 5 progressions sont synchronisées automatiquement Et un toast s'affiche brièvement: "✅ Progression synchronisée" Scénario: Suppression de la progression (recommencer proprement) Étant donné qu'un utilisateur est à la séquence 10/12 Quand il ouvre les paramètres de l'audio-guide Et qu'il clique sur "🔄 Réinitialiser progression" Alors une confirmation s'affiche: """ Réinitialiser cet audio-guide ? Toutes les séquences seront marquées comme non écoutées. [Annuler] [Réinitialiser] """ Et si confirmé, la progression est effacée # 16.7 - Statistiques d'écoute Scénario: Taux de complétion global de l'audio-guide Étant donné un audio-guide de 12 séquences Et que l'utilisateur a écouté complètement 8 séquences Et partiellement 1 séquence (45%) Quand les statistiques sont calculées Alors le taux de complétion affiché est "67%" (8/12) Scénario: Badge "Audio-guide complété" à 100% Étant donné un audio-guide de 12 séquences Quand l'utilisateur écoute la 12ème séquence à 100% Alors un badge "✅ Audio-guide complété" s'affiche Et une notification de félicitations est envoyée Et le statut "Complété le 22/01/2026" est visible dans l'historique Scénario: Temps total passé sur l'audio-guide Étant donné qu'un utilisateur a écouté un audio-guide sur 2 sessions: | session | durée | | 1 | 25 min | | 2 | 18 min | Quand les statistiques sont calculées Alors le temps total est "43 minutes" Et il est affiché dans l'historique personnel Scénario: Liste des audio-guides "En cours" dans le profil Étant donné qu'un utilisateur a 3 audio-guides en cours: | audio_guide | progression | | Visite du Louvre | 6/12 | | Safari du Paugre | 3/8 | | Circuit Loire à Vélo | 12/15 | Quand il consulte son profil "Audio-guides" Alors la section "📍 En cours" affiche les 3 audio-guides Et chaque élément montre la progression sous forme de barre Scénario: Liste des audio-guides "Complétés" dans le profil Étant donné qu'un utilisateur a complété 2 audio-guides: | audio_guide | date_completion | | Tour de Paris | 2026-01-15 | | Découverte de Lyon | 2026-01-20 | Quand il consulte son profil "Audio-guides" Alors la section "✅ Complétés" affiche les 2 audio-guides Et la date de complétion est visible Scénario: Badge "Complétiste" pour 10 audio-guides complétés Étant donné qu'un utilisateur complète son 10ème audio-guide Quand la complétion est enregistrée Alors un badge "🏆 Complétiste" est débloqué Et il apparaît sur son profil Et une notification est envoyée: """ 🎉 Badge débloqué : Complétiste Vous avez complété 10 audio-guides ! """ Plan du Scénario: Niveaux de badges selon nombre d'audio-guides complétés Étant donné qu'un utilisateur complète audio-guides Quand le badge est attribué Alors il reçoit le badge "" Exemples: | nombre | badge | | 1 | 🎧 Premier audio-guide | | 5 | 🗺️ Explorateur | | 10 | 🏆 Complétiste | | 25 | 🌟 Expert | | 50 | 💎 Maître audio-guideur | # 16.8 - Métriques créateur Scénario: Dashboard créateur - Statistiques par audio-guide Étant donné qu'un créateur a publié l'audio-guide "Visite du Louvre" Quand il consulte son dashboard Alors les métriques suivantes sont affichées: | métrique | valeur | | Écoutes totales | 1542 | | Écoutes complètes (>80%) | 892 | | Taux de complétion moyen | 58% | | Temps d'écoute total | 423h | | Séquence la plus écoutée | Séq. 3 | | Séquence la moins écoutée | Séq. 11 | Scénario: Graphique de complétion par séquence Étant donné un audio-guide de 12 séquences Quand le créateur consulte les statistiques détaillées Alors un graphique en barres affiche: | séquence | taux_completion | | 1 | 100% | | 2 | 95% | | 3 | 89% | | ... | ... | | 12 | 58% | Scénario: Détection des points d'abandon Étant donné qu'un audio-guide a un taux de complétion de 58% Et que 35% des utilisateurs abandonnent à la séquence 7 Quand le créateur consulte les insights Alors un avertissement s'affiche: """ ⚠️ Point d'abandon détecté 35% des utilisateurs abandonnent à la séquence 7 "Aile Richelieu" Durée : 8 min Suggestion : Réduire la durée ou rendre plus captivant """ Scénario: Heatmap géographique des écoutes Étant donné un audio-guide géolocalisé Quand le créateur consulte la heatmap Alors une carte affiche: | élément | description | | Densité d'écoutes | Zones rouge/orange/jaune selon écoutes | | Points GPS | Marqueurs sur chaque point | | Statistiques par point | Nombre d'écoutes par zone | Scénario: Temps moyen par séquence Étant donné qu'un créateur analyse son audio-guide Quand il consulte les statistiques temporelles Alors il voit pour chaque séquence: | séquence | durée_audio | temps_ecoute_moyen | ecart | | 1 | 2:15 | 2:10 | -5s | | 2 | 1:48 | 1:30 | -18s | | 3 | 3:42 | 3:40 | -2s | Scénario: Notification créateur pour milestone Étant donné qu'un audio-guide atteint 1000 écoutes Quand le seuil est franchi Alors une notification est envoyée au créateur: """ 🎉 Félicitations ! Votre audio-guide "Visite du Louvre" a atteint 1000 écoutes ! Taux de complétion : 58% """ # Cas d'erreur et limites Scénario: Corruption de données de sauvegarde Étant donné qu'une sauvegarde locale (SQLite) est corrompue Quand l'application tente de charger la progression Alors une récupération depuis le cloud est tentée Et si réussie, les données cloud sont restaurées Et la base locale est reconstruite Scénario: Échec de synchronisation cloud Étant donné que l'API cloud est indisponible Quand une tentative de synchronisation est effectuée Alors l'application continue avec sauvegarde locale uniquement Et un retry automatique est programmé dans 5 minutes Et l'icône "☁️ Non synchronisé" reste affichée Scénario: Suppression accidentelle de progression (récupération) Étant donné qu'un utilisateur réinitialise un audio-guide par erreur Quand il contacte le support dans les 7 jours Alors l'équipe peut restaurer la progression depuis les backups Et les données sont récupérables (backup quotidien conservé 30 jours) Scénario: Nettoyage automatique des vieilles progressions Étant donné qu'une progression n'a pas été mise à jour depuis 6 mois Quand le nettoyage automatique s'exécute Alors la progression est archivée (mais pas supprimée) Et l'utilisateur peut la restaurer via l'historique