diff --git a/apps/api/app/controllers/banking_controller.ts b/apps/api/app/controllers/banking_controller.ts index 9237faa..6f5a136 100644 --- a/apps/api/app/controllers/banking_controller.ts +++ b/apps/api/app/controllers/banking_controller.ts @@ -66,17 +66,20 @@ export default class BankingController { /** * GET /banking/status — public. * - * Kill switch lu côté SPA pour décider d'afficher la section banque. - * On considère banking activé si : - * - `BANKING_ENABLED` == 'true' (ou non défini = true par défaut en dev) - * - ET les credentials Powens sont configurés - * - * En prod on déploie avec `BANKING_ENABLED=false` tant que le KYC - * Powens prod n'est pas finalisé — la feature est dormante, aucun - * bouton n'apparaît, aucun call init n'est tenté. + * Trois états : + * - { enabled: true } → feature pleinement active + * - { enabled: false, comingSoon: true } → KYC Powens en cours, + * teaser "Bientôt disponible" affiché aux Pro/Business + * - { enabled: false, comingSoon: false } → section complètement + * cachée (kill switch dur) */ async status({ response }: HttpContext) { - return response.json({ data: { enabled: isBankingEnabled() } }) + return response.json({ + data: { + enabled: isBankingEnabled(), + comingSoon: !isBankingEnabled() && env.get('BANKING_TEASER_ENABLED') === true, + }, + }) } /** diff --git a/apps/api/start/env.ts b/apps/api/start/env.ts index cefdf68..39b3d47 100644 --- a/apps/api/start/env.ts +++ b/apps/api/start/env.ts @@ -127,6 +127,13 @@ export default await Env.create(new URL('../', import.meta.url), { | (sinon calculée : https://.biapi.pro/2.0/). */ BANKING_ENABLED: Env.schema.boolean.optional(), + /** + * Teaser "Bientôt disponible" affiché dans /parametres pour les + * Pro/Business quand BANKING_ENABLED=false. Permet d'annoncer la + * feature aux users payants pendant la fenêtre KYC Powens. Si false, + * la section est complètement cachée. + */ + BANKING_TEASER_ENABLED: Env.schema.boolean.optional(), BANKING_PROVIDER: Env.schema.enum.optional(['powens'] as const), POWENS_DOMAIN: Env.schema.string.optional(), POWENS_API_BASE_URL: Env.schema.string.optional({ format: 'url', tld: false }), diff --git a/apps/web/src/components/settings/BankingSection.tsx b/apps/web/src/components/settings/BankingSection.tsx index 873cc73..a3d7caa 100644 --- a/apps/web/src/components/settings/BankingSection.tsx +++ b/apps/web/src/components/settings/BankingSection.tsx @@ -4,6 +4,7 @@ import { toast } from "sonner"; import { Banknote, ArrowRight, + Clock, Lock, Loader2, Trash2, @@ -84,6 +85,12 @@ export function BankingSection({ return ; } + // Banking pas encore activé mais teaser ON → afficher "Bientôt disponible" + // pour annoncer la feature aux Pro/Business pendant la fenêtre KYC Powens. + if (status?.comingSoon) { + return ; + } + return ( +
+
+
+
+
+
+
+

+ Bientôt disponible +

+

+ Connexion bancaire en finalisation +

+

+ Rubis termine son agrément AISP (lecture seule, lecture des + virements entrants uniquement) pour détecter automatiquement + les factures payées. Vous serez notifié dès l'ouverture. +

+

+ 🔒 Lecture seule · Aucun déplacement de fonds · Compatible + toutes banques françaises +

+
+
+ + ); +} + function UpsellCard() { return ( diff --git a/apps/web/src/lib/banking.ts b/apps/web/src/lib/banking.ts index 64458f7..567171d 100644 --- a/apps/web/src/lib/banking.ts +++ b/apps/web/src/lib/banking.ts @@ -47,7 +47,10 @@ export type BankingSettings = { export function useBankingStatus() { return useQuery({ queryKey: ["banking", "status"] as const, - queryFn: () => api.get<{ enabled: boolean }>("/api/v1/banking/status"), + queryFn: () => + api.get<{ enabled: boolean; comingSoon: boolean }>( + "/api/v1/banking/status", + ), // Le flag bouge rarement — long cache OK. staleTime: 5 * 60_000, }); diff --git a/apps/web/src/routes/_app/parametres.tsx b/apps/web/src/routes/_app/parametres.tsx index 2b1a3ad..ba60c95 100644 --- a/apps/web/src/routes/_app/parametres.tsx +++ b/apps/web/src/routes/_app/parametres.tsx @@ -46,10 +46,12 @@ function ParametresPage() { const { data: sub } = useSubscription(); const planLabel = sub?.plan === "pro" ? "Pro" : sub?.plan === "business" ? "Business" : "Free"; const search = Route.useSearch(); - // Kill switch banking : la section ENTIÈRE disparaît si BANKING_ENABLED=false - // côté API (typiquement en prod tant que le KYC Powens n'est pas validé). + // Kill switch banking : la section apparaît si la feature est ON, OU si + // la prod est en mode "teaser" (KYC Powens en cours, mais on annonce + // qu'elle arrive). Sinon la section reste invisible. const { data: bankingStatus } = useBankingStatus(); - const showBanking = bankingStatus?.enabled === true; + const showBanking = + bankingStatus?.enabled === true || bankingStatus?.comingSoon === true; return (
diff --git a/k3s/app/api.yml b/k3s/app/api.yml index cffcbd6..b36691e 100644 --- a/k3s/app/api.yml +++ b/k3s/app/api.yml @@ -156,6 +156,10 @@ data: # - POWENS_REDIRECT_URI doit matcher EXACTEMENT ce qui est whitelisté # côté console Powens prod. BANKING_ENABLED: 'false' + # Teaser "Bientôt disponible" affiché aux Pro/Business pendant la + # fenêtre KYC Powens. Flip à 'false' pour cacher complètement la + # section (cas où on veut remettre la feature sous le tapis). + BANKING_TEASER_ENABLED: 'true' BANKING_PROVIDER: 'powens' POWENS_DOMAIN: 'rubis' POWENS_API_BASE_URL: 'https://rubis.biapi.pro/2.0/'