execution-des-mesures
Interface synchrone (OpenAPI) — version 0.2.0. Producteur : conformite. Consommateurs déclarés : tenue-de-compte.
Ce contrat n’expose NI alerte, NI dossier, NI motif, NI soupçon : il expose ce qui contraint un objet, à qui doit le savoir pour ne pas agir contre une mesure en vigueur. Indisponibilité franche : faute de pouvoir répondre, la conformité répond une erreur — jamais « aucune mesure ». Le demandeur bloque sa décision ; un silence pris pour un feu vert laisserait exécuter un rachat sur un compte gelé. Toute interface de la plateforme est authentifiée (401) et autorisée par famille d’accès.
La spécification
Section intitulée « La spécification »openapi: 3.1.0info: title: conformite — exécution des mesures version: 0.2.0 x-ruptures: - version: 0.2.0 rupture: "chemins déplacés : le préfixe /tenants/{tenant} disparaît de tous les chemins" motif: >- Le tenant n'entre jamais dans le chemin d'une interface : il est résolu à l'assemblage — routage par l'hôte, audience du jeton — jamais par une donnée d'appel. Le paramètre de chemin tenant disparaît avec le préfixe. summary: >- Déposer la preuve d'exécution d'une mesure, cible par cible ; consulter les mesures actives sur un objet avant d'agir. description: >- Ce contrat n'expose NI alerte, NI dossier, NI motif, NI soupçon : il expose ce qui contraint un objet, à qui doit le savoir pour ne pas agir contre une mesure en vigueur. Indisponibilité franche : faute de pouvoir répondre, la conformité répond une erreur — jamais « aucune mesure ». Le demandeur bloque sa décision ; un silence pris pour un feu vert laisserait exécuter un rachat sur un compte gelé. Toute interface de la plateforme est authentifiée (401) et autorisée par famille d'accès. x-producteurs: - conformite x-consommateurs: - tenue-de-comptepaths: /mesures/{mesure}/preuves: post: operationId: deposerUnePreuveDExecution summary: Déposer un lot de constats d'exécution — un par cible élémentaire. description: >- Le domaine exécutant, ayant décliné le périmètre reçu en cibles élémentaires, rend compte de chacune. Le lot est accepté en entier ou refusé en entier. Le dépôt est IDEMPOTENT : le rejeu d'un même constat ne crée pas de doublon et ne modifie pas le premier — la trace est append-only, une correction est un constat ULTÉRIEUR sur la même cible. La réponse restitue l'état consolidé de la mesure : une mesure dont au moins une cible reste en écart demeure PARTIELLEMENT_APPLIQUEE, jamais EXECUTEE. Famille d'accès requise : conformite:mesures. security: - authentification: [conformite:mesures] parameters: - $ref: '#/components/parameters/mesure' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/LotDeConstats' responses: '201': description: Les constats sont enregistrés ; l'état consolidé de la mesure est rendu. content: application/json: schema: $ref: '#/components/schemas/EtatDeLaMesure' '400': description: >- La demande est irrecevable — le motif nomme le champ. Notamment : un constat dont le statut n'est pas APPLIQUEE et qui ne porte pas de motif. content: application/json: schema: $ref: '#/components/schemas/Erreur' '401': $ref: '#/components/responses/NonAuthentifie' '403': $ref: '#/components/responses/NonAutorise' '404': description: La mesure est inconnue de ce tenant. content: application/json: schema: $ref: '#/components/schemas/Erreur' '409': description: >- Le déposant n'est pas le domaine exécutant désigné par la mesure, ou la mesure est déjà levée. content: application/json: schema: $ref: '#/components/schemas/Erreur' /mesures-actives: get: operationId: consulterLesMesuresActives summary: Quelles mesures contraignent cet objet, à cet instant ? description: >- Interrogée avant d'agir : pour renseigner un champ « gelé », écrêter une position consommable, ou refuser un rachat. La réponse dit CE QUI CONTRAINT — nature, périmètre, date d'effet — jamais POURQUOI : ni dossier, ni motif, ni caractère de la mesure. Un écran qui afficherait « gelé — soupçon de blanchiment » violerait la confidentialité de la déclaration. La réponse est DATÉE et porte une durée de validité courte : une mesure peut être ordonnée à tout instant. Famille d'accès requise : conformite:consultation. security: - authentification: [conformite:consultation] parameters: - name: type_objet in: query required: true description: >- La maille interrogée. La réponse inclut les mesures qui visent l'objet LUI-MÊME et celles qui le contraignent par un périmètre ENGLOBANT — une mesure sur l'épargnant contraint chacun de ses comptes. Le demandeur n'a donc aucune règle de portée à appliquer par lui-même. schema: type: string enum: [COMPTE, EPARGNANT, ENTREPRISE, OPERATION, PAIEMENT] - name: objet in: query required: true description: Identifiant publié de l'objet interrogé. schema: type: string responses: '200': description: >- L'état des mesures en vigueur à la date servie. Une liste vide signifie « aucune mesure » — et ne peut être rendue que si la conformité a effectivement pu répondre. content: application/json: schema: $ref: '#/components/schemas/MesuresActives' '400': description: La demande est irrecevable — le motif nomme le paramètre. content: application/json: schema: $ref: '#/components/schemas/Erreur' '401': $ref: '#/components/responses/NonAuthentifie' '403': $ref: '#/components/responses/NonAutorise' '503': description: >- La conformité ne peut pas répondre. INDISPONIBILITÉ FRANCHE : le demandeur bloque sa décision, il ne présume pas l'absence de mesure et ne sert pas une réponse antérieure mise en cache. content: application/json: schema: $ref: '#/components/schemas/Erreur'components: parameters: mesure: name: mesure in: path required: true description: Identifiant publié de la mesure ordonnée. schema: type: string responses: NonAuthentifie: description: L'appelant n'est pas authentifié. content: application/json: schema: $ref: '#/components/schemas/Erreur' NonAutorise: description: L'appelant n'a pas la famille d'accès requise. content: application/json: schema: $ref: '#/components/schemas/Erreur' securitySchemes: authentification: type: openIdConnect openIdConnectUrl: https://exemple.invalid/.well-known/openid-configuration description: >- L'exigence est déclarée ici ; le mécanisme est décliné à l'assemblage. schemas: LotDeConstats: type: object required: [constats] properties: cibles_attendues: type: integer minimum: 0 description: >- Nombre de cibles élémentaires que le déclinage du périmètre a produites chez l'exécutant. constats: type: array minItems: 1 items: $ref: '#/components/schemas/Constat' Constat: type: object required: [cible, statut, constate_le] properties: cible: type: string description: >- Identifiant publié de la cible ÉLÉMENTAIRE couverte — un compte, jamais le périmètre englobant reçu dans l'ordre. statut: type: string enum: [APPLIQUEE, PARTIELLEMENT_APPLIQUEE, NON_APPLICABLE, EN_SUSPENS, REJETEE] motif: type: string description: >- Obligatoire dès que le statut n'est pas APPLIQUEE — pas de suspens muet, pas de « non applicable » sans raison. constate_le: type: string format: date-time description: >- Instant du constat chez l'exécutant. Pour un gel, l'écart avec la date de l'ordre est ce qui démontre le « sans délai ». EtatDeLaMesure: type: object required: [mesure, etat, cibles_couvertes, ecarts, servi_le] properties: mesure: type: string etat: type: string description: >- État consolidé. PARTIELLEMENT_APPLIQUEE tant qu'un écart subsiste — pour un gel, un état CRITIQUE : un compte non couvert est une mise à disposition qui subsiste, que la loi interdit. enum: [ORDONNEE, PARTIELLEMENT_APPLIQUEE, EXECUTEE, EN_SUSPENS, LEVEE] cibles_couvertes: type: integer minimum: 0 ecarts: type: integer minimum: 0 description: Nombre de cibles dont le dernier constat n'est pas APPLIQUEE. servi_le: type: string format: date-time MesuresActives: type: object required: [objet, type_objet, mesures, servi_le, valide_jusqu_a] properties: objet: type: string type_objet: type: string enum: [COMPTE, EPARGNANT, ENTREPRISE, OPERATION, PAIEMENT] mesures: type: array items: $ref: '#/components/schemas/MesureApplicable' servi_le: type: string format: date-time valide_jusqu_a: type: string format: date-time description: >- Au-delà, la réponse ne vaut plus : il faut redemander. Une mesure peut être ordonnée à tout instant. MesureApplicable: type: object required: [mesure, nature, type_cible, cible, effet_le] properties: mesure: type: string nature: type: string enum: - MISE_EN_ATTENTE - SUSPENSION_OPERATION - REFUS - GEL_AVOIRS - BLOCAGE_TOTAL - LECTURE_SEULE - BLOCAGE_OPERATIONS type_cible: type: string description: >- Périmètre de la mesure — il peut ÊTRE PLUS LARGE que l'objet interrogé (une mesure sur l'épargnant remontée à la consultation d'un compte). enum: [COMPTE, EPARGNANT, ENTREPRISE, OPERATION, PAIEMENT] cible: type: string effet_le: type: string format: date Erreur: type: object required: [code, message] properties: code: type: string message: type: string description: >- Nomme le champ ou la condition en cause. Ne révèle jamais le motif d'une mesure, le dossier qui la fonde, ni l'existence d'une instruction.