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