Réorganise la documentation du projet selon les principes du Domain-Driven Design (DDD) pour améliorer la cohésion, la maintenabilité et l'alignement avec l'architecture modulaire du backend. **Structure cible:** ``` docs/domains/ ├── README.md (Context Map) ├── _shared/ (Core Domain) ├── recommendation/ (Supporting Subdomain) ├── content/ (Supporting Subdomain) ├── moderation/ (Supporting Subdomain) ├── advertising/ (Generic Subdomain) ├── premium/ (Generic Subdomain) └── monetization/ (Generic Subdomain) ``` **Changements effectués:** Phase 1: Création de l'arborescence des 7 bounded contexts Phase 2: Déplacement des règles métier (01-19) vers domains/*/rules/ Phase 3: Déplacement des diagrammes d'entités vers domains/*/entities/ Phase 4: Déplacement des diagrammes flux/états/séquences vers domains/*/ Phase 5: Création des README.md pour chaque domaine Phase 6: Déplacement des features Gherkin vers domains/*/features/ Phase 7: Création du Context Map (domains/README.md) Phase 8: Mise à jour de mkdocs.yml pour la nouvelle navigation Phase 9: Correction automatique des liens internes (script fix-markdown-links.sh) Phase 10: Nettoyage de l'ancienne structure (regles-metier/, diagrammes/, features/) **Configuration des tests:** - Makefile: godog run docs/domains/*/features/ - scripts/generate-bdd-docs.py: features_dir → docs/domains **Avantages:** ✅ Cohésion forte: toute la doc d'un domaine au même endroit ✅ Couplage faible: domaines indépendants, dépendances explicites ✅ Navigabilité améliorée: README par domaine = entrée claire ✅ Alignement code/docs: miroir de backend/internal/ ✅ Onboarding facilité: exploration domaine par domaine ✅ Tests BDD intégrés: features au plus près des règles métier Voir docs/REFACTOR-DDD.md pour le plan complet.
308 lines
14 KiB
Gherkin
308 lines
14 KiB
Gherkin
# language: fr
|
||
Fonctionnalité: Sources de revenus créateurs
|
||
En tant que créateur monétisé
|
||
Je veux générer des revenus via publicités et abonnés Premium
|
||
Afin d'être rémunéré pour mon travail
|
||
|
||
Contexte:
|
||
Étant donné que je suis un créateur avec la monétisation activée
|
||
Et que mon KYC est validé
|
||
|
||
# ===== PUBLICITÉS (UTILISATEURS GRATUITS) =====
|
||
|
||
Scénario: CPM créateur de 3€ / 1000 écoutes complètes
|
||
Étant donné que mes contenus ont généré 1000 écoutes complètes par des utilisateurs gratuits
|
||
Quand le calcul des revenus du mois est effectué
|
||
Alors je touche 3.00€ pour ces 1000 écoutes
|
||
Et ce montant est ajouté à mon solde disponible
|
||
|
||
Scénario: 10 000 écoutes gratuits → 30€ de revenus pub
|
||
Étant donné que mes contenus ont généré 10 000 écoutes complètes (utilisateurs gratuits)
|
||
Quand le mois se termine
|
||
Alors je touche 30.00€ de revenus publicitaires
|
||
Et ces revenus sont visibles en temps réel dans mon tableau de bord
|
||
|
||
Scénario: 50 000 écoutes gratuits → 150€ de revenus pub
|
||
Étant donné que mes contenus ont généré 50 000 écoutes complètes (utilisateurs gratuits)
|
||
Quand le mois se termine
|
||
Alors je touche 150.00€ de revenus publicitaires
|
||
|
||
Scénario: 100 000 écoutes gratuits → 300€ de revenus pub
|
||
Étant donné que mes contenus ont généré 100 000 écoutes complètes (utilisateurs gratuits)
|
||
Quand le mois se termine
|
||
Alors je touche 300.00€ de revenus publicitaires
|
||
|
||
Scénario: Répartition économique - Plateforme garde 94%
|
||
Étant donné qu'une publicité facturée 0.05€/écoute génère 50€ CPM
|
||
Quand la plateforme calcule la répartition
|
||
Alors le créateur touche 3€ (6% du CA pub)
|
||
Et la plateforme garde 47€ (94%) pour:
|
||
| poste budgétaire | coût estimé |
|
||
| CDN + infrastructure | 10-15€ |
|
||
| Modération + support | 5-10€ |
|
||
| Développement + R&D | 10-15€ |
|
||
| Marge opérationnelle | 10-15€ |
|
||
|
||
Scénario: Écoute complète = ≥80% du contenu écouté
|
||
Étant donné qu'un utilisateur gratuit écoute mon contenu de 10 minutes
|
||
Quand il écoute 8 minutes (80%)
|
||
Alors l'écoute compte comme "complète"
|
||
Et je génère 0.003€ de revenus pub (3€/1000)
|
||
|
||
Scénario: Écoute incomplète <80% ne compte pas
|
||
Étant donné qu'un utilisateur gratuit écoute mon contenu de 10 minutes
|
||
Mais il skip après 5 minutes (50%)
|
||
Quand le calcul des revenus est effectué
|
||
Alors cette écoute ne compte pas comme "complète"
|
||
Et je ne génère aucun revenu publicitaire pour cette écoute
|
||
|
||
Scénario: Écoutes Premium ne comptent pas pour les revenus pub
|
||
Étant donné qu'un utilisateur Premium écoute 100% de mon contenu
|
||
Quand le calcul des revenus publicitaires est effectué
|
||
Alors cette écoute ne compte pas dans les revenus pub
|
||
Car les utilisateurs Premium ne voient pas de publicités
|
||
Mais elle compte dans les revenus Premium (système séparé)
|
||
|
||
Scénario: Détection bots - Écoutes exclues
|
||
Étant donné qu'un bot génère 10 000 écoutes artificielles sur mes contenus
|
||
Quand le système détecte le pattern suspect (rate limiting, IP unique, etc.)
|
||
Alors ces écoutes sont marquées comme frauduleuses
|
||
Et elles sont exclues du calcul des revenus publicitaires
|
||
|
||
Scénario: Comparaison avec YouTube (3-5€/1000 vues)
|
||
Étant donné que YouTube paie 3-5€/1000 vues
|
||
Quand RoadWave fixe le CPM créateur à 3€/1000 écoutes
|
||
Alors le tarif est aligné sur le bas de la fourchette YouTube
|
||
Et cela est compétitif pour un MVP sans marché publicitaire mature
|
||
|
||
Scénario: Comparaison avec Spotify (3-4€/1000 écoutes)
|
||
Étant donné que Spotify paie ~3-4€/1000 écoutes
|
||
Quand RoadWave fixe le CPM créateur à 3€/1000 écoutes
|
||
Alors le tarif est aligné sur l'industrie musicale
|
||
Et les créateurs audio peuvent anticiper des revenus similaires
|
||
|
||
Scénario: Tableau de bord - Revenus pub temps réel
|
||
Étant donné que j'accède à mon tableau de bord créateur
|
||
Quand je consulte mes revenus publicitaires
|
||
Alors je vois:
|
||
| métrique | valeur exemple |
|
||
| Écoutes complètes ce mois (gratuit)| 23 456 |
|
||
| Revenus pub ce mois | 70.37€ |
|
||
| CPM effectif | 3.00€ |
|
||
Et ces valeurs sont mises à jour toutes les 10 minutes
|
||
|
||
# ===== ABONNÉS PREMIUM =====
|
||
|
||
Scénario: Répartition 70/30 - Créateur touche 70%
|
||
Étant donné qu'un utilisateur Premium paie 4.99€/mois
|
||
Quand la répartition est calculée
|
||
Alors 3.49€ sont reversés aux créateurs écoutés (70%)
|
||
Et 1.50€ sont gardés par la plateforme (30%)
|
||
|
||
Scénario: Utilisateur écoute 3 créateurs - Répartition proportionnelle
|
||
Étant donné qu'un utilisateur Premium paie 4.99€/mois
|
||
Et qu'il écoute 3 créateurs ce mois:
|
||
| créateur | temps écoute | ratio |
|
||
| Créateur A | 10h | 50% |
|
||
| Créateur B | 6h | 30% |
|
||
| Créateur C | 4h | 20% |
|
||
Quand le calcul des revenus Premium est effectué
|
||
Alors la répartition est:
|
||
| créateur | revenus |
|
||
| Créateur A | 1.75€ |
|
||
| Créateur B | 1.05€ |
|
||
| Créateur C | 0.70€ |
|
||
Et la somme totale versée aux créateurs est 3.50€ (70% de 4.99€)
|
||
|
||
Scénario: Calcul SQL proportionnel au temps d'écoute
|
||
Étant donné qu'un utilisateur Premium a écouté plusieurs créateurs
|
||
Quand le système calcule les revenus du mois
|
||
Alors la requête SQL suivante est exécutée:
|
||
```sql
|
||
SELECT
|
||
creator_id,
|
||
SUM(listen_duration_seconds) AS total_seconds,
|
||
(SUM(listen_duration_seconds) / (SELECT SUM(listen_duration_seconds) FROM premium_listens WHERE user_id = :user_id AND month = :current_month)) AS ratio,
|
||
(4.99 * 0.70 * ratio) AS revenue_euros
|
||
FROM premium_listens
|
||
WHERE user_id = :user_id
|
||
AND month = :current_month
|
||
GROUP BY creator_id;
|
||
```
|
||
|
||
Scénario: Utilisateur écoute un seul créateur - 100% à ce créateur
|
||
Étant donné qu'un utilisateur Premium paie 4.99€/mois
|
||
Et qu'il n'écoute qu'un seul créateur (moi)
|
||
Quand le mois se termine
|
||
Alors je touche 3.49€ (70% de 4.99€)
|
||
Et je reçois 100% de la part créateurs
|
||
|
||
Scénario: Utilisateur Premium inactif - Aucun revenu généré
|
||
Étant donné qu'un utilisateur Premium paie 4.99€/mois
|
||
Mais qu'il n'écoute aucun contenu ce mois
|
||
Quand le calcul des revenus Premium est effectué
|
||
Alors aucun créateur ne reçoit de revenus de cet utilisateur
|
||
Et les 3.49€ de la part créateurs restent à la plateforme
|
||
Et cela couvre les coûts d'infrastructure
|
||
|
||
Scénario: Comparaison avec YouTube Premium (70/30)
|
||
Étant donné que YouTube Premium reverse 70% aux créateurs
|
||
Quand RoadWave fixe également 70/30
|
||
Alors le modèle est aligné sur le standard industrie
|
||
Et les créateurs ont confiance dans l'équité du système
|
||
|
||
Scénario: Comparaison avec Spotify (70/30)
|
||
Étant donné que Spotify reverse 70% aux artistes
|
||
Quand RoadWave fixe également 70/30
|
||
Alors le modèle est identique à Spotify
|
||
Et les créateurs audio comprennent facilement le système
|
||
|
||
Scénario: Apple Music moins avantageux (52/48)
|
||
Étant donné qu'Apple Music ne reverse que 52% aux artistes
|
||
Quand RoadWave offre 70% aux créateurs
|
||
Alors RoadWave est plus avantageux de 18 points
|
||
Et cela devient un argument marketing fort
|
||
|
||
Scénario: Justification équité - Créateurs les plus écoutés gagnent plus
|
||
Étant donné que 2 créateurs ont le même nombre d'abonnés Premium
|
||
Mais que le Créateur A est écouté 20h/mois et le Créateur B seulement 2h/mois
|
||
Quand les revenus Premium sont calculés
|
||
Alors le Créateur A gagne 10× plus que le Créateur B
|
||
Et cela récompense la qualité et l'engagement (pas juste l'abonnement)
|
||
|
||
Scénario: Pas de "winner takes all" - Équité totale
|
||
Étant donné qu'un utilisateur Premium écoute 10 créateurs différents
|
||
Quand les revenus sont calculés
|
||
Alors chacun des 10 créateurs reçoit sa part proportionnelle
|
||
Et il n'y a pas de système où un seul créateur prend tout
|
||
|
||
Scénario: Marge plateforme 30% couvre absence revenus pub Premium
|
||
Étant donné qu'un utilisateur Premium ne voit aucune publicité
|
||
Quand la plateforme calcule ses revenus
|
||
Alors elle ne touche que les 30% de l'abonnement Premium (1.50€)
|
||
Et cette marge compense la perte des revenus publicitaires (qui auraient été ~47€/1000 écoutes)
|
||
|
||
Scénario: Tableau de bord - Revenus Premium temps réel
|
||
Étant donné que j'accède à mon tableau de bord créateur
|
||
Quand je consulte mes revenus Premium
|
||
Alors je vois:
|
||
| métrique | valeur exemple |
|
||
| Abonnés Premium actifs ayant écouté | 47 |
|
||
| Heures d'écoute Premium ce mois | 234h |
|
||
| Revenus Premium ce mois | 89.23€ |
|
||
Et ces valeurs sont mises à jour toutes les 10 minutes
|
||
|
||
# ===== CUMUL REVENUS PUB + PREMIUM =====
|
||
|
||
Scénario: Revenus cumulés pub + premium
|
||
Étant donné que j'ai généré ce mois:
|
||
| source | montant |
|
||
| Revenus pub | 150.00€ |
|
||
| Revenus Premium | 89.23€ |
|
||
Quand je consulte mon solde disponible
|
||
Alors le total est 239.23€
|
||
Et ce solde sera versé le 15 du mois prochain (si ≥50€)
|
||
|
||
Scénario: Dashboard créateur - Vue d'ensemble
|
||
Étant donné que j'accède à mon tableau de bord créateur
|
||
Quand je consulte la page revenus
|
||
Alors je vois:
|
||
```
|
||
===== REVENUS DU MOIS EN COURS =====
|
||
|
||
📊 Publicités (utilisateurs gratuits)
|
||
- Écoutes complètes: 50,234
|
||
- Revenus pub: 150.70€
|
||
|
||
👑 Abonnés Premium
|
||
- Abonnés actifs: 47
|
||
- Heures d'écoute: 234h
|
||
- Revenus Premium: 89.23€
|
||
|
||
💰 TOTAL CE MOIS: 239.93€
|
||
|
||
===== HISTORIQUE =====
|
||
Mois dernier: 178.45€ (versé le 15/01)
|
||
Il y a 2 mois: 156.78€ (versé le 15/12)
|
||
```
|
||
|
||
Scénario: Export comptable CSV pour expert-comptable
|
||
Étant donné que je clique sur "Exporter pour comptable"
|
||
Quand l'export est généré
|
||
Alors je télécharge un fichier CSV:
|
||
```csv
|
||
Mois,Revenus Pub,Revenus Premium,Total,Statut
|
||
2025-01,150.70,89.23,239.93,En attente versement
|
||
2024-12,123.45,55.00,178.45,Versé le 15/01/2025
|
||
2024-11,100.30,56.48,156.78,Versé le 15/12/2024
|
||
```
|
||
Et je peux transmettre ce fichier à mon expert-comptable
|
||
|
||
Scénario: Notification hebdomadaire progression revenus
|
||
Étant donné que je suis créateur monétisé
|
||
Quand chaque lundi matin arrive
|
||
Alors je reçois un email récapitulatif:
|
||
"""
|
||
📊 Vos revenus de la semaine dernière:
|
||
- Revenus pub: +23.45€ (3,456 écoutes)
|
||
- Revenus Premium: +12.78€ (12 abonnés actifs)
|
||
- Total semaine: 36.23€
|
||
- Projection mois: ~150€
|
||
"""
|
||
|
||
Scénario: Graphique évolution revenus sur 12 mois
|
||
Étant donné que je suis monétisé depuis 12 mois
|
||
Quand j'accède à mes statistiques
|
||
Alors je vois un graphique en courbes montrant:
|
||
| mois | revenus pub | revenus premium | total |
|
||
| Jan 25 | 150€ | 89€ | 239€ |
|
||
| Déc 24 | 123€ | 55€ | 178€ |
|
||
| Nov 24 | 100€ | 56€ | 156€ |
|
||
| ... | ... | ... | ... |
|
||
Et cela m'aide à suivre ma progression
|
||
|
||
Scénario: Top 3 contenus les plus rentables du mois
|
||
Étant donné que j'ai publié 20 contenus ce mois
|
||
Quand je consulte mes statistiques détaillées
|
||
Alors je vois mon top 3 contenus:
|
||
| titre | écoutes | revenus pub | revenus premium | total |
|
||
| Mon meilleur épisode | 12,345 | 37.04€ | 23.45€ | 60.49€ |
|
||
| Discussion tech | 8,901 | 26.70€ | 15.67€ | 42.37€ |
|
||
| Road trip Bretagne | 7,234 | 21.70€ | 12.34€ | 34.04€ |
|
||
Et cela m'aide à comprendre quel type de contenu plaît le plus
|
||
|
||
Scénario: Alertes seuils de revenus
|
||
Étant donné que j'ai activé les notifications de seuils
|
||
Quand mes revenus du mois dépassent 100€ pour la première fois
|
||
Alors je reçois une notification:
|
||
"""
|
||
🎉 Félicitations ! Vous venez de dépasser 100€ de revenus ce mois !
|
||
Continuez comme ça !
|
||
"""
|
||
|
||
Scénario: Performance calcul avec 100 000 créateurs
|
||
Étant donné que RoadWave a 100 000 créateurs monétisés
|
||
Quand le calcul des revenus mensuels est lancé le dernier jour du mois
|
||
Alors un job asynchrone traite tous les créateurs
|
||
Et le calcul prend environ 2-4 heures pour tous les créateurs
|
||
Et les résultats sont stockés dans la table monthly_revenues
|
||
|
||
Scénario: Cache Redis pour métriques temps réel
|
||
Étant donné que je consulte mon dashboard plusieurs fois par jour
|
||
Quand la page se charge
|
||
Alors les compteurs sont récupérés depuis Redis:
|
||
| clé Redis | valeur exemple |
|
||
| creator:[id]:complete_listens:202501 | 50234 |
|
||
| creator:[id]:premium_hours:202501 | 234 |
|
||
| creator:[id]:revenue_ads:202501 | 150.70 |
|
||
| creator:[id]:revenue_premium:202501 | 89.23 |
|
||
Et le temps de réponse est <30ms
|
||
|
||
Scénario: Prévision revenus fin de mois
|
||
Étant donné que nous sommes le 20 du mois
|
||
Et que mes revenus actuels sont 160€
|
||
Quand le système calcule la projection
|
||
Alors il estime les revenus fin de mois à ~240€ (extrapolation linéaire)
|
||
Et affiche "Projection fin de mois: ~240€"
|
||
Et cela m'aide à anticiper mes revenus
|