comptes-rendus-d-execution
Événement (AsyncAPI) — version 0.2.0. Producteur : carnet-ordres. Consommateurs déclarés : tenue-de-compte.
LES FAITS COMPTABLES DONT LE DOMAINE EST L’AUTORITÉ. Le carnet d’ordres constate L’EXÉCUTION D’UN ORDRE, et personne d’autre ne la constate. CE SONT DES CRE, JAMAIS DES CRO : le mot « compte rendu d’opération » désigne uniquement la catégorie des CRE produits par le domaine Opérations. LE DOMAINE N’INSCRIT AUCUNE ÉCRITURE et ne touche AUCUNE POSITION : produire un compte rendu n’est pas comptabiliser, et la tenue de compte reste seule à interpréter. LA MAILLE EST LE COMPTE — aucun compte rendu agrégé n’existe, ce qui rend structurel l’interdit de double incidence.
La spécification
Section intitulée « La spécification »asyncapi: 3.0.0info: title: carnet-ordres — les comptes rendus d'exécution version: 0.2.0 x-ruptures: - version: 0.2.0 rupture: "propriété retirée : tenant" motif: >- Isolation forte par tenant — aucun identifiant de tenant n'est transporté ; l'appartenance est celle de l'installation (précédent instruments 0.4.0). description: >- LES FAITS COMPTABLES DONT LE DOMAINE EST L'AUTORITÉ. Le carnet d'ordres constate L'EXÉCUTION D'UN ORDRE, et personne d'autre ne la constate. CE SONT DES CRE, JAMAIS DES CRO : le mot « compte rendu d'opération » désigne uniquement la catégorie des CRE produits par le domaine Opérations. LE DOMAINE N'INSCRIT AUCUNE ÉCRITURE et ne touche AUCUNE POSITION : produire un compte rendu n'est pas comptabiliser, et la tenue de compte reste seule à interpréter. LA MAILLE EST LE COMPTE — aucun compte rendu agrégé n'existe, ce qui rend structurel l'interdit de double incidence. x-producteurs: - carnet-ordres x-consommateurs: - tenue-de-comptedefaultContentType: application/json
channels:
comptesRendusDExecution: address: carnet-ordres.compte-rendu-execution description: >- Les comptes rendus d'exécution vers la tenue de compte. SEUL CANAL COMPTABILISABLE DU DOMAINE : les retours vers Opérations et les obligations de règlement vers la banque ont leurs propres canaux, et les mêler ouvrirait la porte à une comptabilisation prématurée. messages: souscriptionExecutee: { $ref: '#/components/messages/souscriptionExecutee' } rachatExecute: { $ref: '#/components/messages/rachatExecute' } achatTitresExecute: { $ref: '#/components/messages/achatTitresExecute' } venteTitresExecutee: { $ref: '#/components/messages/venteTitresExecutee' } executionRegularisee: { $ref: '#/components/messages/executionRegularisee' }
operations:
publierLesComptesRendusDExecution: action: send channel: { $ref: '#/channels/comptesRendusDExecution' } summary: >- Attester un fait définitif d'exécution, selon une RÈGLE DE FINALITÉ VERSIONNÉE portée par le profil de chaîne — allocation individuelle arrêtée sur une chaîne fonds, dénouement titres prononcé sur une chaîne de livraison. messages: - $ref: '#/channels/comptesRendusDExecution/messages/souscriptionExecutee' - $ref: '#/channels/comptesRendusDExecution/messages/rachatExecute' - $ref: '#/channels/comptesRendusDExecution/messages/achatTitresExecute' - $ref: '#/channels/comptesRendusDExecution/messages/venteTitresExecutee' - $ref: '#/channels/comptesRendusDExecution/messages/executionRegularisee'
components:
messages:
souscriptionExecutee: name: souscription-executee title: Souscription exécutée summary: Des parts ont été définitivement attribuées à un compte contre un montant investi. contentType: application/json payload: { $ref: '#/components/schemas/creDeFonds' }
rachatExecute: name: rachat-execute title: Rachat exécuté summary: Des parts ont été définitivement rachetées et le produit brut est déterminé. contentType: application/json payload: { $ref: '#/components/schemas/creDeFonds' }
achatTitresExecute: name: achat-titres-execute title: Achat de titres exécuté summary: Un achat de titres est exécuté et livré. contentType: application/json payload: { $ref: '#/components/schemas/creDeTitres' }
venteTitresExecutee: name: vente-titres-executee title: Vente de titres exécutée summary: Une vente de titres est exécutée et livrée. contentType: application/json payload: { $ref: '#/components/schemas/creDeTitres' }
executionRegularisee: name: execution-regularisee title: Exécution régularisée summary: >- Correction d'une exécution antérieure — valeur liquidative corrigée, quantité ou frais. UN COMPTE RENDU PUBLIÉ N'EST JAMAIS CORRIGÉ EN PLACE : c'est un FAIT NOUVEAU qui référence le précédent et porte la DIFFÉRENCE SIGNÉE. contentType: application/json payload: { $ref: '#/components/schemas/creDeRegularisation' }
schemas:
enveloppe: description: >- L'ENVELOPPE EST CELLE DE LA TENUE DE COMPTE (contrat cre-enveloppe 0.3), PAS LA NÔTRE : c'est le consommateur qui fixe la forme de ce qu'il reçoit et déduplique. DEUX DE SES CHAMPS RESTENT VIDES POUR CE PRODUCTEUR : dispositif_ref et dispositif_version, que le carnet ne reçoit pas et n'inventera pas — les Opérations les servent sur leur propre catégorie, pour le même lot de droits. reservation_ref reste vide aussi : la réservation de l'enveloppe est une réservation de DROITS chez la tenue de compte, la nôtre est l'immobilisation d'une quantité pendant l'exécution, et elle ne franchit aucune frontière. type: object required: [identifiant, type, version_type, cle_idempotence, date_fait_generateur, date_valeur, cree_le, cree_par] properties: identifiant: type: string description: Identifiant du compte rendu chez son producteur — unique par producteur. type: type: string enum: [CO-SOUSCRIPTION-EXECUTEE, CO-RACHAT-EXECUTE, CO-ACHAT-TITRES-EXECUTE, CO-VENTE-TITRES-EXECUTEE, CO-EXECUTION-REGULARISEE] description: >- Code du type, appartenant à la NOMENCLATURE type_cre DE LA TENUE DE COMPTE, dont le CATALOGUE DES TYPES posait la catégorie « carnet-ordres » en attendant la naissance de ce contrat. Chaque code y déclare son AXE TEMPOREL DE SÉLECTION du schéma comptable et sa RÈGLE D'IDEMPOTENCE : ils ne sont plus uniformes depuis l'enveloppe 0.2. Proposition à CONTRESIGNER par une session de la tenue de compte — le producteur nomme, le consommateur arrête. version_type: { type: string, description: 'Version SemVer du schéma de charge utile du type.' } cle_idempotence: type: string description: >- Clé de déduplication stable. Deux livraisons de la même clé = UNE SEULE comptabilisation. Forme retenue : « <execution>:allocation:<instruction> ». entite_sujet: type: string description: Facultative — l'ordre individuel dont le compte rendu relate le fait. sequence_entite: { type: integer } cause: type: string description: Identifiant de l'événement causal chez le producteur (traçabilité). reference_extourne: type: string description: >- OBLIGATOIRE sur un compte rendu compensateur, ABSENT sinon. Un compte rendu émis NE SE CORRIGE PAS : il s'extourne. date_fait_generateur: { type: string, format: date } date_effet: type: string format: date description: >- 0.2 — la date à laquelle le fait est réputé modifier les droits, quand elle diffère du fait générateur. Sur une chaîne titres, c'est la DATE DE DÉNOUEMENT. date_valeur: { type: string, format: date } cree_le: { type: string, format: date-time } cree_par: { type: string, const: carnet-ordres }
referencesDOrigine: type: object required: [operation_ref, instruction_ref, compte_ref, support_ref, support_version, origine_avoir, ordre_ref] properties: operation_ref: type: string description: Identifiant publié de l'opération d'origine (domaine Opérations). instruction_ref: type: string description: >- Identifiant publié de l'instruction d'origine. LE DÉPOUILLEMENT EST EXACT : chaque compte rendu désigne l'instruction qu'il sert, jamais un agrégat. ordre_ref: { type: string, description: 'Identifiant publié de l''ordre individuel chez le carnet.' } compte_ref: { type: string } support_ref: type: string description: >- LE SUPPORT SEUL, JAMAIS LE DISPOSITIF. Une instruction est, chez Opérations, un couple dispositif × support ; seul le support franchit la frontière du carnet. Le dispositif et sa version restent chez Opérations et gagnent la comptabilité par LEUR canal — le trajet est Entreprise → Opérations → compte rendu → lot de droits. support_version: { type: string } origine_avoir: type: string description: >- Transmise parce que la tenue de compte l'inscrira dans le LOT DE DROITS : c'est elle qui conditionne l'indisponibilité et le régime fiscal. DEUX ORIGINES DISTINCTES SUR UN MÊME SUPPORT SONT DEUX COMPTES RENDUS, jamais un seul.
ligneDeFrais: type: object required: [nature, montant_ct] properties: nature: type: string enum: [DROITS_ENTREE, DROITS_SORTIE, FRAIS_BOURSE, COMMISSION, TAXE_TRANSACTION] montant_ct: { type: integer, format: int64 } taux_pb: { type: integer, description: 'Taux appliqué en points de base, quand il existe.' } source: type: string description: >- D'où vient la donnée — la place, le référentiel des instruments, le calcul du carnet. Le carnet NE RECALCULE PAS un coût rendu par une autorité externe.
creDeFonds: allOf: - $ref: '#/components/schemas/enveloppe' - type: object required: [charge_utile] properties: charge_utile: allOf: - $ref: '#/components/schemas/referencesDOrigine' - type: object required: [quantite_upm, montant_brut_ct, vl_ue6, date_vl, devise, finalite_version, execution_ref] properties: quantite_upm: type: integer format: int64 description: >- Quantité de parts en MILLIONIÈMES. Fil rouge de la campagne : 68 517 956 (68,517956 parts) pour l'intéressement de Camille Roussel, 11 851 755 pour son abondement. montant_brut_ct: type: integer format: int64 description: 'Montant brut en CENTIMES. Fil rouge : 167055 et 28896.' vl_ue6: type: integer format: int64 description: >- Valeur liquidative appliquée, en MICRO-EUROS. Fil rouge : 24381200 (24,3812 €). Le carnet NE FABRIQUE JAMAIS un prix absent. date_vl: { type: string, format: date } rang_vl: type: integer description: >- Rang de la valeur liquidative chez instruments — le rang le plus élevé fait foi. Une correction publie un rang supérieur et produit une RÉGULARISATION, jamais une réécriture. devise: { type: string } frais: type: array description: >- LES FRAIS SONT DES LIGNES, JAMAIS DES COLONNES : une nature nouvelle est une ligne, aucun changement de schéma. Tableau vide = NÉANT, qui est un RÉSULTAT et non une absence d'information. items: { $ref: '#/components/schemas/ligneDeFrais' } execution_ref: { type: string } allocation_ref: { type: string } finalite_version: type: string description: >- Version de la RÈGLE DE FINALITÉ qui a autorisé la publication. Un compte rendu publié « parce qu'on avait l'information » n'existe pas. partielle: type: boolean description: >- Vrai quand ce compte rendu atteste UNE TRANCHE d'un ordre non entièrement servi. Il reste DÉFINITIF POUR SA TRANCHE ; d'autres suivront, sur d'autres valeurs liquidatives, avec leurs propres clés.
creDeTitres: allOf: - $ref: '#/components/schemas/enveloppe' - type: object required: [charge_utile] properties: charge_utile: allOf: - $ref: '#/components/schemas/referencesDOrigine' - type: object required: [quantite_upm, montant_brut_ct, prix_moyen_ue6, devise, finalite_version, execution_ref] properties: quantite_upm: { type: integer, format: int64 } montant_brut_ct: { type: integer, format: int64 } prix_moyen_ue6: { type: integer, format: int64 } prix_elementaires: type: array description: >- LES PRIX ÉLÉMENTAIRES SONT CONSERVÉS même si un prix moyen est calculé pour la restitution : un prix moyen ne remplace jamais ses composants. items: type: object required: [quantite_upm, prix_ue6] properties: quantite_upm: { type: integer, format: int64 } prix_ue6: { type: integer, format: int64 } lieu_execution: { type: string } devise: { type: string } frais: type: array items: { $ref: '#/components/schemas/ligneDeFrais' } execution_ref: { type: string } date_denouement: { type: string, format: date } finalite_version: { type: string }
creDeRegularisation: allOf: - $ref: '#/components/schemas/enveloppe' - type: object required: [charge_utile] properties: charge_utile: allOf: - $ref: '#/components/schemas/referencesDOrigine' - type: object required: [difference_quantite_upm, difference_montant_ct, motif, autorite, date_connaissance, finalite_version] properties: difference_quantite_upm: type: integer format: int64 description: >- LA DIFFÉRENCE SIGNÉE en millionièmes de part, jamais la nouvelle valeur absolue : la tenue de compte extourne puis réinscrit, elle ne recalcule pas. difference_montant_ct: { type: integer, format: int64 } vl_corrigee_ue6: { type: integer, format: int64 } rang_vl: { type: integer } motif: type: string description: >- Codifié. Une correction sans motif n'existe pas — la contrainte est portée jusque dans le schéma du producteur. autorite: type: string description: Qui a décidé la correction — la source, jamais le carnet seul. date_connaissance: { type: string, format: date } frais: type: array items: { $ref: '#/components/schemas/ligneDeFrais' } finalite_version: { type: string }