openapi: 3.0.0
paths:
  /catalog/operations:
    post:
      operationId: CatalogOperationController_syncCatalogOperations
      summary: Synchronisation des données opération/chantier/projet
      description: >-
        La création des opérations est initiée par les utilisateurs depuis la
        plateforme Batis. Après avoir sélectionné un groupe (agence), ils se
        voient proposer une liste d’opérations disponibles dans le catalogue.
        Lorsqu’une opération est sélectionnée, certains champs sont préremplis
        automatiquement en fonction des données récupérées.


        ⚠️ Attention : les mises à jour du catalogue n’ont aucun effet
        rétroactif sur les opérations déjà créées dans la plateforme.
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: "#/components/schemas/CatalogOperationInfoDto"
      responses:
        "200":
          description: Nombre d'opérations synchronisées.
          content:
            application/json:
              schema:
                type: integer
                example: 1
        "400":
          description: Données invalides
        "401":
          description: Authentification manquante ou invalide
        "429":
          description: Trop de requêtes effectuées. 10 requêtes maximum autorisées par
            minutes
      tags: &a1
        - Catalogue
      security: &a2
        - OAuth2ClientCredentials: []
    get:
      operationId: CatalogOperationController_listCatalogOperations
      summary: Liste des opérations disponibles
      description: >-
        Retourne la liste des opérations (chantier / projet) enregistrées dans
        le catalogue et accessibles.


        Ces opérations sont proposées aux utilisateurs dans Batis lors de la
        création d'une opération sur la plateforme, afin de préremplir certains
        champs.
      parameters:
        - name: updatedSince
          required: false
          in: query
          description: Retourne uniquement les opérations créées ou modifiées depuis cette
            date (ISO 8601 UTC).
          schema:
            type: string
      responses:
        "200":
          description: ""
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/CatalogOperationInfoDto"
        "400":
          description: Données invalides
        "401":
          description: Authentification manquante ou invalide
        "429":
          description: Trop de requêtes effectuées. 10 requêtes maximum autorisées par
            minutes
      tags: *a1
      security: *a2
  /catalog/enterprises:
    post:
      operationId: CatalogEnterpriseController_syncCatalogEnterprises
      summary: Synchronisation des données fournisseurs
      description: >-
        Les fournisseurs sont initialement créés manuellement par les
        utilisateurs sur la plateforme Batis.

        Cette API permet ensuite d’enrichir les fiches fournisseurs à partir des
        données référentielles issues des systèmes tiers, via le catalogue.


        Les informations transmises via cette route — comme le code fournisseur
        du système d'information tiers, les conditions de paiement ou les
        blocages — sont synchronisées
        avec la plateforme et visibles par les utilisateurs Batis.

        Toute mise à jour des statuts de blocage dans le catalogue est donc
        répercutée automatiquement dans Batis.
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: "#/components/schemas/CatalogEnterpriseInfoDto"
      responses:
        "200":
          description: Nombre d'entreprises synchronisées.
          content:
            application/json:
              schema:
                type: integer
                example: 1
        "400":
          description: Données invalides
        "401":
          description: Authentification manquante ou invalide
        "429":
          description: Trop de requêtes effectuées. 10 requêtes maximum autorisées par
            minutes
      tags: &a3
        - Catalogue
      security: &a4
        - OAuth2ClientCredentials: []
    get:
      operationId: CatalogEnterpriseController_listCatalogEnterprises
      summary: Liste des fournisseurs synchronisés
      description: Retourne la liste des fournisseurs enregistrés dans le catalogue.
      parameters:
        - name: updatedSince
          required: false
          in: query
          description: Retourne uniquement les entreprises créées ou modifiées depuis
            cette date (ISO 8601 UTC).
          schema:
            type: string
      responses:
        "200":
          description: ""
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/CatalogEnterpriseInfoDto"
        "400":
          description: Données invalides
        "401":
          description: Authentification manquante ou invalide
        "429":
          description: Trop de requêtes effectuées. 10 requêtes maximum autorisées par
            minutes
      tags: *a3
      security: *a4
