administration-des-calendriers
Interface synchrone (OpenAPI) — version 0.1.0. Producteur : instruments. Consommateurs déclarés : backoffice, alimentation-documentaire.
Les portes d’écriture des calendriers. Un établissement crée une demande de validation (contrat administration-du-referentiel — quatre yeux, valideur distinct du préparateur) ; l’exception d’urgence prend effet immédiatement, sa demande se valide a posteriori avec échéance de revue. La publication d’une version validée recalcule les horizons et publie ses impacts (contrat evenement-de-valorisation-prevue), sans réécrire une décision passée. Tout ou rien : un rejet (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 des calendriers version: 0.1.0 x-ruptures: [] summary: >- Référencer un calendrier, préparer une version immuable, saisir une exception — d'urgence au besoin —, mesurer l'impact avant publication. description: >- Les portes d'écriture des calendriers. Un établissement crée une demande de validation (contrat administration-du-referentiel — quatre yeux, valideur distinct du préparateur) ; l'exception d'urgence prend effet immédiatement, sa demande se valide a posteriori avec échéance de revue. La publication d'une version validée recalcule les horizons et publie ses impacts (contrat evenement-de-valorisation-prevue), sans réécrire une décision passée. Tout ou rien : un rejet (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-documentairepaths: /calendriers: post: operationId: referencerUnCalendrier summary: Référencer un calendrier — l'identité durable, sans version. security: - authentification: [instruments:administration] requestBody: required: true content: application/json: schema: type: object required: [nom, type, fuseau] properties: nom: { type: string, minLength: 1 } type: type: string enum: [place_de_negociation, jours_feries, contractuel_de_fonds, fonds_maitre, reglement_livraison, paiement, fenetre_liquidite_non_cote, operationnel_de_service, interets_ccb, remboursement_ccb] description: Des natures non substituables entre elles. fuseau: { type: string, minLength: 1, description: Le fuseau IANA de référence. } perimetre: { type: string } autorite: { type: string, description: L'autorité responsable des jours et des exceptions. } 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/horsFamille' } '422': { $ref: '#/components/responses/rejete' } /calendriers/{calendrier}/versions: post: operationId: preparerUneVersion summary: Préparer une version — immuable une fois publiée ; la validation la publie. security: - authentification: [instruments:administration] parameters: - $ref: '#/components/parameters/calendrier' requestBody: required: true content: application/json: schema: type: object required: [valide_du, regle_jour_ouvre] properties: valide_du: { type: string, format: date } valide_au: { type: string, format: date, description: La borne de fin, exclue — absente si la validité court. } regle_jour_ouvre: type: object required: [jours_ouvres] properties: jours_ouvres: type: array minItems: 1 items: { type: string, enum: [lundi, mardi, mercredi, jeudi, vendredi, samedi, dimanche] } jours_feries_reference: { type: string, description: Le calendrier de jours fériés référencé, le cas échéant. } politique_demi_seance: { type: string } preuves: type: array items: { type: string } 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/horsFamille' } '404': { $ref: '#/components/responses/inconnu' } '422': { $ref: '#/components/responses/rejete' } /calendriers/{calendrier}/exceptions: post: operationId: saisirUneException summary: Saisir une exception — sourcée, datée de sa connaissance ; l'urgence s'applique immédiatement. description: >- Une exception ordinaire crée une demande de validation. Une exception d'URGENCE (fermeture décidée en séance) prend effet immédiatement, recalcule les occurrences futures, publie ses impacts — les ordres déjà affectés se signalent chez leurs domaines par les faits publiés — et ouvre la demande a posteriori, avec échéance de revue obligatoire. security: - authentification: [instruments:administration] parameters: - $ref: '#/components/parameters/calendrier' requestBody: required: true content: application/json: schema: type: object required: [date, nature, source, connue_le] properties: date: { type: string, format: date, description: La date visée. } nature: type: string enum: [fermeture, ouverture_exceptionnelle, demi_seance, changement_heure_limite, statut_incertain] heure_limite_modifiee: { type: string, pattern: '^([01][0-9]|2[0-3]):[0-5][0-9]$' } motif: { type: string } source: { type: string, minLength: 1 } connue_le: { type: string, format: date, description: La date de connaissance — distincte de la date visée. } urgence: { type: boolean, default: false } echeance_de_revue: { type: string, format: date, description: Obligatoire quand urgence est vrai, ou pour un statut incertain. } responses: '201': description: URGENCE — l'exception est en vigueur, les impacts sont publiés ; la demande a posteriori est créée. content: application/json: schema: type: object required: [exception, demande] properties: exception: { type: string } demande: { type: string } echeance_de_revue: { type: string, format: date } '202': { $ref: '#/components/responses/demandeCreee' } '400': { $ref: '#/components/responses/irrecevable' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamille' } '404': { $ref: '#/components/responses/inconnu' } '422': { $ref: '#/components/responses/rejete' } /calendriers/{calendrier}/analyses-d-impact: post: operationId: mesurerLImpact summary: Mesurer l'impact d'une version en préparation — une lecture calculée, rien n'est publié. security: - authentification: [instruments:administration] parameters: - $ref: '#/components/parameters/calendrier' requestBody: required: true content: application/json: schema: type: object required: [version] properties: version: { type: string, description: La version en préparation à mesurer. } horizon_jours: { type: integer, minimum: 1, maximum: 730, default: 90 } responses: '200': description: L'impact mesuré sur l'horizon. content: application/json: schema: type: object required: [version, fonds_touches, occurrences] properties: version: { type: string } fonds_touches: type: array items: type: object required: [instrument, directe] properties: instrument: { type: string } libelle: { type: string } directe: { type: boolean, description: Faux quand l'impact passe par le fonds maître. } occurrences: type: object properties: ajoutees: { type: integer } supprimees: { type: integer } reportees: { type: integer } heures_limites_deplacees: { type: integer } '400': { $ref: '#/components/responses/irrecevable' } '401': { $ref: '#/components/responses/sansIdentite' } '403': { $ref: '#/components/responses/horsFamille' } '404': { $ref: '#/components/responses/inconnu' } '422': { $ref: '#/components/responses/rejete' }components: parameters: calendrier: name: calendrier in: path required: true schema: { type: string, minLength: 1 } securitySchemes: authentification: type: http scheme: bearer description: >- Tout appel est authentifié (401) et autorisé par famille d'accès (403) — la famille en portée, sous la forme instruments:famille. responses: demandeCreee: description: La demande de validation est créée — l'effet attend sa validation (contrat administration-du-referentiel). content: application/json: schema: type: object required: [demande, objet] properties: demande: { type: string } objet: { type: string, enum: [referencement, version_de_calendrier, exception_de_calendrier] } cible: { type: string } irrecevable: description: La demande est irrecevable — le motif nomme le champ. content: application/json: schema: { $ref: '#/components/schemas/Erreur' } sansIdentite: description: Aucune identité présentée. horsFamille: description: L'identité présentée n'a pas la famille d'accès instruments:administration. inconnu: description: Le calendrier — ou la version — est inconnu de ce tenant. content: application/json: schema: { $ref: '#/components/schemas/Erreur' } rejete: description: >- Le domaine refuse (version publiée intouchable, chevauchement de validité, heure sans fuseau, urgence sans échéance de revue…) — rien n'est retenu ; 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: Obligatoire quand la source est un document. } Erreur: type: object required: [motif] properties: motif: { type: string }