evenement-d-instrument
Événement (AsyncAPI) — version 0.5.0. Producteur : instruments. Consommateurs déclarés : operations, fiscalite.
Le cycle des événements de la vie des instruments — fusion, scission, réajustement, distribution — représentés par délégation de la société de gestion. Chaque transition publie son fait, une seule fois par événement, jamais par porteur ; le mécanisme n’émet aucun ordre. Enveloppe CloudEvents 1.0.2 en mode structuré JSON ; aucun identifiant de tenant n’est transporté. Unicité du fait : (evenement, type_de_fait).
La spécification
Section intitulée « La spécification »asyncapi: 3.0.0info: title: instruments — l'événement d'instrument (le cycle des OST) version: 0.5.0 description: >- Le cycle des événements de la vie des instruments — fusion, scission, réajustement, distribution — représentés par délégation de la société de gestion. Chaque transition publie son fait, une seule fois par événement, jamais par porteur ; le mécanisme n'émet aucun ordre. Enveloppe CloudEvents 1.0.2 en mode structuré JSON ; aucun identifiant de tenant n'est transporté. Unicité du fait : (evenement, type_de_fait). x-producteurs: - instruments x-consommateurs: - composant: operations - composant: fiscalite x-ruptures: - version: 0.5.0 rupture: "schéma remanié : decisionFusion perd correspondances_categories ; chaque absorbé porte sa ligne d'arrivée (cible)" motif: >- Fusion arbitrée le 2026-08-13 (journal des décisions) : une catégorie de parts différenciée EST un instrument — la correspondance de fusion se dit d'instrument à instrument, l'absorbé désignant la ligne qui le remplace. - version: 0.4.0 rupture: "enveloppe remplacée : le socle propriétaire devient CloudEvents 1.0.2 en mode structuré JSON" motif: >- La séquence par événement reste, en extension ; la référence de causalité (document, événement corrigé) devient l'extension cause. - version: 0.4.0 rupture: "propriété retirée : tenant" motif: >- Isolation forte par tenant — aucun identifiant de tenant n'est transporté ; l'émission « une fois par tenant et par événement » devient « une fois par événement », l'unicité du fait perd sa composante tenant.defaultContentType: application/cloudevents+jsonchannels: evenementDInstrument: address: instruments.evenement description: >- Canal logique du cycle des événements d'instrument. L'ordre n'est garanti que par producteur (sequence strictement croissante par événement), jamais entre producteurs. messages: evenementAnnonce: $ref: '#/components/messages/evenementAnnonce' evenementPrononce: $ref: '#/components/messages/evenementPrononce' evenementDenoue: $ref: '#/components/messages/evenementDenoue' evenementAnnule: $ref: '#/components/messages/evenementAnnule'operations: publierLeCycleDesEvenements: action: send channel: $ref: '#/channels/evenementDInstrument' summary: Chaque transition du cycle publie son fait, retenu en boîte d'envoi. messages: - $ref: '#/channels/evenementDInstrument/messages/evenementAnnonce' - $ref: '#/channels/evenementDInstrument/messages/evenementPrononce' - $ref: '#/channels/evenementDInstrument/messages/evenementDenoue' - $ref: '#/channels/evenementDInstrument/messages/evenementAnnule'components: messages: evenementAnnonce: name: evenement-annonce title: Événement annoncé summary: La décision est annoncée — calendrier connu, caractéristiques non figées. contentType: application/cloudevents+json payload: allOf: - $ref: '#/components/schemas/enveloppeCloudEvents' - type: object required: [data] properties: type: { const: fr.epargne.instruments.evenement.annonce.v1 } dataschema: { const: 'urn:schema:epargne:instruments:evenement-annonce:1' } data: { $ref: '#/components/schemas/chapeau' } evenementPrononce: name: evenement-prononce title: Événement prononcé summary: >- Les caractéristiques sont arrêtées et FIGÉES — le message porteur, sa charge typée par le type d'événement ; après, seule la correction par un événement correctif existe. contentType: application/cloudevents+json payload: allOf: - $ref: '#/components/schemas/enveloppeCloudEvents' - type: object required: [data] properties: type: { const: fr.epargne.instruments.evenement.prononce.v1 } dataschema: { const: 'urn:schema:epargne:instruments:evenement-prononce:1' } data: allOf: - $ref: '#/components/schemas/chapeau' - type: object required: [decision] properties: decision: description: La décision typée — exactement l'une des quatre formes. oneOf: - $ref: '#/components/schemas/decisionFusion' - $ref: '#/components/schemas/decisionScission' - $ref: '#/components/schemas/decisionReajustement' - $ref: '#/components/schemas/decisionDistribution' evenementDenoue: name: evenement-denoue title: Événement dénoué summary: >- Le dénouement constaté — sur le retour agrégé des consommateurs. Pour une fusion, il emporte la fin de vie des absorbés : leurs terminus se publient au contrat evenement-du-cycle-de-vie. contentType: application/cloudevents+json payload: allOf: - $ref: '#/components/schemas/enveloppeCloudEvents' - type: object required: [data] properties: type: { const: fr.epargne.instruments.evenement.denoue.v1 } dataschema: { const: 'urn:schema:epargne:instruments:evenement-denoue:1' } data: allOf: - $ref: '#/components/schemas/chapeau' - type: object required: [denoue_le] properties: denoue_le: { type: string, format: date } evenementAnnule: name: evenement-annule title: Événement annulé summary: Le renoncement — avant le prononcé seulement ; après, un événement correctif référence le fautif (cause). contentType: application/cloudevents+json payload: allOf: - $ref: '#/components/schemas/enveloppeCloudEvents' - type: object required: [data] properties: type: { const: fr.epargne.instruments.evenement.annule.v1 } dataschema: { const: 'urn:schema:epargne:instruments:evenement-annule:1' } data: allOf: - $ref: '#/components/schemas/chapeau' - type: object required: [motif] properties: motif: { type: string } schemas: enveloppeCloudEvents: type: object # Les consommateurs sont tolérants : un champ inconnu s'ignore. required: [specversion, id, source, type, subject, time, datacontenttype, dataschema, sequence, data] properties: specversion: { type: string, const: '1.0' } id: { type: string, minLength: 1, description: L'identifiant unique du fait — la clé d'idempotence. } source: { type: string, const: 'urn:epargne:instruments' } type: { type: string, minLength: 1 } subject: type: string minLength: 1 description: L'identifiant publié de l'événement d'instrument. time: { type: string, format: date-time, description: L'instant de la retenue du fait (UTC). } datacontenttype: { type: string, const: application/json } dataschema: { type: string, format: uri-reference } sequence: type: integer minimum: 1 description: Extension — la séquence du cycle chez le producteur, strictement croissante par événement. cause: type: string description: >- Extension — la référence de causalité : le document qui établit la décision, s'il existe ; l'événement corrigé, pour un correctif (obligatoire alors). data: true chapeau: type: object required: [evenement, type_evenement, annonce_le, instruments_touches] properties: evenement: { type: string, description: L'identifiant publié — le sujet du fait, répété dans la charge. } type_evenement: { type: string, enum: [fusion, scission, reajustement, distribution] } annonce_le: { type: string, format: date } effet_le: { type: string, format: date } denouement_prevu_le: { type: string, format: date } instruments_touches: type: array minItems: 1 description: Les instruments touchés, chacun avec son rôle — l'ordre et l'orientation sont publiés. items: type: object required: [instrument, role] properties: instrument: { type: string } role: { type: string, enum: [absorbant, absorbe, source, cible, concerne] } decisionFusion: type: object required: [forme, absorbant, absorbes] properties: forme: { const: fusion } absorbant: { type: string, description: L'identifiant publié. } absorbes: type: array minItems: 1 items: type: object required: [instrument, parite_p6] properties: instrument: { type: string } parite_p6: type: integer description: La parité d'échange en millionièmes — arrêtée au prononcé. cible: type: string description: >- La ligne d'arrivée de cet absorbé, quand la fusion touche plusieurs lignes (des catégories de parts différenciées) — absente, l'absorbant unique est la cible. decisionScission: type: object required: [forme, source, cibles] properties: forme: { const: scission } source: { type: string } cibles: type: array minItems: 1 items: type: object required: [instrument, cle_repartition_p6] properties: instrument: { type: string } cle_repartition_p6: { type: integer, description: La clé de répartition en millionièmes. } decisionReajustement: type: object required: [forme, instrument, coefficient_p6] properties: forme: { const: reajustement } instrument: { type: string } coefficient_p6: type: integer description: Le coefficient en millionièmes — division ou regroupement ; quantités recalculées, valeur totale inchangée. decisionDistribution: type: object required: [forme, instrument, coupon_part_ue6] properties: forme: { const: distribution } instrument: { type: string } coupon_part_ue6: { type: integer, description: Le coupon par part, en micro-euros. } date_detachement: { type: string, format: date } date_paiement: { type: string, format: date } # La forme (versée / réinvestie) et la fiscalité attendent la capture au # référentiel réglementaire — le modèle porte l'anatomie de la décision, pas # son régime.