Aller au contenu

initiation-des-operations

Interface synchrone (OpenAPI) — version 0.2.0. Producteur : operations. Consommateurs déclarés : backoffice, entreprise, instruments, relation-tiers.

LES TRANSITIONS SONT DES COMMANDES, PAS DES MISES À JOUR D’ÉTAT : on n’écrit pas « état = validée », on appelle « valider » — une commande porte ses gardes, sa trace et sa causalité. AUCUNE COMMANDE NE MODIFIE UNE OPÉRATION VALIDÉE : au-delà de ce point de non-retour, seuls l’état change et le dossier de correction agit. Toute commande est IDEMPOTENTE par la clé que l’appelant fournit : le rejeu retourne la même opération, jamais une seconde. Toute interface de la plateforme est authentifiée (401) et autorisée par famille d’accès.

openapi: 3.1.0
info:
title: operations — initiation et conduite des opérations
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: >-
Faire naître une opération, la conduire le long de son cycle de vie, corriger et
remédier. Onze commandes, aucune lecture.
description: >-
LES TRANSITIONS SONT DES COMMANDES, PAS DES MISES À JOUR D'ÉTAT : on n'écrit pas « état =
validée », on appelle « valider » — une commande porte ses gardes, sa trace et sa causalité.
AUCUNE COMMANDE NE MODIFIE UNE OPÉRATION VALIDÉE : au-delà de ce point de non-retour, seuls
l'état change et le dossier de correction agit. Toute commande est IDEMPOTENTE par la clé
que l'appelant fournit : le rejeu retourne la même opération, jamais une seconde. Toute
interface de la plateforme est authentifiée (401) et autorisée par famille d'accès.
x-producteurs:
- operations
x-consommateurs:
- backoffice
- entreprise
- instruments
- relation-tiers
paths:
/operations-collectives:
post:
operationId: creerUneOperationCollective
summary: Créer une opération collective depuis une enveloppe déclarée ou une régularisation.
description: >-
LES QUATRE CONTRÔLES D'ENSEMBLE SONT BLOQUANTS et refusent la création : entreprise
active et contrat en vigueur, accord couvrant l'exercice, somme des quotes-parts
égale à l'enveloppe, chaque bénéficiaire identifié. Une opération d'entreprise
engage autant d'opérations individuelles qu'il y a de bénéficiaires, et rien ne se
corrige ensuite autrement que par contrepassation. L'ÉLIGIBILITÉ INDIVIDUELLE ET
LES PLAFONDS NE SONT PAS CONTRÔLÉS ICI : ils s'apprécient à la validation,
opération par opération, une fois la collective créée.
security:
- authentification: [operations:saisie]
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreationOperationCollective'
responses:
'201':
description: L'opération collective est créée, à l'état « en préparation ».
content:
application/json:
schema:
$ref: '#/components/schemas/AccuseOperationCollective'
'200':
description: >-
REJEU d'une clé d'idempotence déjà vue : l'opération existante est rendue
telle quelle, sans second effet.
content:
application/json:
schema:
$ref: '#/components/schemas/AccuseOperationCollective'
'422':
$ref: '#/components/responses/ControlesEnEchec'
'403': { $ref: '#/components/responses/Interdit' }
/operations-collectives/{operationCollective}/arreter-quotes-parts:
post:
operationId: arreterLesQuotesParts
summary: Arrêter la répartition — POINT DE NON-RETOUR.
description: >-
Au-delà, un écart ne se corrige plus globalement : il se traite opération par
opération, par contrepassation. La garde est l'invariant du domaine — la somme des
quotes-parts déclinées EST ÉGALE au montant réparti.
security:
- authentification: [operations:validation]
parameters:
- $ref: '#/components/parameters/operationCollective'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Transition'
responses:
'200':
description: Les quotes-parts sont arrêtées ; la déclinaison peut commencer.
content:
application/json:
schema:
$ref: '#/components/schemas/AccuseOperationCollective'
'409': { $ref: '#/components/responses/Conflit' }
'422': { $ref: '#/components/responses/ControlesEnEchec' }
/operations-collectives/{operationCollective}/decliner:
post:
operationId: declinerUneOperationCollective
summary: Décliner la masse en opérations individuelles, par lots rejouables.
description: >-
La population est FIGÉE à la constitution des lots. Un lot interrompu reprend à son
point d'arrêt ; il ne se relance jamais depuis le début, sous peine de double exécution.
Pour une déclinaison d'événement d'instrument, l'analyse d'impact précède l'acte et
COMPTE les cas particuliers ; elle en écarte les comptes clos et les anomalies, mais
PLUS les positions sous mesure ordonnée — celles-ci sont transformées et leur mesure se
reporte. La déclinaison publie un COMPTE RENDU DE TRANSFORMATION par compte transformé —
l'unique compte rendu que le domaine produise.
security:
- authentification: [operations:validation]
parameters:
- $ref: '#/components/parameters/operationCollective'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/DemandeDeDeclinaison'
responses:
'202':
description: >-
La déclinaison est lancée. Elle est ASYNCHRONE et massive : l'avancement se lit
à la consultation, les lots se reprennent, et la clôture exige le rapprochement
attendu = traité + en anomalie.
content:
application/json:
schema:
$ref: '#/components/schemas/AccuseDeDeclinaison'
'409': { $ref: '#/components/responses/Conflit' }
'422': { $ref: '#/components/responses/ControlesEnEchec' }
/operations:
post:
operationId: initierUneOperation
summary: Faire naître une opération individuelle au fil de l'eau.
description: >-
Le cas de l'épargnant (versement volontaire, arbitrage, rachat, déblocage,
transfert) et celui de l'opérateur du teneur de compte (régularisation). L'identité
est stable, la non-duplication est vérifiée par la clé d'idempotence, et la
catégorie est qualifiée sur SES DEUX AXES — l'initiateur et l'effet économique —
qui sont orthogonaux.
security:
- authentification: [operations:saisie]
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/InitiationOperation'
responses:
'201':
description: L'opération est créée, à l'état « saisie ».
content:
application/json:
schema:
$ref: '#/components/schemas/AccuseOperation'
'200':
description: REJEU d'une clé d'idempotence déjà vue — la même opération est rendue.
content:
application/json:
schema:
$ref: '#/components/schemas/AccuseOperation'
'422': { $ref: '#/components/responses/ControlesEnEchec' }
/imports:
post:
operationId: importerUnLotDOperations
summary: Charger un lot transmis par une entreprise ou un tiers autorisé.
description: >-
Le fichier est contrôlé par empreinte, total de contrôle et nombre de lignes.
L'idempotence est LIGNE À LIGNE (identifiant de fichier + numéro de ligne) : un
fichier déposé deux fois ne produit qu'un seul jeu d'opérations, et un fichier
partiellement rejoué ne duplique que rien.
security:
- authentification: [operations:saisie]
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/DemandeDImport'
responses:
'202':
description: Le lot est accepté et sera traité de façon asynchrone.
content:
application/json:
schema:
$ref: '#/components/schemas/AccuseDeDeclinaison'
'422': { $ref: '#/components/responses/ControlesEnEchec' }
/programmes-de-versement:
post:
operationId: creerUnProgrammeDeVersement
summary: Créer un programme de versement récurrent.
description: >-
Le mandat de prélèvement exécutable, lui, reste à la banque : le programme n'en connaît
que la référence.
security:
- authentification: [operations:saisie]
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreationProgramme'
responses:
'201':
description: Le programme est créé, à l'état « actif ».
content:
application/json:
schema:
$ref: '#/components/schemas/AccuseProgramme'
'422': { $ref: '#/components/responses/ControlesEnEchec' }
/programmes-de-versement/{programme}/suspendre:
post:
operationId: suspendreUnProgramme
summary: Suspendre les versements — un geste du PORTEUR sur son programme.
description: >-
SUSPENDRE UN PROGRAMME N'EST PAS RÉVOQUER UN MANDAT : deux gestes, deux objets, deux
domaines. Le porteur qui suspend garde son mandat ; les échéances continuent d'être
inscrites, mais ÉCARTÉES avec leur motif — jamais sautées en silence.
security:
- authentification: [operations:saisie]
parameters:
- $ref: '#/components/parameters/programme'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Transition'
responses:
'200':
description: Le programme est suspendu.
content:
application/json:
schema:
$ref: '#/components/schemas/AccuseProgramme'
'409': { $ref: '#/components/responses/Conflit' }
/programmes-de-versement/{programme}/reprendre:
post:
operationId: reprendreUnProgramme
summary: Reprendre les versements suspendus.
description: >-
La garde est que le mandat soit TOUJOURS EXÉCUTABLE. Un programme devenu
« inexécutable » — mandat révoqué, support non ordonnable — ne se reprend pas par ce
chemin : la cause doit d'abord être levée chez son détenteur.
security:
- authentification: [operations:saisie]
parameters:
- $ref: '#/components/parameters/programme'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Transition'
responses:
'200':
description: Le programme est actif de nouveau.
content:
application/json:
schema:
$ref: '#/components/schemas/AccuseProgramme'
'409': { $ref: '#/components/responses/Conflit' }
'422': { $ref: '#/components/responses/ControlesEnEchec' }
/programmes-de-versement/{programme}/clore:
post:
operationId: cloreUnProgramme
summary: Clore un programme — POINT DE NON-RETOUR.
description: >-
Un programme clos NE SE RÉACTIVE PAS : on en crée un nouveau. C'est ce qui garde
lisible l'historique de ce que le porteur a voulu, et quand.
security:
- authentification: [operations:saisie]
parameters:
- $ref: '#/components/parameters/programme'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/DemandeMotivee'
responses:
'200':
description: Le programme est clos.
content:
application/json:
schema:
$ref: '#/components/schemas/AccuseProgramme'
'409': { $ref: '#/components/responses/Conflit' }
/programmes-de-versement/{programme}/echeances/{echeance}:
put:
operationId: declencherUneEcheance
summary: Déclencher l'échéance d'un programme — IDEMPOTENT PAR CONSTRUCTION.
description: >-
Le verbe est PUT et la date est dans le chemin : l'échéance est identifiée par le couple
(programme, date), qui EST la clé d'idempotence. Un traitement calendaire rejoué appelle
la même adresse et obtient la même échéance — jamais un second versement. C'est ce point
qui a commandé le domicile du programme : le domaine qui porte l'idempotence est celui
qui porte l'entité. Si le programme est suspendu ou inexécutable, l'échéance est
inscrite ÉCARTÉE avec son motif, et la réponse le dit — elle n'est jamais sautée en
silence.
security:
- authentification: [operations:validation]
parameters:
- $ref: '#/components/parameters/programme'
- name: echeance
in: path
required: true
description: La date d'échéance. Avec le programme, elle forme la clé d'idempotence.
schema: { type: string, format: date }
responses:
'201':
description: L'échéance est inscrite ; une opération individuelle est engendrée, ou l'échéance est écartée avec son motif.
content:
application/json:
schema:
$ref: '#/components/schemas/AccuseEcheance'
'200':
description: >-
REJEU : l'échéance existait déjà. La même réponse est rendue, sans second effet.
content:
application/json:
schema:
$ref: '#/components/schemas/AccuseEcheance'
/operations/{operation}/evaluer-recevabilite:
post:
operationId: evaluerLaRecevabilite
summary: Produire ou rafraîchir une décision de recevabilité.
description: >-
La décision est DATÉE, MOTIVÉE ET REJOUABLE : elle porte ses contrôles avec leur
classement effectif et les versions consommées. UNE RÉÉVALUATION PRODUIT UNE
DÉCISION NOUVELLE reliée à la précédente ; l'ancienne reste lisible. UN CONTRÔLE
OBLIGATOIRE INDISPONIBLE NE PRODUIT JAMAIS UN ACCORD IMPLICITE — le résultat est
« incomplète », pas « recevable ».
security:
- authentification: [operations:saisie]
parameters:
- $ref: '#/components/parameters/operation'
responses:
'200':
description: La décision est rendue.
content:
application/json:
schema:
$ref: '#/components/schemas/DecisionDeRecevabilite'
'409': { $ref: '#/components/responses/Conflit' }
/operations/{operation}/garnir:
post:
operationId: garnirUneOperation
summary: Construire les instructions, les jambes et les prélèvements.
description: >-
Le garnissage est DÉTERMINISTE : à entrées et versions identiques, il produit le
même résultat, et il cite la version de stratégie appliquée. L'ABONDEMENT EST
CALCULÉ, JAMAIS SAISI : le moteur applique le barème publié par l'Entreprise, les
cumuls et les plafonds légaux (R-ABOND-PLAFOND), et produit l'explication de ses
tranches et de ses écrêtements.
security:
- authentification: [operations:saisie]
parameters:
- $ref: '#/components/parameters/operation'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Transition'
responses:
'200':
description: L'opération est garnie ; ses instructions et ses jambes sont complètes.
content:
application/json:
schema:
$ref: '#/components/schemas/AccuseOperation'
'409': { $ref: '#/components/responses/Conflit' }
'422': { $ref: '#/components/responses/ControlesEnEchec' }
/operations/{operation}/valider:
post:
operationId: validerUneOperation
summary: Figer le contexte et les instructions — POINT DE NON-RETOUR.
description: >-
Au-delà, aucun attribut figé ne se modifie : l'erreur se corrige par un dossier de
correction. La validation contrôle l'ÉLIGIBILITÉ INDIVIDUELLE et les PLAFONDS, qui
ne l'ont pas été à la création d'une opération collective. Elle écrit son état et
ses événements sortants DANS LA MÊME TRANSACTION LOCALE (boîte d'envoi).
security:
- authentification: [operations:validation]
parameters:
- $ref: '#/components/parameters/operation'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Transition'
responses:
'200':
description: L'opération est validée ; la publication est autorisée.
content:
application/json:
schema:
$ref: '#/components/schemas/AccuseOperation'
'409': { $ref: '#/components/responses/Conflit' }
'422': { $ref: '#/components/responses/ControlesEnEchec' }
/operations/{operation}/suspendre:
post:
operationId: suspendreUneOperation
summary: Suspendre pour un motif OPÉRATIONNEL, et pour lui seul.
description: >-
Ce chemin ne crée QUE des suspensions opérationnelles, qui portent leur motif. UNE
SUSPENSION DE CONFORMITÉ NE S'APPELLE PAS D'ICI : elle naît d'une mesure ordonnée
reçue par le bus, ne porte aucun motif et ne se lève que par la Conformité — aucune
action de ce contrat ne l'atteint.
security:
- authentification: [operations:validation]
parameters:
- $ref: '#/components/parameters/operation'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/DemandeDeSuspension'
responses:
'200':
description: L'opération est suspendue ; les publications nouvelles sont arrêtées.
content:
application/json:
schema:
$ref: '#/components/schemas/AccuseOperation'
'409': { $ref: '#/components/responses/Conflit' }
/operations/{operation}/reprendre:
post:
operationId: reprendreUneOperation
summary: Lever une suspension opérationnelle et réévaluer.
description: >-
LA REPRISE RÉÉVALUE OBLIGATOIREMENT les règles susceptibles d'avoir changé pendant
la suspension : elle ne relance jamais aveuglément une instruction devenue périmée.
Une suspension de conformité ne se lève pas ici.
security:
- authentification: [operations:validation]
parameters:
- $ref: '#/components/parameters/operation'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Transition'
responses:
'200':
description: L'opération reprend son cours, après réévaluation.
content:
application/json:
schema:
$ref: '#/components/schemas/AccuseOperation'
'409': { $ref: '#/components/responses/Conflit' }
'422': { $ref: '#/components/responses/ControlesEnEchec' }
/operations/{operation}/annuler:
post:
operationId: annulerUneOperation
summary: Sortir une opération du cycle, SANS EFFETS.
description: >-
L'annulation suppose l'absence d'effet définitif. Une opération dont des effets sont
partis NE S'ANNULE PAS : elle se compense, par un dossier de correction. Le contrat
rend 409 si l'état ne le permet pas.
security:
- authentification: [operations:remediation]
parameters:
- $ref: '#/components/parameters/operation'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/DemandeMotivee'
responses:
'200':
description: L'opération est annulée.
content:
application/json:
schema:
$ref: '#/components/schemas/AccuseOperation'
'409': { $ref: '#/components/responses/Conflit' }
/dossiers-de-correction:
post:
operationId: ouvrirUnDossierDeCorrection
summary: Ouvrir un dossier de correction sur une opération dont des effets sont définitifs.
description: >-
UNE CORRECTION AJOUTE UN FAIT : elle n'efface ni l'opération d'origine, ni ses
comptes rendus. Le dossier cite le fait erroné et les effets qu'il neutralise ;
chaque domaine reste auteur de ses propres faits compensatoires.
security:
- authentification: [operations:correction]
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/OuvertureDeCorrection'
responses:
'201':
description: Le dossier est ouvert, en attente d'autorisation.
content:
application/json:
schema:
$ref: '#/components/schemas/AccuseDossier'
'422': { $ref: '#/components/responses/ControlesEnEchec' }
/dossiers-de-correction/{dossier}/autoriser:
post:
operationId: autoriserUnDossierDeCorrection
summary: Autoriser le plan — POINT DE NON-RETOUR.
description: >-
SÉPARATION DES POUVOIRS : l'autorisation ne peut pas venir de celui qui a créé le
dossier, et au-delà des seuils définis un SECOND REGARD est exigé — qui ne peut pas
être celui qui autorise. Le contrat rend 403 dans les deux cas. Le plan autorisé
engage des opérations nouvelles, qui ont leur propre vie.
security:
- authentification: [operations:correction]
parameters:
- $ref: '#/components/parameters/dossier'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/AutorisationDeCorrection'
responses:
'200':
description: Le dossier est autorisé ; les opérations compensatoires peuvent naître.
content:
application/json:
schema:
$ref: '#/components/schemas/AccuseDossier'
'403': { $ref: '#/components/responses/Interdit' }
'409': { $ref: '#/components/responses/Conflit' }
/anomalies/{anomalie}/recycler:
post:
operationId: recyclerUneAnomalie
summary: Remettre l'entité à son statut précédent — l'acte NOMINAL de remédiation.
description: >-
Le statut précédent a été mémorisé À L'OUVERTURE de l'anomalie : sans lui, le
recyclage n'aurait pas de cible. Une anomalie résolue NE SE ROUVRE PAS — une
anomalie qui se reproduit est une anomalie nouvelle, avec sa propre ancienneté.
security:
- authentification: [operations:remediation]
parameters:
- $ref: '#/components/parameters/anomalie'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/DemandeMotivee'
responses:
'200':
description: L'entité est revenue à son statut précédent ; l'anomalie est résolue.
content:
application/json:
schema:
$ref: '#/components/schemas/AccuseAnomalie'
'409': { $ref: '#/components/responses/Conflit' }
/anomalies/{anomalie}/annuler:
post:
operationId: annulerDepuisUneAnomalie
summary: Sortir l'entité du cycle sans effets, depuis son anomalie.
description: >-
DISTINCT DE LA CONTREPASSATION, qu'il ne remplace pas : l'annulation suppose
l'absence d'effet définitif.
security:
- authentification: [operations:remediation]
parameters:
- $ref: '#/components/parameters/anomalie'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/DemandeMotivee'
responses:
'200':
description: L'entité est sortie du cycle ; l'anomalie est résolue.
content:
application/json:
schema:
$ref: '#/components/schemas/AccuseAnomalie'
'409': { $ref: '#/components/responses/Conflit' }
components:
securitySchemes:
authentification:
type: oauth2
description: >-
Jeton portant identité, tenant et portées grossières. Les habilitations fines — seuils
de validation, second regard — sont vérifiées par le composant, pas par la portée.
flows:
clientCredentials:
tokenUrl: https://exemple.invalid/oauth2/token
scopes:
operations:saisie: Faire naître et préparer une opération.
operations:validation: Valider, suspendre, reprendre, décliner.
operations:remediation: Recycler ou annuler depuis une anomalie.
operations:correction: Ouvrir et autoriser un dossier de correction.
parameters:
operation:
name: operation
in: path
required: true
description: L'identifiant publié de l'opération individuelle.
schema: { type: string }
operationCollective:
name: operationCollective
in: path
required: true
description: L'identifiant publié de l'opération collective.
schema: { type: string }
dossier:
name: dossier
in: path
required: true
description: L'identifiant publié du dossier de correction.
schema: { type: string }
programme:
name: programme
in: path
required: true
description: L'identifiant publié du programme de versement.
schema: { type: string }
anomalie:
name: anomalie
in: path
required: true
description: L'identifiant de l'anomalie.
schema: { type: string }
responses:
Conflit:
description: >-
409 — VERSION PÉRIMÉE ou TRANSITION INTERDITE par le cycle de vie. Rien n'a été
écrit. L'appelant relit et recommence ; il ne réessaie pas à l'aveugle.
content:
application/json:
schema: { $ref: '#/components/schemas/Probleme' }
ControlesEnEchec:
description: >-
422 — un ou plusieurs contrôles métier ont échoué. Le détail est CODIFIÉ et porte
le classement de chaque contrôle, pour que l'écran puisse dire pourquoi il refuse.
content:
application/json:
schema: { $ref: '#/components/schemas/ProblemeDeControles' }
Interdit:
description: >-
403 — famille d'accès manquante, ou séparation des pouvoirs non respectée
(autorisation par le créateur, second regard par l'autorisateur).
content:
application/json:
schema: { $ref: '#/components/schemas/Probleme' }
schemas:
Transition:
type: object
required: [versionAttendue]
additionalProperties: false
properties:
versionAttendue:
type: integer
description: >-
Le verrou optimiste, exposé au contrat. L'appelant cite la version de
l'opération qu'il croit modifier ; un décalage rend 409 SANS RIEN ÉCRIRE.
commentaire:
type: string
description: Commentaire libre porté au journal. Jamais une donnée sensible.
DemandeMotivee:
type: object
required: [versionAttendue, motif]
additionalProperties: false
properties:
versionAttendue: { type: integer }
motif:
type: string
description: Motif CODIFIÉ. On ne sort pas une entité du cycle en silence.
commentaire: { type: string }
DemandeDeSuspension:
type: object
required: [versionAttendue, motif, conditionDeLevee]
additionalProperties: false
properties:
versionAttendue: { type: integer }
motif:
type: string
description: >-
Le motif OPÉRATIONNEL, obligatoire. Une suspension de conformité n'en porte
aucun, et ne s'appelle pas par ce chemin.
conditionDeLevee:
type: string
description: Ce qui devra être vrai pour reprendre.
portee:
type: string
enum: [OPERATION, JAMBE, REGLEMENT]
default: OPERATION
CreationOperationCollective:
type: object
required: [cleIdempotence, categorie, initiateur, ouvertureLe]
additionalProperties: false
properties:
cleIdempotence:
type: string
description: >-
Fournie par l'appelant, stable. Le rejeu retourne la même opération collective
(200), jamais une seconde.
categorie:
type: string
description: Code de la nomenclature des catégories d'opération.
variante: { type: string }
initiateur:
type: string
description: Code de la nomenclature des catégories d'initiateur.
entrepriseRef:
type: string
description: >-
Identifiant publié de l'entreprise. Absent pour une déclinaison d'événement
d'instrument, qui n'en a pas.
enveloppeRef:
type: string
description: >-
L'enveloppe DÉCLARÉE ET ARRÊTÉE par l'entreprise, dont cette opération est
l'exécution. Absente sur la voie de régularisation, qui n'a rien derrière elle.
instrumentRef: { type: string }
instrumentVersion: { type: string }
exercice: { type: integer }
enveloppeDeclareeCt:
type: integer
format: int64
description: Montant en CENTIMES. Jamais de flottant pour de l'argent.
ouvertureLe: { type: string, format: date }
clotureLe: { type: string, format: date }
valeurSouhaiteeLe: { type: string, format: date }
repartition:
type: array
description: >-
Les quotes-parts par bénéficiaire. LEUR SOMME DOIT ÉGALER l'enveloppe — l'écart
refuse la création (422), il n'avertit pas.
items: { $ref: '#/components/schemas/QuotePart' }
QuotePart:
type: object
required: [epargnantRef, montantCt]
additionalProperties: false
properties:
epargnantRef:
type: string
description: >-
Identifiant publié de la personne. Une ligne dont le bénéficiaire n'est pas
identifié fait échouer le contrôle d'ensemble.
salarieRef: { type: string }
montantCt: { type: integer, format: int64 }
choixBeneficiaire:
type: string
enum: [PLACEMENT, PERCEPTION_IMMEDIATE, AFFECTATION_PAR_DEFAUT]
description: >-
LE CHOIX exprimé, jamais un attribut de dispositif : le dispositif se décide
instruction par instruction, au garnissage.
InitiationOperation:
type: object
required: [cleIdempotence, categorie, initiateur, epargnantRef, dateDemande, dateFaitGenerateur]
additionalProperties: false
properties:
cleIdempotence: { type: string }
categorie: { type: string }
variante: { type: string }
initiateur: { type: string }
epargnantRef: { type: string }
salarieRef: { type: string }
compteRef: { type: string }
dateDemande:
type: string
format: date
description: Quand la demande a été formulée.
dateFaitGenerateur:
type: string
format: date
description: >-
Quand le fait qui la fonde est survenu. À NE PAS CONFONDRE avec la date de
demande : un déblocage anticipé s'apprécie à CETTE date.
montantBrutCt: { type: integer, format: int64 }
affectations:
type: array
description: >-
Les affectations demandées. LES RATIOS TOTALISENT EXACTEMENT 1 000 000
millionièmes ; le dispositif est porté ICI, jamais au niveau de l'opération.
items:
type: object
required: [dispositifRef, supportRef, ratioPpm]
additionalProperties: false
properties:
dispositifRef: { type: string }
supportRef: { type: string }
ratioPpm: { type: integer, minimum: 0, maximum: 1000000 }
origineAvoir:
type: string
description: >-
Obligatoire dès lors que l'instruction crée ou transporte un avoir :
c'est elle qui conditionne l'indisponibilité et le régime fiscal.
moyenPaiement:
type: string
description: >-
Il commande la POLITIQUE DE COUPLAGE : un prélèvement impose le couplage
strict, un virement déjà reçu autorise le parallèle.
coordonneeRef:
type: string
description: >-
RÉFÉRENCE OPAQUE ET VERSIONNÉE de la coordonnée bancaire, jamais sa valeur.
Double figement : les Opérations figent la référence, la banque fige la version
exécutable.
DemandeDImport:
type: object
required: [fichierRef, empreinte, nombreLignes]
additionalProperties: false
properties:
fichierRef: { type: string }
empreinte:
type: string
description: Empreinte du contenu — l'intégrité du lot est contrôlée avant traitement.
nombreLignes: { type: integer }
totalControleCt: { type: integer, format: int64 }
operationCollectiveRef: { type: string }
DemandeDeDeclinaison:
type: object
required: [versionAttendue]
additionalProperties: false
properties:
versionAttendue: { type: integer }
taillePartition:
type: integer
description: Le grain des lots rejouables. Défaut fixé par le composant.
isolerLesCasARisque:
type: boolean
default: true
description: >-
Les comptes clos ou en anomalie et les incidences fiscales particulières sont
ÉCARTÉS du traitement automatique et versés en anomalie. La contrepartie est un
point de synchronisation avec la Conformité — le report doit être ordonné et prouvé
avant que la déclinaison soit tenue pour faite.
OuvertureDeCorrection:
type: object
required: [operationSourceRef, nature, plan]
additionalProperties: false
properties:
operationSourceRef:
type: string
description: >-
Le fait erroné. IL N'EST JAMAIS MODIFIÉ par le dossier : un dossier qui
écrirait dans son opération source ne serait plus une correction.
nature:
type: string
enum: [ANNULATION, COMPENSATION, REGULARISATION, CONTREPASSATION]
plan:
type: string
description: Les actes retenus, lisibles.
operationsNeutralisees:
type: array
items: { type: string }
description: Les opérations dont les effets sont neutralisés, au-delà de la source.
AutorisationDeCorrection:
type: object
required: [versionAttendue]
additionalProperties: false
properties:
versionAttendue: { type: integer }
secondRegardPar:
type: string
description: >-
EXIGÉ au-delà des seuils définis, et il ne peut pas être celui qui autorise.
Le contrat rend 403 sinon.
AccuseOperation:
type: object
required: [operationRef, etat, version]
additionalProperties: false
properties:
operationRef: { type: string }
etat:
type: string
enum: [SAISIE, VALIDEE, EN_COURS_EXECUTION, SOLDEE, REJETEE, ANNULEE, ANOMALIE, SUSPENDUE]
etatPrecedent:
type: string
description: Présent seulement en anomalie ou en suspension — la cible du retour.
version: { type: integer }
montantBrutCt: { type: integer, format: int64 }
prelevementsCt: { type: integer, format: int64 }
montantNetCt:
type: integer
format: int64
description: >-
DONNÉE PORTÉE, figée à la validation — jamais recalculée à l'affichage. brut −
prélèvements = net.
AccuseOperationCollective:
type: object
required: [operationCollectiveRef, etat, version]
additionalProperties: false
properties:
operationCollectiveRef: { type: string }
etat:
type: string
enum: [EN_PREPARATION, QUOTES_PARTS_ARRETEES, EXECUTION, CLOTUREE, ABANDONNEE]
version: { type: integer }
enveloppeDeclareeCt: { type: integer, format: int64 }
montantRepartiCt: { type: integer, format: int64 }
nombreIndividuelles: { type: integer }
AccuseDeDeclinaison:
type: object
required: [lots]
additionalProperties: false
properties:
lots:
type: array
items:
type: object
required: [lotRef, partition, attendu]
additionalProperties: false
properties:
lotRef: { type: string }
partition: { type: string }
attendu: { type: integer }
casARisqueIsoles:
type: integer
description: Le nombre de cas écartés du traitement automatique et versés en anomalie.
AccuseDossier:
type: object
required: [dossierRef, etat, version]
additionalProperties: false
properties:
dossierRef: { type: string }
etat:
type: string
enum: [OUVERT, AUTORISE, EN_EXECUTION, CLOS, REFUSE]
version: { type: integer }
CreationProgramme:
type: object
required: [epargnantRef, periodicite, jourEcheance, montantCt, mandatRef, premiereEcheanceLe, affectations]
additionalProperties: false
properties:
epargnantRef: { type: string }
salarieRef: { type: string }
compteRef: { type: string }
periodicite:
type: string
enum: [MENSUELLE, TRIMESTRIELLE, SEMESTRIELLE, ANNUELLE]
jourEcheance:
type: integer
minimum: 1
maximum: 28
description: >-
BORNÉ À 28 : au-delà, le jour n'existe pas tous les mois, et une échéance qui
glisse silencieusement est une échéance qu'on ne rapproche plus.
montantCt: { type: integer, format: int64, minimum: 1 }
mandatRef:
type: string
description: >-
RÉFÉRENCE OPAQUE du mandat de prélèvement EXÉCUTABLE, détenu par la banque. Le
consentement et son parcours appartiennent à l'épargnant ; ni l'un ni l'autre
n'entre ici.
premiereEcheanceLe: { type: string, format: date }
derniereEcheanceLe:
type: string
format: date
description: Absente pour un programme sans terme.
affectations:
type: array
minItems: 1
description: >-
L'intention d'investissement — ce que la banque ne détient pas, et ce qui a
commandé le domicile du programme. LE DISPOSITIF EST ICI, au grain de
l'affectation ; les ratios totalisent EXACTEMENT 1 000 000 millionièmes.
items:
type: object
required: [dispositifRef, supportRef, ratioPpm, origineAvoir]
additionalProperties: false
properties:
dispositifRef: { type: string }
supportRef: { type: string }
ratioPpm: { type: integer, minimum: 0, maximum: 1000000 }
origineAvoir: { type: string }
AccuseProgramme:
type: object
required: [programmeRef, etat, version]
additionalProperties: false
properties:
programmeRef: { type: string }
etat:
type: string
enum: [ACTIF, SUSPENDU, INEXECUTABLE, CLOS]
motifInexecutable:
type: string
description: >-
Présent SEULEMENT à l'état INEXECUTABLE. Un programme inexécutable dit toujours
pourquoi il l'est — mandat révoqué, support cessant d'être ordonnable.
version: { type: integer }
AccuseEcheance:
type: object
required: [programmeRef, echeanceLe, statut]
additionalProperties: false
properties:
programmeRef: { type: string }
echeanceLe: { type: string, format: date }
statut:
type: string
enum: [ENGENDREE, ECARTEE]
operationRef:
type: string
description: Présent si l'échéance a engendré une opération.
motifEcart:
type: string
description: >-
Présent si l'échéance a été écartée — programme suspendu, inexécutable, ou règle
qui refuse. Une échéance écartée porte TOUJOURS son motif : on ne saute jamais une
échéance en silence.
AccuseAnomalie:
type: object
required: [anomalieRef, acteResolution]
additionalProperties: false
properties:
anomalieRef: { type: string }
acteResolution:
type: string
enum: [RECYCLEE, ANNULEE]
statutRetabli:
type: string
description: Le statut précédent auquel l'entité est revenue, sur un recyclage.
DecisionDeRecevabilite:
type: object
required: [decisionNo, resultat, evalueeLe, controles]
additionalProperties: false
properties:
decisionNo: { type: integer }
decisionPrecedenteNo:
type: integer
description: Une réévaluation RELIE, elle ne remplace pas.
resultat:
type: string
enum: [RECEVABLE, IRRECEVABLE, INCOMPLETE, SUSPENDUE, A_CONFIRMER]
evalueeLe: { type: string, format: date-time }
controles:
type: array
items: { $ref: '#/components/schemas/ControleEvalue' }
versionsConsommees:
type: array
description: >-
Le CONTEXTE FIGÉ : ce qui a déterminé la décision, en identifiants publiés et
versions — jamais une copie de la donnée du voisin.
items:
type: object
required: [producteur, objet, identifiantPublie, version]
additionalProperties: false
properties:
producteur: { type: string }
objet: { type: string }
identifiantPublie: { type: string }
version: { type: string }
horodatageLecture:
type: string
format: date-time
description: >-
Pour une position consommable, l'horodatage EST la preuve : c'est la
tenue de compte qui a servi et écrêté, à cet instant.
ControleEvalue:
type: object
required: [code, verdict, classement]
additionalProperties: false
properties:
code: { type: string }
verdict:
type: string
enum: [CONFORME, NON_CONFORME, INDISPONIBLE, NON_APPLICABLE]
description: >-
INDISPONIBLE n'est JAMAIS un accord implicite : le domaine interrogé n'a pas
répondu, et l'opération attend.
classement:
type: string
enum: [BLOQUANT, SUSPENSIF, INFORMATIF, CONFIRMATION_HUMAINE]
motif:
type: string
description: Obligatoire sur un verdict non conforme — on ne refuse pas en silence.
pieceManquante: { type: string }
Probleme:
type: object
required: [code, message]
additionalProperties: false
properties:
code: { type: string }
message: { type: string }
ProblemeDeControles:
allOf:
- $ref: '#/components/schemas/Probleme'
- type: object
properties:
controles:
type: array
items: { $ref: '#/components/schemas/ControleEvalue' }