DOCS/kanban/done/120-lot-f-backend-portail-de-facturation-stripe-e.md
2026-09-03 14:00:51 +02:00

7 lines
2.0 KiB
Markdown

---
title: Lot F backend — portail de facturation Stripe et coût réel d'une question
---
<span><strong>Customer Portal</strong> : <code>StripeService.CreateBillingPortalSessionAsync</code> + <code>POST /api/onboarding/billing-portal</code>, calqué sur <code>checkout-session</code>. ⚠️ <strong>Une garde absente de l'énoncé</strong> : <code>StripeCustomerId</code> peut être nul. <code>CreateCustomerAsync</code> n'est appelée que par l'inscription self-service, donc <strong>les 4 instances de la bascule, venues de Mongo, n'ont jamais vu Stripe</strong> — sans la garde, elles partaient chercher le portail d'un client inexistant et récupéraient une erreur d'API Stripe illisible côté front. C'est un 409, distinct du 404 d'instance inconnue.</span>
<span><strong>Ratio jetons → questions</strong> : <code>InstanceQuotaDTO.aiTokensPerQuestion</code> est désormais mesuré sur les <code>VisitorQuestion.TokensUsed</code> de l'instance, avec un seuil de 20 questions avant de faire foi — une seule réponse citant un long article doublerait la moyenne, et le crédit restant afficherait moitié moins d'un rafraîchissement à l'autre. ⚠️ <strong>Le <code>/1000</code> de manager-app était faux d'un facteur 10, et c'est un chiffre montré au client</strong> : la grille vend Premium à 20 M de jetons pour ~2 000 questions, soit 10 000 par question. Le gestionnaire lisait un crédit dix fois trop généreux. Le repli serveur est calé sur 10 000. <strong>Reste à brancher le diviseur dans manager-app.</strong></span>
<span><strong>Trois points du lot F étaient déjà faits et n'attendaient qu'une vérification</strong> : le rate limiting (livré, pas seulement décidé), l'endpoint de mise à jour d'<code>ApplicationInstance</code> (CRUD complet existant — ce qui manque est l'écran SuperAdmin, déjà parqué en V2) et les quotas seed (alignés par <code>AlignSubscriptionPlansWithPricing</code>). 6 tests ajoutés, <code>dotnet test</code> 197 passés / 14 sautés / 0 échec.</span>