Aller au contenu

consultation-des-operations

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

CE CONTRAT SERT DES VUES, JAMAIS LE SCHÉMA INTERNE. LES AGRÉGATS SONT SERVIS, JAMAIS DÉDUITS — un écran qui additionnerait des lignes pour obtenir un total reconstituerait une règle du domaine dans l’interface, où elle divergerait au premier cas particulier. UNE SUSPENSION DE CONFORMITÉ SE VOIT, NE S’EXPLIQUE PAS : l’état est servi sans motif, sans référence de mesure, sans lien vers un dossier.

openapi: 3.1.0
info:
title: operations — consultation 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: >-
Les listes, les fiches et leurs volets, la liste de travail des anomalies, et les
agrégats dont un écran a besoin.
description: >-
CE CONTRAT SERT DES VUES, JAMAIS LE SCHÉMA INTERNE. LES AGRÉGATS SONT SERVIS, JAMAIS DÉDUITS
— un écran qui additionnerait des lignes pour obtenir un total reconstituerait une règle du
domaine dans l'interface, où elle divergerait au premier cas particulier. UNE SUSPENSION DE
CONFORMITÉ SE VOIT, NE S'EXPLIQUE PAS : l'état est servi sans motif, sans référence de
mesure, sans lien vers un dossier.
x-producteurs:
- operations
x-consommateurs:
- backoffice
- entreprise
- relation-tiers
paths:
/operations-collectives:
get:
operationId: listerLesOperationsCollectives
summary: La liste des opérations collectives, filtrée et paginée.
description: >-
Sert l'écran « Opérations d'entreprise » et, avec le filtre de famille d'effet,
l'écran « Opérations sur titres » et l'écran « Augmentations de capital » — ce sont
trois lectures d'une même entité, pas trois entités.
security: [{ authentification: [operations:consultation] }]
parameters:
- { name: entreprise, in: query, schema: { type: string } }
- { name: exercice, in: query, schema: { type: integer } }
- { name: categorie, in: query, schema: { type: string } }
- name: familleEffet
in: query
description: Filtre sur l'axe de l'effet économique (OST, alimentation, …).
schema: { type: string }
- { name: etat, in: query, schema: { type: string } }
- $ref: '#/components/parameters/page'
- $ref: '#/components/parameters/taille'
responses:
'200':
description: La page demandée.
content:
application/json:
schema:
type: object
required: [lignes, total, serviLe]
properties:
lignes:
type: array
items: { $ref: '#/components/schemas/LigneOperationCollective' }
total: { type: integer }
serviLe: { type: string, format: date-time }
/operations-collectives/{operationCollective}:
get:
operationId: consulterUneOperationCollective
summary: La fiche d'une opération collective.
security: [{ authentification: [operations:consultation] }]
parameters:
- $ref: '#/components/parameters/operationCollective'
responses:
'200':
description: La fiche, avec son avancement et son contrôle de répartition.
content:
application/json:
schema: { $ref: '#/components/schemas/FicheOperationCollective' }
'404': { $ref: '#/components/responses/Inconnu' }
/operations-collectives/{operationCollective}/operations:
get:
operationId: listerLesOperationsDUneCollective
summary: Les opérations individuelles déclinées, filtrées et paginées.
security: [{ authentification: [operations:consultation] }]
parameters:
- $ref: '#/components/parameters/operationCollective'
- { name: beneficiaire, in: query, schema: { type: string } }
- { name: choix, in: query, schema: { type: string } }
- { name: etat, in: query, schema: { type: string } }
- $ref: '#/components/parameters/page'
- $ref: '#/components/parameters/taille'
responses:
'200':
description: La page demandée.
content:
application/json:
schema:
type: object
properties:
lignes:
type: array
items: { $ref: '#/components/schemas/LigneOperation' }
total: { type: integer }
/operations-collectives/{operationCollective}/repartition-des-choix:
get:
operationId: consulterLaRepartitionDesChoix
summary: L'agrégat des choix des bénéficiaires, par choix et par dispositif.
description: >-
SERVI, JAMAIS DÉDUIT.
security: [{ authentification: [operations:consultation] }]
parameters:
- $ref: '#/components/parameters/operationCollective'
responses:
'200':
description: La répartition.
content:
application/json:
schema:
type: object
properties:
parChoix:
type: array
items:
type: object
properties:
choix: { type: string }
nombre: { type: integer }
montantCt: { type: integer, format: int64 }
parDispositif:
type: array
items:
type: object
properties:
dispositifRef: { type: string }
nombre: { type: integer }
montantCt: { type: integer, format: int64 }
/operations-collectives/{operationCollective}/reglements:
get:
operationId: listerLesReglementsDUneCollective
summary: Les règlements à la maille de la campagne.
description: >-
Le volet espèces se règle à la maille COLLECTIVE : l'entreprise verse un virement
global par objet, ventilé ensuite. « Ventilé sur » est le nombre d'imputations,
servi ici et non compté par l'écran.
security: [{ authentification: [operations:consultation] }]
parameters:
- $ref: '#/components/parameters/operationCollective'
responses:
'200':
description: Les règlements.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/LigneReglement' }
/operations-collectives/{operationCollective}/lots:
get:
operationId: listerLesLotsDUneCollective
summary: L'avancement de la déclinaison, lot par lot.
security: [{ authentification: [operations:consultation] }]
parameters:
- $ref: '#/components/parameters/operationCollective'
responses:
'200':
description: Les lots et leur rapprochement.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/LigneLot' }
/operations-collectives/{operationCollective}/analyse-d-impact:
get:
operationId: consulterLAnalyseDImpact
summary: L'ampleur d'un acte de masse, et les cas à risque isolés.
description: >-
AVANT UN ACTE LARGEMENT IRRÉVERSIBLE. L'analyse mesure l'ampleur — porteurs concernés,
parts à absorber et à attribuer, rompus à régler en espèces — et COMPTE les cas
particuliers : positions sous mesure ordonnée, comptes clos ou en anomalie, incidences
fiscales particulières. Elle en ISOLE les comptes clos et les anomalies ; LES POSITIONS
SOUS MESURE, ELLE NE LES ISOLE PLUS — la mesure suit la position que la transformation
produit.
security: [{ authentification: [operations:consultation] }]
parameters:
- $ref: '#/components/parameters/operationCollective'
responses:
'200':
description: L'analyse.
content:
application/json:
schema: { $ref: '#/components/schemas/AnalyseDImpact' }
/operations-collectives/{operationCollective}/denouement-agrege:
get:
operationId: consulterLeDenouementAgrege
summary: Ce que la déclinaison rend au référentiel des instruments.
description: >-
DES TOTAUX, JAMAIS UNE DONNÉE DE PORTEUR : le référentiel des instruments ne voit ni
porteur, ni compte, ni position.
security: [{ authentification: [operations:consultation] }]
parameters:
- $ref: '#/components/parameters/operationCollective'
responses:
'200':
description: Le dénouement agrégé.
content:
application/json:
schema: { $ref: '#/components/schemas/DenouementAgrege' }
/operations-collectives/{operationCollective}/journal:
get:
operationId: consulterLeJournalDUneCollective
summary: Le journal causal de l'opération collective.
security: [{ authentification: [operations:consultation] }]
parameters:
- $ref: '#/components/parameters/operationCollective'
responses:
'200':
description: Le journal.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/LigneJournal' }
/operations:
get:
operationId: listerLesOperations
summary: La liste des opérations individuelles, filtrée et paginée.
description: >-
Sert l'écran « Opérations d'épargnant » et toute lecture au fil de l'eau. Les deux
axes de taxonomie sont des filtres distincts, parce qu'ils sont orthogonaux.
security: [{ authentification: [operations:consultation] }]
parameters:
- { name: initiateur, in: query, schema: { type: string } }
- { name: categorie, in: query, schema: { type: string } }
- { name: epargnant, in: query, schema: { type: string } }
- { name: entreprise, in: query, schema: { type: string } }
- { name: etat, in: query, schema: { type: string } }
- $ref: '#/components/parameters/page'
- $ref: '#/components/parameters/taille'
responses:
'200':
description: La page demandée.
content:
application/json:
schema:
type: object
properties:
lignes:
type: array
items: { $ref: '#/components/schemas/LigneOperation' }
total: { type: integer }
/operations/{operation}:
get:
operationId: consulterUneOperation
summary: La fiche d'une opération individuelle — le tronc commun.
description: >-
LA MÊME FICHE quelle que soit la catégorie de l'initiateur. Le net est servi TEL
QU'IL EST PORTÉ, jamais recalculé à la réponse.
security: [{ authentification: [operations:consultation] }]
parameters:
- $ref: '#/components/parameters/operation'
responses:
'200':
description: La fiche.
content:
application/json:
schema: { $ref: '#/components/schemas/FicheOperation' }
'404': { $ref: '#/components/responses/Inconnu' }
/operations/{operation}/instructions:
get:
operationId: listerLesInstructions
summary: Le volet titres — instructions et exécution.
security: [{ authentification: [operations:consultation] }]
parameters:
- $ref: '#/components/parameters/operation'
responses:
'200':
description: Les instructions.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/LigneInstruction' }
/operations/{operation}/prelevements:
get:
operationId: listerLesPrelevements
summary: Frais et taxes — la chaîne du brut au net, et ce qui ne la réduit pas.
description: >-
DEUX LISTES DISTINCTES, et c'est le point : ce qui RÉDUIT LE NET (prélèvements
retenus sur le brut) et ce qui NE LE RÉDUIT PAS (droits d'entrée, frais de tenue de
compte à la charge de l'entreprise). Les mêler laisserait croire à une amputation
qui n'a pas lieu. Chaque ligne est AUTOPORTEUSE — assiette, taux, montant,
redevable, source — et l'opération NE LES RECALCULE PAS.
security: [{ authentification: [operations:consultation] }]
parameters:
- $ref: '#/components/parameters/operation'
responses:
'200':
description: Les prélèvements, séparés selon leur effet sur le net.
content:
application/json:
schema:
type: object
required: [reduisentLeNet, neReduisentPasLeNet, chaineDuBrutAuNet]
properties:
reduisentLeNet:
type: array
items: { $ref: '#/components/schemas/LignePrelevement' }
neReduisentPasLeNet:
type: array
items: { $ref: '#/components/schemas/LignePrelevement' }
chaineDuBrutAuNet:
type: object
properties:
totalBrutCt: { type: integer, format: int64 }
prelevementsCt: { type: integer, format: int64 }
netInvestiCt: { type: integer, format: int64 }
/operations/{operation}/imputations:
get:
operationId: listerLesImputations
summary: Le volet espèces — le règlement collectif et la part imputée ici.
description: >-
UNE OPÉRATION INDIVIDUELLE N'A PAS DE RÈGLEMENT EN PROPRE : elle porte des
imputations. La réponse montre les deux ensemble sans les confondre — le règlement
collectif tel qu'il est, et en champ distinct la part imputée ici — puis la
COUVERTURE ESPÈCES, servie et non déduite.
security: [{ authentification: [operations:consultation] }]
parameters:
- $ref: '#/components/parameters/operation'
responses:
'200':
description: Les imputations et la couverture.
content:
application/json:
schema:
type: object
properties:
imputations:
type: array
items: { $ref: '#/components/schemas/LigneImputation' }
couvertureEspeces:
type: object
properties:
brutCt: { type: integer, format: int64 }
imputeRapprocheCt: { type: integer, format: int64 }
complete: { type: boolean }
/operations/{operation}/journal:
get:
operationId: consulterLeJournalDUneOperation
summary: Le journal causal — la chronologie complète et exportable.
description: >-
AUCUNE DONNÉE SENSIBLE N'Y ENTRE : un motif de déblocage peut révéler une situation
de santé, de violences, familiale ou de surendettement. Le journal porte
l'événement et sa causalité, pas la pièce.
security: [{ authentification: [operations:consultation] }]
parameters:
- $ref: '#/components/parameters/operation'
responses:
'200':
description: Le journal.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/LigneJournal' }
/dossiers-de-correction:
get:
operationId: listerLesDossiersDeCorrection
summary: Les opérations de back-office — régularisations et contrepassations.
security: [{ authentification: [operations:consultation] }]
parameters:
- { name: nature, in: query, schema: { type: string } }
- { name: etat, in: query, schema: { type: string } }
- $ref: '#/components/parameters/page'
- $ref: '#/components/parameters/taille'
responses:
'200':
description: La page demandée.
content:
application/json:
schema:
type: object
properties:
lignes:
type: array
items: { $ref: '#/components/schemas/LigneDossier' }
total: { type: integer }
/programmes-de-versement:
get:
operationId: listerLesProgrammes
summary: Les programmes de versement récurrent d'un porteur, ou de tout le tenant.
security: [{ authentification: [operations:consultation] }]
parameters:
- { name: epargnant, in: query, schema: { type: string } }
- { name: etat, in: query, schema: { type: string } }
- $ref: '#/components/parameters/page'
- $ref: '#/components/parameters/taille'
responses:
'200':
description: La page demandée.
content:
application/json:
schema:
type: object
properties:
lignes:
type: array
items: { $ref: '#/components/schemas/LigneProgramme' }
total: { type: integer }
/programmes-de-versement/{programme}/echeances:
get:
operationId: listerLesEcheances
summary: Les échéances d'un programme — engendrées et écartées.
description: >-
LES DEUX SONT SERVIES, et c'est le point : une échéance écartée porte son motif, de
sorte qu'un porteur ou un opérateur voie pourquoi un versement n'a pas eu lieu. Un
programme suspendu ne saute pas ses échéances, il les inscrit écartées.
security: [{ authentification: [operations:consultation] }]
parameters:
- $ref: '#/components/parameters/programme'
responses:
'200':
description: Les échéances, du plus récent au plus ancien.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/LigneEcheance' }
/anomalies:
get:
operationId: listerLesAnomalies
summary: La liste de travail des anomalies — transverse aux catégories d'initiateur.
description: >-
L'ANOMALIE EST UN ÉTAT, PAS UNE CATÉGORIE D'OPÉRATION : l'initiateur y est une
colonne et un filtre, pas un découpage. Famille d'accès distincte, parce que
c'est l'outil d'un poste et non une consultation générale.
security: [{ authentification: [operations:remediation] }]
parameters:
- { name: entite, in: query, schema: { type: string } }
- { name: initiateur, in: query, schema: { type: string } }
- { name: motif, in: query, schema: { type: string } }
- name: ouvertesDepuisJours
in: query
description: L'ancienneté, qui est l'indicateur de pilotage principal du poste.
schema: { type: integer }
- $ref: '#/components/parameters/page'
- $ref: '#/components/parameters/taille'
responses:
'200':
description: La page demandée.
content:
application/json:
schema:
type: object
properties:
lignes:
type: array
items: { $ref: '#/components/schemas/LigneAnomalie' }
total: { type: integer }
components:
securitySchemes:
authentification:
type: oauth2
flows:
clientCredentials:
tokenUrl: https://exemple.invalid/oauth2/token
scopes:
operations:consultation: Lire les opérations, leurs volets et leurs agrégats.
operations:remediation: Lire et traiter la liste de travail des anomalies.
parameters:
operation:
name: operation
in: path
required: true
schema: { type: string }
operationCollective:
name: operationCollective
in: path
required: true
schema: { type: string }
programme:
name: programme
in: path
required: true
schema: { type: string }
page:
name: page
in: query
description: >-
L'ordre est fixé par un critère stable : une page suivante ne saute ni ne répète
une ligne, même si des opérations naissent entre deux appels.
schema: { type: integer, minimum: 0, default: 0 }
taille:
name: taille
in: query
schema: { type: integer, minimum: 1, maximum: 200, default: 50 }
responses:
Inconnu:
description: 404 — inconnu de ce tenant.
content:
application/json:
schema:
type: object
properties:
code: { type: string }
message: { type: string }
schemas:
LigneOperationCollective:
type: object
properties:
reference: { type: string }
entrepriseRef: { type: string }
exercice: { type: integer }
categorie: { type: string }
variante: { type: string }
nombreIndividuelles: { type: integer }
montantRepartiCt: { type: integer, format: int64 }
etat: { type: string }
instrumentRef:
type: string
description: Renseigné pour une opération sur titres ou une offre d'actionnariat.
dateEffet: { type: string, format: date }
FicheOperationCollective:
allOf:
- $ref: '#/components/schemas/LigneOperationCollective'
- type: object
properties:
enveloppeDeclareeCt: { type: integer, format: int64 }
controleDeLaRepartition:
type: object
description: >-
UNE DONNÉE CONTRÔLÉE, pas un commentaire : l'écart et son verdict sont
servis, parce que l'invariant du domaine est que la somme des quotes-parts
égale le montant réparti.
properties:
enveloppeCt: { type: integer, format: int64 }
repartiCt: { type: integer, format: int64 }
ecartCt: { type: integer, format: int64 }
verifie: { type: boolean }
avancement:
type: object
properties:
total: { type: integer }
soldees: { type: integer }
enCours: { type: integer }
enAnomalie: { type: integer }
calendrier:
type: object
properties:
ouvertureLe: { type: string, format: date }
clotureLe: { type: string, format: date }
valeurSouhaiteeLe: { type: string, format: date }
version: { type: integer }
LigneOperation:
type: object
properties:
reference: { type: string }
epargnantRef: { type: string }
entrepriseRef: { type: string }
categorie:
type: string
description: Le « cas de gestion » de l'écran — l'axe de l'effet économique.
initiateur: { type: string }
choixBeneficiaire: { type: string }
montantQuotePartCt: { type: integer, format: int64 }
montantBrutCt: { type: integer, format: int64 }
abondementBrutCt: { type: integer, format: int64 }
etat: { type: string }
suspension:
$ref: '#/components/schemas/SuspensionServie'
FicheOperation:
allOf:
- $ref: '#/components/schemas/LigneOperation'
- type: object
properties:
prelevementsCt: { type: integer, format: int64 }
montantNetCt:
type: integer
format: int64
description: Servi tel qu'il est PORTÉ, jamais recalculé à la réponse.
dateDemande: { type: string, format: date }
dateFaitGenerateur: { type: string, format: date }
dateValeur: { type: string, format: date }
dateExecution: { type: string, format: date }
operationCollectiveRef: { type: string }
strategieRef: { type: string }
version: { type: integer }
SuspensionServie:
type: object
description: >-
UNE SUSPENSION DE CONFORMITÉ SE VOIT, NE S'EXPLIQUE PAS. Pour l'origine CONFORMITE,
les champs de motif sont ABSENTS de la réponse — pas vides : absents. Aucun lien
vers un dossier n'existe.
properties:
origine:
type: string
enum: [CONFORMITE, OPERATIONNELLE]
motif:
type: string
description: Présent SEULEMENT pour l'origine OPERATIONNELLE.
prononceeLe: { type: string, format: date-time }
LigneInstruction:
type: object
properties:
instructionNo: { type: integer }
dispositifRef: { type: string }
supportRef: { type: string }
sens: { type: string }
origineAvoir: { type: string }
montantBrutCt: { type: integer, format: int64 }
prelevementsCt: { type: integer, format: int64 }
montantInvestiCt: { type: integer, format: int64 }
quantiteUpm:
type: integer
format: int64
description: Quantité de parts en MILLIONIÈMES. Jamais de flottant.
etatExecution: { type: string }
annonceRef:
type: string
description: >-
La frontière aval : la fiche s'arrête à « instructions remises au carnet
d'ordres ». L'ordre, son exécution et son dépouillement se consultent chez lui.
LignePrelevement:
type: object
properties:
echelon: { type: string, enum: [OPERATION, INSTRUCTION] }
instructionNo: { type: integer }
objet: { type: string }
nature: { type: string }
assietteCt: { type: integer, format: int64 }
tauxPb:
type: integer
description: Taux en POINTS DE BASE (9,20 % = 920).
montantCt: { type: integer, format: int64 }
redevable: { type: string, enum: [EPARGNANT, ENTREPRISE] }
source:
type: string
description: D'où vient la donnée — FISCALITE, INSTRUMENTS, ENTREPRISE.
sourceVersion: { type: string }
LigneReglement:
type: object
properties:
reference: { type: string }
objet: { type: string }
sens: { type: string }
contrepartieRef: { type: string }
moyen: { type: string }
montantGlobalCt: { type: integer, format: int64 }
nombreImputations:
type: integer
description: Le « ventilé sur » de l'écran — SERVI, jamais compté par l'interface.
etat: { type: string }
constateLe: { type: string, format: date }
LigneImputation:
type: object
properties:
reglement: { $ref: '#/components/schemas/LigneReglement' }
montantImputeCt:
type: integer
format: int64
description: LA PART IMPUTÉE ICI — en champ distinct du montant global, jamais fondue.
etatRapprochement: { type: string }
rapprocheeLe: { type: string, format: date-time }
LigneLot:
type: object
properties:
lotRef: { type: string }
partition: { type: string }
attendu: { type: integer }
traite: { type: integer }
enAnomalie: { type: integer }
etat: { type: string }
pointReprise:
type: string
description: Où la reprise redémarre. Un lot ne se relance jamais depuis le début.
AnalyseDImpact:
type: object
properties:
porteursImpactes: { type: integer }
partsAbsorbeesUpm: { type: integer, format: int64 }
partsAttribueesUpm: { type: integer, format: int64 }
rompusCt: { type: integer, format: int64 }
casARisque:
type: array
items:
type: object
properties:
nature:
type: string
enum: [POSITION_SOUS_MESURE, COMPTE_CLOS, COMPTE_EN_ANOMALIE, INCIDENCE_FISCALE]
nombre: { type: integer }
isole:
type: boolean
description: >-
Écarté du traitement automatique et versé en anomalie.
DenouementAgrege:
type: object
description: DES TOTAUX, JAMAIS UNE DONNÉE DE PORTEUR.
properties:
instrumentRef: { type: string }
partsAbsorbeesUpm: { type: integer, format: int64 }
partsAttribueesUpm: { type: integer, format: int64 }
rompusRegleCt: { type: integer, format: int64 }
porteursTraites: { type: integer }
porteursEnAnomalie: { type: integer }
prononceLe: { type: string, format: date-time }
LigneDossier:
type: object
properties:
reference: { type: string }
cible:
type: string
description: L'entité visée par la correction.
nature: { type: string }
operationSourceRef: { type: string }
montantCt: { type: integer, format: int64 }
etat: { type: string }
LigneAnomalie:
type: object
properties:
anomalieRef: { type: string }
entiteType: { type: string }
entiteReference: { type: string }
initiateur: { type: string }
motifConsigne: { type: string }
statutPrecedent:
type: string
description: >-
Mémorisé À L'OUVERTURE. C'est la cible du recyclage, et ce que l'écran affiche
sous « statut précédent ».
ouverteLe: { type: string, format: date-time }
anciennete Jours:
type: integer
description: L'indicateur de pilotage principal du poste.
priorite: { type: integer }
proprietaire: { type: string }
LigneProgramme:
type: object
properties:
reference: { type: string }
epargnantRef: { type: string }
periodicite: { type: string }
jourEcheance: { type: integer }
montantCt: { type: integer, format: int64 }
etat: { type: string }
motifInexecutable:
type: string
description: Présent seulement à l'état INEXECUTABLE.
prochaineEcheanceLe: { type: string, format: date }
derniereEcheanceLe: { type: string, format: date }
LigneEcheance:
type: object
properties:
echeanceLe: { type: string, format: date }
statut: { type: string, enum: [ENGENDREE, ECARTEE] }
operationRef: { type: string }
motifEcart:
type: string
description: >-
Toujours présent sur une échéance écartée : on ne saute jamais une échéance en
silence.
LigneJournal:
type: object
properties:
evenement: { type: string }
survenuLe: { type: string, format: date-time }
auteur: { type: string }
resume: { type: string }
causaliteReference:
type: string
description: >-
La chaîne causale d'une correction doit se remonter SANS INTERPRÉTATION.