Aller au contenu

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.

openapi: 3.1.0
info:
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.