Aller au contenu

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.

openapi: 3.1.0
info:
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-compte
paths:
/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.