comptes-rendus-d-operation
Événement (AsyncAPI) — version 0.3.0. Producteur : operations. Consommateurs déclarés : tenue-de-compte.
LES COMPTES RENDUS D’OPÉRATION (CRO) QUE LE DOMAINE PRODUIT : les faits comptables dont il est L’AUTORITÉ — ceux qu’il FIXE LUI-MÊME et que personne d’autre ne constate. CRO DÉSIGNE UNIQUEMENT UNE CATÉGORIE DE CRE — ceux produits par ce domaine — ET JAMAIS UNE ENTITÉ NI UNE TABLE : ce contrat publie des CRE, et « comptes rendus d’opération » nomme la catégorie, pas un objet. Chez le consommateur, l’entité est le CRE quel que soit son producteur, avec l’identifiant de l’opération et de l’instruction d’origine, et une charge utile PHOTOGRAPHIÉE AU GARNISSAGE — un acte de ce domaine. CE QUI RESTE VRAI, et qui est le vrai enjeu de la frontière : le domaine N’INSCRIT AUCUNE ÉCRITURE et ne touche AUCUNE POSITION ; et une DEMANDE D’EXÉCUTION n’est jamais un compte rendu — une intention n’est pas un constat.
La spécification
Section intitulée « La spécification »asyncapi: 3.0.0info: title: operations — les comptes rendus d'opération version: 0.3.0 x-ruptures: - >- 0.2.0 → 0.3.0 : propriété retirée — tenant. Isolation forte par tenant : aucun identifiant de tenant n'est transporté ; l'enveloppe suivie est celle de la tenue de compte, montée en 0.3 dans le même mouvement. - >- 0.1.0 → 0.2.0 : le contrat portait UN message, présenté comme l'unique exception à « Opérations ne produit aucun compte rendu ». Le contrat s'élargit à cinq faits et se renomme. Aucun consommateur n'était encore branché : la rupture est déclarée, non subie. description: >- LES COMPTES RENDUS D'OPÉRATION (CRO) QUE LE DOMAINE PRODUIT : les faits comptables dont il est L'AUTORITÉ — ceux qu'il FIXE LUI-MÊME et que personne d'autre ne constate. CRO DÉSIGNE UNIQUEMENT UNE CATÉGORIE DE CRE — ceux produits par ce domaine — ET JAMAIS UNE ENTITÉ NI UNE TABLE : ce contrat publie des CRE, et « comptes rendus d'opération » nomme la catégorie, pas un objet. Chez le consommateur, l'entité est le CRE quel que soit son producteur, avec l'identifiant de l'opération et de l'instruction d'origine, et une charge utile PHOTOGRAPHIÉE AU GARNISSAGE — un acte de ce domaine. CE QUI RESTE VRAI, et qui est le vrai enjeu de la frontière : le domaine N'INSCRIT AUCUNE ÉCRITURE et ne touche AUCUNE POSITION ; et une DEMANDE D'EXÉCUTION n'est jamais un compte rendu — une intention n'est pas un constat. x-producteurs: - operations x-consommateurs: - tenue-de-comptedefaultContentType: application/json
channels: comptesRendusDOperation: address: operations.cro description: >- Canal dédié, et non des messages de plus sur le canal des événements de cycle de vie : ceux-là décrivent un cycle opérationnel et NE SONT PAS comptabilisables, ceux-ci le sont. Deux natures, deux contrats, deux canaux — les mêler ouvrirait la porte à une comptabilisation prématurée. La maille est LE COMPTE : un compte rendu par compte concerné, jamais un agrégat, parce que la tenue de compte inscrit des écritures par compte. messages: prelevementsAppliques: $ref: '#/components/messages/prelevementsAppliques' abondementAcquis: $ref: '#/components/messages/abondementAcquis' repartitionArretee: $ref: '#/components/messages/repartitionArretee' affectationParDefaut: $ref: '#/components/messages/affectationParDefaut' transformationDeclinaison: $ref: '#/components/messages/transformationDeclinaison'
operations: publierLesComptesRendusDOperation: action: send channel: { $ref: '#/channels/comptesRendusDOperation' } summary: >- Constater les faits comptables dont le domaine est l'autorité. Produire un compte rendu N'EST PAS comptabiliser : la tenue de compte reste seule à interpréter. LES CODES DE TYPE APPARTIENNENT À SA NOMENCLATURE (cro_type), dont le catalogue reste ouvert jusqu'à la naissance de ses producteurs. messages: - $ref: '#/channels/comptesRendusDOperation/messages/prelevementsAppliques' - $ref: '#/channels/comptesRendusDOperation/messages/abondementAcquis' - $ref: '#/channels/comptesRendusDOperation/messages/repartitionArretee' - $ref: '#/channels/comptesRendusDOperation/messages/affectationParDefaut' - $ref: '#/channels/comptesRendusDOperation/messages/transformationDeclinaison'
components:
messages: prelevementsAppliques: name: cro-prelevements-appliques title: Prélèvements appliqués à une opération summary: >- Les prélèvements retenus sur une opération, en LIGNES PAR TAXE. La fiscalité calcule et régit ; son anti-périmètre renvoie ici la PERSISTANCE DE LA TRACE, et aucun domaine aval ne constate le prélèvement — son montant est fixé à la validation. contentType: application/json payload: { $ref: '#/components/schemas/croPrelevements' }
abondementAcquis: name: cro-abondement-acquis title: Abondement acquis summary: >- Le montant d'abondement calculé et figé à la validation. Le moteur est ici et le calcul est déterministe ; le barème appartient à l'entreprise, mais personne en aval ne recalcule ni ne constate le montant — c'est une dette de l'entreprise avant d'être une souscription. contentType: application/json payload: { $ref: '#/components/schemas/croAbondement' }
repartitionArretee: name: cro-repartition-arretee title: Répartition arrêtée summary: >- La quote-part attribuée à un bénéficiaire, au POINT DE NON-RETOUR de l'arrêté. Elle crée la créance du bénéficiaire AVANT tout encaissement. contentType: application/json payload: { $ref: '#/components/schemas/croRepartition' }
affectationParDefaut: name: cro-affectation-par-defaut title: Affectation par défaut summary: >- L'affectation d'office de sommes qu'aucun choix de porteur ne fonde — donc que personne d'autre ne peut déclarer. contentType: application/json payload: { $ref: '#/components/schemas/croAffectationDefaut' }
transformationDeclinaison: name: cro-transformation-declinaison title: Transformation d'une déclinaison summary: >- Une position a été transformée par la déclinaison d'une opération sur titres. Le domaine décline, et PERSONNE D'AUTRE NE LE CONSTATE : le carnet d'ordres est hors circuit, la tenue de compte n'interprète que ce qu'on lui donne. contentType: application/json payload: { $ref: '#/components/schemas/croTransformation' }
schemas:
enveloppe: type: object description: >- L'ENVELOPPE EST CELLE DE LA TENUE DE COMPTE, pas la nôtre : c'est le consommateur qui fixe la forme de ce qu'il reçoit et déduplique (contrat « enveloppe du compte rendu d'événement », version 0.3). Nous en remplissons les attributs obligatoires ; `cause` est facultative en général et OBLIGATOIRE sur la transformation, qui pointe l'événement d'instrument source. required: [identifiant, type, version_type, cle_idempotence, date_fait_generateur, date_valeur, cree_le, cause, charge_utile] properties: identifiant: type: string description: Identifiant du compte rendu chez son producteur — unique par producteur. type: type: string const: TRANSFORMATION_OST description: >- Le seul type que ce contrat produit. Son entrée au catalogue des types de la tenue de compte est due. version_type: type: string description: Version du schéma de charge utile du type (SemVer). cle_idempotence: type: string description: >- Clé de déduplication — deux livraisons de la même clé = UNE SEULE comptabilisation. Composée de l'événement d'instrument, du compte et de la date d'effet. entite_sujet: type: string description: >- Optionnelle au contrat d'enveloppe ; nous la renseignons — c'est le compte transformé. cause: type: string description: >- L'identifiant du fait causal chez le producteur. OBLIGATOIRE sur la transformation d'une déclinaison — l'événement d'instrument source —, facultative ailleurs. reference_extourne: type: string description: >- Présent sur un compte rendu COMPENSATEUR seulement. Un compte rendu émis ne se corrige pas : il s'extourne. date_fait_generateur: { type: string, format: date } date_valeur: type: string format: date description: Obligatoire à l'enveloppe. cree_le: { type: string, format: date-time } cree_par: { type: string, const: operations }
croPrelevements: allOf: - $ref: '#/components/schemas/enveloppe' - type: object required: [charge_utile] properties: charge_utile: type: object required: [compte_ref, operation_ref, assiette_totale_ct, lignes] additionalProperties: false properties: compte_ref: { type: string } operation_ref: { type: string } instruction_ref: { type: string } liquidation_fiscale_ref: type: string description: >- La décision de la fiscalité, versionnée et justifiée. Elle reste À ELLE : ce qui voyage ici est la trace de son APPLICATION. assiette_totale_ct: { type: integer, format: int64 } lignes: type: array minItems: 1 description: >- LES MONTANTS PAR TAXE SONT DES LIGNES, JAMAIS DES COLONNES — exigence du consommateur (règle G3 des conventions, et le commentaire de sa table montant_cro). Chaque ligne est AUTOPORTEUSE : un audit ne rejoue aucun moteur. items: type: object required: [taxe, assiette_ct, taux_pb, montant_ct, redevable] additionalProperties: false properties: taxe: { type: string } assiette_ct: { type: integer, format: int64 } taux_pb: type: integer description: Taux en POINTS DE BASE (9,20 % = 920). montant_ct: { type: integer, format: int64 } redevable: { type: string, enum: [EPARGNANT, ENTREPRISE] } reduit_le_net: type: boolean description: >- La distinction qui structure la réconciliation : ce qui réduit le net et ce qui ne le réduit pas (droits d'entrée à la charge de l'entreprise).
croAbondement: allOf: - $ref: '#/components/schemas/enveloppe' - type: object required: [charge_utile] properties: charge_utile: type: object required: [compte_ref, operation_ref, montant_ct, origine_avoir, bareme_ref, bareme_version] additionalProperties: false properties: compte_ref: { type: string } operation_ref: { type: string } montant_ct: { type: integer, format: int64 } origine_avoir: type: string description: ABONDEMENT — elle conditionne l'indisponibilité et le régime fiscal. bareme_ref: type: string description: Le barème publié par l'entreprise, qui en reste le détenteur. bareme_version: { type: string } plafond_atteint: type: boolean description: >- Vrai si un écrêtement a joué (R-ABOND-PLAFOND). L'explication détaillée du calcul reste au journal du domaine — elle n'est pas comptable.
croRepartition: allOf: - $ref: '#/components/schemas/enveloppe' - type: object required: [charge_utile] properties: charge_utile: type: object required: [compte_ref, operation_ref, operation_collective_ref, quote_part_ct, origine_avoir] additionalProperties: false properties: compte_ref: { type: string } operation_ref: { type: string } operation_collective_ref: { type: string } entreprise_ref: { type: string } exercice: { type: integer } quote_part_ct: { type: integer, format: int64 } origine_avoir: { type: string }
croAffectationDefaut: allOf: - $ref: '#/components/schemas/enveloppe' - type: object required: [charge_utile] properties: charge_utile: type: object required: [compte_ref, operation_ref, montant_ct, dispositif_ref, support_ref, regle_ref] additionalProperties: false properties: compte_ref: { type: string } operation_ref: { type: string } montant_ct: { type: integer, format: int64 } dispositif_ref: { type: string } support_ref: { type: string } origine_avoir: { type: string } regle_ref: type: string description: >- La règle qui fonde l'affectation d'office. Aucun choix de porteur ne la fonde : c'est pourquoi personne d'autre ne peut la déclarer.
croTransformation: allOf: - $ref: '#/components/schemas/enveloppe' - type: object required: [charge_utile] properties: charge_utile: { $ref: '#/components/schemas/chargeUtileTransformation' }
chargeUtileTransformation: type: object description: >- DES QUANTITÉS, PAS DES VALEURS : aucune valeur liquidative recopiée — la tenue de compte a la sienne. Et LA MÉMOIRE TRANSPORTÉE EST DANS LE MESSAGE, PAS DÉDUITE : c'est ce qui rend la transformation prouvablement NEUTRE. Sans les échéances et l'origine reportées, l'antériorité serait perdue et le régime fiscal faussé — un compte rendu de transformation qui n'emporterait qu'une quantité serait inutilisable. required: [compte_ref, operation_ref, instrument_absorbe_ref, instrument_attribue_ref, parts_absorbees_upm, parts_attribuees_upm, memoire_transportee] additionalProperties: false properties: compte_ref: type: string description: Le compte transformé — identifiant publié. operation_ref: type: string description: L'opération individuelle de déclinaison qui a produit ce fait. operation_collective_ref: { type: string } instrument_absorbe_ref: { type: string } instrument_attribue_ref: { type: string } parts_absorbees_upm: type: integer format: int64 description: Quantité en MILLIONIÈMES de part. Jamais de flottant. parts_attribuees_upm: { type: integer, format: int64 } parite_numerateur: { type: integer } parite_denominateur: { type: integer } rompu_regle_ct: type: integer format: int64 description: >- La fraction de part qui n'a pu être attribuée, réglée en espèces (centimes). Nulle quand la parité tombe juste. sous_mesure_ordonnee: type: boolean description: >- Le drapeau n'est pas là pour que la tenue de compte décide quoi que ce soit — elle n'a rien à décider —, mais pour qu'elle sache que la position d'arrivée est elle aussi sous mesure, et que son écrêtement doit le refléter SANS ATTENDRE un second message. Le motif de la mesure ne circule jamais. memoire_transportee: type: array minItems: 1 description: >- Ce que la transformation REPORTE de la position source vers la position cible. C'est la preuve de la neutralité, et c'est pourquoi le tableau ne peut pas être vide. items: type: object required: [origine_avoir, echeance_du, parts_upm] additionalProperties: false properties: origine_avoir: type: string description: >- L'origine reportée — elle conditionne l'indisponibilité et le régime fiscal, et la tenue de compte l'inscrit dans le lot de droits. compartiment: { type: string } echeance_du: type: string format: date description: L'échéance de disponibilité reportée, jamais recalculée. parts_upm: { type: integer, format: int64 }