info:
  title: BATIS Integration API — Catalogue
  description: >-
    API catalogue de Batis.


    Le catalogue permet de synchroniser les référentiels du système
    d'information tiers (opérations et entreprises)

    avec Batis, et de les relire pour une synchronisation incrémentale.


    ## Authentification


    L'API utilise OAuth2 avec le flow `client_credentials`.

    Exemple :

    `Authorization: Bearer ACCESS_TOKEN`


    ## Synchronisation incrémentale


    Les endpoints de liste exposent un filtre `updatedSince` (date ISO 8601 UTC)
    qui retourne

    uniquement les ressources créées ou modifiées depuis la date fournie. Chaque
    ressource expose

    un champ `updatedAt` afin de conserver la dernière date de synchronisation
    réussie.
  version: "0.3"
  contact: {}
tags: []
servers:
  - url: https://integration.batis.io/api/v1
components:
  securitySchemes:
    OAuth2ClientCredentials:
      type: oauth2
      flows:
        clientCredentials:
          tokenUrl: https://integration.batis.io/api/v1/oauth/token
          scopes:
            integration:read: Lecture des ressources d'intégration.
  schemas:
    ProrataSettingsDto:
      type: object
      properties:
        amount:
          type: number
          description: Montant fixe du prorata
        percentage:
          type: number
          description: Pourcentage du prorata
        enabled:
          type: boolean
          description: Prorata activé ou non
        mode:
          type: string
          description: Mode de calcul du prorata
      required:
        - enabled
        - mode
    CatalogOperationInfoDto:
      type: object
      properties:
        code:
          type: string
          description: Code de l'opération dans Batis
        title:
          type: string
          description: Titre de l'opération
        groupCode:
          type: string
          description: Code du groupe Batis
        bonneFinPercentage:
          type: number
          description: Retenue pour bonne fin (%)
        rgPercentage:
          type: number
          description: Retenue de garantie (%)
        parfaitAchevementPercentage:
          type: number
          description: Retenue pour parfait achèvement (%)
        street:
          type: string
          description: Adresse de l’opération
        zipcode:
          type: string
          description: Code postal
        city:
          type: string
          description: Ville de l’opération
        cspsEnabled:
          type: boolean
          description: Fonctionnalité CSPS activée ou non
        description:
          type: string
          description: Description libre du chantier
        dictEnabled:
          type: boolean
          description: Fonctionnalité DICT activée ou non
        duration:
          type: string
          description: Durée du marché
        insertionHoursEnabled:
          type: boolean
          description: Heures d’insertion activées ou non
        marketDate:
          format: date-time
          type: string
          description: Date de création du marché (ISO)
        marketNumber:
          type: string
          description: Numéro du marché
        marketType:
          type: string
          enum:
            - private
            - public
          description: Type de marché  public ou privé
        moaSiret:
          type: string
          description: SIRET du maître d’ouvrage (MOA)
        moeSiret:
          type: string
          description: SIRET du maître d’œuvre (MOE)
        prorataSettings:
          description: Paramètres de prorata
          allOf:
            - $ref: "#/components/schemas/ProrataSettingsDto"
        responsibleUserCode:
          type: string
          description: Code de l’utilisateur responsable (OpenID)
        responsibleUserEmail:
          type: string
          description: Email de l’utilisateur responsable
        startingAt:
          format: date-time
          type: string
          description: Date de démarrage du marché (ISO)
        updatedAt:
          format: date-time
          type: string
          description: Date de dernière modification de l'opération dans le catalogue
            Batis (ISO)
      required:
        - code
        - title
        - groupCode
        - updatedAt
    CatalogEnterpriseInfoDto:
      type: object
      properties:
        accountingCode:
          type: string
          description: Identifiant fournisseur dans le système d'information tiers
        identifier:
          type: string
          description: Numéro d'identification (SIRET si pays = FR)
        countryCode:
          type: string
          description: Code pays (ISO 3166-1 alpha-2)
        blockedReason:
          type: string
          description: Raison du blocage éventuel
        isBlocked:
          type: boolean
          description: Indique si l’entreprise est bloquée
        paymentConditionCode:
          type: string
          description: Code condition de paiement (issue d'un mapping statique code /
            condition de paiement)
        activityCodeList:
          description: Liste de code d'activité (issue d'un mapping statique code /
            activité ) [en cours de dev]
          type: array
          items:
            type: string
        updatedAt:
          format: date-time
          type: string
          description: Date de dernière modification de l'entreprise dans le catalogue
            Batis (ISO)
      required:
        - accountingCode
        - identifier
        - countryCode
        - updatedAt
security:
  - OAuth2ClientCredentials: []
