administration-des-comptes
Interface synchrone (OpenAPI) — version 0.8.0. Producteur : tenue-de-compte. Consommateurs déclarés : backoffice.
La première tranche du paramétrage administré : le cycle de vie du compte — en préparation à la demande, ouvert, suspendu et remis en service, mis en clôture, clos (définitivement). Toute interface de la plateforme est authentifiée (401) et autorisée par famille d’accès (403) — l’administration exige la famille tenue-de-compte:parametrage. Chaque changement d’état publie son fait (contrat evenements-du-compte 0.2.0), retenu dans la même transaction.
La spécification
Section intitulée « La spécification »openapi: 3.1.0info: title: tenue-de-compte — administration des comptes version: 0.8.0 summary: Ouvrir, suspendre, mettre en clôture et clore un compte au plan du tenant. x-ruptures: >- 0.8.0 (2026-08-07) — RUPTURE DÉCLARÉE en 0.x : le plan de comptes remanié décide davantage. Le cadre légal NE SE DEMANDE PLUS à l'ouverture — il se décide au compte général, comme le type et le sous-type ; le rattachement se demande en couples génériques clé / référence — `rattachement_cle`/`rattachement_ref` et, pour un compte de parts d'épargnant, `origine_cle`/`origine_ref` — à la place des propriétés « épargnant » et « entreprise d'origine ». La fiche sert `type` (nouvelles valeurs : parts-epargnant, especes, titres, mixte, droits-contractuels — les suffixes « -technique » disparaissent), `sous_type` et les couples de rattachement ; elle ne sert plus « portée », et `cadre_legal` devient une lecture dérivée du compte général, absente pour un compte hors cadre. 0.7.0 (2026-08-07) — RUPTURE DÉCLARÉE en 0.x : vocabulaire comptable — `categorie` devient « type de compte », `enveloppe` devient `cadre_legal` (valeurs inchangées) ; le rattachement remplace la borne dans la sémantique. 0.6.0 (2026-08-07) — RUPTURE DÉCLARÉE en 0.x. Le préfixe `/tenants/{tenant}` DISPARAÎT des chemins et la propriété `tenant` quitte la fiche. L'ENVELOPPE LÉGALE devient OBLIGATOIRE à l'ouverture (épargne salariale ou plan d'épargne retraite) : l'unicité du compte s'apprécie par couple, catégorie et enveloppe — le compte-titres d'un PER est un compte propre par la loi (L. 224-1), jamais une dérogation. 0.5.0 — RUPTURE DÉCLARÉE en 0.x. La propriété `categorie` (avoirs/passage) est RENOMMÉE « portée » ; `categorie` désigne désormais la qualification structurelle du compte (compte-titres d'épargnant, espèces, technique, droits contractuels), obligatoire à l'ouverture — c'est elle qui rend le RATTACHEMENT exigible : pour un compte-titres d'épargnant, épargnant ET entreprise d'origine sont OBLIGATOIRES (ils étaient facultatifs en 0.4.0). Le booléen `historise` DISPARAÎT : la politique temporelle découle de la catégorie, un paramétrage ne la choisit pas. Le statut passe de deux à six états, et la clôture exige désormais positions, LOTS, RÉSERVATIONS et soldes nuls, ou une décision formelle et prouvée sur chaque reste. Trois actes s'ajoutent (compatibles) : suspendre, remettre en service, mettre en clôture. description: >- La première tranche du paramétrage administré : le cycle de vie du compte — en préparation à la demande, ouvert, suspendu et remis en service, mis en clôture, clos (définitivement). Toute interface de la plateforme est authentifiée (401) et autorisée par famille d'accès (403) — l'administration exige la famille tenue-de-compte:parametrage. Chaque changement d'état publie son fait (contrat evenements-du-compte 0.2.0), retenu dans la même transaction. x-producteurs: - tenue-de-compte x-consommateurs: - composant: backoffice statut: réel — module Tenue de compte (ouverture, suspension, mise en clôture, clôture des comptes)paths: /comptes: post: operationId: ouvrirUnCompte summary: Ouvrir un compte — un numéro ne s'ouvre qu'une fois. description: >- Le compte ouvert participe aussitôt au paramétrage. Un numéro déjà connu — ouvert ou clos — est refusé : un compte clos ne se rouvre pas, on en ouvre un autre. L'ouverture publie le fait « compte ouvert ». security: - authentification: [tenue-de-compte:parametrage] requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/DemandeDOuverture' responses: '201': description: Le compte est ouvert. content: application/json: schema: $ref: '#/components/schemas/FicheDeCompteAdministre' '400': description: La demande est irrecevable — le motif nomme le champ. content: application/json: schema: $ref: '#/components/schemas/Erreur' '401': description: Aucune identité présentée. '403': description: L'identité présentée n'a pas la famille d'accès tenue-de-compte:parametrage. '409': description: Le numéro est déjà connu (ouvert ou clos) — motivé. content: application/json: schema: $ref: '#/components/schemas/Erreur' /comptes/{numero}/suspension: post: operationId: suspendreUnCompte summary: 0.5.0 — suspendre un compte, qui refuse alors les mouvements sans rien effacer. security: - authentification: [tenue-de-compte:parametrage] parameters: - $ref: '#/components/parameters/numero' responses: '200': description: Le compte est suspendu ; le fait « compte suspendu » est publié. content: application/json: schema: { $ref: '#/components/schemas/FicheDeCompteAdministre' } '401': { description: Aucune identité présentée. } '403': { description: Hors famille tenue-de-compte:parametrage. } '404': { description: Le compte est inconnu de ce teneur de compte. } '409': description: Le compte n'est pas ouvert — motivé. content: application/json: schema: { $ref: '#/components/schemas/Erreur' } /comptes/{numero}/remise-en-service: post: operationId: remettreUnCompteEnService summary: 0.5.0 — lever la suspension. security: - authentification: [tenue-de-compte:parametrage] parameters: - $ref: '#/components/parameters/numero' responses: '200': description: Le compte accepte de nouveau les mouvements. content: application/json: schema: { $ref: '#/components/schemas/FicheDeCompteAdministre' } '401': { description: Aucune identité présentée. } '403': { description: Hors famille tenue-de-compte:parametrage. } '404': { description: Le compte est inconnu de ce teneur de compte. } '409': description: Le compte n'est pas suspendu — motivé. content: application/json: schema: { $ref: '#/components/schemas/Erreur' } /comptes/{numero}/mise-en-cloture: post: operationId: mettreUnCompteEnCloture summary: 0.5.0 — ouvrir l'examen des restes avant la clôture définitive. description: >- L'état « en clôture » porte l'examen : ce qui reste — positions, lots, réservations, soldes — se traite ou se prouve. Le retour à l'état ouvert n'est pas une réouverture, c'est le constat qu'il restait quelque chose à traiter. security: - authentification: [tenue-de-compte:parametrage] parameters: - $ref: '#/components/parameters/numero' responses: '200': description: L'examen des restes est ouvert ; le fait « compte mis en clôture » est publié. content: application/json: schema: { $ref: '#/components/schemas/FicheDeCompteAdministre' } '401': { description: Aucune identité présentée. } '403': { description: Hors famille tenue-de-compte:parametrage. } '404': { description: Le compte est inconnu de ce teneur de compte. } '409': description: Le compte n'est pas ouvert — motivé. content: application/json: schema: { $ref: '#/components/schemas/Erreur' } /comptes/{numero}/cloture: post: operationId: cloreUnCompte summary: Clore un compte — définitivement, ses restes soldés ou prouvés. description: >- 0.5.0 — la clôture exige positions, lots, réservations et soldes nuls, OU une décision formelle et prouvée sur chaque reste (R-TCC-CLOTURE-AVOIRS-LIQUIDES, étendue par le réalignement) ; refusée sinon, le motif NOMME ce qui reste — un lot résiduel ou une réservation active suffit. Elle est définitive et publie le fait « compte clos ». security: - authentification: [tenue-de-compte:parametrage] parameters: - $ref: '#/components/parameters/numero' responses: '200': description: Le compte est clos. content: application/json: schema: $ref: '#/components/schemas/FicheDeCompteAdministre' '401': description: Aucune identité présentée. '403': description: L'identité présentée n'a pas la famille d'accès tenue-de-compte:parametrage. '404': description: Le compte est inconnu de ce teneur de compte. '409': description: Des avoirs restent (le motif nomme ce qui reste), ou le compte est déjà clos. content: application/json: schema: $ref: '#/components/schemas/Erreur'components: securitySchemes: authentification: type: http scheme: bearer description: >- L'exigence : tout appel est authentifié (401) et autorisé par famille d'accès (403 hors famille) — chaque opération déclare sa famille en portée, sous la forme tenue-de-compte:famille. Le mécanisme est OIDC ; sa déclinaison relève de l'assemblage. parameters: numero: name: numero in: path required: true description: L'identifiant public du compte chez ce tenant. schema: type: string minLength: 1 schemas: DemandeDOuverture: type: object required: [numero, compte_general, libelle] description: >- C'est à l'ouverture que le rattachement se fixe et se contrôle, en couples clé / référence exigés selon le type et le sous-type du compte général visé : pour un compte de parts d'épargnant, le rattachement (clé EPG) ET l'origine (clé ENT) sont OBLIGATOIRES — un compte ouvert sans son rattachement ne pourrait recevoir aucune écriture ; un sous-type entreprise, fonds ou société de gestion exige son rattachement ; un poste d'erreurs n'en porte aucun. Le rattachement se déclare ici et nulle part ailleurs — aucun chemin ne le modifie ensuite, un déplacement de droits entre entreprises étant un transfert entre deux comptes. Un second compte de parts pour un même couple, sous un compte général du même cadre légal, exige une justification de séparation documentée. Le type, le sous-type et le cadre légal ne se demandent pas : ils se décident au compte général du plan. properties: numero: type: string minLength: 1 description: L'identifiant public du compte à ouvrir. compte_general: type: string minLength: 1 description: >- Le numéro du compte général du plan dont le compte relève : il en tient le type, le sous-type et le cadre légal. libelle: type: string minLength: 1 description: Le libellé du compte, servi tel quel aux restitutions. rattachement_cle: type: string enum: [EPG, ENT, FDS, SGP, BNK, ORG] description: >- La clé du rattachement — l'entité dont le compte portera les avoirs ou qu'il reflétera : EPG épargnant, ENT entreprise, FDS fonds, SGP société de gestion, BNK compte bancaire reflété, ORG organisme. La clé admise est contrainte par le sous-type du compte général ; absente pour un poste sans entité propre (suspens, collectif). Clé et référence se donnent ensemble, jamais l'une sans l'autre. rattachement_ref: type: string minLength: 1 description: >- La référence du rattachement — un identifiant publié par le domaine détenteur (Épargnant, Entreprise, Instruments…), **immuable**. origine_cle: type: string enum: [ENT] description: >- La clé du second couple — comptes de parts d'épargnant seulement : l'origine des avoirs est toujours une entreprise. origine_ref: type: string minLength: 1 description: >- L'entreprise dont proviennent les avoirs — identifiant publié par le domaine Entreprise, **immuable**. Deux entreprises imposent deux comptes : elle ne se déduit ni de l'employeur courant, ni du dispositif, ni de l'instrument. justification_separation: type: string description: >- Le motif juridique ou contractuel, documenté, qui autorise un second compte de parts pour un même couple épargnant × entreprise sous un compte général du même cadre légal ; refusé sans lui. FicheDeCompteAdministre: type: object required: [compte, compte_general, libelle, type, sous_type, politique_temporelle, statut] properties: compte: type: string compte_general: type: string description: Le numéro du compte général dont le compte relève. libelle: type: string type: type: string enum: [parts-epargnant, especes, titres, mixte, droits-contractuels] description: Le type, tenu du compte général — ce que le compte enregistre. sous_type: type: string enum: [epargnant, entreprise, fonds, societe-de-gestion, banque, organisme, erreurs] description: Le sous-type, tenu du compte général — l'entité que le compte reflète. cadre_legal: type: string enum: [epargne-salariale, plan-epargne-retraite] description: >- Le cadre légal, dérivé du compte général — absent pour un compte hors cadre (banque, organisme, erreurs). rattachement_cle: type: string enum: [EPG, ENT, FDS, SGP, BNK, ORG] description: La clé du rattachement, telle que fixée à l'ouverture. rattachement_ref: type: string description: La référence du rattachement — un identifiant publié, immuable. origine_cle: type: string enum: [ENT] description: La clé du second couple — comptes de parts d'épargnant seulement. origine_ref: type: string description: L'entreprise d'origine des avoirs, immuable. politique_temporelle: type: string enum: [bitemporelle, double-axe-de-solde, position-courante, observations-attestees] description: Dérivée du type, servie pour information ; jamais demandée. statut: type: string enum: [en-preparation, ouvert, suspendu, en-cloture, clos, abandonne] description: Le cycle réel du compte (cycles de vie, § 2). Erreur: type: object required: [motif] properties: motif: type: string description: Le motif, qui nomme le champ ou l'identifiant en cause.