Aller au contenu

Facturation

L’application billing (applications/billing) est l’outil interne qui produit les factures et les documents réglementaires des formations erevo. Elle orchestre, derrière une interface unique, plusieurs services : HubSpot (le CRM), l’internal-api (le back-office Symfony/Doctrine), le portail financeur FIFPL (of.fifpl.fr), un worker Claude Code pour l’appariement des participants, et la génération de PDF.

C’est l’une des briques les plus riches du monorepo : la logique est portée par une machine à états xstate (billing-app-machine.ts, > 4000 lignes) qui coordonne toutes ces étapes de manière déterministe, avec des mécanismes de synchronisation idempotents et de confirmation par polling difficiles à percevoir depuis l’écran.

Après connexion, l’opérateur choisit un module :

ModulePour quoiParticularité
DPCFacturer les sessions financées par l’ANDPCParcours financé « court » (consentements + documents)
FIFPLFacturer les sessions financées par le FIFPLParcours financé « complet » avec export portail + appariement + synchro HubSpot
ReportsVue comptable : rechercher les factures par période et les télécharger (PDF / Excel / ZIP)Lecture seule
Self-FundedFacturer une session auto-financéeParcours minimal : utilisateur → session → facture
Connexion
└─ Choix du module (DPC / FIFPL / Reports / Self-Funded)
└─ Recherche des transactions HubSpot (n° de session + référence financeur)
└─ Chargement des sessions depuis l'internal-api
└─ [FIFPL] Export FIFPL → appariement (Claude) → synchro HubSpot → confirmation propagation
└─ Validation (noms, dates, consentements)
└─ Génération des documents (facture → traçabilité → relevés → signatures)
└─ Sauvegarde du dossier de facturation (billing_file) dans l'internal-api
ServiceRôle dans la facturation
HubSpotSource des transactions (deals) à facturer ; destination des noms/montants FIFPL synchronisés
internal-apiSessions, étudiants, consentements, classes virtuelles, dossiers de facturation persistés
puppeteer-serviceTélécharge l’export XLSX des participants depuis of.fifpl.fr
worker Claude CodeApparie les participants FIFPL de l’XLSX aux transactions HubSpot
pdfRend les DocumentProps en PDF
file-apiStocke les PDF générés (minio)
  • Machine à états : applications/billing/src/machines/billing-app-machine.ts. États racine checkingAuth / unauthenticated / authenticated ; sous-états choosingModule, dpc, fifpl, reports, selfFunded. Le contexte (150+ champs) suit les résultats de recherche, les pipelines de documents, l’état de synchro FIFPL et les erreurs de validation. Les tags (loading, error, generating, saving…) pilotent l’affichage conditionnel.
  • API type-safe : tous les appels passent par tRPC (librairies/trpc/src/controller/*) — pas d’appel HTTP brut côté front. Les clients de contexte (HubSpot, internal-api) sont injectés côté serveur.
  • React Query : utilisé pour les requêtes ad-hoc (recherche d’utilisateur en self-funded, classe virtuelle du dossier) ; les mutations longues sont portées par les actors de la machine.