administration-du-referentiel
Interface synchrone (OpenAPI) — version 0.8.0. Producteur : instruments. Consommateurs déclarés : backoffice, alimentation-documentaire, carnet-ordres.
Toute écriture du référentiel passe ici — l’alimentation documentaire comprise, qui propose et n’écrit jamais directement. Un geste d’ÉTABLISSEMENT (référencement, transition de cycle, caractéristique, restriction, règle, relation, rôle) crée une DEMANDE DE VALIDATION : l’effet est acquis à sa validation par un valideur distinct du préparateur (les quatre yeux — le workflow vit aux portes, jamais dans les cycles). La restriction d’urgence s’applique immédiatement, sa demande se valide a posteriori avec échéance de revue. La publication des valeurs et le pilotage des événements et des occurrences s’appliquent sans demande et publient chacun leur fait, retenu dans la même transaction (boîte d’envoi). Tout ou rien : un rejet du domaine (422, motivé) ne retient rien. Le teneur de compte ne se donne jamais dans l’adresse.
La spécification
Section intitulée « La spécification »openapi: 3.1.0info: title: instruments — administration du référentiel version: 0.8.0 summary: >- Les portes d'écriture du référentiel — structure, caractéristiques, restrictions, règles de valorisation, valeurs, occurrences, événements, documents et analyses — et le versant lecture de leur circuit : demandes de validation et anomalies. description: >- Toute écriture du référentiel passe ici — l'alimentation documentaire comprise, qui propose et n'écrit jamais directement. Un geste d'ÉTABLISSEMENT (référencement, transition de cycle, caractéristique, restriction, règle, relation, rôle) crée une DEMANDE DE VALIDATION : l'effet est acquis à sa validation par un valideur distinct du préparateur (les quatre yeux — le workflow vit aux portes, jamais dans les cycles). La restriction d'urgence s'applique immédiatement, sa demande se valide a posteriori avec échéance de revue. La publication des valeurs et le pilotage des événements et des occurrences s'appliquent sans demande et publient chacun leur fait, retenu dans la même transaction (boîte d'envoi). Tout ou rien : un rejet du domaine (422, motivé) ne retient rien. Le teneur de compte ne se donne jamais dans l'adresse. x-producteurs: - instruments x-consommateurs: - composant: backoffice - composant: alimentation-documentaire - composant: carnet-ordres # La règle 0.x admet la rupture en version mineure ; aucun consommateur n'est né. Le # module supprimé avait publié jusqu'en 0.6.0 : la numérotation continue au-dessus. x-ruptures: - version: 0.8.0 rupture: >- la catégorie de parts disparaît comme dimension : chemin /instruments/{instrument}/categories retiré (referencerUneCategorie) ; propriété `categorie` retirée des restrictions, des règles, des valeurs et des documents ; geste referencer_une_categorie retiré ; portées réduites. Le référencement d'un instrument accepte désormais categorie, devise et politique de revenus (les frais restent aux caractéristiques datées) ; celui d'un véhicule déclare est_compartimente. motif: >- Le compartimentage se déclare au véhicule, jamais de compartiment fantôme. - version: 0.7.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 ; la propriété tenant quitte les réponses. - version: 0.7.0 rupture: "comportement changé : les gestes d'établissement répondent 202 (demande de validation créée), non plus 201 (effet immédiat)" motif: >- Le circuit de validation à quatre yeux du cadrage vit aux portes d'administration (arbitrage du domaine, cycles de vie) : l'effet d'un établissement attend sa validation par un valideur distinct du préparateur. La publication des valeurs et le pilotage des événements et occurrences restent à effet immédiat. - version: 0.7.0 rupture: "opération remplacée : referencerUnInstrument ouvre en_preparation, la transition « lancer » ouvre commercialisable" motif: >- L'entrée « en préparation » du cycle complet remplace le référencement directement commercialisable de la 0.6.0 — l'instrument se prépare, se valide, puis se lance.paths: /vehicules: post: operationId: referencerUnVehicule summary: Référencer un véhicule — FCPE ou SICAVAS, il naît en préparation. security: - authentification: [instruments:administration] requestBody: required: true content: application/json: schema: type: object required: [type, nom_legal] properties: type: { type: string, enum: [fcpe, sicavas] } nom_legal: { type: string, minLength: 1 } est_compartimente: type: boolean default: false description: >- Le compartimentage déclaré par la documentation du fonds — vrai, chaque ligne investissable vivra sur un compartiment ; faux, aucun compartiment n'existe (jamais de compartiment fantôme). agrement: { type: string, description: La référence de l'agrément, s'il est déjà obtenu. } provenance: { $ref: '#/components/schemas/Provenance' } responses: '202': { $ref: '#/components/responses/demandeCreee' } '400': { $ref: '#/components/responses/irrecevable' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamilleAdministration' } '422': { $ref: '#/components/responses/rejete' } /vehicules/{vehicule}/transitions: post: operationId: transitionnerUnVehicule summary: Faire avancer le cycle du véhicule par le geste nommé. description: >- agreer exige la preuve de l'agrément ; ouvrir exige au moins un instrument publiable ; dissoudre exige l'absence de droits résiduels — les terminus créés par un événement (fusion dénouée) n'ont pas de porte. security: - authentification: [instruments:administration] parameters: - $ref: '#/components/parameters/vehicule' requestBody: required: true content: application/json: schema: type: object required: [geste, date] properties: geste: { type: string, enum: [agreer, ouvrir, abandonner, dissoudre] } date: { type: string, format: date, description: La date d'effet — elle vient de l'appelant. } document: { type: string, description: La preuve documentaire — exigée pour agréer. } motif: { type: string } responses: '202': { $ref: '#/components/responses/demandeCreee' } '400': { $ref: '#/components/responses/irrecevable' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamilleAdministration' } '404': { $ref: '#/components/responses/inconnu' } '422': { $ref: '#/components/responses/rejete' } /vehicules/{vehicule}/caracteristiques: post: operationId: etablirUneCaracteristiqueDeVehicule summary: Établir une caractéristique datée du véhicule — régime juridique, profils, orientation de gestion. security: - authentification: [instruments:administration] parameters: - $ref: '#/components/parameters/vehicule' requestBody: required: true content: application/json: schema: { $ref: '#/components/schemas/CaracteristiqueAEtablir' } responses: '202': { $ref: '#/components/responses/demandeCreee' } '400': { $ref: '#/components/responses/irrecevable' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamilleAdministration' } '404': { $ref: '#/components/responses/inconnu' } '422': { $ref: '#/components/responses/rejete' } /vehicules/{vehicule}/caracteristiques/reetablissements: post: operationId: reetablirUneCaracteristiqueDeVehicule summary: Ré-établir une caractéristique erronée — motif obligatoire, l'ancienne version reste tracée. security: - authentification: [instruments:administration] parameters: - $ref: '#/components/parameters/vehicule' requestBody: required: true content: application/json: schema: { $ref: '#/components/schemas/CaracteristiqueAReetablir' } responses: '202': { $ref: '#/components/responses/demandeCreee' } '400': { $ref: '#/components/responses/irrecevable' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamilleAdministration' } '404': { $ref: '#/components/responses/inconnu' } '422': { $ref: '#/components/responses/rejete' } /vehicules/{vehicule}/roles: post: operationId: affecterUnRole summary: Affecter un rôle daté d'intervenant au véhicule. description: Sans chevauchement par (véhicule, rôle) ; l'intervenant est référencé au préalable. security: - authentification: [instruments:administration] parameters: - $ref: '#/components/parameters/vehicule' requestBody: required: true content: application/json: schema: type: object required: [intervenant, role, du] properties: intervenant: { type: string } role: { $ref: '#/components/schemas/RoleDIntervenant' } du: { type: string, format: date } provenance: { $ref: '#/components/schemas/Provenance' } responses: '202': { $ref: '#/components/responses/demandeCreee' } '400': { $ref: '#/components/responses/irrecevable' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamilleAdministration' } '404': { $ref: '#/components/responses/inconnu' } '422': { $ref: '#/components/responses/rejete' } /vehicules/{vehicule}/roles/fins: post: operationId: terminerUnRole summary: Borner un rôle d'intervenant — jamais d'effacement. security: - authentification: [instruments:administration] parameters: - $ref: '#/components/parameters/vehicule' requestBody: required: true content: application/json: schema: type: object required: [intervenant, role, au] properties: intervenant: { type: string } role: { $ref: '#/components/schemas/RoleDIntervenant' } au: { type: string, format: date, description: La borne de fin, exclue. } motif: { type: string } responses: '202': { $ref: '#/components/responses/demandeCreee' } '400': { $ref: '#/components/responses/irrecevable' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamilleAdministration' } '404': { $ref: '#/components/responses/inconnu' } '422': { $ref: '#/components/responses/rejete' } /vehicules/{vehicule}/relations: post: operationId: nouerUneRelation summary: Nouer une relation de structure — maître/nourricier ou sous-jacent. description: >- Au plus une relation maître effective par nourricier ; un changement de maître termine la relation et en ouvre une nouvelle. Le maître et le titre visé sont des références publiées, jamais des lignes du référentiel. security: - authentification: [instruments:administration] parameters: - $ref: '#/components/parameters/vehicule' requestBody: required: true content: application/json: schema: type: object required: [type, du, provenance] properties: type: { type: string, enum: [maitre_nourricier, sous_jacent] } du: { type: string, format: date } maitre: type: object description: La cible d'une relation maître/nourricier. properties: nom: { type: string } isin: { type: string } titre: type: object description: Le titre visé d'une relation sous-jacent. properties: emetteur: { type: string } isin: { type: string } role_du_titre: type: string enum: [sous_jacent_principal, sous_jacent_de_formule, titre_de_reference, actif_de_couverture] mode_exposition: type: string enum: [direct, indirect, garanti, a_effet_de_levier] provenance: { $ref: '#/components/schemas/Provenance' } responses: '202': { $ref: '#/components/responses/demandeCreee' } '400': { $ref: '#/components/responses/irrecevable' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamilleAdministration' } '404': { $ref: '#/components/responses/inconnu' } '422': { $ref: '#/components/responses/rejete' } /vehicules/{vehicule}/relations/fins: post: operationId: terminerUneRelation summary: Terminer une relation de structure — jamais de modification en place. security: - authentification: [instruments:administration] parameters: - $ref: '#/components/parameters/vehicule' requestBody: required: true content: application/json: schema: type: object required: [relation, au] properties: relation: { type: string, description: L'identifiant de la relation à borner. } au: { type: string, format: date, description: La borne de fin, exclue. } motif: { type: string } responses: '202': { $ref: '#/components/responses/demandeCreee' } '400': { $ref: '#/components/responses/irrecevable' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamilleAdministration' } '404': { $ref: '#/components/responses/inconnu' } '422': { $ref: '#/components/responses/rejete' } /compartiments: post: operationId: referencerUnCompartiment summary: Référencer un compartiment — le véhicule doit se déclarer compartimenté (422 sinon). security: - authentification: [instruments:administration] requestBody: required: true content: application/json: schema: type: object required: [vehicule, libelle] properties: vehicule: { type: string } libelle: { type: string, minLength: 1 } provenance: { $ref: '#/components/schemas/Provenance' } responses: '202': { $ref: '#/components/responses/demandeCreee' } '400': { $ref: '#/components/responses/irrecevable' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamilleAdministration' } '422': { $ref: '#/components/responses/rejete' } /instruments: post: operationId: referencerUnInstrument summary: Référencer un instrument — il naît « en préparation », rien ne peut s'y détenir. description: >- La nature commande la forme du corps : un placement collectif exige son véhicule (au moins agréé), son compartiment quand le véhicule est compartimenté et son libellé de catégorie quand le règlement émet plusieurs catégories de parts — UN INSTRUMENT PAR CATÉGORIE DE PARTS, chaque catégorie EST un instrument ; un CCB exige l'entreprise débitrice et l'accord de participation (références publiées) ; la devise est référencée une fois. L'identifiant publié attribué est stable à vie. security: - authentification: [instruments:administration] requestBody: required: true content: application/json: schema: type: object required: [nature, libelle] properties: nature: { type: string, enum: [placement_collectif, ccb, devise] } libelle: { type: string, minLength: 1 } unite: { type: string, enum: [part, unite_monetaire] } decimales: { type: integer, minimum: 0 } vehicule: { type: string, description: Obligatoire pour un placement collectif. } compartiment: { type: string, description: Du même véhicule — obligatoire quand le véhicule est compartimenté, interdit sinon. } categorie: type: string description: >- Le libellé de la catégorie de parts que la ligne représente (Part A, Part I…) — absent pour une catégorie de parts unique. Ses frais s'établissent en caractéristique datée (frais_du_fonds), jamais au référencement. devise: { type: string } politique_revenus: { type: string } isin: { type: string } entreprise_debitrice: { type: string, description: CCB seulement — référence publiée. } accord_participation: { type: string, description: CCB seulement — référence publiée. } provenance: { $ref: '#/components/schemas/Provenance' } responses: '202': { $ref: '#/components/responses/demandeCreee' } '400': { $ref: '#/components/responses/irrecevable' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamilleAdministration' } '422': { $ref: '#/components/responses/rejete' } /instruments/{instrument}/transitions: post: operationId: transitionnerUnInstrument summary: Faire avancer le cycle de l'instrument — lancer, ou annuler avant tout lancement. description: >- lancer exige un véhicule ouvert (placement collectif) et la règle de valorisation établie ; annuler exige qu'aucune position n'ait jamais existé. Les terminus absorbé et liquidé n'ont pas de porte : ils sont créés par le dénouement d'un événement ou la dissolution du véhicule. security: - authentification: [instruments:administration] parameters: - $ref: '#/components/parameters/instrument' requestBody: required: true content: application/json: schema: type: object required: [geste, date] properties: geste: { type: string, enum: [lancer, annuler] } date: { type: string, format: date } motif: { type: string } responses: '202': { $ref: '#/components/responses/demandeCreee' } '400': { $ref: '#/components/responses/irrecevable' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamilleAdministration' } '404': { $ref: '#/components/responses/inconnu' } '422': { $ref: '#/components/responses/rejete' } /instruments/{instrument}/caracteristiques: post: operationId: etablirUneCaracteristique summary: Établir une caractéristique datée de l'instrument. description: >- Typée, période [du, au[ sans chevauchement par sous-classe, provenance obligatoire — la référence documentaire est obligatoire quand la source est un document. L'inapplicable à la nature est un rejet. security: - authentification: [instruments:administration] parameters: - $ref: '#/components/parameters/instrument' requestBody: required: true content: application/json: schema: { $ref: '#/components/schemas/CaracteristiqueAEtablir' } responses: '202': { $ref: '#/components/responses/demandeCreee' } '400': { $ref: '#/components/responses/irrecevable' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamilleAdministration' } '404': { $ref: '#/components/responses/inconnu' } '422': { $ref: '#/components/responses/rejete' } /instruments/{instrument}/caracteristiques/reetablissements: post: operationId: reetablirUneCaracteristique summary: Ré-établir une caractéristique erronée — motif obligatoire, l'ancienne version reste tracée. security: - authentification: [instruments:administration] parameters: - $ref: '#/components/parameters/instrument' requestBody: required: true content: application/json: schema: { $ref: '#/components/schemas/CaracteristiqueAReetablir' } responses: '202': { $ref: '#/components/responses/demandeCreee' } '400': { $ref: '#/components/responses/irrecevable' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamilleAdministration' } '404': { $ref: '#/components/responses/inconnu' } '422': { $ref: '#/components/responses/rejete' } /instruments/{instrument}/restrictions: post: operationId: poserUneRestriction summary: Poser une restriction de négociabilité — datée, cumulable, hors cycle. description: >- Ordinaire, elle crée une demande de validation. D'URGENCE, elle prend effet immédiatement et ouvre la demande a posteriori, avec échéance de revue obligatoire. La pose publie son fait (contrat evenement-de-negociabilite) au moment où elle prend effet. security: - authentification: [instruments:administration] parameters: - $ref: '#/components/parameters/instrument' requestBody: required: true content: application/json: schema: type: object required: [type, du, capacites_touchees, provenance] properties: type: { type: string, enum: [ferme_aux_souscriptions, ferme_aux_rachats, suspendu, ferme_aux_nouveaux_versements] } du: { type: string, format: date } au: { type: string, format: date, description: La borne de levée prévue, exclue — absente si ouverte. } heure_effet: { type: string, pattern: '^([01][0-9]|2[0-3]):[0-5][0-9]$' } fuseau: { type: string } capacites_touchees: type: array minItems: 1 items: { $ref: '#/components/schemas/Capacite' } portee: { type: string, enum: [instrument, vehicule], default: instrument } urgence: { type: boolean, default: false } echeance_de_revue: { type: string, format: date, description: Obligatoire quand urgence est vrai. } motif: { type: string } provenance: { $ref: '#/components/schemas/Provenance' } responses: '201': description: URGENCE — la restriction est en vigueur ; la demande de validation a posteriori est créée. content: application/json: schema: { $ref: '#/components/schemas/RestrictionPosee' } '202': { $ref: '#/components/responses/demandeCreee' } '400': { $ref: '#/components/responses/irrecevable' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamilleAdministration' } '404': { $ref: '#/components/responses/inconnu' } '422': { $ref: '#/components/responses/rejete' } /instruments/{instrument}/restrictions/levees: post: operationId: leverUneRestriction summary: Lever une restriction — la levée borne la période, jamais d'effacement. description: La levée publie son fait (contrat evenement-de-negociabilite). security: - authentification: [instruments:administration] parameters: - $ref: '#/components/parameters/instrument' requestBody: required: true content: application/json: schema: type: object required: [restriction, au] properties: restriction: { type: string, description: L'identifiant de la restriction à lever. } au: { type: string, format: date, description: La borne de levée, exclue. } motif: { type: string } responses: '202': { $ref: '#/components/responses/demandeCreee' } '400': { $ref: '#/components/responses/irrecevable' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamilleAdministration' } '404': { $ref: '#/components/responses/inconnu' } '422': { $ref: '#/components/responses/rejete' } /instruments/{instrument}/regle-valorisation: post: operationId: etablirLaRegleDeValorisation summary: Établir la règle de valorisation — portée déclarée unique, éléments sourcés, calendriers affectés. description: >- Une nouvelle version de règle remplace la précédente à sa date d'application — jamais de modification en place ; l'horizon des occurrences se recalcule et publie ses impacts (contrat evenement-de-valorisation-prevue). L'heure limite porte toujours son fuseau IANA. security: - authentification: [instruments:administration] parameters: - $ref: '#/components/parameters/instrument' requestBody: required: true content: application/json: schema: type: object required: [portee, frequence, heure_limite, fuseau, du, provenances] properties: portee: type: string enum: [vehicule, compartiment, instrument] description: >- La règle vit au niveau qui porte le patrimoine valorisé d'un seul mouvement — le véhicule non compartimenté ou le compartiment ; la portée instrument reste au CCB. frequence: { type: string, enum: [quotidienne, hebdomadaire, mensuelle] } ancrage: { type: string } heure_limite: { type: string, pattern: '^([01][0-9]|2[0-3]):[0-5][0-9]$' } fuseau: { type: string, minLength: 1 } convention_report: { type: string } delai_publication_jours: { type: integer, minimum: 0 } delai_reglement_jours: { type: integer, minimum: 0 } du: { type: string, format: date, description: La date d'application de la version. } calendriers: type: array description: Les affectations — sémantique explicite, jamais un effet par simple présence. items: type: object required: [calendrier, semantique] properties: calendrier: { type: string } semantique: type: string enum: [ouverture_requise, fermeture_exclusive, dependance_valorisation, calcul_publication, calcul_reglement, informatif] provenances: type: array minItems: 1 description: La provenance de chaque élément établi — la résolution n'effacera pas la trace. items: type: object required: [element, provenance] properties: element: type: string enum: [frequence, ancrage, heure_limite, convention_report, delai_publication_jours, delai_reglement_jours, calendriers] provenance: { $ref: '#/components/schemas/Provenance' } responses: '202': { $ref: '#/components/responses/demandeCreee' } '400': { $ref: '#/components/responses/irrecevable' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamilleAdministration' } '404': { $ref: '#/components/responses/inconnu' } '422': { $ref: '#/components/responses/rejete' } /intervenants: post: operationId: referencerUnIntervenant summary: Référencer un intervenant — l'identité générale vit chez la relation tiers. security: - authentification: [instruments:administration] requestBody: required: true content: application/json: schema: type: object required: [nom] properties: nom: { type: string, minLength: 1 } reference_tiers: { type: string, description: L'ancre vers l'identité générale (relation tiers), quand elle existe. } responses: '202': { $ref: '#/components/responses/demandeCreee' } '400': { $ref: '#/components/responses/irrecevable' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamilleAdministration' } '422': { $ref: '#/components/responses/rejete' } /intervenants/{intervenant}/desactivation: post: operationId: desactiverUnIntervenant summary: Désactiver un intervenant — jamais supprimé, les rôles passés le référencent. security: - authentification: [instruments:administration] parameters: - name: intervenant in: path required: true schema: { type: string, minLength: 1 } requestBody: required: false content: application/json: schema: type: object properties: motif: { type: string } responses: '202': { $ref: '#/components/responses/demandeCreee' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamilleAdministration' } '404': { $ref: '#/components/responses/inconnu' } '422': { $ref: '#/components/responses/rejete' } /instruments/{instrument}/valeurs: post: operationId: publierUneValeur summary: Publier une valeur — le rang 1 d'une date de calcul, jamais de motif. description: >- L'appariement nature ↔ sorte est structurel (placement collectif → marché, CCB → administrée) ; une devise ne publie rien. Le fait est retenu dans la même transaction (contrat evenement-valeur-liquidative). Une valeur au même rang est un rejet : la correction passe par la porte des corrections. security: - authentification: [instruments:publication] parameters: - $ref: '#/components/parameters/instrument' requestBody: required: true content: application/json: schema: type: object required: [date_calcul, valeur_part_ue6, provenance] properties: date_calcul: { type: string, format: date } valeur_part_ue6: { type: integer } occurrence: { type: string, description: L'occurrence de valorisation prévue à laquelle la valeur répond. } provenance: { type: string, enum: [flux_de_place, saisie] } responses: '201': description: La valeur est publiée, son fait est retenu. content: application/json: schema: { $ref: '#/components/schemas/ValeurPubliee' } '400': { $ref: '#/components/responses/irrecevable' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamillePublication' } '404': { $ref: '#/components/responses/inconnu' } '422': { $ref: '#/components/responses/rejete' } /instruments/{instrument}/valeurs/corrections: post: operationId: corrigerUneValeur summary: Corriger une valeur — le rang suivant, motif obligatoire, l'ancienne conservée. security: - authentification: [instruments:publication] parameters: - $ref: '#/components/parameters/instrument' requestBody: required: true content: application/json: schema: type: object required: [date_calcul, valeur_part_ue6, motif, provenance] properties: date_calcul: { type: string, format: date } valeur_part_ue6: { type: integer } motif: { type: string, minLength: 1 } provenance: { type: string, enum: [flux_de_place, saisie] } responses: '201': description: La correction est publiée au rang suivant, son fait est retenu. content: application/json: schema: { $ref: '#/components/schemas/ValeurPubliee' } '400': { $ref: '#/components/responses/irrecevable' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamillePublication' } '404': { $ref: '#/components/responses/inconnu' } '422': { $ref: '#/components/responses/rejete' } /occurrences/{occurrence}/transitions: post: operationId: transitionnerUneOccurrence summary: Tenir le cycle d'une occurrence — confirmer, reporter, annuler, suspendre, reprendre. description: >- Le report est un terminus : l'occurrence de remplacement (nouvelle date, nouvel identifiant) naît du même geste — jamais de modification en place. Toute transition est motivée quand elle ferme ou suspend, et publie son fait (contrat evenement-de-valorisation-prevue). security: - authentification: [instruments:publication] parameters: - name: occurrence in: path required: true schema: { type: string, minLength: 1 } requestBody: required: true content: application/json: schema: type: object required: [geste] properties: geste: { type: string, enum: [confirmer, reporter, annuler, suspendre, reprendre] } motif: { type: string, description: Obligatoire pour reporter, annuler, suspendre. } date_de_remplacement: type: string format: date description: Obligatoire pour un report — la date de l'occurrence de remplacement. source: { type: string, description: La source de la décision (suspension notifiée, décision de la société de gestion…). } responses: '201': description: La transition est appliquée, son fait est retenu — pour un report, l'occurrence de remplacement est servie. content: application/json: schema: type: object required: [occurrence, statut] properties: occurrence: { type: string } statut: { type: string, enum: [prevue, confirmee, reportee, annulee, suspendue] } occurrence_remplacante: { type: string } '400': { $ref: '#/components/responses/irrecevable' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamillePublication' } '404': { $ref: '#/components/responses/inconnu' } '422': { $ref: '#/components/responses/rejete' } /evenements-instrument: post: operationId: annoncerUnEvenement summary: Annoncer un événement d'instrument — la décision typée, le calendrier, l'établissement documentaire. description: >- La décision de la société de gestion, représentée par délégation. Un correctif référence l'événement fautif (corrige). L'annonce publie son fait (contrat evenement-d-instrument). security: - authentification: [instruments:publication] requestBody: required: true content: application/json: schema: type: object required: [type, annonce_le, instruments_touches] properties: type: { type: string, enum: [fusion, scission, reajustement, distribution] } annonce_le: { type: string, format: date } effet_le: { type: string, format: date } instruments_touches: type: array minItems: 1 items: type: object required: [instrument, role] properties: instrument: { type: string } role: { type: string, enum: [absorbant, absorbe, source, cible, concerne] } decision: type: object description: Les caractéristiques connues à l'annonce — non figées avant le prononcé. etabli_par_document: { type: string } corrige: { type: string, description: L'événement corrigé, pour un correctif — la référence de causalité est alors obligatoire. } responses: '201': description: L'événement est annoncé, son fait est retenu. content: application/json: schema: type: object required: [evenement, etat] properties: evenement: { type: string } etat: { type: string, const: annonce } '400': { $ref: '#/components/responses/irrecevable' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamillePublication' } '422': { $ref: '#/components/responses/rejete' } /evenements-instrument/{evenement}/prononce: post: operationId: prononcerUnEvenement summary: Prononcer — les caractéristiques sont arrêtées et figées. description: >- La charge est typée par le type d'événement : parités et lignes d'arrivée par instrument absorbé (fusion), clés de répartition (scission), coefficient (réajustement), coupon et dates (distribution). Après le prononcé, seule la correction par un nouvel événement correctif existe. security: - authentification: [instruments:publication] parameters: - $ref: '#/components/parameters/evenement' requestBody: required: true content: application/json: schema: type: object required: [decision] properties: decision: type: object description: La décision typée, figée au prononcé — entiers à unité suffixée (parite_p6, cle_repartition_p6, coefficient_p6, coupon_part_ue6). effet_le: { type: string, format: date } responses: '201': description: L'événement est prononcé, son fait est retenu. '400': { $ref: '#/components/responses/irrecevable' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamillePublication' } '404': { $ref: '#/components/responses/inconnu' } '422': { $ref: '#/components/responses/rejete' } /evenements-instrument/{evenement}/annulation: post: operationId: annulerUnEvenement summary: Annuler — le renoncement, avant le prononcé seulement. security: - authentification: [instruments:publication] parameters: - $ref: '#/components/parameters/evenement' requestBody: required: true content: application/json: schema: type: object required: [motif] properties: motif: { type: string, minLength: 1 } responses: '201': description: L'événement est annulé, son fait est retenu. '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamillePublication' } '404': { $ref: '#/components/responses/inconnu' } '422': { $ref: '#/components/responses/rejete' } /evenements-instrument/{evenement}/denouement: post: operationId: denouerUnEvenement summary: Dénouer — le dénouement constaté ; une fusion emporte la fin de vie des absorbés. description: >- S'appuie sur le retour agrégé des consommateurs. Le dénouement publie son fait, et les terminus des instruments absorbés et du véhicule éteint publient les leurs (contrat evenement-du-cycle-de-vie). security: - authentification: [instruments:publication] parameters: - $ref: '#/components/parameters/evenement' requestBody: required: true content: application/json: schema: type: object required: [denoue_le] properties: denoue_le: { type: string, format: date } retour: type: object description: Le retour agrégé de la déclinaison, sans donnée de porteur, quand il existe. responses: '201': description: L'événement est dénoué, ses faits sont retenus. '400': { $ref: '#/components/responses/irrecevable' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamillePublication' } '404': { $ref: '#/components/responses/inconnu' } '422': { $ref: '#/components/responses/rejete' } /documents: post: operationId: verserUnDocument summary: Verser un document — immuable ; un contenu déjà versé est reconnu par son empreinte. description: >- Le contenu se verse par exactement l'un des deux champs — contenu_texte (UTF-8) ou contenu_pdf (base64, archivé tel quel). L'empreinte se calcule sur les octets versés ; le fichier part à l'adaptateur de stockage, le référentiel n'en garde que l'identité, la version et l'empreinte. Une nouvelle édition est un NOUVEAU document. security: - authentification: [instruments:administration] requestBody: required: true content: application/json: schema: type: object required: [type, emetteur, edite_le] properties: type: { type: string, enum: [prospectus, dic, reglement_du_fonds, lettre_aux_porteurs] } libelle: { type: string } emetteur: { type: string, description: L'intervenant émetteur. } edite_le: { type: string, format: date } applicable_le: { type: string, format: date } derniere_revue_le: { type: string, format: date } langue: { type: string } niveau_d_attache: { type: string, enum: [vehicule, instrument] } vehicule: { type: string } instruments: type: array description: Le rattachement déclaré au versement — confirmable à l'examen (un prospectus couvre parfois plusieurs compartiments). items: { type: string } contenu_texte: { type: string } contenu_pdf: { type: string, contentEncoding: base64 } responses: '201': description: Le document est versé — ou reconnu, s'il l'était déjà (même empreinte). content: application/json: schema: type: object required: [document, empreinte, deja_verse] properties: document: { type: string } empreinte: { type: string } deja_verse: { type: boolean } '400': { $ref: '#/components/responses/irrecevable' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamilleAdministration' } '422': { $ref: '#/components/responses/rejete' } /documents/{document}/analyses: post: operationId: analyserUnDocument summary: Analyser un document — l'analyseur propose, il n'écrit jamais. description: >- Chaque analyse est une entité DE PLUS (ré-analyser ne remplace rien), datée et versionnée par son outillage. Les gestes proposés sont exactement des gestes du composant — jamais inventés, jamais une publication de valeur. security: - authentification: [instruments:administration] parameters: - $ref: '#/components/parameters/document' responses: '201': description: L'analyse est produite. content: application/json: schema: { $ref: '#/components/schemas/Analyse' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamilleAdministration' } '404': { $ref: '#/components/responses/inconnu' } '422': { $ref: '#/components/responses/rejete' } get: operationId: listerLesAnalysesDuDocument summary: Les analyses d'un document, de la plus récente à la plus ancienne. security: - authentification: [instruments:administration] parameters: - $ref: '#/components/parameters/document' responses: '200': description: Les analyses. content: application/json: schema: type: array items: { $ref: '#/components/schemas/Analyse' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamilleAdministration' } '404': { $ref: '#/components/responses/inconnu' } /analyses: get: operationId: rechercherLesAnalyses summary: La file des analyses — l'examen partiel est visible. security: - authentification: [instruments:administration] parameters: - name: examinee in: query required: false description: Faux pour la file de travail — les analyses dont au moins un geste attend son sort. schema: { type: boolean } - $ref: '#/components/parameters/page' - $ref: '#/components/parameters/taille' responses: '200': description: La page demandée. content: application/json: schema: type: object required: [lignes, total] properties: lignes: type: array items: { $ref: '#/components/schemas/Analyse' } total: type: [integer, 'null'] '400': { $ref: '#/components/responses/irrecevable' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamilleAdministration' } /analyses/{analyse}: get: operationId: consulterUneAnalyse summary: Une analyse — ses gestes proposés, localisés, rapprochés, et leur sort. security: - authentification: [instruments:administration] parameters: - name: analyse in: path required: true schema: { type: string, minLength: 1 } responses: '200': description: L'analyse. content: application/json: schema: { $ref: '#/components/schemas/Analyse' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamilleAdministration' } '404': { $ref: '#/components/responses/inconnu' } /analyses/{analyse}/gestes/{numero}/sort: post: operationId: examinerUnGeste summary: Examiner un geste proposé — appliquer, amender puis appliquer, ou écarter (motivé). description: >- L'application part par la porte d'administration correspondante, la provenance documentaire posée — elle crée donc la demande de validation ordinaire. Un rejet du cœur vaut écart avec le motif du cœur. L'amendement trace la donnée proposée et la donnée appliquée. security: - authentification: [instruments:administration] parameters: - name: analyse in: path required: true schema: { type: string, minLength: 1 } - name: numero in: path required: true schema: { type: integer, minimum: 1 } requestBody: required: true content: application/json: schema: type: object required: [sort] properties: sort: { type: string, enum: [appliquer, amender_puis_appliquer, ecarter] } donnees_amendees: type: object description: Obligatoire pour amender — la donnée corrigée avant application. motif: { type: string, description: Obligatoire pour écarter. } responses: '201': description: Le sort est rendu — pour une application, la demande de validation créée est servie. content: application/json: schema: type: object required: [sort] properties: sort: { type: string, enum: [applique, amende_puis_applique, ecarte] } demande: { type: string, description: La demande de validation créée par l'application. } motif_du_coeur: { type: string, description: Le motif, quand l'application a été rejetée par le cœur (le geste est alors écarté). } '400': { $ref: '#/components/responses/irrecevable' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamilleAdministration' } '404': { $ref: '#/components/responses/inconnu' } '422': { $ref: '#/components/responses/rejete' } /demandes-de-validation: get: operationId: rechercherLesDemandes summary: La file des demandes de validation — l'ancienneté et la recevabilité sont servies. security: - authentification: [instruments:administration] parameters: - name: objet in: query required: false schema: { $ref: '#/components/schemas/ObjetDeDemande' } - name: cible in: query required: false description: L'identifiant de l'entité visée (instrument, véhicule, calendrier…). schema: { type: string, minLength: 1 } - name: prepare_par in: query required: false schema: { type: string, minLength: 1 } - name: en_attente_depuis in: query required: false description: Ne servir que les demandes soumises avant cette date. schema: { type: string, format: date } - name: etat in: query required: false schema: { type: string, enum: [en_attente, validee, refusee], default: en_attente } - $ref: '#/components/parameters/page' - $ref: '#/components/parameters/taille' responses: '200': description: La page demandée. content: application/json: schema: type: object required: [lignes, total] properties: lignes: type: array items: { $ref: '#/components/schemas/DemandeDeValidation' } total: type: [integer, 'null'] '400': { $ref: '#/components/responses/irrecevable' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamilleAdministration' } /demandes-de-validation/{demande}: get: operationId: consulterUneDemande summary: Une demande — ce qui change, sa source, sa recevabilité pour le lecteur. security: - authentification: [instruments:administration] parameters: - $ref: '#/components/parameters/demande' responses: '200': description: La demande. content: application/json: schema: { $ref: '#/components/schemas/DemandeDeValidation' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamilleAdministration' } '404': { $ref: '#/components/responses/inconnu' } /demandes-de-validation/{demande}/validation: post: operationId: validerUneDemande summary: Valider — l'effet est acquis ; jamais par le préparateur. description: >- La validation applique l'établissement et publie les faits qui en découlent. Une demande préparée par le valideur est refusée (422) — les quatre yeux sont du domaine, pas de l'écran. security: - authentification: [instruments:administration] parameters: - $ref: '#/components/parameters/demande' responses: '200': description: La demande est validée, l'effet est acquis. '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamilleAdministration' } '404': { $ref: '#/components/responses/inconnu' } '422': { $ref: '#/components/responses/rejete' } /demandes-de-validation/{demande}/refus: post: operationId: refuserUneDemande summary: Refuser — motivé ; pour une urgence déjà en vigueur, le refus lève la restriction. security: - authentification: [instruments:administration] parameters: - $ref: '#/components/parameters/demande' requestBody: required: true content: application/json: schema: type: object required: [motif] properties: motif: { type: string, minLength: 1 } responses: '200': description: La demande est refusée. '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamilleAdministration' } '404': { $ref: '#/components/responses/inconnu' } '422': { $ref: '#/components/responses/rejete' } /anomalies: post: operationId: signalerUneAnomalie summary: Signaler une anomalie ou une donnée structurelle manquante — la porte des consommateurs. description: >- L'attente exprimée par le carnet d'ordres : un consommateur qui bute sur le référentiel le dit ici, il ne contourne pas. Le groupe des anomalies converge avec l'arbitrage de la navette (frontière domaine / service transverse de qualité). security: - authentification: [instruments:signalement] requestBody: required: true content: application/json: schema: type: object required: [objet, detail] properties: objet: { $ref: '#/components/schemas/ObjetDAnomalie' } regle: { type: string, description: La règle de contrôle en cause, quand le signaleur la connaît. } detail: { type: string, minLength: 1 } signale_par: { type: string, description: Le composant signaleur. } responses: '201': description: L'anomalie est ouverte. content: application/json: schema: { $ref: '#/components/schemas/Anomalie' } '400': { $ref: '#/components/responses/irrecevable' } '401': { $ref: '#/components/responses/sansIdentite' } '403': description: L'identité présentée n'a pas la famille d'accès instruments:signalement. '422': { $ref: '#/components/responses/rejete' } get: operationId: rechercherLesAnomalies summary: Les anomalies de qualité du référentiel — collection filtrée, cycle propre. security: - authentification: [instruments:administration] parameters: - name: gravite in: query required: false schema: { type: string, enum: [elevee, moyenne, faible] } - name: objet in: query required: false description: L'identifiant de l'objet rattaché. schema: { type: string, minLength: 1 } - name: regle in: query required: false schema: { type: string, minLength: 1 } - name: etat in: query required: false schema: { type: string, enum: [ouvertes, traitees, ecartees, toutes], default: ouvertes } - $ref: '#/components/parameters/page' - $ref: '#/components/parameters/taille' responses: '200': description: La page demandée. content: application/json: schema: type: object required: [lignes, total] properties: lignes: type: array items: { $ref: '#/components/schemas/Anomalie' } total: type: [integer, 'null'] '400': { $ref: '#/components/responses/irrecevable' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamilleAdministration' } /anomalies/{anomalie}/traitement: post: operationId: traiterUneAnomalie summary: Traiter — l'anomalie est close par l'action qui la résout, tracée. security: - authentification: [instruments:administration] parameters: - $ref: '#/components/parameters/anomalie' requestBody: required: true content: application/json: schema: type: object required: [action] properties: action: { type: string, minLength: 1, description: Ce qui a résolu l'anomalie. } responses: '200': description: L'anomalie est traitée. '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamilleAdministration' } '404': { $ref: '#/components/responses/inconnu' } '422': { $ref: '#/components/responses/rejete' } /anomalies/{anomalie}/ecart: post: operationId: ecarterUneAnomalie summary: Écarter — une décision tracée et motivée, jamais une suppression. security: - authentification: [instruments:administration] parameters: - $ref: '#/components/parameters/anomalie' requestBody: required: true content: application/json: schema: type: object required: [motif] properties: motif: { type: string, minLength: 1 } responses: '200': description: L'anomalie est écartée. '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamilleAdministration' } '404': { $ref: '#/components/responses/inconnu' } '422': { $ref: '#/components/responses/rejete' }components: parameters: instrument: name: instrument in: path required: true schema: { type: string, minLength: 1 } vehicule: name: vehicule in: path required: true schema: { type: string, minLength: 1 } evenement: name: evenement in: path required: true schema: { type: string, minLength: 1 } document: name: document in: path required: true schema: { type: string, minLength: 1 } demande: name: demande in: path required: true schema: { type: string, minLength: 1 } anomalie: name: anomalie in: path required: true schema: { type: string, minLength: 1 } page: name: page in: query required: false schema: { type: integer, minimum: 1, default: 1 } taille: name: taille in: query required: false schema: { type: integer, minimum: 1, maximum: 500, default: 50 } securitySchemes: authentification: type: http scheme: bearer description: >- Tout appel est authentifié (401) et autorisé par famille d'accès (403 hors famille) — chaque opération déclare sa famille en portée, sous la forme instruments:famille. Les familles se prouvent en croisé : l'administration ne publie pas, la publication n'administre pas. responses: demandeCreee: description: >- La demande de validation est créée — l'effet attend sa validation par un valideur distinct du préparateur. content: application/json: schema: type: object required: [demande, objet] properties: demande: { type: string } objet: { $ref: '#/components/schemas/ObjetDeDemande' } cible: { type: string } irrecevable: description: La demande est irrecevable (champ manquant, date mal formée, flottant…) — le motif nomme le champ. content: application/json: schema: { $ref: '#/components/schemas/Erreur' } sansIdentite: description: Aucune identité présentée. horsFamilleAdministration: description: L'identité présentée n'a pas la famille d'accès instruments:administration. horsFamillePublication: description: L'identité présentée n'a pas la famille d'accès instruments:publication. inconnu: description: La ressource est inconnue de ce tenant — rien n'existe à travers la muraille. content: application/json: schema: { $ref: '#/components/schemas/Erreur' } rejete: description: >- Le domaine refuse (invariant violé : chevauchement de périodes, inapplicable à la nature, cycle qui n'admet pas la transition, rang déjà publié, préparateur valideur…) — rien n'est retenu, aucun fait n'existe ; le motif nomme l'invariant. content: application/json: schema: { $ref: '#/components/schemas/Erreur' } schemas: Provenance: type: object required: [source] properties: source: { type: string, enum: [document, saisie, flux_de_place] } document: { type: string, description: La référence du document versé — obligatoire quand la source est un document. } RoleDIntervenant: type: string enum: [societe_de_gestion, depositaire, valorisateur, agent_de_transfert, centralisateur, teneur_compte_emission, commissaire_aux_comptes, conseil_de_surveillance] Capacite: type: string enum: [souscription, rachat, arbitrage_entrant, arbitrage_sortant, transfert, affectation_ccb] CaracteristiqueAEtablir: type: object required: [type, du, provenance] properties: type: type: string enum: [periodicite_de_publication, classification, frais_du_fonds, taux_d_interet, mecanisme_plafonnement_rachats, modalites_d_ordre, regime_juridique_fcpe, profil_solidaire, profil_relais, profil_garanti, profil_a_formule, orientation_gestion] description: >- La typologie fermée — fermée PAR LE LOGICIEL : un type nouveau est une évolution versionnée, pas un paramétrage. Le niveau d'attache est structurel : les types de véhicule se rejettent sur un instrument, et réciproquement. du: { type: string, format: date } au: { type: string, format: date, description: La borne de fin, exclue — absente si la période est ouverte. } provenance: { $ref: '#/components/schemas/Provenance' } donnees: type: object description: >- Les champs propres au type, aux types du modèle — entiers à unité suffixée (taux_pb, droits_entree_pb, seuil_pb, minimum_souscription_ue6…), codes des listes fermées (regime : l_214_164…), périodes. CaracteristiqueAReetablir: allOf: - $ref: '#/components/schemas/CaracteristiqueAEtablir' - type: object required: [motif] properties: motif: { type: string, minLength: 1, description: Pourquoi la version précédente était erronée — elle reste tracée. } RestrictionPosee: type: object required: [restriction, en_vigueur_depuis, demande] properties: restriction: { type: string } en_vigueur_depuis: { type: string, format: date-time } demande: { type: string, description: La demande de validation a posteriori. } echeance_de_revue: { type: string, format: date } ValeurPubliee: type: object required: [instrument, date_calcul, rang, valeur_part_ue6, sorte] properties: instrument: { type: string } date_calcul: { type: string, format: date } rang: { type: integer, minimum: 1 } valeur_part_ue6: { type: integer } sorte: { type: string, enum: [marche, administree] } motif: { type: string } Analyse: type: object required: [analyse, document, outillage, version_outillage, produite_le, examinee, gestes] properties: analyse: { type: string } document: { type: string } outillage: { type: string, description: Qui a extrait — l'analyseur est un adaptateur versionné, jamais une autorité. } version_outillage: { type: string } produite_le: { type: string, format: date-time } examinee: { type: boolean, description: Vrai quand chaque geste a son sort — l'examen partiel est visible. } gestes: type: array items: { $ref: '#/components/schemas/GestePropose' } GestePropose: type: object required: [numero, geste_vise, rapprochement, donnees_extraites, localisation] properties: numero: { type: integer, minimum: 1 } geste_vise: type: string enum: [referencer_un_instrument, referencer_un_vehicule, etablir_une_caracteristique, reetablir_une_caracteristique, poser_une_restriction, lever_une_restriction, etablir_la_regle_de_valorisation, nouer_une_relation, affecter_un_role, annoncer_un_evenement] description: >- Exactement l'un des gestes du composant — jamais un geste inventé, JAMAIS une publication de valeur (un document n'établit pas une VL). rapprochement: type: string enum: [nouveau, ecart, conforme] description: Le conforme ne produit pas de geste applicable — il constate, et vaut confirmation datée. donnees_extraites: { type: object, description: Aux types du modèle — l'extraction qui ne sait pas produire le type ne propose pas. } localisation: type: object description: Ce que le valideur lira en face du geste. properties: page: { type: integer } section: { type: string } extrait: { type: string } indice_confiance_pb: type: integer minimum: 0 maximum: 10000 description: L'indice de confiance de l'extraction, en points de base — le tri à l'examen, jamais un seuil d'application automatique. sort: type: string enum: [a_examiner, applique, amende_puis_applique, ecarte] motif: { type: string, description: Le motif de l'écart, quand le geste est écarté. } valideur: { type: string } ObjetDeDemande: type: string enum: [referencement, transition_de_cycle, caracteristique, restriction, regle_de_valorisation, relation, role_d_intervenant, version_de_calendrier, exception_de_calendrier, intervenant] DemandeDeValidation: type: object required: [demande, objet, cible, ce_qui_change, prepare_par, soumise_le, anciennete_jours, etat, gestes] properties: demande: { type: string } objet: { $ref: '#/components/schemas/ObjetDeDemande' } cible: type: object required: [type, reference] properties: type: { type: string, enum: [instrument, vehicule, calendrier, intervenant] } reference: { type: string } libelle: { type: string } ce_qui_change: { type: string, description: Le résumé lisible de l'établissement demandé. } source: { type: string, description: La provenance de l'établissement (document, saisie, flux). } prepare_par: { type: string } soumise_le: { type: string, format: date-time } anciennete_jours: type: integer description: L'ancienneté SERVIE — le consommateur ne la calcule jamais. effet: type: object description: L'effet prévu — ou déjà en vigueur pour une urgence (validation a posteriori). properties: prevu_le: { type: string, format: date } deja_en_vigueur: { type: boolean } echeance_de_revue: { type: string, format: date } etat: { type: string, enum: [en_attente, validee, refusee] } refus_de_validation: type: string description: >- Pourquoi le LECTEUR ne peut pas valider cette demande (« préparée par vous — un autre valideur est requis ») — absent quand elle lui est recevable. Le verdict est servi, jamais déduit. gestes: type: array description: Les gestes ouverts au lecteur — servis, jamais déduits de l'état. items: { type: string, enum: [valider, refuser, lever] } ObjetDAnomalie: type: object required: [type, reference] properties: type: { type: string, enum: [instrument, calendrier, document] } reference: { type: string } Anomalie: type: object required: [anomalie, gravite, regle, detail, objet, relevee_le, par_un_agent, etat, gestes] properties: anomalie: { type: string } gravite: { type: string, enum: [elevee, moyenne, faible] } regle: type: string description: >- La règle de contrôle, nommée et versionnée (valeur attendue non reçue, conflit de sources, calendrier expirant sans successeur, document attendu non reçu, nourricier valorisé avant son maître…). detail: { type: string } objet: { $ref: '#/components/schemas/ObjetDAnomalie' } relevee_le: { type: string, format: date-time } relevee_par: { type: string, description: Le contrôle, l'agent ou le composant signaleur. } par_un_agent: { type: boolean, description: Vrai quand un agent l'a relevée — la provenance se voit jusqu'au bout de la chaîne. } etat: { type: string, enum: [ouverte, traitee, ecartee] } gestes: type: array items: { type: string, enum: [traiter, ecarter] } Erreur: type: object required: [motif] properties: motif: { type: string, description: Le motif, qui nomme le champ, l'identifiant ou l'invariant en cause. }