Aller au contenu

cas-d-usage-de-l-epargnant

Interface synchrone (OpenAPI) — version 0.1.0. Producteur : diapason.

Le consommateur est le serveur d’un teneur de compte, jamais le navigateur d’un épargnant. Une page de portail se sert en un à trois appels : le grain est le cas d’usage métier, pas l’écran. La plateforme ne sait jamais qui est devant l’écran du teneur. Elle sait quel client appelle, et pour quelle ressource : l’identifiant d’épargnant que porte un chemin désigne la ressource, il n’est jamais un sujet d’autorisation. Vérifier que la personne connectée est bien le titulaire des avoirs demandés est une obligation du teneur de compte, et une clause du contrat qui le lie à la plateforme. Ce contrat rend des valeurs décidées : la disponibilité, la valorisation et les montants nets sont servis calculés, avec leur motif. Il ne rend jamais les ingrédients dont un portail les recomposerait — ni échéance de lot, ni mesure de conformité, ni paramètre de règle.

openapi: 3.1.0
info:
title: diapason — les cas d'usage de l'épargnant
version: 0.1.0
summary: >-
Ce dont un portail d'épargnant a besoin, en valeurs décidées : sa situation, le détail
d'un dispositif, ce qui est disponible et pourquoi le reste ne l'est pas, l'historique,
l'offre de placement, les documents, le versement volontaire et l'arbitrage.
description: >-
Le consommateur est le **serveur** d'un teneur de compte, jamais le navigateur d'un
épargnant. Une page de portail se sert en un à trois appels : le grain est le cas
d'usage métier, pas l'écran.
La plateforme ne sait jamais qui est devant l'écran du teneur. Elle sait quel client
appelle, et pour quelle ressource : l'identifiant d'épargnant que porte un chemin **désigne
la ressource**, il n'est jamais un sujet d'autorisation. Vérifier que la personne connectée
est bien le titulaire des avoirs demandés est une obligation du teneur de compte, et une
clause du contrat qui le lie à la plateforme.
Ce contrat rend des **valeurs décidées** : la disponibilité, la valorisation et les
montants nets sont servis calculés, avec leur motif. Il ne rend jamais les ingrédients
dont un portail les recomposerait — ni échéance de lot, ni mesure de conformité, ni
paramètre de règle.
x-ruptures: []
x-producteurs:
- diapason
# Les serveurs des teneurs de compte ne sont pas recensables : un
# retrait de version majeure relève du préavis contractuel, jamais d'un décompte.
x-consommateurs: []
servers:
- url: https://{hote}
description: >-
Un hôte par teneur de compte — un processus ne sert qu'un tenant. Le tenant se lit à
l'hôte et au jeton, jamais dans un chemin : le nom d'hôte route, l'identité autorise.
variables:
hote:
default: passerelle.teneur.exemple
description: L'hôte attribué au teneur de compte à l'activation de sa passerelle.
security:
- jetonPartenaire: []
paths:
/v1/perimetre:
get:
operationId: consulterLePerimetreSouscrit
summary: Les cas d'usage que ce client peut exercer — lisibles par le teneur lui-même.
description: >-
Le périmètre souscrit se lit, il ne se devine pas à coups de 403. Il est **dérivé des
politiques d'autorisation** et jamais ressaisi à côté d'elles : cette réponse est une
projection de ce que le point de décision rendrait, pas une seconde source. Sa forme
reste à arbitrer.
responses:
'200':
description: Le périmètre du client qui appelle.
content:
application/json:
schema: { $ref: '#/components/schemas/PerimetreSouscrit' }
headers:
Correlation-Id: { $ref: '#/components/headers/CorrelationId' }
'401': { $ref: '#/components/responses/NonAuthentifie' }
/v1/epargnants/{epargnant}/situation:
get:
operationId: consulterLaSituationDEnsemble
summary: Les avoirs tous dispositifs confondus, valorisés, avec la part disponible.
description: >-
La page d'accueil d'un portail d'épargnant. Sans expansion, les seuls totaux ;
avec `inclure=dispositifs`, la ventilation par dispositif ; avec
`inclure=disponibilite`, le détail de ce qui n'est pas disponible et pourquoi.
L'expansion est **bornée par cette liste fermée** — aucune autre valeur n'est
acceptée, et le point de décision statue sur les mêmes cas d'usage que les
chemins qu'elle remplace.
parameters:
- $ref: '#/components/parameters/epargnant'
- $ref: '#/components/parameters/correlation'
- name: inclure
in: query
required: false
description: L'expansion demandée, dans la liste fermée du contrat.
schema:
type: array
items: { type: string, enum: [dispositifs, disponibilite] }
style: form
explode: false
responses:
'200':
description: La situation d'ensemble, aux expansions demandées.
content:
application/json:
schema: { $ref: '#/components/schemas/SituationDEnsemble' }
headers:
Correlation-Id: { $ref: '#/components/headers/CorrelationId' }
'400': { $ref: '#/components/responses/DemandeIrrecevable' }
'401': { $ref: '#/components/responses/NonAuthentifie' }
'403': { $ref: '#/components/responses/HorsPerimetre' }
'404': { $ref: '#/components/responses/Inconnu' }
/v1/epargnants/{epargnant}/dispositifs/{dispositif}:
get:
operationId: consulterLeDetailDUnDispositif
summary: Un dispositif détenu — supports, quantités, valorisation, origine des versements.
description: >-
Le mot du référentiel est **dispositif** : il couvre les plans d'épargne (PEE, PEI,
PERECO…) comme les mécanismes de partage de la valeur dont les avoirs sont issus.
Un portail qui affiche « mes plans » lit ici.
**Le dispositif est un axe de lecture, pas un compte.** La plateforme ne rattache
jamais un compte à un dispositif : le dispositif vit dans les lots de droits, et
« le PEE de cet épargnant » est une recomposition que la passerelle projette. Deux
conséquences visibles : un dispositif jamais alimenté n'apparaît pas, et les avoirs
d'un même dispositif issus de deux entreprises restent distingués par
`entreprise`.
L'origine des versements est servie en cumuls par origine — participation,
intéressement, abondement, prime de partage de la valeur, versement volontaire —,
jamais en lots de droits : un lot porte l'échéance et le paramétrage qui l'a fondée,
et les servir reviendrait à confier la règle de disponibilité au portail.
parameters:
- $ref: '#/components/parameters/epargnant'
- $ref: '#/components/parameters/dispositif'
- $ref: '#/components/parameters/correlation'
responses:
'200':
description: Le détail du dispositif détenu.
content:
application/json:
schema: { $ref: '#/components/schemas/DetailDUnDispositif' }
headers:
Correlation-Id: { $ref: '#/components/headers/CorrelationId' }
'401': { $ref: '#/components/responses/NonAuthentifie' }
'403': { $ref: '#/components/responses/HorsPerimetre' }
'404': { $ref: '#/components/responses/Inconnu' }
/v1/epargnants/{epargnant}/disponibilite:
get:
operationId: consulterLaDisponibilite
summary: Ce qui est disponible, et le motif de ce qui ne l'est pas.
description: >-
Le cas d'usage où la règle des valeurs décidées se joue en entier. La réponse
donne un montant disponible et, pour le reste, des parts indisponibles **portant
chacune son motif** et, quand elle est datée, la date à laquelle elle cesse de
l'être. Elle ne donne ni échéance de lot, ni identifiant de mesure de conformité,
ni contrainte élémentaire : un portail qui les recomposerait s'écarterait de notre
interprétation, et l'écart nous reviendrait en réclamation.
parameters:
- $ref: '#/components/parameters/epargnant'
- $ref: '#/components/parameters/correlation'
- name: dispositif
in: query
required: false
description: Restreindre à un dispositif ; absent, tous les dispositifs détenus.
schema: { type: string, minLength: 1 }
responses:
'200':
description: La disponibilité appréciée à l'instant servi.
content:
application/json:
schema: { $ref: '#/components/schemas/Disponibilite' }
headers:
Correlation-Id: { $ref: '#/components/headers/CorrelationId' }
'401': { $ref: '#/components/responses/NonAuthentifie' }
'403': { $ref: '#/components/responses/HorsPerimetre' }
'404': { $ref: '#/components/responses/Inconnu' }
/v1/epargnants/{epargnant}/operations:
get:
operationId: listerLesOperationsDeLEpargnant
summary: Ce qui est entré, sorti, arbitré — l'état de ce qui est en cours compris.
parameters:
- $ref: '#/components/parameters/epargnant'
- $ref: '#/components/parameters/correlation'
- name: depuis
in: query
required: false
description: Borne basse incluse, sur la date de l'opération.
schema: { type: string, format: date }
- name: jusqu_a
in: query
required: false
description: Borne haute incluse, sur la date de l'opération.
schema: { type: string, format: date }
- name: dispositif
in: query
required: false
schema: { type: string, minLength: 1 }
- name: en_cours
in: query
required: false
description: Vrai pour ne rendre que les opérations dont l'exécution n'est pas achevée.
schema: { type: boolean }
- $ref: '#/components/parameters/page'
- $ref: '#/components/parameters/taille'
responses:
'200':
description: La page demandée, du plus récent au plus ancien.
content:
application/json:
schema: { $ref: '#/components/schemas/PageDOperations' }
headers:
Correlation-Id: { $ref: '#/components/headers/CorrelationId' }
'400': { $ref: '#/components/responses/DemandeIrrecevable' }
'401': { $ref: '#/components/responses/NonAuthentifie' }
'403': { $ref: '#/components/responses/HorsPerimetre' }
'404': { $ref: '#/components/responses/Inconnu' }
/v1/epargnants/{epargnant}/operations/{operation}:
get:
operationId: consulterUneOperationDeLEpargnant
summary: Le détail d'une opération — et le suivi d'une écriture qu'on vient d'engager.
description: >-
C'est aussi la ressource que `Location` désigne après un versement ou un
arbitrage : le portail y suit l'avancement de ce qu'il a engagé. Le montant net est
servi **tel qu'il est porté** par les Opérations, jamais recalculé à la réponse.
parameters:
- $ref: '#/components/parameters/epargnant'
- $ref: '#/components/parameters/operation'
- $ref: '#/components/parameters/correlation'
responses:
'200':
description: La fiche de l'opération.
content:
application/json:
schema: { $ref: '#/components/schemas/FicheDOperation' }
headers:
Correlation-Id: { $ref: '#/components/headers/CorrelationId' }
'401': { $ref: '#/components/responses/NonAuthentifie' }
'403': { $ref: '#/components/responses/HorsPerimetre' }
'404': { $ref: '#/components/responses/Inconnu' }
/v1/epargnants/{epargnant}/dispositifs/{dispositif}/offre-de-placement:
get:
operationId: consulterLOffreDePlacement
summary: Les supports que le dispositif autorise, avec leur documentation réglementaire.
description: >-
L'offre est celle du dispositif **en vigueur**, servie sous la désignation de
l'épargnant parce que c'est son droit d'accès qui est apprécié. Chaque support
porte les documents réglementaires par lesquels il doit être présenté ; leur
contenu se télécharge par le cas d'usage « documents ».
parameters:
- $ref: '#/components/parameters/epargnant'
- $ref: '#/components/parameters/dispositif'
- $ref: '#/components/parameters/correlation'
responses:
'200':
description: L'offre de placement du dispositif.
content:
application/json:
schema: { $ref: '#/components/schemas/OffreDePlacement' }
headers:
Correlation-Id: { $ref: '#/components/headers/CorrelationId' }
'401': { $ref: '#/components/responses/NonAuthentifie' }
'403': { $ref: '#/components/responses/HorsPerimetre' }
'404': { $ref: '#/components/responses/Inconnu' }
/v1/epargnants/{epargnant}/documents:
get:
operationId: listerLesDocumentsDeLEpargnant
summary: Relevés de situation, avis d'opéré, documents d'information clé.
parameters:
- $ref: '#/components/parameters/epargnant'
- $ref: '#/components/parameters/correlation'
- name: type
in: query
required: false
description: Restreindre à un type ; absent, tous les types servis.
schema: { $ref: '#/components/schemas/TypeDeDocument' }
- name: depuis
in: query
required: false
description: Borne basse incluse, sur la date d'émission.
schema: { type: string, format: date }
- $ref: '#/components/parameters/page'
- $ref: '#/components/parameters/taille'
responses:
'200':
description: La page demandée, du plus récent au plus ancien.
content:
application/json:
schema: { $ref: '#/components/schemas/PageDeDocuments' }
headers:
Correlation-Id: { $ref: '#/components/headers/CorrelationId' }
'400': { $ref: '#/components/responses/DemandeIrrecevable' }
'401': { $ref: '#/components/responses/NonAuthentifie' }
'403': { $ref: '#/components/responses/HorsPerimetre' }
'404': { $ref: '#/components/responses/Inconnu' }
/v1/epargnants/{epargnant}/documents/{document}/contenu:
get:
operationId: telechargerUnDocumentDeLEpargnant
summary: Le document lui-même, dans le format sous lequel il a été émis.
description: >-
Le format annoncé par la liste fait foi ; un document est immuable, et l'octet
servi aujourd'hui est celui qui a été émis.
parameters:
- $ref: '#/components/parameters/epargnant'
- name: document
in: path
required: true
description: L'identifiant du document, tel que la liste le publie.
schema: { type: string, minLength: 1 }
- $ref: '#/components/parameters/correlation'
responses:
'200':
description: Le contenu du document.
content:
application/pdf:
schema: { type: string, format: binary }
headers:
Correlation-Id: { $ref: '#/components/headers/CorrelationId' }
'401': { $ref: '#/components/responses/NonAuthentifie' }
'403': { $ref: '#/components/responses/HorsPerimetre' }
'404': { $ref: '#/components/responses/Inconnu' }
/v1/epargnants/{epargnant}/versements:
post:
operationId: effectuerUnVersementVolontaire
summary: Engager un versement volontaire — de l'argent entre.
description: >-
La plateforme ne peut pas prouver que la personne à l'origine de cette écriture est
le titulaire : elle repose **entièrement** sur l'authentification faite par le
teneur de compte.
L'écriture est prise en compte, elle n'est pas exécutée : la réponse est un accusé
portant la référence de l'opération née, que `Location` désigne et que le portail
suit. Deux envois de la même clé d'idempotence produisent **un** versement.
parameters:
- $ref: '#/components/parameters/epargnant'
- $ref: '#/components/parameters/idempotence'
- $ref: '#/components/parameters/correlation'
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/DemandeDeVersement' }
responses:
'202':
description: >-
Le versement est pris en compte. Un rejeu de la même clé rend cette même
réponse, avec la même référence.
headers:
Location:
description: La ressource d'opération où suivre l'exécution.
schema: { type: string }
Correlation-Id: { $ref: '#/components/headers/CorrelationId' }
content:
application/json:
schema: { $ref: '#/components/schemas/PriseEnCompte' }
'400': { $ref: '#/components/responses/DemandeIrrecevable' }
'401': { $ref: '#/components/responses/NonAuthentifie' }
'403': { $ref: '#/components/responses/HorsPerimetre' }
'404': { $ref: '#/components/responses/Inconnu' }
'409': { $ref: '#/components/responses/RejeuDivergent' }
'422': { $ref: '#/components/responses/EcritureRefusee' }
/v1/epargnants/{epargnant}/arbitrages:
post:
operationId: demanderUnArbitrage
summary: Engager un arbitrage entre supports — la composition change, rien ne sort.
description: >-
Le désinvestissement et le réinvestissement s'expriment en **millièmes**, jamais en
nombre à virgule : le désinvestissement en millièmes de ce qui est détenu sur
chaque support, le réinvestissement en millièmes du produit, de somme exactement
1000. Mêmes garanties que le versement — idempotence par clé, prise en compte,
suivi par la ressource d'opération.
parameters:
- $ref: '#/components/parameters/epargnant'
- $ref: '#/components/parameters/idempotence'
- $ref: '#/components/parameters/correlation'
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/DemandeDArbitrage' }
responses:
'202':
description: L'arbitrage est pris en compte.
headers:
Location:
description: La ressource d'opération où suivre l'exécution.
schema: { type: string }
Correlation-Id: { $ref: '#/components/headers/CorrelationId' }
content:
application/json:
schema: { $ref: '#/components/schemas/PriseEnCompte' }
'400': { $ref: '#/components/responses/DemandeIrrecevable' }
'401': { $ref: '#/components/responses/NonAuthentifie' }
'403': { $ref: '#/components/responses/HorsPerimetre' }
'404': { $ref: '#/components/responses/Inconnu' }
'409': { $ref: '#/components/responses/RejeuDivergent' }
'422': { $ref: '#/components/responses/EcritureRefusee' }
components:
securitySchemes:
jetonPartenaire:
type: http
scheme: bearer
bearerFormat: JWT
description: >-
Le jeton est obtenu par le **client credentials grant** OAuth 2.0 : l'appelant est
le serveur du teneur de compte, pas une personne. Il est validé comme par tout
serveur de ressources — signature, émetteur, dates, audience, tenant comparé au
tenant du déploiement.
**L'audience est celle de ce contrat.** Le jeton doit avoir été obtenu pour la
surface de l'épargnant : un jeton obtenu pour celle du correspondant est rejeté en
`401`, et non en `403` — il ne nous était pas adressé, ce n'est pas un droit qui
manque. Un client enregistré ne sert qu'un teneur de compte ; il peut en revanche
servir les deux surfaces, si son enregistrement l'y autorise. Un teneur qui sert ses
deux portails depuis un seul serveur obtient donc deux jetons et route par surface.
**Le jeton authentifie, il n'autorise pas** : aucune portée, aucun claim
propriétaire n'accorde quoi que ce soit. L'autorisation est rendue à chaque appel
par le point de décision, sur la question relationnelle « ce client sert-il le
teneur dont relève la ressource, et ce cas d'usage est-il dans son périmètre
souscrit ? ». La liste de portées de ce schéma est vide, et c'est intentionnel.
headers:
CorrelationId:
description: L'identifiant de corrélation reçu, restitué tel quel — la jointure entre le journal du teneur et le nôtre.
schema: { type: string, minLength: 1, maxLength: 128 }
parameters:
epargnant:
name: epargnant
in: path
required: true
description: >-
L'identifiant publié de l'épargnant chez ce teneur de compte. Il **désigne la
ressource** ; il n'est jamais le sujet de l'autorisation.
schema: { type: string, minLength: 1 }
dispositif:
name: dispositif
in: path
required: true
description: L'identifiant publié du dispositif — plan d'épargne ou mécanisme de partage de la valeur.
schema: { type: string, minLength: 1 }
operation:
name: operation
in: path
required: true
description: La référence de l'opération, telle que la plateforme l'a publiée.
schema: { type: string, minLength: 1 }
correlation:
name: Correlation-Id
in: header
required: true
description: >-
L'identifiant que le teneur de compte donne à l'échange dans **son** journal.
Obligatoire : notre trace dit qui a lu quoi, jamais pour qui, et ce champ est la
seule jointure entre les deux journaux. Il est restitué dans la réponse.
schema: { type: string, minLength: 1, maxLength: 128 }
idempotence:
name: Idempotency-Key
in: header
required: true
description: >-
La clé d'idempotence de l'écriture, choisie par l'appelant. Un serveur tiers
réessaie : deux envois de la même clé produisent **un** effet. Le rejeu à charge
identique rend la réponse d'origine ; le rejeu à charge différente est refusé.
schema: { type: string, minLength: 8, maxLength: 128 }
page:
name: page
in: query
required: false
description: >-
L'ordre est fixé par un critère stable : une page suivante ne saute ni ne répète
une ligne, même si des lignes naissent entre deux appels.
schema: { type: integer, minimum: 0, default: 0 }
taille:
name: taille
in: query
required: false
schema: { type: integer, minimum: 1, maximum: 200, default: 50 }
responses:
DemandeIrrecevable:
description: 400 — la demande est mal formée ; le motif nomme le champ en cause.
content:
application/json:
schema: { $ref: '#/components/schemas/Erreur' }
NonAuthentifie:
description: >-
401 — aucune identité présentée, ou jeton invalide : signature, émetteur, dates,
tenant, ou **audience obtenue pour une autre surface**. La réponse porte
`WWW-Authenticate: Bearer error="invalid_token"`.
headers:
WWW-Authenticate:
description: Le défi d'authentification, au format des jetons porteurs.
schema: { type: string }
content:
application/json:
schema: { $ref: '#/components/schemas/Erreur' }
HorsPerimetre:
description: >-
403 — le cas d'usage n'est pas dans le périmètre souscrit de ce client. La réponse
ne dit jamais si la ressource existe.
content:
application/json:
schema: { $ref: '#/components/schemas/Erreur' }
Inconnu:
description: >-
404 — inconnu de ce teneur de compte. Un épargnant, un dispositif ou une opération
relevant d'un autre teneur est *inexistant*, jamais *interdit* : la muraille de
Chine ne laisse pas fuir une existence.
content:
application/json:
schema: { $ref: '#/components/schemas/Erreur' }
RejeuDivergent:
description: >-
409 — cette clé d'idempotence a déjà servi, avec une charge utile différente. Rien
n'a été engagé.
content:
application/json:
schema: { $ref: '#/components/schemas/Erreur' }
EcritureRefusee:
description: >-
422 — la demande est bien formée mais l'écriture est refusée par le métier :
support fermé, montant hors des limites du dispositif, avoirs indisponibles. Le
motif est servi décidé, jamais sous forme de règle à recomposer.
content:
application/json:
schema: { $ref: '#/components/schemas/Erreur' }
schemas:
PerimetreSouscrit:
type: object
required: [client, contrat, audience, version, cas_d_usage]
properties:
client:
type: string
description: L'identifiant du client OAuth qui appelle — le sujet de l'autorisation.
contrat:
type: string
description: Le contrat concerné (« cas-d-usage-de-l-epargnant »).
audience:
type: string
description: >-
L'audience pour laquelle un jeton doit être obtenu afin d'exercer ce contrat —
la valeur à demander au point de jeton. Un client qui sert aussi la surface du
correspondant lit l'autre audience dans l'autre contrat.
version:
type: string
description: La version du contrat servie par ce déploiement.
cas_d_usage:
type: array
description: >-
Les `operationId` que ce client peut exercer. Un cas d'usage absent répond 403
sans révéler l'existence de la ressource.
items: { type: string }
SituationDEnsemble:
type: object
required: [epargnant, valorise_au, montant_total_ct, montant_disponible_ct, montant_indisponible_ct]
properties:
epargnant: { type: string }
valorise_au:
type: string
format: date
description: >-
La date des valeurs liquidatives appliquées. Une position passée ne se valorise
jamais au dernier cours connu : la date sert à le dire au porteur.
montant_total_ct:
type: integer
description: La valorisation totale, en **centimes d'euro** — jamais un flottant.
montant_disponible_ct: { type: integer }
montant_indisponible_ct: { type: integer }
valeurs_manquantes:
type: array
description: >-
Les supports dont la valeur liquidative manque à la date servie, nommés. Leur
montant n'entre dans aucun total : un total incomplet se dit, il ne s'arrondit
pas.
items: { type: string }
dispositifs:
type: array
description: Servi avec `inclure=dispositifs`.
items: { $ref: '#/components/schemas/SituationParDispositif' }
disponibilite:
description: Servi avec `inclure=disponibilite`.
$ref: '#/components/schemas/Disponibilite'
SituationParDispositif:
type: object
required: [dispositif, libelle, type, cadre_legal, montant_ct, montant_disponible_ct]
properties:
dispositif: { type: string }
libelle: { type: string, description: Le libellé d'usage du dispositif chez ce teneur. }
type:
type: string
description: >-
Le type de dispositif — PEE, PEI, PERECO, participation, intéressement… — dans
la nomenclature publiée par le domaine Entreprise.
cadre_legal: { $ref: '#/components/schemas/CadreLegal' }
entreprise:
type: string
description: L'entreprise dont le dispositif est issu ; le détail par entreprise n'est jamais mélangé.
montant_ct: { type: integer }
montant_disponible_ct: { type: integer }
CadreLegal:
type: string
description: >-
Le cadre légal dont relèvent les avoirs — c'est lui qui décide de ce qu'un
épargnant peut demander, et il se lit sans être déduit du type de dispositif.
enum: [epargne-salariale, plan-epargne-retraite]
DetailDUnDispositif:
type: object
required: [dispositif, libelle, type, cadre_legal, valorise_au, montant_ct, supports, origines]
properties:
dispositif: { type: string }
libelle: { type: string }
type: { type: string }
cadre_legal: { $ref: '#/components/schemas/CadreLegal' }
entreprise: { type: string }
valorise_au: { type: string, format: date }
montant_ct: { type: integer }
supports:
type: array
items: { $ref: '#/components/schemas/SupportDetenu' }
origines:
type: array
description: >-
L'origine des versements en cumuls — participation, intéressement, abondement,
prime de partage de la valeur, versement volontaire, transfert. Jamais les lots
de droits qui les composent.
items: { $ref: '#/components/schemas/CumulParOrigine' }
SupportDetenu:
type: object
required: [support, libelle, quantite, montant_ct]
properties:
support:
type: string
description: L'identifiant publié de l'instrument — le fonds, le titre.
libelle: { type: string }
quantite:
type: integer
description: >-
La quantité détenue — toujours un entier, jamais un flottant. **L'unité est
celle de l'instrument**, publiée par le référentiel des instruments : elle ne
se devine pas, et deux instruments n'ont pas nécessairement la même.
valeur_liquidative_ue6:
type: integer
description: La valeur liquidative appliquée, en **micro-euros**.
valeur_liquidative_du:
type: string
format: date
description: La date de cette valeur liquidative — absente si la valeur manque.
montant_ct:
type: integer
description: La valorisation de la ligne, en centimes ; absente si la valeur liquidative manque.
CumulParOrigine:
type: object
required: [origine, libelle, montant_ct]
properties:
origine:
type: string
description: L'origine d'avoir, dans la nomenclature des dimensions de lot du référentiel.
libelle: { type: string }
montant_ct: { type: integer }
Disponibilite:
type: object
required: [epargnant, apprecie_au, montant_disponible_ct, parts_indisponibles]
properties:
epargnant: { type: string }
apprecie_au:
type: string
format: date-time
description: L'instant auquel la disponibilité a été appréciée.
montant_disponible_ct: { type: integer }
parts_indisponibles:
type: array
description: Le tableau vide signifie « tout est disponible ».
items: { $ref: '#/components/schemas/PartIndisponible' }
PartIndisponible:
type: object
required: [dispositif, montant_ct, motif]
properties:
dispositif: { type: string }
montant_ct: { type: integer }
motif:
type: string
description: >-
Le motif **décidé**, dans le vocabulaire clos que la tenue de compte publie.
Il remplace les ingrédients — échéance de lot, mesure de conformité,
réservation — que le portail recomposerait.
enum:
- ECHEANCE_NON_ATTEINTE
- INDISPONIBLE_JUSQU_A_LA_RETRAITE
- AVOIRS_GELES
- RESERVE_PAR_UNE_OPERATION
- AUTRE_CONTRAINTE
disponible_le:
type: string
format: date
description: >-
La date à laquelle cette part cesse d'être indisponible, quand elle est datée.
Absente pour un motif sans terme connu — un gel n'a pas d'échéance.
precision:
type: string
description: >-
Une phrase destinée à être affichée telle quelle, quand le motif seul ne suffit
pas à l'expliquer au porteur. Elle ne nomme jamais une mesure de conformité.
PageDOperations:
type: object
required: [lignes, total]
properties:
lignes:
type: array
items: { $ref: '#/components/schemas/LigneDOperation' }
total:
type: [integer, 'null']
description: >-
Le nombre total de lignes du filtre — **null quand il ne se compte pas à
coût raisonnable**. Un portail pagine sans total ; il ne le fabrique pas.
LigneDOperation:
type: object
required: [operation, nature, etat, date]
properties:
operation: { type: string }
nature:
type: string
description: >-
La nature de l'opération — versement, abondement, arbitrage, rachat,
transfert — dans la nomenclature publiée par les Opérations.
etat:
type: string
description: >-
L'état d'avancement servi tel que les Opérations le portent — en cours,
exécutée, annulée, en anomalie. Un portail affiche cet état, il ne l'interprète
pas.
date: { type: string, format: date }
dispositif: { type: string }
montant_net_ct:
type: integer
description: Le net servi tel qu'il est porté, jamais recalculé à la réponse ; absent tant qu'il n'est pas arrêté.
FicheDOperation:
type: object
required: [operation, nature, etat, date_demande]
properties:
operation: { type: string }
nature: { type: string }
etat: { type: string }
date_demande: { type: string, format: date }
date_execution: { type: string, format: date }
dispositif: { type: string }
montant_brut_ct: { type: integer }
montant_net_ct: { type: integer }
prelevements:
type: array
description: >-
Les frais et taxes du brut au net, servis décidés avec leur libellé — jamais
l'assiette et le taux dont un portail les recalculerait.
items:
type: object
required: [libelle, montant_ct]
properties:
libelle: { type: string }
montant_ct: { type: integer }
mouvements:
type: array
description: Les supports mouvementés par l'opération.
items:
type: object
required: [support, sens, quantite]
properties:
support: { type: string }
sens: { type: string, enum: [ENTREE, SORTIE] }
quantite: { type: integer, description: Dans l'unité de l'instrument, publiée par le référentiel des instruments. }
montant_ct: { type: integer }
OffreDePlacement:
type: object
required: [dispositif, supports]
properties:
dispositif: { type: string }
supports:
type: array
items: { $ref: '#/components/schemas/SupportEligible' }
SupportEligible:
type: object
required: [support, libelle, ouvert_aux_versements, documents]
properties:
support: { type: string }
libelle: { type: string }
classification:
type: string
description: La classification du support telle que le référentiel des instruments la publie.
ouvert_aux_versements:
type: boolean
description: >-
La valeur décidée : ce support accepte-t-il un versement aujourd'hui dans ce
dispositif ? Le portail n'a pas à croiser une date de fermeture avec un
paramétrage.
documents:
type: array
description: >-
Les documents réglementaires par lesquels le support doit être présenté — leur
contenu se télécharge par le cas d'usage « documents ».
items:
type: object
required: [document, type]
properties:
document: { type: string }
type: { $ref: '#/components/schemas/TypeDeDocument' }
TypeDeDocument:
type: string
description: Le vocabulaire clos des documents servis à l'épargnant.
enum:
- RELEVE_DE_SITUATION
- AVIS_D_OPERE
- DOCUMENT_D_INFORMATION_CLE
- REGLEMENT_DU_DISPOSITIF
PageDeDocuments:
type: object
required: [lignes, total]
properties:
lignes:
type: array
items: { $ref: '#/components/schemas/LigneDeDocument' }
total:
type: [integer, 'null']
description: >-
Le nombre total de lignes du filtre — **null quand il ne se compte pas à
coût raisonnable**. Un portail pagine sans total ; il ne le fabrique pas.
LigneDeDocument:
type: object
required: [document, type, libelle, emis_le, format]
properties:
document: { type: string }
type: { $ref: '#/components/schemas/TypeDeDocument' }
libelle: { type: string }
emis_le: { type: string, format: date }
format: { type: string, enum: [application/pdf] }
dispositif: { type: string }
DemandeDeVersement:
type: object
required: [dispositif, montant_ct, repartition]
properties:
dispositif: { type: string }
montant_ct:
type: integer
minimum: 1
description: Le montant versé, en centimes d'euro.
repartition:
type: array
minItems: 1
description: La ventilation du versement sur les supports, en millièmes, de somme exactement 1000.
items: { $ref: '#/components/schemas/PartSurSupport' }
reference_du_teneur:
type: string
description: >-
La référence que le teneur de compte donne à cette demande dans ses propres
systèmes ; restituée dans la fiche d'opération.
DemandeDArbitrage:
type: object
required: [dispositif, desinvestissements, reinvestissements]
properties:
dispositif: { type: string }
desinvestissements:
type: array
minItems: 1
description: >-
Ce qui est cédé, en millièmes de ce qui est détenu sur chaque support — 1000
pour la totalité d'un support.
items: { $ref: '#/components/schemas/PartSurSupport' }
reinvestissements:
type: array
minItems: 1
description: La destination du produit, en millièmes, de somme exactement 1000.
items: { $ref: '#/components/schemas/PartSurSupport' }
reference_du_teneur: { type: string }
PartSurSupport:
type: object
required: [support, part_millieme]
properties:
support: { type: string }
part_millieme:
type: integer
minimum: 1
maximum: 1000
description: Une part en millièmes — un entier, parce qu'un pourcentage à virgule ne se répartit pas au centime.
PriseEnCompte:
type: object
required: [operation, etat, recu_le]
properties:
operation:
type: string
description: La référence de l'opération née — celle que `Location` désigne.
etat:
type: string
description: L'état de l'opération à la prise en compte.
recu_le: { type: string, format: date-time }
reference_du_teneur: { type: string }
Erreur:
type: object
required: [code, motif]
properties:
code:
type: string
description: >-
Le code stable sur lequel un portail se branche — le motif, lui, est écrit pour
être lu par une personne et peut changer sans rupture.
enum:
- DEMANDE_MAL_FORMEE
- CHAMP_INVALIDE
- NON_AUTHENTIFIE
- HORS_PERIMETRE_SOUSCRIT
- RESSOURCE_INCONNUE
- REJEU_DIVERGENT
- ECRITURE_REFUSEE
motif:
type: string
description: Le motif, qui nomme le champ ou l'identifiant en cause.
champ:
type: string
description: Le champ en cause, quand l'erreur en désigne un.
correlation:
type: string
description: L'identifiant de corrélation de l'appel — le même que l'en-tête restitué.