Aller au contenu

resolutions-metier

Interface synchrone (OpenAPI) — version 0.1.0. Producteur : entreprise. Consommateurs déclarés : operations, tenue-de-compte.

Sept résolutions synchrones, sans effet métier (sauf conservation éventuelle d’une décision expliquée). INDETERMINE est un résultat explicite : il ne devient jamais silencieusement éligible ou non éligible, et une dépendance indisponible ne vaut jamais réponse négative. La date métier sélectionne la règle.

openapi: 3.1.0
info:
title: entreprise — les résolutions métier
version: 0.1.0
summary: >-
Rendre une décision expliquée — applicabilité, éligibilité, abondement, répartition,
autorisation, offre, tarif — à une date, avec les faits et versions utilisés.
description: >-
Sept résolutions synchrones, sans effet métier (sauf conservation éventuelle d'une
décision expliquée). INDETERMINE est un résultat explicite : il ne devient jamais
silencieusement éligible ou non éligible, et une dépendance indisponible ne vaut
jamais réponse négative. La date métier sélectionne la règle.
x-producteurs:
- entreprise
x-consommateurs:
- composant: operations
statut: pressenti — éligibilité, abondement, répartition, version applicable
- composant: tenue-de-compte
statut: pressenti — tarif applicable
x-ruptures: [] # première version publiée — aucune rupture
paths:
/entreprise/v1/resolutions/version:
post:
operationId: resoudreLaVersionApplicable
summary: >-
La version applicable d'un objet versionné à une date d'effet — identifiant
stable, numéro, période, empreinte, version remplacée éventuelle.
security:
- authentification: [entreprise:resolution]
parameters:
- $ref: '#/components/parameters/tenant'
- $ref: '#/components/parameters/correlation'
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [objet_type, objet_id, date_effet]
properties:
objet_type:
type: string
description: >-
Objets acceptés : entité, rattachement de dossier, périmètre, acte,
dispositif, jeu d'abondement, formule collective, règle de
répartition, offre, panier, stratégie, convention, tarif.
objet_id:
type: string
date_effet:
type: string
format: date
connu_a:
type: string
format: date-time
description: Temps de connaissance — réservé aux lectures d'audit.
responses:
'200':
description: >-
La version applicable — par exemple REP-2027-V2 pour le 15 février 2027,
même si une V3 est préparée pour juillet.
content:
application/json:
schema:
$ref: '#/components/schemas/VersionApplicable'
'401': { $ref: '#/components/responses/nonAuthentifie' }
'403': { $ref: '#/components/responses/nonAutorise' }
'404': { $ref: '#/components/responses/introuvable' }
'422': { $ref: '#/components/responses/inapplicable' }
'503': { $ref: '#/components/responses/dependanceIndisponible' }
/entreprise/v1/resolutions/repartition:
post:
operationId: previsualiserUneRepartition
summary: >-
Prévisualiser une répartition — contrôles de complétude, composantes applicables,
plafonds, arrondis et données manquantes ; jamais les quotes-parts individuelles.
security:
- authentification: [entreprise:resolution]
parameters:
- $ref: '#/components/parameters/tenant'
- $ref: '#/components/parameters/correlation'
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [version_repartition_id, enveloppe_id, population_id]
properties:
version_repartition_id:
type: string
enveloppe_id:
type: string
population_id:
type: string
references_assiettes:
type: array
description: Les références des assiettes à contrôler.
items:
type: string
responses:
'200':
description: >-
La prévisualisation — INDETERMINE si une donnée manque (par exemple le
salaire de référence d'un lien retenu dans la composante SALAIRE).
content:
application/json:
schema:
$ref: '#/components/schemas/Resolution'
'401': { $ref: '#/components/responses/nonAuthentifie' }
'403': { $ref: '#/components/responses/nonAutorise' }
'404': { $ref: '#/components/responses/introuvable' }
'422': { $ref: '#/components/responses/inapplicable' }
'503': { $ref: '#/components/responses/dependanceIndisponible' }
/entreprise/v1/resolutions/autorisation-correspondant:
post:
operationId: resoudreLAutorisationDUnCorrespondant
summary: >-
L'autorisation métier d'un correspondant pour un acte — affectation, mandat,
délégation, révocation et séparation des tâches vérifiés.
security:
- authentification: [entreprise:resolution]
parameters:
- $ref: '#/components/parameters/tenant'
- $ref: '#/components/parameters/correlation'
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [correspondant_id, acte, date_effet]
properties:
correspondant_id:
type: string
acte:
type: string
description: L'acte demandé — code métier complet.
organisation_id:
type: string
perimetre_id:
type: string
date_effet:
type: string
format: date
responses:
'200':
description: AUTORISE, REFUSE ou INDETERMINE, avec mandats et motifs.
content:
application/json:
schema:
$ref: '#/components/schemas/Resolution'
'401': { $ref: '#/components/responses/nonAuthentifie' }
'403': { $ref: '#/components/responses/nonAutorise' }
'404': { $ref: '#/components/responses/introuvable' }
'422': { $ref: '#/components/responses/inapplicable' }
'503': { $ref: '#/components/responses/dependanceIndisponible' }
/entreprise/v1/resolutions/eligibilite:
post:
operationId: resoudreLEligibilite
summary: >-
L'éligibilité d'un lien d'emploi à un dispositif — emploi, ancienneté, périmètre,
population, mise à disposition et version du dispositif combinés.
security:
- authentification: [entreprise:resolution]
parameters:
- $ref: '#/components/parameters/tenant'
- $ref: '#/components/parameters/correlation'
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [lien_emploi_id, dispositif_id, date_effet]
properties:
lien_emploi_id:
type: string
dispositif_id:
type: string
date_effet:
type: string
format: date
responses:
'200':
description: ELIGIBLE, INELIGIBLE ou INDETERMINE, motifs et faits cités.
content:
application/json:
schema:
$ref: '#/components/schemas/Resolution'
'401': { $ref: '#/components/responses/nonAuthentifie' }
'403': { $ref: '#/components/responses/nonAutorise' }
'404': { $ref: '#/components/responses/introuvable' }
'422': { $ref: '#/components/responses/inapplicable' }
'503': { $ref: '#/components/responses/dependanceIndisponible' }
/entreprise/v1/resolutions/abondement:
post:
operationId: resoudreLAbondementABlanc
summary: >-
L'abondement à blanc — règle retenue, règles écartées, calcul par tranche et
écrêtements ; sans les consommations déjà exécutées, détenues par Opérations.
security:
- authentification: [entreprise:resolution]
parameters:
- $ref: '#/components/parameters/tenant'
- $ref: '#/components/parameters/correlation'
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [lien_emploi_id, dispositif_id, origine_versement, montant, date_effet]
properties:
lien_emploi_id:
type: string
dispositif_id:
type: string
origine_versement:
type: string
description: L'origine du versement — code métier complet.
support_id:
type: string
montant:
type: number
date_effet:
type: string
format: date
responses:
'200':
description: >-
Le calcul expliqué — par exemple 500 + 150 = 650 euros pour un versement de
800 euros sous la règle « 100 % sur les 500 premiers, 50 % sur les 500
suivants », avant consommations antérieures.
content:
application/json:
schema:
$ref: '#/components/schemas/Resolution'
'401': { $ref: '#/components/responses/nonAuthentifie' }
'403': { $ref: '#/components/responses/nonAutorise' }
'404': { $ref: '#/components/responses/introuvable' }
'422': { $ref: '#/components/responses/inapplicable' }
'503': { $ref: '#/components/responses/dependanceIndisponible' }
/entreprise/v1/resolutions/offre:
post:
operationId: resoudreLOffreApplicable
summary: >-
L'offre applicable — supports, opérations permises, modes de gestion et défaut
conventionnel ; aucun choix individuel dans la réponse.
security:
- authentification: [entreprise:resolution]
parameters:
- $ref: '#/components/parameters/tenant'
- $ref: '#/components/parameters/correlation'
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [dispositif_id, type_flux, date_effet]
properties:
dispositif_id:
type: string
lien_emploi_id:
type: string
type_flux:
type: string
description: Le type de flux — code métier complet.
date_effet:
type: string
format: date
responses:
'200':
description: Les supports, opérations permises, modes de gestion et défaut.
content:
application/json:
schema:
$ref: '#/components/schemas/Resolution'
'401': { $ref: '#/components/responses/nonAuthentifie' }
'403': { $ref: '#/components/responses/nonAutorise' }
'404': { $ref: '#/components/responses/introuvable' }
'422': { $ref: '#/components/responses/inapplicable' }
'503': { $ref: '#/components/responses/dependanceIndisponible' }
/entreprise/v1/resolutions/tarif:
post:
operationId: resoudreLeTarifApplicable
summary: >-
Le tarif applicable — payeur, formule, montant ou paramètres, version de tarif et
faits d'emploi utilisés, à la date du fait tarifaire.
security:
- authentification: [entreprise:resolution]
parameters:
- $ref: '#/components/parameters/tenant'
- $ref: '#/components/parameters/correlation'
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [convention_id, prestation, date_fait]
properties:
convention_id:
type: string
prestation:
type: string
lien_emploi_id:
type: string
date_fait:
type: string
format: date
description: >-
La date du fait tarifaire — pour un fait du 15 décembre la résolution
cite VT-1, pour un fait du 10 février VT-2 et le lien d'emploi clos.
responses:
'200':
description: Le payeur, la formule, la version de tarif et les faits utilisés.
content:
application/json:
schema:
$ref: '#/components/schemas/Resolution'
'401': { $ref: '#/components/responses/nonAuthentifie' }
'403': { $ref: '#/components/responses/nonAutorise' }
'404': { $ref: '#/components/responses/introuvable' }
'422': { $ref: '#/components/responses/inapplicable' }
'503': { $ref: '#/components/responses/dependanceIndisponible' }
components:
parameters:
tenant:
name: X-Tenant-Id
in: header
required: true
description: >-
Le teneur de compte — injecté et signé par la passerelle ; le corps ne choisit
jamais le tenant. Une ressource d'un autre tenant est traitée comme inexistante.
schema:
type: string
minLength: 1
correlation:
name: X-Correlation-Id
in: header
required: true
description: La corrélation de bout en bout — reprise dans toute réponse.
schema:
type: string
minLength: 1
securitySchemes:
authentification:
type: http
scheme: bearer
description: >-
L'exigence : 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
entreprise:famille. Ce contrat n'ouvre que
entreprise:resolution ; le grain fin (périmètre d'organisation, mandat métier)
s'évalue à l'exécution. Le mécanisme est OIDC ; sa déclinaison relève de
l'assemblage.
responses:
nonAuthentifie:
description: Aucune identité présentée (401).
nonAutorise:
description: >-
L'identité présentée n'a pas la famille d'accès entreprise:resolution (403). Les
403 croisés entre familles sont prouvés par les tests d'assemblage.
introuvable:
description: >-
Ressource absente ou invisible — y compris une ressource d'un autre tenant
(le régime de la muraille : 404, jamais 403).
content:
application/json:
schema:
$ref: '#/components/schemas/Erreur'
inapplicable:
description: Commande comprise mais impossible au regard du métier (422).
content:
application/json:
schema:
$ref: '#/components/schemas/Erreur'
dependanceIndisponible:
description: >-
Dépendance indisponible, sans effet partiel (503) — jamais convertie en réponse
négative (ENT-DEC-002).
content:
application/json:
schema:
$ref: '#/components/schemas/Erreur'
schemas:
Resolution:
type: object
description: >-
La convention de réponse de toute résolution — le résultat, ses motifs, la date
d'effet, l'instant de calcul, les faits et versions retenus, les données
manquantes en cas d'indétermination.
required: [resultat, motifs, date_effet, calcule_a]
properties:
resultat:
type: string
description: >-
Le résultat stable — par exemple ELIGIBLE, INELIGIBLE, AUTORISE, REFUSE,
INDETERMINE. INDETERMINE reste un résultat explicite (ENT-DEC-003).
motifs:
type: array
items:
type: string
description: Les motifs stables — par exemple LIEN_ACTIF, ANCIENNETE_ATTEINTE.
date_effet:
type: string
format: date
calcule_a:
type: string
format: date-time
faits:
type: array
description: Les faits retenus, cités par type, identifiant et version.
items:
$ref: '#/components/schemas/ReferenceVersionnee'
versions:
type: array
description: Les versions de règles retenues.
items:
$ref: '#/components/schemas/ReferenceVersionnee'
donnees_manquantes:
type: array
items:
type: string
description: Ce qui manque, en cas d'indétermination.
details:
type: object
description: >-
Le détail propre à la résolution — règle retenue et règles écartées, calcul
par tranche et écrêtements (abondement), composantes et contrôles
(répartition), supports et modes (offre), payeur et formule (tarif).
decision_id:
type: string
description: Présent si le résultat est conservé en décision expliquée.
VersionApplicable:
type: object
description: La version applicable résolue.
required: [objet_type, objet_id, version_id, numero, date_debut_effet]
properties:
objet_type:
type: string
objet_id:
type: string
version_id:
type: string
description: L'identifiant stable de la version.
numero:
type: integer
date_debut_effet:
type: string
format: date
date_fin_effet:
type: string
format: date
empreinte:
type: string
remplace_version:
type: integer
description: La version remplacée éventuelle.
ReferenceVersionnee:
type: object
required: [type, id]
properties:
type:
type: string
description: Par exemple LIEN_EMPLOI, DISPOSITIF, CONVENTION.
id:
type: string
version:
type: integer
Erreur:
type: object
required: [code, message, correlation_id]
properties:
code:
type: string
description: Par exemple ENT_VERSION_CONFLICT.
message:
type: string
correlation_id:
type: string
details:
type: array
items:
type: object
properties:
champ:
type: string
motif:
type: string