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.
262 lines
12 KiB
Gherkin
262 lines
12 KiB
Gherkin
# language: fr
|
||
Fonctionnalité: Validation et modération des publicités
|
||
En tant que modérateur RoadWave
|
||
Je veux valider manuellement toutes les publicités avant diffusion
|
||
Afin de garantir la qualité et la légalité des contenus publicitaires
|
||
|
||
Contexte:
|
||
Étant donné que l'API RoadWave est disponible
|
||
Et qu'un modérateur RoadWave est connecté
|
||
|
||
Scénario: Validation manuelle obligatoire avant diffusion
|
||
Étant donné qu'un publicitaire a créé une campagne
|
||
Et que le paiement de 300€ a été effectué
|
||
Quand la campagne est soumise
|
||
Alors elle passe en statut "En attente de validation"
|
||
Et elle est ajoutée à la file d'attente des modérateurs
|
||
Et la diffusion ne démarre PAS avant validation manuelle
|
||
Et le publicitaire reçoit un email "Votre campagne est en cours de validation (24-48h)"
|
||
|
||
Scénario: Délai de validation 24-48h ouvrées
|
||
Étant donné qu'une campagne est soumise le lundi 10h
|
||
Quand le modérateur la valide le mardi 15h
|
||
Alors le délai est de 29h (dans les 48h ouvrées)
|
||
Et le publicitaire reçoit une notification "Votre campagne est approuvée"
|
||
|
||
Scénario: Validation dépassant 48h avec notification
|
||
Étant donné qu'une campagne est soumise le lundi 10h
|
||
Quand 48h ouvrées se sont écoulées
|
||
Et que la campagne n'est toujours pas validée
|
||
Alors le publicitaire reçoit un email automatique:
|
||
"""
|
||
Validation en cours - Délai prolongé
|
||
|
||
Votre campagne nécessite une analyse approfondie.
|
||
Nous vous contacterons sous 24h supplémentaires.
|
||
"""
|
||
Et un modérateur senior est assigné automatiquement
|
||
|
||
Scénario: Acceptation de campagne publicitaire
|
||
Étant donné qu'une campagne est en attente de validation
|
||
Et que l'audio respecte toutes les règles
|
||
Quand le modérateur clique sur "Approuver"
|
||
Alors le statut passe à "Approuvée"
|
||
Et la campagne démarre à la date programmée
|
||
Et le publicitaire reçoit un email de confirmation
|
||
Et le budget commence à être consommé dès le début
|
||
|
||
Scénario: Refus de campagne avec motif détaillé
|
||
Étant donné qu'une campagne contient du contenu alcool
|
||
Quand le modérateur clique sur "Refuser"
|
||
Et qu'il sélectionne le motif "Contenu interdit: Alcool"
|
||
Et qu'il ajoute le commentaire "La publicité pour l'alcool est interdite en France"
|
||
Alors le statut passe à "Refusée"
|
||
Et le publicitaire reçoit un email détaillé avec:
|
||
| Champ | Valeur |
|
||
| Motif | Contenu interdit: Alcool |
|
||
| Commentaire | La publicité pour l'alcool est interdite en France |
|
||
| Action requise | Modifier votre contenu et soumettre à nouveau |
|
||
Et un remboursement automatique de 300€ est déclenché
|
||
|
||
Scénario: Remboursement automatique après refus
|
||
Étant donné qu'une campagne à 500€ est refusée
|
||
Quand le statut passe à "Refusée"
|
||
Alors un remboursement Mangopay de 500€ est initié automatiquement
|
||
Et le délai de remboursement est de 5-7 jours ouvrés
|
||
Et le publicitaire reçoit un email "Remboursement en cours"
|
||
|
||
Scénario: Contenus interdits - Alcool
|
||
Étant donné qu'une publicité mentionne "Whisky premium 40°"
|
||
Quand le modérateur écoute l'audio
|
||
Alors il doit refuser la campagne
|
||
Et sélectionner le motif "Contenu interdit: Alcool"
|
||
Car la publicité pour l'alcool est interdite en France
|
||
|
||
Scénario: Contenus interdits - Tabac
|
||
Étant donné qu'une publicité mentionne "Cigarettes électroniques"
|
||
Quand le modérateur écoute l'audio
|
||
Alors il doit refuser la campagne
|
||
Et sélectionner le motif "Contenu interdit: Tabac/Vape"
|
||
Car la publicité pour le tabac et dérivés est interdite
|
||
|
||
Scénario: Contenus interdits - Jeux d'argent
|
||
Étant donné qu'une publicité mentionne "Gagnez 10 000€ - Paris sportifs"
|
||
Quand le modérateur écoute l'audio
|
||
Alors il doit refuser la campagne
|
||
Et sélectionner le motif "Contenu interdit: Jeux d'argent"
|
||
Car la publicité pour les jeux d'argent est soumise à régulation stricte
|
||
|
||
Scénario: Contenus interdits - Politique pendant campagne électorale
|
||
Étant donné qu'une publicité politique est soumise
|
||
Et que nous sommes en période de campagne électorale officielle
|
||
Quand le modérateur écoute l'audio
|
||
Alors il doit refuser la campagne
|
||
Et sélectionner le motif "Contenu interdit: Publicité politique (période électorale)"
|
||
|
||
Scénario: Contenus interdits - Contenu sexuel
|
||
Étant donné qu'une publicité contient des propos sexuellement explicites
|
||
Quand le modérateur écoute l'audio
|
||
Alors il doit refuser la campagne
|
||
Et sélectionner le motif "Contenu interdit: Contenu sexuel"
|
||
|
||
Scénario: Contenus interdits - Violence
|
||
Étant donné qu'une publicité contient des descriptions violentes
|
||
Quand le modérateur écoute l'audio
|
||
Alors il doit refuser la campagne
|
||
Et sélectionner le motif "Contenu interdit: Violence"
|
||
|
||
Scénario: Contenu légal autorisé - Commerce local
|
||
Étant donné qu'une publicité pour un restaurant local dit "Découvrez notre menu du jour"
|
||
Quand le modérateur écoute l'audio
|
||
Alors il doit approuver la campagne
|
||
Car le contenu est légal et conforme
|
||
|
||
Scénario: Contenu légal autorisé - Service professionnel
|
||
Étant donné qu'une publicité pour un garage dit "Révision complète à partir de 99€"
|
||
Quand le modérateur écoute l'audio
|
||
Alors il doit approuver la campagne
|
||
Car le contenu est légal et informatif
|
||
|
||
Scénario: Critères de validation - Qualité audio
|
||
Étant donné qu'une publicité a une qualité audio très basse (bruits, saturation)
|
||
Quand le modérateur écoute l'audio
|
||
Alors il peut refuser avec le motif "Qualité audio insuffisante"
|
||
Et recommander "Veuillez soumettre un fichier audio de meilleure qualité"
|
||
|
||
Scénario: Critères de validation - Classification d'âge correcte
|
||
Étant donné qu'une publicité contient du langage familier
|
||
Et qu'elle est classée "Tout public"
|
||
Quand le modérateur écoute l'audio
|
||
Alors il peut refuser avec le motif "Classification d'âge incorrecte"
|
||
Et recommander "Reclasser en 13+ minimum"
|
||
|
||
Scénario: Critères de validation - Respect réglementation française
|
||
Étant donné qu'une publicité fait des promesses mensongères "Perdez 10kg en 1 semaine"
|
||
Quand le modérateur écoute l'audio
|
||
Alors il doit refuser avec le motif "Non-conformité réglementaire: Publicité mensongère"
|
||
Car cela viole la réglementation sur la publicité trompeuse
|
||
|
||
Scénario: File d'attente modération priorisée
|
||
Étant donné que 10 campagnes sont en attente de validation
|
||
Et que la campagne A a été soumise il y a 40h
|
||
Et que la campagne B a été soumise il y a 2h
|
||
Quand le modérateur consulte sa file
|
||
Alors la campagne A apparaît en premier (priorité temporelle)
|
||
Et un badge "Urgente - >40h" est affiché
|
||
|
||
Scénario: Dashboard modération - Vue d'ensemble
|
||
Étant donné que je suis modérateur
|
||
Quand j'accède au dashboard modération publicités
|
||
Alors je vois:
|
||
| Métrique | Exemple valeur |
|
||
| Campagnes en attente | 5 |
|
||
| Délai moyen de validation | 28h |
|
||
| Campagnes validées aujourd'hui | 12 |
|
||
| Campagnes refusées aujourd'hui | 3 |
|
||
| Taux d'acceptation | 80% |
|
||
|
||
Scénario: Transcription automatique pour aide modération
|
||
Étant donné qu'une publicité audio est soumise
|
||
Quand le système traite l'audio
|
||
Alors une transcription automatique est générée via Whisper
|
||
Et elle est affichée au modérateur pour faciliter la revue
|
||
Et elle permet une recherche par mots-clés (alcool, tabac, etc.)
|
||
|
||
Scénario: Détection automatique mots-clés interdits
|
||
Étant donné qu'une publicité audio est soumise
|
||
Quand la transcription contient "whisky" ou "vodka"
|
||
Alors un flag automatique "⚠️ Alcool détecté" est ajouté
|
||
Et la campagne est priorisée pour validation manuelle rapide
|
||
Et le modérateur est alerté du contenu potentiellement interdit
|
||
|
||
Scénario: Historique modération publicitaire
|
||
Étant donné qu'un publicitaire a eu 2 campagnes refusées
|
||
Quand il soumet une 3ème campagne
|
||
Alors le modérateur voit l'historique:
|
||
| Date | Statut | Motif |
|
||
| 2026-01-15 | Refusée | Contenu interdit: Alcool |
|
||
| 2026-01-20 | Refusée | Qualité audio faible |
|
||
Et il peut en tenir compte dans sa décision
|
||
|
||
Scénario: Appel possible après refus
|
||
Étant donné que ma campagne a été refusée pour "Classification incorrecte"
|
||
Quand je conteste la décision via le formulaire d'appel
|
||
Alors un modérateur senior revoit la campagne
|
||
Et il peut approuver si la classification est en fait correcte
|
||
Et le délai de réponse est de 48-72h
|
||
|
||
Scénario: Notification temps réel pour modérateurs
|
||
Étant donné que je suis modérateur connecté
|
||
Quand une nouvelle campagne est soumise
|
||
Alors je reçois une notification in-app
|
||
Et le compteur "Campagnes en attente" s'incrémente en temps réel
|
||
Et je peux cliquer pour consulter immédiatement
|
||
|
||
Scénario: Statistiques conformité par catégorie
|
||
Étant donné que je suis admin modération
|
||
Quand je consulte les statistiques mensuelles
|
||
Alors je vois les motifs de refus:
|
||
| Motif | Nombre | Pourcentage |
|
||
| Alcool | 15 | 30% |
|
||
| Qualité audio | 12 | 24% |
|
||
| Classification erronée | 10 | 20% |
|
||
| Publicité mensongère | 8 | 16% |
|
||
| Autres | 5 | 10% |
|
||
|
||
Scénario: Export rapport modération
|
||
Étant donné que je suis modérateur senior
|
||
Quand j'exporte le rapport mensuel
|
||
Alors je reçois un fichier CSV avec:
|
||
| Colonne |
|
||
| Campagne ID |
|
||
| Publicitaire |
|
||
| Date soumission |
|
||
| Date décision |
|
||
| Statut |
|
||
| Motif (si refus) |
|
||
| Modérateur |
|
||
Et je peux l'analyser dans Excel
|
||
|
||
Scénario: Validation partielle avec demande modification
|
||
Étant donné qu'une campagne a un contenu acceptable
|
||
Mais que la classification d'âge est incorrecte
|
||
Quand le modérateur clique sur "Demander modification"
|
||
Alors le publicitaire reçoit un email:
|
||
"""
|
||
Modification requise
|
||
|
||
Votre campagne nécessite un ajustement:
|
||
- Reclasser de "Tout public" à "13+"
|
||
|
||
Veuillez modifier et soumettre à nouveau.
|
||
Budget conservé, pas de remboursement.
|
||
"""
|
||
Et le statut devient "Modification requise"
|
||
Et le publicitaire peut modifier sans repayer
|
||
|
||
Plan du Scénario: Contenus interdits automatiquement détectés
|
||
Étant donné qu'une publicité contient le mot <mot_cle>
|
||
Quand la transcription automatique est analysée
|
||
Alors un flag <flag> est ajouté
|
||
Et le motif de refus suggéré est <motif>
|
||
|
||
Exemples:
|
||
| mot_cle | flag | motif |
|
||
| whisky | ⚠️ Alcool | Contenu interdit: Alcool |
|
||
| vodka | ⚠️ Alcool | Contenu interdit: Alcool |
|
||
| cigarette | ⚠️ Tabac | Contenu interdit: Tabac |
|
||
| casino | ⚠️ Jeux argent | Contenu interdit: Jeux |
|
||
| paris sportifs | ⚠️ Jeux argent | Contenu interdit: Jeux |
|
||
|
||
Plan du Scénario: Délais de validation selon soumission
|
||
Étant donné qu'une campagne est soumise <jour> à <heure>
|
||
Quand elle est validée <delai> heures plus tard
|
||
Alors le statut est <conformite>
|
||
|
||
Exemples:
|
||
| jour | heure | delai | conformite |
|
||
| Lundi | 10h | 24 | Dans les délais (24h) |
|
||
| Lundi | 10h | 48 | Dans les délais (48h) |
|
||
| Lundi | 10h | 50 | Hors délais (>48h) |
|
||
| Vendredi| 16h | 72 | Dans les délais (we) |
|