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