edtech / docs /business /backlog.md
CognxSafeTrack
feat(billing): complete billing system, push notifications, and tech debt fixes
8280d7d

📋 Backlog XAMLÉ — État complet au 2026-05-12

Audit exhaustif de ce qui est implémenté, incomplet, ou manquant. Toutes les sections "À faire" sont classées par priorité business.


✅ CE QUI EST ENTIÈREMENT IMPLÉMENTÉ

Infrastructure & Core

  • Architecture async-first (réponse 200 OK immédiate, BullMQ)
  • Multi-tenancy Prisma via AsyncLocalStorage
  • JWT + API Key auth, org isolation middleware
  • Encryption/décryption des secrets org (clés API, tokens)
  • Rate limiting, CORS, error handler global
  • Logs structurés (Pino + Logtail), Sentry
  • Redis locks idempotence (300s) sur tous les jobs LLM

Worker — Handlers (20/20 opérationnels)

  • OnboardingHandler — langue, secteur, activité, flow config
  • ExerciseHandler — évaluation + grading IA
  • FeedbackHandler — feedback IA + deep-dive + tracking usage ✅
  • MediaHandler — transcription Whisper + vision Base64 + tracking audio ✅
  • MessageHandler — envoi texte/boutons/listes + tracking WA ✅
  • ContentHandler — envoi contenu jour
  • NavigationHandler — navigation jours/leçons
  • CommandHandler — SEED, MENU_HISTORIQUE, DAY_X
  • BroadcastHandler — diffusion campagnes
  • CampaignHandler — traitement campagnes
  • AIAgentHandler — mode agent IA (RAG + KB)
  • NudgeHandler — relances planifiées
  • AdminHandler — override audio admin
  • EnrollHandler — enrollment utilisateur
  • KBProcessor — indexation knowledge base
  • WebhookHandler — forward webhook avec retries
  • DirectMessageHandler — message direct
  • EmailHandler — welcome(1), reset pwd(2), alerte quota(3), rapport mensuel(4) ✅

API Routes (12/12 implémentées)

  • Auth, Admin, Organizations, AI, Analytics, Billing, Campaigns, Notifications, Payments, Student, WhatsApp, Internal

Admin UI (21/21 pages fonctionnelles)

  • Dashboard, Analytics, Conversations (CRM + EdTech), Contacts, Content (tracks/jours), LiveFeed, TrainingLab, KnowledgeBase, CampaignHistory, Templates, AIAgentSetup, ClientsManagement, Billing, Settings, Users, Onboarding, ResetPassword

Système de Facturation (terminé session actuelle)

  • Migration Gemini 2.0 Flash → 2.5 Flash
  • Modèles DB : UsageEvent, SubscriptionPlan, compteurs aiCreditsUsed/whatsappMessagesSent
  • Capture tokens réels : OpenAI (completion.usage) + Gemini (usageMetadata)
  • usage-tracker.ts fire-and-forget (ne bloque jamais le flux pédagogique)
  • Routes API : /v1/billing/summary, /history, /breakdown, /chat
  • BillingPage UI : carte crédits IA + barre de progression, carte WhatsApp, graphe 30j, répartition features, chat IA facturation
  • Plan gating : clés API propres verrouillées STARTER/GROWTH, actives SCALE/ENTERPRISE
  • Sélecteur plan dans ClientsManagementView (super-admin)
  • Guard backend : PUT /v1/organizations/:id rejette clés API si plan < SCALE

Paiements

  • Orange Money : initiation + webhook de confirmation
  • Wave : initiation session checkout + webhook
  • Auto-enrollment après paiement réussi

✅ PRIORITÉ HAUTE — Tous les items critiques fermés

1. Usage tracking incomplet — ✅ DONE

pedagogy.ts + ai-pedagogy.ts + InboundHandler.ts audio — tracking complet via fire-and-forget trackAiUsage / trackAudioUsage.

2. Clé nav.billing manquante dans i18n — ✅ DONE

Ajouté dans fr/en/es/pt. MainLayout.tsx utilise t('nav.billing').

3. BillingPage spinner infini sans orgId — ✅ DONE

Guard if (!orgId) affiche un message "Sélectionnez une organisation".

4. EmailHandler stub — ✅ DONE

EmailService : templates 1 (welcome), 2 (reset pwd), 3 (alerte quota), 4 (rapport mensuel). EmailHandler.ts : switch complet sur les 4 cas.

5. Alerte email quota IA — ✅ DONE

maybeQueueQuotaAlert() dans usage-tracker.ts — détecte le crossing 85% de manière atomique via la valeur retournée par prisma.organization.update, sans champ DB supplémentaire.


🟡 PRIORITÉ MOYENNE — État

