demandes-d-execution
Événement (AsyncAPI) — version 0.2.0. Producteur : operations. Consommateurs déclarés : carnet-ordres, banque-flux-financiers, relation-tiers.
CE QUI FRANCHIT LA FRONTIÈRE AVAL DU DOMAINE. « Opérations publie ce qui doit être exécuté ; les domaines aval constatent ce qui a réellement été exécuté. » UNE DEMANDE D’EXÉCUTION N’EST DONC JAMAIS UN COMPTE RENDU D’ÉVÉNEMENT : elle demande, elle ne constate pas, et la publier ne vaut jamais mise à jour de position. Chaque fait EMPORTE OBLIGATION DE TRAITEMENT : zéro consommateur n’est pas un état admissible, c’est une anomalie que la réconciliation détecte.
La spécification
Section intitulée « La spécification »asyncapi: 3.0.0info: title: operations — les demandes 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: >- CE QUI FRANCHIT LA FRONTIÈRE AVAL DU DOMAINE. « Opérations publie ce qui doit être exécuté ; les domaines aval constatent ce qui a réellement été exécuté. » UNE DEMANDE D'EXÉCUTION N'EST DONC JAMAIS UN COMPTE RENDU D'ÉVÉNEMENT : elle demande, elle ne constate pas, et la publier ne vaut jamais mise à jour de position. Chaque fait EMPORTE OBLIGATION DE TRAITEMENT : zéro consommateur n'est pas un état admissible, c'est une anomalie que la réconciliation détecte. x-producteurs: - operations x-consommateurs: - carnet-ordres - banque-flux-financiers - relation-tiersdefaultContentType: application/json
channels:
annoncesDOrdre: address: operations.annonce-ordre description: >- Les annonces d'ordre vers le carnet d'ordres. UN CANAL PAR DESTINATAIRE, et non un canal unique : les rythmes, les volumétries et les habilitations diffèrent trop — un rejeu massif d'annonces ne doit pas retarder une demande de paiement. messages: annonceDOrdre: { $ref: '#/components/messages/annonceDOrdre' } annulationDemandee: { $ref: '#/components/messages/annulationDemandee' }
demandesEspeces: address: operations.demande-especes description: >- Les demandes d'encaissement, de paiement et de reversement vers la banque et flux financiers. Chez elle, une demande d'encaissement donne naissance à un FLUX ATTENDU, et une demande de paiement à un PAIEMENT — ces objets lui appartiennent. messages: demandeDEncaissement: { $ref: '#/components/messages/demandeDEncaissement' } demandeDePaiement: { $ref: '#/components/messages/demandeDePaiement' } demandeDeReversement: { $ref: '#/components/messages/demandeDeReversement' } annulationDemandee: { $ref: '#/components/messages/annulationDemandee' }
demandesDeNotification: address: operations.demande-notification description: >- Les demandes de notification vers la relation tiers. LE MESSAGE NE PORTE AUCUNE COORDONNÉE : il nomme le destinataire par son identifiant publié et laisse le canal au domaine qui le détient. messages: demandeDeNotification: { $ref: '#/components/messages/demandeDeNotification' }
operations:
publierLesAnnoncesDOrdre: action: send channel: { $ref: '#/channels/annoncesDOrdre' } summary: >- Opérations exprime le besoin d'une instruction de marché ou de fonds. Le carnet d'ordres en contrôle l'EXÉCUTABILITÉ — jamais la recevabilité métier, qui est déjà tranchée. messages: - $ref: '#/channels/annoncesDOrdre/messages/annonceDOrdre' - $ref: '#/channels/annoncesDOrdre/messages/annulationDemandee'
publierLesDemandesDEspeces: action: send channel: { $ref: '#/channels/demandesEspeces' } summary: Faire entrer, décaisser ou reverser des espèces — sans jamais les manipuler. messages: - $ref: '#/channels/demandesEspeces/messages/demandeDEncaissement' - $ref: '#/channels/demandesEspeces/messages/demandeDePaiement' - $ref: '#/channels/demandesEspeces/messages/demandeDeReversement' - $ref: '#/channels/demandesEspeces/messages/annulationDemandee'
publierLesDemandesDeNotification: action: send channel: { $ref: '#/channels/demandesDeNotification' } summary: Demander la délivrance d'un message, sans connaître ni canal ni coordonnée. messages: - $ref: '#/channels/demandesDeNotification/messages/demandeDeNotification'
components:
messages:
annonceDOrdre: name: annonce-ordre title: Annonce d'ordre summary: Une instruction titres est prête à être exécutée. contentType: application/json payload: { $ref: '#/components/schemas/annonceDOrdre' }
demandeDEncaissement: name: demande-encaissement title: Demande d'encaissement summary: Faire entrer ou constater des espèces. contentType: application/json payload: { $ref: '#/components/schemas/demandeDEncaissement' }
demandeDePaiement: name: demande-paiement title: Demande de paiement summary: >- Décaisser un montant vers un bénéficiaire. L'acte amont porte le nom consacré de MISE EN PAIEMENT ; l'exécution bancaire s'appelle un PAIEMENT et appartient à la banque. contentType: application/json payload: { $ref: '#/components/schemas/demandeDePaiement' }
demandeDeReversement: name: demande-reversement title: Demande de reversement summary: Régler à une administration un prélèvement dû, sur la dette validée par la fiscalité. contentType: application/json payload: { $ref: '#/components/schemas/demandeDeReversement' }
demandeDeNotification: name: demande-notification title: Demande de notification summary: Délivrer un message sur un canal autorisé, que le producteur ne connaît pas. contentType: application/json payload: { $ref: '#/components/schemas/demandeDeNotification' }
annulationDemandee: name: annulation-demandee title: Annulation demandée summary: >- UNE DEMANDE NOUVELLE, PAS UN RETRAIT : un message émis ne se dé-publie pas. Elle cite la demande visée et lui succède. Elle n'a d'effet que si l'exécution n'a pas eu lieu. contentType: application/json payload: { $ref: '#/components/schemas/annulationDemandee' }
schemas:
enveloppe: type: object required: [evenementId, typeEvenement, versionContrat, dateEvenement, producteur, operationRef, cleIdempotence] properties: evenementId: type: string description: >- Identifiant unique — LA CLÉ D'IDEMPOTENCE DES CONSOMMATEURS. La livraison est au moins une fois : le rejeu ne doit produire qu'un effet. typeEvenement: { type: string } versionContrat: { type: string } dateEvenement: { type: string, format: date-time } producteur: { type: string, const: operations } sequenceEntite: type: integer description: >- Numéro de séquence PAR ENTITÉ ET PAR PRODUCTEUR — l'assise de la garantie d'ordre. Rien n'est garanti entre producteurs. operationRef: type: string description: L'identifiant publié de l'opération individuelle qui demande. operationCollectiveRef: { type: string } jambeNo: type: integer description: La jambe dont la condition de libération est satisfaite. cleIdempotence: type: string description: Clé stable de la demande, distincte de celle du message. causaliteReference: type: string description: >- Facultative en général, OBLIGATOIRE sur tout fait de compensation.
annonceDOrdre: allOf: - $ref: '#/components/schemas/enveloppe' - type: object required: [sens, supportRef, supportVersion, dispositifRef, compteRef, origineAvoir] properties: sens: type: string enum: [SOUSCRIPTION, RACHAT, ECHANGE] description: >- TRANSFORMATION n'y figure pas : une opération sur titres de structure n'émet AUCUN ORDRE — le carnet d'ordres est hors circuit. supportRef: { type: string } supportVersion: { type: string } dispositifRef: { type: string } compteRef: { type: string } origineAvoir: 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. montantCt: type: integer format: int64 description: En CENTIMES. Un ordre à montant ou un ordre à quantité, jamais les deux. quantiteUpm: type: integer format: int64 description: En MILLIONIÈMES de part. dateValeurSouhaitee: { type: string, format: date } instructionNo: { type: integer }
demandeDEncaissement: allOf: - $ref: '#/components/schemas/enveloppe' - type: object required: [objet, montantCt, moyen, payeurRef] properties: objet: { type: string } montantCt: { type: integer, format: int64 } moyen: { type: string } payeurRef: type: string description: Identifiant publié du payeur. JAMAIS un nom, jamais une coordonnée. mandatRef: type: string description: >- Pour un prélèvement, la référence du mandat exécutable. Le CONSENTEMENT et son parcours appartiennent à l'épargnant ; le mandat exécutable à la banque. dateValeurSouhaitee: { type: string, format: date }
demandeDePaiement: allOf: - $ref: '#/components/schemas/enveloppe' - type: object required: [objet, montantCt, beneficiaireRef, coordonneeRef] properties: objet: { type: string } montantCt: type: integer format: int64 description: >- LE MONTANT EXÉCUTÉ, NET des prélèvements applicables — pas le montant demandé. Sur un rachat, il n'existe qu'après l'exécution à la valeur liquidative. beneficiaireRef: { type: string } coordonneeRef: type: string description: >- RÉFÉRENCE OPAQUE ET VERSIONNÉE, jamais la valeur. DOUBLE FIGEMENT : Opérations fige la RÉFÉRENCE au moment engageant, la banque fige la VERSION exécutable à l'exécution — l'activation d'une version postérieure ne réoriente jamais un paiement engagé. differeAu: type: string format: date description: >- Pour un paiement différé, seule forme qui reste révocable avant son échéance (R-BFF-ORDRE-DIFFERE-REVOCATION).
demandeDeReversement: allOf: - $ref: '#/components/schemas/enveloppe' - type: object required: [organismeRef, montantCt, liquidationFiscaleRef] properties: organismeRef: { type: string } montantCt: { type: integer, format: int64 } liquidationFiscaleRef: type: string description: >- La dette VALIDÉE par la fiscalité. Opérations ne recalcule ni assiette ni taux, et la banque ne corrige jamais un montant dû. echeanceLe: { type: string, format: date } referenceDeclarative: { type: string }
demandeDeNotification: allOf: - $ref: '#/components/schemas/enveloppe' - type: object required: [destinataireRef, gabarit] properties: destinataireRef: type: string description: >- Identifiant publié. LE MESSAGE NE CONTIENT PAS LA COORDONNÉE du destinataire : le canal appartient au domaine qui le détient. gabarit: { type: string } variables: type: object description: >- Les valeurs à insérer. Aucune donnée sensible : un motif de déblocage peut révéler une situation de santé, de violences ou de surendettement. additionalProperties: true
annulationDemandee: allOf: - $ref: '#/components/schemas/enveloppe' - type: object required: [demandeVisee, motif] properties: demandeVisee: type: string description: La référence de la demande à annuler. motif: type: string description: Codifié. On ne rappelle pas une demande en silence.