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.
La spécification
Section intitulée « La spécification »openapi: 3.1.0info: 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é.