openapi: 3.0.1
info:
  title: NumEcoEval - API données d'entrées
  version: v0
  license:
    name: Apache 2.0
  description: |
    API permettant l'import de données dans le système NumEcoEval. \
    L'import de données seul ne permet pas d'importer et impose de soumettre la demande de calcul après l'import des données.
tags:
  - name: Imports
    description: Endpoints liés à l'import de données dans NumEcoEval
  - name: Calculs
    description: Endpoints liés au déclenchement de calcul dans NumEcoEval
paths:
  /entrees/calculs/statut:
    get:
      summary: Endpoint de récupération du statut des calculs.
      description: |
        Endpoint de récupération du statut des calculs.
      tags:
        - Calculs
      operationId: statutPourCalcul
      parameters:
        - in: query
          name: nomLot
          schema:
            type: string
          required: true
          description: Nom lot
        - in: query
          name: nomOrganisation
          schema:
            type: string
          required: true
          description: Nom Organisation
      responses:
        "500":
          description: Erreur interne du service
          content:
            'application/json':
              schema:
                $ref: "#/components/schemas/ErreurRest"
        "400":
          description: Contenu de la soumission incorrecte
          content:
            'application/json':
              schema:
                $ref: "#/components/schemas/ErreurRest"
        "200":
          description: Rapport d'import des données d'entrées
          content:
            'application/json':
              schema:
                $ref: "#/components/schemas/StatutCalculRest"
  /entrees/calculs/soumission:
    post:
      summary: Endpoint de soumission de données d'entrées pour lancer les calculs dans NumEcoEval.
      description: |
        Endpoint de soumission de données d'entrées pour lancer les calculs dans NumEcoEval.
      tags:
        - Calculs
      operationId: soumissionPourCalcul
      parameters:
        - in: query
          name: mode
          schema:
            $ref: "#/components/schemas/ModeRest"
          required: false
          description: Mode de traitement, SYNC ou ASYNC
      requestBody:
        required: true
        content:
          'application/json':
            schema:
              $ref: "#/components/schemas/DemandeCalculRest"
      responses:
        "500":
          description: Erreur interne du service
          content:
            'application/json':
              schema:
                $ref: "#/components/schemas/ErreurRest"
        "400":
          description: Contenu de la soumission incorrecte
          content:
            'application/json':
              schema:
                $ref: "#/components/schemas/ErreurRest"
        "200":
          description: Rapport d'import des données d'entrées
          content:
            'application/json':
              schema:
                $ref: "#/components/schemas/RapportDemandeCalculRest"
  /entrees/calculs/rejeu:
    post:
      summary: Endpoint de rejeu des calculs à partir des données d'entrées pour relancer les calculs dans NumEcoEval.
      description: |
        Endpoint de rejeu des calculs à partir des données d'entrées pour relancer les calculs dans NumEcoEval.
      tags:
        - Calculs
      operationId: rejeuCalcul
      requestBody:
        required: true
        content:
          'application/json':
            schema:
              $ref: "#/components/schemas/DemandeCalculRest"
      responses:
        "500":
          description: Erreur interne du service
          content:
            'application/json':
              schema:
                $ref: "#/components/schemas/ErreurRest"
        "400":
          description: Contenu de la soumission incorrecte
          content:
            'application/json':
              schema:
                $ref: "#/components/schemas/ErreurRest"
        "200":
          description: Rapport d'import des données d'entrées
          content:
            'application/json':
              schema:
                $ref: "#/components/schemas/RapportDemandeCalculRest"
  /entrees/json:
    post:
      tags:
        - Imports
      summary: Soumission de données d'entrées au format CSV pour calcul d'indicateurs
      description: |
        Endpoint de soumission des données d'entrées au format JSON pour le calcul d'indicateurs. \
        La taille totale de tout le contenu JSON ne doit pas dépasser 10 Mo.
      operationId: importJson
      requestBody:
        required: true
        content:
          'application/json':
            schema:
              $ref: "#/components/schemas/DonneesEntreeRest"
      responses:
        "500":
          description: Erreur interne du service
          content:
            'application/json':
              schema:
                $ref: "#/components/schemas/ErreurRest"
        "400":
          description: Contenu de la soumission incorrecte
          content:
            'application/json':
              schema:
                $ref: "#/components/schemas/ErreurRest"
        "200":
          description: Rapport d'import des données d'entrées
          content:
            'application/json':
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/RapportImportRest"
  /entrees/csv:
    post:
      tags:
        - Imports
      summary: Soumission de données d'entrées au format CSV pour calcul d'indicateurs
      description: |
        Endpoint de soumission des données d'entrées au format CSV pour le calcul d'indicateurs.  
        
        La taille totale de tous les fichiers ne doit pas dépasser 10 Mo. <br/>
        
        Le séparateur des fichiers CSV est le point-virgule (;).  <br/>
        
        Les colonnes facultatives sont notées entre parenthèses, toutes les autres sont obligatoires !  <br/>
        
        Le Header du CSV des data centers est : nomCourtDatacenter;nomLongDatacenter;pue;localisation;(nomEntite).  <br/> 
        
        Le Header du CSV des équipements physiques est : nomEquipementPhysique,modele;quantite;nomCourtDatacenter;dateAchat;dateRetrait;type;statut;paysDUtilisation;consoElecAnnuelle;utilisateur;(nomSourceDonnee);(nomEntite);nbCoeur;nbJourUtiliseAn;goTelecharge;(modeUtilisation);(tauxUtilisation).  <br/>
        
        Le Header du CSV des équipements virtuels est : nomEquipementVirtuel;nomEquipementPhysique;(nomSourceDonneeEquipementPhysique);(cleRepartition);vCPU;cluster;(consoElecAnnuelle);(typeEqv);(capaciteStockage);(nomEntite).  <br/>
        
        Le Header du CSV des application est : nomApplication;typeEnvironnement;(nomEquipementVirtuel);(nomSourceEquipementVirtuel);domaine;sousDomaine;(nomEntite);nomEquipementPhysique;(nomSourceDonnee).  <br/>
        
        Le Header du CSV de la messagerie est : nombreMailEmis;nombreMailEmisXDestinataires;volumeTotalMailEmis;MoisAnnee;(nomEntite).  <br/>
        
        Le Header du CSV des entités est : nomEntite;nbCollaborateurs;responsableEntite;responsableNumeriqueResponsable.  

      operationId: importCSV
      requestBody:
        content:
          multipart/form-data:
            schema:
              type: object
              required:
                - nomLot
              properties:
                csvDataCenter:
                  type: string
                  format: binary
                csvEquipementPhysique:
                  type: string
                  format: binary
                csvEquipementVirtuel:
                  type: string
                  format: binary
                csvApplication:
                  type: string
                  format: binary
                csvMessagerie:
                  type: string
                  format: binary
                csvEntite:
                  type: string
                  format: binary
                dateLot:
                  type: string
                nomOrganisation:
                  type: string
                nomLot:
                  type: string
      responses:
        "500":
          description: Erreur interne du service
          content:
            'application/json':
              schema:
                $ref: "#/components/schemas/ErreurRest"
        "400":
          description: Contenu de la soumission incorrecte
          content:
            'application/json':
              schema:
                $ref: "#/components/schemas/ErreurRest"
        "200":
          description: Rapport d'import des données d'entrées
          content:
            'application/json':
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/RapportImportRest"
components:
  schemas:
    StatutTraitement:
      description: Statut de traitement des données d'entrées dans NumEcoEval
      type: string
      enum:
        - EN_ATTENTE
        - A_INGERER
        - INGERE
        - TRAITE
        - A_REJOUER
        - EN_ERREUR
    DemandeCalculRest:
      description: Objet à soumettre pour une demande de calcul
      required:
        - nomLot
      properties:
        nomLot:
          description: "Nom du lot rattaché"
          type: string
    ModeRest:
      type: string
      enum:
        - ASYNC
        - SYNC
      default: ASYNC
    StatutCalculRest:
      description: Statut des calculs.
      properties:
        statut:
          description: "Statut global des calculs"
          type: string
          enum:
            - TERMINE
            - EN_COURS
        etat:
          description: "Etat des calculs"
          type: string
        equipementPhysique:
          description: "Bloc equipement physique"
          $ref: '#/components/schemas/VolumeRest'
        messagerie:
          description: "Bloc messagerie"
          $ref: '#/components/schemas/VolumeRest'
    VolumeRest:
      description: Volume
      type: object
      properties:
        nbEnCours:
          type: integer
        nbTraite:
          type: integer
    RapportDemandeCalculRest:
      description: Rapport de la demande de calcul.
      properties:
        nomLot:
          description: "Nom du lot rattaché"
          type: string
        nbrDataCenter:
          description: Nombre de Data Center concernés
          type: integer
        nbrEquipementPhysique:
          description: Nombre d'équipements physiques concernés
          type: integer
        nbrEquipementVirtuel:
          description: Nombre d'équipements physiques concernés
          type: integer
        nbrApplication:
          description: Nombre d'application concernées
          type: integer
        nbrMessagerie:
          description: Nombre d'éléments de messagerie concernés
          type: integer
    ErreurRest:
      description: Objet standard pour les réponses en cas d'erreur d'API
      type: object
      properties:
        code:
          description: Code de l'erreur
          type: string
        message:
          description: Message de l'erreur
          type: string
        status:
          description: Code Statut HTTP de la réponse
          type: integer
        timestamp:
          description: Date & Heure de l'erreur
          type: string
          format: date-time
    RapportImportRest:
      description: Rapport d'import pour un fichier
      type: object
      properties:
        fichier:
          description: Fichier concerné par le rapport
          type: string
        erreurs:
          description: Erreurs du fichier
          type: array
          items:
            type: string
        avertissements:
          description: Avertissements du fichier
          type: array
          items:
            type: string
        nbrLignesImportees:
          description: Nombre de lignes importées
          type: integer
    DonneesEntreeRest:
      description: Données d'entres de NumEcoEval
      type: object
      required:
        - dateLot
        - nomOrganisation
      properties:
        nomOrganisation:
          description: Nom de l'organisation rattachée au données
          type: string
        nomLot:
          description: "Nom du lot rattaché"
          type: string
        dateLot:
          description: Date de lot rattachée au données
          type: string
        dataCenters:
          type: array
          items:
            $ref: "#/components/schemas/DataCenterRest"
        equipementsPhysiques:
          type: array
          items:
            $ref: "#/components/schemas/EquipementPhysiqueRest"
        messageries:
          type: array
          items:
            $ref: "#/components/schemas/MessagerieRest"
        entites:
          type: array
          items:
            $ref: "#/components/schemas/EntiteRest"
    DataCenterRest:
      description: Représentation d'un DataCenter dans NumEcoEval
      properties:
        nomCourtDatacenter:
          description: ""
          type: string
        nomLongDatacenter:
          description: ""
          type: string
        pue:
          description: ""
          type: number
        localisation:
          description: ""
          type: string
        nomEntite:
          description: ""
          type: string
        nomSourceDonnee:
          description: "Nom de la source de la donnée"
          type: string
    EquipementPhysiqueRest:
      description: Représentation d'un équipement physique dans NumEcoEval
      properties:
        nomEquipementPhysique:
          description: ""
          type: string
        modele:
          description: ""
          type: string
        type:
          description: ""
          type: string
        statut:
          description: ""
          type: string
        paysDUtilisation:
          description: ""
          type: string
        utilisateur:
          description: ""
          type: string
        dateAchat:
          description: ""
          type: string
          format: date
        dateRetrait:
          description: ""
          type: string
          format: date
        nbCoeur:
          description: ""
          type: string
        modeUtilisation:
          description: ""
          type: string
        tauxUtilisation:
          description: ""
          type: number
        nomCourtDatacenter:
          description: ""
          type: string
        nbJourUtiliseAn:
          description: ""
          type: number
        goTelecharge:
          description: ""
          type: number
        quantite:
          description: ""
          type: number
        serveur:
          description: ""
          type: boolean
        nomEntite:
          description: ""
          type: string
        nomSourceDonnee:
          description: "Nom de la source de la donnée"
          type: string
        equipementsVirtuels:
          description: ""
          items:
            $ref: "#/components/schemas/EquipementVirtuelRest"
    EquipementVirtuelRest:
      description: Représentation d'un équipement virtuel dans NumEcoEval
      properties:
        nomEquipementVirtuel:
          description: ""
          type: string
        nomEquipementPhysique:
          description: ""
          type: string
        vCPU:
          description: ""
          type: integer
        cluster:
          description: ""
          type: string
        nomEntite:
          description: ""
          type: string
        nomSourceDonnee:
          description: "Nom de la source de la donnée"
          type: string
        nomSourceDonneeEquipementPhysique:
          description: "Nom de la source de la donnée pour l'équipement physique"
          type: string
        applications:
          description: ""
          type: array
          items:
            $ref: "#/components/schemas/ApplicationRest"
        typeEqv:
          description: |
            Le type d'équipement virtuel contient "calcul", "stockage" ou null.
            Peut être omis entièrement si ce n'est pas applicable.
          type: string
        capaciteStockage:
          description: |
            Capacité de stockage de l'équipement virtuel en To.
          type: number
          format: double
        cleRepartition:
          description: |
            La clé de repartition est exprimée comme une fraction.
          type: number
          format: double
        consoElecAnnuelle:
          description: |
            Consommation électrique annuelle de l'équipement virtuel.
          type: number
          format: double
    ApplicationRest:
      description: Représentation d'une application dans NumEcoEval
      properties:
        nomApplication:
          description: ""
          type: string
        typeEnvironnement:
          description: ""
          type: string
        nomEquipementVirtuel:
          description: ""
          type: string
        domaine:
          description: ""
          type: string
        sousDomaine:
          description: ""
          type: string
        nomEntite:
          description: ""
          type: string
        nomSourceDonnee:
          description: "Nom de la source de la donnée"
          type: string
        nomSourceDonneeEquipementVirtuel:
          description: "Nom de la source de la donnée pour l'équipement virtuel"
          type: string
    MessagerieRest:
      description: Représentation d'éléments de messagerie dans NumEcoEval
      properties:
        nombreMailEmis:
          description: ""
          type: integer
        nombreMailEmisXDestinataires:
          description: ""
          type: integer
        volumeTotalMailEmis:
          description: ""
          type: integer
        moisAnnee:
          description: "Mois et Année rattachés au données, format MMAAAA"
          type: integer
        nomEntite:
          description: ""
          type: string
        nomSourceDonnee:
          description: "Nom de la source de la donnée"
          type: string
    EntiteRest:
      description: Représentation d'une entité dans NumEcoEval
      properties:
        nomEntite:
          description: "Nom de l'entité"
          type: string
        nbCollaborateurs:
          description: "Nombre de collaborateur de l'entité"
          type: integer
        responsableEntite:
          description: "Nom du responsable de l'entité"
          type: string
        responsableNumeriqueDurable:
          description: "Nom du responsable du numérique durable dans l'entité"
          type: string
        nomSourceDonnee:
          description: "Nom de la source de la donnée"
          type: string