Programmes par application
Architecture des programmes et des fonctions â de quoi reprendre chaque application rapidement : point d'entrĂ©e, DI, pipeline, endpoints, services et flux clĂ©s.
D:\Dev2026\. Toutes exposent leur front via la passerelle (sous-domaine) et lisent l'identité via Identité/Keycloak.
IIQARION Factures (THEIA) â D:\Dev2026\Theia
RÎle : facturation électronique Factur-X, gestion commerciale ventes/achats, stock, PDP. Stack : .NET 10, Razor Pages + API Controllers, EF Core / PostgreSQL.
Structure de la solution
| Projet | RĂŽle |
|---|---|
Theia.Core | Domaine (entités, enums), Factur-X pur (FacturX/ : GenerateurCii, LecteurCii, AssembleurFacturX PDF/A-3, GenerateurPdf QuestPDF, ValidateurFacturX, MetadataXmp) et moteur de taxes (Taxes/MoteurTaxes). Sans IO. |
Theia.Storage | Persistance EF (TheiaDbContext) + services métier : ServiceFacturation, ServiceStock, ServiceBonsCommande/Livraison, ServiceRapprochement, ServiceEmail, ServiceSuppression, ServiceEReporting (brouillard de caisse), MigrateurLeger, DonneesInitiales. |
Theia.WebUI | HÎte web (point d'entrée) : Razor Pages + Controllers API /api/* + middlewares tenant. |
Theia.Tenancy / .ControlPlane | Routing multi-base : Shard, Tenant, TenantContext, ControlDbContext, TenantAllocator. |
Theia.Stockage | Stockage objet S3/MinIO (lib partagée GED/documents). |
Theia.PdpWorker | Worker de synchro PDP dédié (multi-dossier, élection de leader). |
Point d'entrée (Theia.WebUI\Program.cs)
- DI : DbContexts (Control + Theia rĂ©solu par requĂȘte depuis
TenantContext), services Storage (scoped), modules partagĂ©s (IArticleCatalogâAdaptateurCatalogueTheia,IStockService, clients HTTP Catalogue/Tiers avec jeton sociĂ©tĂ© signĂ©), PDP (ServicePdpEffinum,ServicePdpAchats,ValidateurSchematron,ServicePollingPdpoptionnel), stockage objet (S3/fichier),ServiceRne,ServiceKpi,ContexteSession,IdentiteClient. - Auth : cookie (session) + OIDC Keycloak (challenge par dĂ©faut) ;
OnTokenValidatedâProvisioningOidc(JIT, réécrit le principal avec l'Id interne). Politiques :Admin+ finesVente/Achat/Reglement.Lire/Ecrire. - Pipeline : ForwardedHeaders â StaticFiles â Routing â Authentication â TenantRoutingMiddleware (choisit la base) â TenantMiddleware (fixe
SocieteCouranteId) â Authorization â handler d'erreurs JSON/apiâ RazorPages â Controllers â endpoints minimal-API. - Bootstrap :
DonneesInitiales,ControlDbContext.AssurerSchema, seed shards, mapping sociĂ©tĂ©sâtenants,MigrateurLeger.Synchronisersur chaque base physique, backfill desCle.
Controllers (Theia.WebUI\Controllers\*)
| Controller | Base | Responsabilité · endpoints clés |
|---|---|---|
| AuthController | api/auth | Session : deconnexion, societe/{id}, societe-dossier (handshake portail, anti-open-redirect) |
| FacturationController | api/factures | Ventes/devis/avoirs/rĂšglements/PDP : create, {id}/comptabiliser, calculer, valider-devis, convertir, acompte, solde, avoir, reglement(s-masse), envoyer, relancer, pdp/deposer, pdp/statut, {id}/facturx|apercu|xml |
| AchatsController | api/achats | Factures fournisseur (PDP entrant), catalogue achat, cycle de vie, webhook : synchroniser, {id}/statut/{transition}, {id}/lignes/extraire, catalogue/*, webhook |
| BonsCommandeController | api/bons-commande | Bons de commande fournisseur (CRUD, valider, PDF) |
| BonsLivraisonController | api/bons-livraison | Bons de livraison (client/fournisseur), facturer, piĂšce jointe |
| StockController | api/stock | Mouvements & valorisation : entree/sortie/ajustement/inventaire/famille-methode |
| ReferentielController | api | Référentiels : catalogue, clients, articles, unites, vatex |
| AdministrationController | api/admin | Config société : taxes, comptes, journaux, conditions, personnalisation (logo, couleurs, fond de page, filigrane), numérotation, relances, SMTP, PDP, sociétés, users |
| ModelesController Nouveau | api/modeles | ModÚles de facture (profils de rÚgles) : liste, upsert, défaut, suppression ; exposés à l'éditeur de facture |
| ImportController Nouveau | api/import | Reprise de données : analyser (aperçu, doublons, codes TVA) & executer (CSV/XLSX SAGE/EFAC/CEGID) |
| ShardsAdminController Nouveau | api/shards | Admin des shards : liste/charge, création semi-auto, activation (garde plateforme ou clé partagée) |
| WidgetsController | api/widgets | KPI pour le portail : kpi (session), kpi-dossier (machine, clé partagée, résolu cross-shard) |
| TenantDiagController | api/tenant | Diagnostic routing multi-tenant (dev) |
Module E-reporting (brouillard de caisse) : pages Pages/EReporting/* (Livre de caisse, E-reporting manuel, Caisses) + ServiceEReporting (journées, ventilations TVA/paiement, soldes, validation/snapshot, export comptable, dépÎt PDP).
Services applicatifs (Theia.WebUI\Services\*)
| Service | Responsabilité |
|---|---|
| TenantRoutingMiddleware | Choisit la connexion base du tenant (cookie dossier) â TenantContext, avant tout accĂšs donnĂ©es |
| TenantMiddleware | Résout user + société courante, fixe SocieteCouranteId (filtre global) |
| ContexteSession | Contexte requĂȘte : user, sociĂ©tĂ©, rĂŽle, droits par module |
| ProvisioningOidc | Provisioning JIT Ă la connexion Keycloak (subâUtilisateur, réécrit le cookie) |
| IdentiteClient | Client HTTP du service Identité (droits fins, cache 5 min) |
| ServicePdpEffinum | Dialogue PDP Effinum/Serensia : OAuth2, dépÎt Factur-X, suivi de statut (AFNOR + propriétaire) |
| ServicePdpAchats | RécupÚre/gÚre les factures fournisseur entrantes, extrait les lignes, propage le cycle de vie |
| ServicePollingPdp / ServiceSyncMultiTenant | Synchro périodique PDP (repli du webhook) / orchestration multi-dossier & élection de leader |
| ValidateurSchematron | Validation EN 16931 (Schematron/Saxon) du XML Factur-X avant envoi |
| ServiceRne | Enrichissement fournisseurs depuis la base RNE (INPI) locale |
| ServiceImportReferentiel Nouveau | Import clients/articles : lecture CSV (UTF-8/Latin1, séparateur auto) & XLSX (ClosedXML, gÚre le « CSV encapsulé » SAGE), mapping par nom de colonne, dédoublonnage, purge optionnelle |
| ServiceKpi / RasteriseurPdf / MessagesErreur | KPI tableau de bord / rendu PDFâPNG pour le viewer / traduction des erreurs techniques en messages FR (ErreurUtilisateur dĂ©placĂ© en Theia.Core pour ĂȘtre partagĂ©) |
đ§Ÿ Flux : crĂ©er & comptabiliser une facture
Route â TenantRouting (base) â TenantMiddleware (SocieteId) â Authorization Vente.Ecrire. POST api/factures crĂ©e le brouillon (contrĂŽle TVA par ligne, MoteurTaxes.CalculerFacture). POST {id}/comptabiliser â validation EN 16931 puis ServiceFacturation.ComptabiliserAsync : n° lĂ©gal (sĂ©quence journal), Ă©chĂ©ance, Ă©tat ComptabilisĂ©e, lettrage, mouvements de stock valorisĂ©s. DĂ©pĂŽt PDP auto si configurĂ©.
đ„ Flux : recevoir une facture d'achat (PDP)
ServicePollingPdp/worker (X-Worker-Secret) â ServiceSyncMultiTenant route le scope vers le bon shard â ServicePdpAchats.SynchroniserEntrantsAsync : jeton OAuth, pagination incrĂ©mentale, upsert FactureAchat par InvoiceId, refresh statuts, dĂ©tection doublons, MAJ fournisseurs, rĂšgles auto. Extraction des lignes & PDF Ă la demande.
Portail Client â D:\Dev2026\PortailClient
RÎle : point d'entrée unique, GED, control-plane multi-tenant, embarque Factures/POS. Stack : .NET 10, Blazor Server + Fluent UI.
| Projet | RĂŽle |
|---|---|
PortailClient.Web | Portail Blazor + control-plane (PortailDbContext + ControlDbContext) + GED |
PortailClient.Ocr | Runner OCR hors-process (console PortailClient.Ocr <fichier> <tessData>, Tesseract/Paddle) |
Point d'entrée (Program.cs)
- DI :
PortailDbContext+ControlDbContext(connPortail), stockageTheia.StockageS3/MinIO, clients HTTP (IdentiteClient,TheiaKpiClient:5087,PosKpiClient:5210,CatalogueHttpClient:5130, sondesante),ContexteSession,ServiceDocuments,ExtracteurContenu, OCR (OcrRunner+OcrQueue+OcrArrierePlanhosted),ProvisioningOidc,TenantAllocator. - Auth : cookie
PortailClient.Auth(8h) + OIDC"kc"(PKCE, code flow,ResponseMode=query) ;OnTokenValidatedâJIT (subâUtilisateur, aligne Clientsâdossiers, assigne tenant au shard). - Pipeline : ForwardedHeaders â (prod) exception/HSTS â StatusCodePages â HttpsRedirect â Authentication â Authorization â
ContexteSession.Initialiserâ Antiforgery â StaticAssets â RazorComponents (InteractiveServer).
Endpoints minimal-API
| Route | But |
|---|---|
GET /auth/login | Challenge Keycloak |
POST /auth/entreprise | Bascule d'entreprise (réécrit le cookie, validé contre les accÚs) |
POST /auth/logout | Déconnexion cookie + session Keycloak |
GET /documents/{id}/telecharger|apercu | Téléchargement / aperçu (cloisonné) |
GET /documents/telecharger-selection?ids= | ZIP d'une sĂ©lection (â€200) |
POST /api/ingest/document | Ingestion externe (X-Api-Key, multipart) â rĂ©sout/crĂ©e le Client |
GET /api/control/shards|tenants, POST /api/control/tenants/{code}/assign | Control-plane : annuaire & affectation au shard |
Pages Blazor (Components/Pages/*)
| Page | RĂŽle |
|---|---|
Home / | Accueil : KPI THEIA/POS + tuiles (gated par ADroitApp) |
Theia /theia · Pos /pos | Embarque Factures / POS en iframe aprÚs handshake SSO top-level |
Documents /documents | Base documentaire : recherche plein-texte Ă facettes |
| Depot / MesDepots / DepotsRecus / Publier | DépÎt (ascendant), mes envois, dépÎts reçus (agent), publication (descendant) |
Administration /administration | Distributeurs / dossiers / membres (via Identité) |
| Outils (Emprunt, FraisKilometriques) | Calculatrices |
Services (Services/*)
| Service | Responsabilité |
|---|---|
| ContexteSession | Identité courante (scoped) ; pilote le filtre global (ClientCourantId, AccesTransversal, ADroitApp) |
| ServiceDocuments | Orchestration GED : création (stockage+extraction), recherche à facettes, marquage lu, transmission |
| ServiceStockage | Objets S3 content-addressed ged/{clientId}/{sha} |
| ExtracteurContenu / OcrRunner / OcrArrierePlan | Extraction texte native ; OCR hors-process ; file d'attente OCR en tĂąche de fond |
| TheiaKpiClient / PosKpiClient | KPI serveurâserveur (X-Widget-Key), cloisonnĂ©s par dossier |
| IdentiteClient / ProvisioningOidc | Source de vérité droits ; provisioning JIT + cookie applicatif |
đ Flux : ouvrir Factures embarquĂ©
Garde Identite.EstJoignable. 1á”Êł passage : navigation top-level vers {Theia.PublicUrl}/api/auth/societe-dossier?embedded=true&dossier=âŠ&retour=âŠtheia?ok=1 (SSO impossible en iframe cross-origin). Retour ?ok=1 : iframe factures.<domaine> (same-site â cookies OK).
đ€ Flux : dĂ©poser/ingĂ©rer un document
UI ou POST /api/ingest/document â ServiceDocuments.CreerAsync : SHA-256 + PutObject (dĂ©dup), extraction texte (ou OCR si image/PDF scannĂ©), mĂ©tadonnĂ©es + accusĂ©, SaveChanges (regĂ©nĂšre le tsvector GIN), enqueue OCR si requis.
IIQARION POS â D:\Dev2026\THEIAPOS
RĂŽle : point de vente/caisse (offline-first), supervision, tickets NF525. Stack : .NET 8 (API) / .NET 10 (MAUI), Minimal API, EF Core / PostgreSQL, SQLite local (caisse).
| Projet | RĂŽle |
|---|---|
Theia.Pos.Api | API + console de supervision (point d'entrée web) |
Theia.Pos.Domain | Entités, enums, DTOs, Nf525Chain (chaßnage inaltérable) |
Theia.Pos.Caisse / .Caisse.Maui | App caisse (Blazor Server hĂŽte / coque MAUI Windows-Android-iOS) |
Theia.Pos.Client / .Ui | Moteur caisse offline-first (SQLite local, PosService, SyncWorker, impression ESC/POS) / UI partagée |
Point d'entrée (Theia.Pos.Api\Program.cs)
- DI : PostgreSQL obligatoire, routing multi-tenant (
PosControlDbContext,PosTenantResolver),PosDbContextrĂ©solu par requĂȘte ; module Catalogue (Embedded ou Hosted viaCatalogueHttpClient+ jeton), module Tiers (TiersHttpClient,ServicePosSyncTiers) ;EmailWorker(outbox), QuestPDF (tickets/Z). - Auth (multi-canal) :
| Consommateur | Schéma |
|---|---|
| Navigateur (console) | OIDC Keycloak "kc" + cookie TheiaPos.Auth (client theiapos, ResponseMode=query) |
| Caisses | X-Api-Key = Register.ApiKey |
| Widgets portail | X-Widget-Key (serveurâserveur, match dossier) |
| Sync Tiers | X-Sync-Secret |
- Gating middleware : pages HTML protĂ©gĂ©es â challenge Keycloak ;
/api/portal/*= cookie SSO obligatoire (jamais une clĂ© de caisse) ; autres/api/*= cookie SSO OU clĂ© caisse. Tenant middleware : lit cookiepos_dossierâ rĂ©sout le shard.
Groupes d'endpoints
| Groupe | Endpoints |
|---|---|
| Handshake auth | /auth/login|logout, GET /api/auth/portail?dossier=&retour= (pose pos_dossier, anti-open-redirect vers Portal:BaseUrl) |
| Admin portail (SSO) | /api/portal/caisses|stores|sellers|customers|products|categories|articles (CRUD, deep-link module Catalogue) |
| Sync portailâcaisse | GET /api/catalog (articles actifs filtrĂ©s par assortiment, TTC recomposĂ©), /api/registers/{id}, /api/sellers |
| Remontée caisse | POST /api/sync/tickets (vérif NF525 + ré-ancrage, décrément stock, fidélité, outbox), heartbeat, sessions/close, z.pdf |
| Clients / e-reporting | /api/customers (incrémental + tombstones), /api/ereporting/{date}, POST /api/tickets/{id}/facturer (Factur-X via THEIA) |
đ Flux : embarquer le POS
Portail â top-level GET /api/auth/portail?dossier=&retour= â (si besoin) challenge Keycloak â pose cookie pos_dossier â retour validĂ© â iframe. Chaque requĂȘte porte pos_dossier : routing base + scope Store.Dossier.
đ§Ÿ Flux : vente caisse (offline-first)
Caisse pull catalogue (X-Api-Key). Vente finalisée localement (SQLite), ticket chaßné NF525. SyncWorker pousse vers POST /api/sync/tickets ; le serveur revérifie le hash (inaltérabilité, ré-ancrage si registre vierge), décrémente le stock, crédite la fidélité, met le reçu dématérialisé en outbox.
IdentitĂ© â D:\Dev2026\Identite
RĂŽle : autorisation fine + provisioning Keycloak. Stack : .NET 10 Minimal API, Dapper + Npgsql. Keycloak porte l'authentification & les rĂŽles grossiers ; la base identite porte les droits fins.
Point d'entrée (Program.cs)
- Bootstrap :
EnsureDatabaseAsyncâ services (SecretProtector,KeycloakAdmin,ResolveurPdp,RafraichisseurPdphosted) â JWT bearer (realm eportail,NameClaimType=sub) âInitialiserAsync(schĂ©ma+seed). - Politiques :
ImportApi(clientimport-api),AdminPlateforme(rÎle realm). Helpers de portée :AutoriserAdminDistrib/Dossier,NiveauxActeur.
Endpoints (préfixe /api/identite)
| Route | Auth | But |
|---|---|---|
GET /moi/habilitations | authentifié | Dossiers + droits par module + apps actives (via vue v_habilitations) |
POST /distributeurs/{code}/dossiers | ImportApi | Import push d'un dossier + chef (provisionne le chef dans Keycloak) |
POST /dossiers/{code}/utilisateurs, PUT âŠ/habilitations, DELETE ⊠| chef/admin | Gestion des membres & droits |
GET/PUT /dossiers/{code}/apps, POST /provisioning | admin-distrib | Entitlements applicatifs (THEIA/POS) |
POST /admin/distributeurs/*, .../cles-pdp | admin-plateforme / distrib | Distributeurs, dossiers, clés PDP (secret jamais renvoyé) |
POST /pdp/token | theia/import/admin | Courtier de jeton PDP : forge un token OAuth depuis la clé distributeur (secret ne sort jamais) |
Services
| Service | Responsabilité |
|---|---|
| KeycloakAdmin | Provisionne les users dans le realm eportail (service account import-api) : dĂ©dup email, crĂ©ation, rĂŽle, invitation â renvoie le sub |
| RealmRoles | Lit les rĂŽles realm depuis le JWT (realm_access.roles) |
| SecretProtector | Chiffre/déchiffre AES-256-GCM les secrets PDP au repos |
| ResolveurPdp / RafraichisseurPdp | Résout l'identité PDP (organization_id/eas) depuis le SIREN via Serensia, cache-first / rattrapage en tùche de fond |
identite = quels dossiers (rattachement), quels droits par module (habilitation), quel périmÚtre admin, quels produits (entitlement). Jointure par le sub.Modules partagés : Catalogue & Tiers
MĂȘme patron : module EF autonome (SQLite/PostgreSQL), cloisonnĂ© par SocieteCode, jeton sociĂ©tĂ© signĂ© HMAC-SHA256 (JetonSociete) requis sur tout /api/*, notification write-through vers les consommateurs.
đ Catalogue (:5130)
Projets : Core (entités, CatalogueDbContext, ServiceArticles/Stock/Etablissements), Contracts (DTOs, IArticleCatalog/IStockService, JetonSociete), Api (Minimal API + auth jeton), Client (CatalogueHttpClient + JetonSocieteHandler).
Endpoints : /api/articles (CRUD, code-barres), /api/categories, /api/unites, /api/tva, /api/etablissements, /api/stock/{entrer|sortir|ajuster|etat|valeur}. Sync descendante : à chaque écriture, POST /api/admin/sync-catalogue vers THEIA (X-Sync-Secret).
đ Tiers (:5140)
Projets : Core (Tiers, TiersDbContext, ServiceTiers source de vérité), Contracts (TiersDto, ITiersReferentiel, CleDedup), Api, Client (TiersHttpClient).
Endpoints : /api/tiers (recherche/CRUD), /resoudre, /doublons, /fusionner. Sync bidirectionnelle THEIA â POS : NotifierAsync â /api/admin/sync-tiers vers chaque consommateur ; garde anti-boucle (notify=false pour les backfills). Enrichissement RNE Ă l'upsert.
Passerelle, Site vitrine, Ingress PDP
| Application | Projet | Programme |
|---|---|---|
| Passerelle | Iiqarion.Gateway | YARP (LoadFromConfig), routage par hĂŽte (appsettings), HTTPS auto prod (LettuceEncrypt, Tls:Enabled), UseWindowsService, sonde /healthz |
| Site vitrine | IIQARION.Site.Web | Blazor SSR marketing ; NavMenu.razor « Se connecter » â PortailUrl (config) |
| Ingress PDP | Iiqarion.WebhookIngress | Service autonome (.NET + PostgreSQL + LettuceEncrypt) : reçoit les webhooks PDP, qu'un worker draine (pull) |
| Documentation | Iiqarion.Docs | Ce site (hĂŽte statique .NET, wwwroot, :5310) |