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.
La spécification
Section intitulée « La spécification »openapi: 3.1.0info: 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.