6. Push Notifications — envoi non implémenté — ✅ DONE

  • apps/whatsapp-worker/src/services/push.tssendPushToUser + sendPushToOrganization via web-push
  • apps/whatsapp-worker/src/handlers/PushHandler.ts — handler send-push dans notification-queue
  • apps/api/src/services/push.tssendToUser() ajouté
  • apps/api/src/routes/notifications.tsPOST /v1/notifications/push
  • usage-tracker.ts — quota alert enqueue send-push en plus du send-email

7. Paiements — credentials non configurés en production

Situation : Le code Orange Money + Wave est complet. Les variables d'env sont commentées dans .env.example.

Ce qu'il faut faire :

  • Obtenir les credentials Orange Money (API Key + Merchant ID) et les ajouter sur Railway
  • Obtenir le WAVE_API_KEY et l'ajouter sur Railway
  • Tester le flow complet (initiation → webhook → enrollment)
  • Variables : ORANGE_MONEY_API_KEY, ORANGE_MONEY_MERCHANT_ID, WAVE_API_KEY

8. Page Facturation — aucun bouton "Recharger les crédits" — ✅ DONE

Bouton "Recharger" dans le header + modale avec 3 packs (500 / 2 000 / 5 000 crédits → contact WhatsApp). L'alerte rouge quota > 85% est désormais cliquable et ouvre la même modale.


9. BillingPage inaccessible sans selectedOrgId — ✅ DONE

Guard if (!orgId) en place, affiche "Sélectionnez une organisation pour voir la facturation."


10. docker-compose.yml incomplet pour le dev local

Situation : Le docker-compose.yml ne contient que Postgres et Redis. Pour lancer l'ensemble du stack en local, il faut démarrer manuellement l'API et le worker.

Ce qu'il faut faire :

  • Ajouter les services api et whatsapp-worker dans docker-compose.yml
  • Ajouter un service admin (optionnel, pour demo)
  • Documenter la commande docker-compose up --build dans le README

11. Tests — couverture critique

Situation actuelle : 7 fichiers de test pour ~10 000+ lignes de code de production.

Déjà écrits :

  • test/billing.test.ts — 10 tests (summary, plan guard, quota threshold, history grouping)
  • test/payments.test.ts — 13 tests (webhook Wave + OM, state machine, auto-enrollment, provider validation)

Flows encore sans tests :

  • Campaigns routes (création, broadcast)
  • Analytics routes
  • Admin routes (stats, users, enrollments)
  • Notification routes
  • WhatsApp worker dispatcher (inbound/media routing)
  • FeedbackHandler + MediaHandler (les plus critiques pédagogiquement)

🟢 PRIORITÉ BASSE — Nice to have

12. Rapport mensuel automatique

Envoyer un email récapitulatif en fin de mois (coût total, features les plus utilisées, crédits restants) à l'admin de chaque org.

13. Export CSV de l'historique facturation

Permettre depuis la BillingPage de télécharger l'historique des UsageEvents en CSV pour comptabilité.

14. Webhook de facturation sortant

Permettre aux clients SCALE/ENTERPRISE de recevoir un webhook sur leur endpoint quand leur quota dépasse 80%.

15. Dashboard super-admin agrégé

Vue globale de toutes les orgs : revenus totaux, crédits consommés par org, les 3 plus gros consommateurs. Actuellement chaque org est vue séparément.

16. Branding non utilisé dans Settings

Les champs brandingData.logoUrl et brandingData.primaryColor sont dans le schéma et dans i18n (settings.branding, settings.logo_url) mais le formulaire Settings ne les expose pas encore.


📊 TABLEAU DE SYNTHÈSE

Domaine Complet En cours Manquant
API Routes (12) 12/12
Admin Pages (21) 21/21
Worker Handlers (20) ✅ 20/20
Usage Tracking ✅ 7/7 handlers
Système facturation ✅ complet
Paiements (code) ✅ complet Credentials prod manquants
i18n ✅ 100%
Push Notifications ✅ Subscribe + Send
Tests 7 fichiers Campaigns, handlers, analytics
Docker dev DB+Redis ✅ API + Worker

🔢 ORDRE D'EXÉCUTION RECOMMANDÉ

✅ 1. Usage tracking — pedagogy.ts + InboundHandler + BroadcastHandler
✅ 2. i18n nav.billing dans les 4 locales + MainLayout
✅ 3. BillingPage guard orgId null
✅ 4. EmailHandler templates 2/3/4 + alerte quota > 85%
✅ 5. Tests billing.test.ts (10 tests) + payments.test.ts (13 tests)
✅ 6. Push notifications — PushHandler + send-push job + quota alert push
✅ 7. BillingPage — modal recharge crédits (3 packs → WhatsApp contact)
   8. Payment credentials Railway                       [external — ops]

Tous les gaps dev fermés. Reste uniquement la configuration des credentials de paiement en production (action externe).