{
  "openapi": "3.0.0",
  "paths": {
    "/": {
      "get": {
        "operationId": "AppController_getHomePage",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "App"
        ]
      }
    },
    "/swagger.json": {
      "get": {
        "operationId": "AppController_getSwaggerJson",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "App"
        ]
      }
    },
    "/login": {
      "get": {
        "operationId": "WebAuthController_getLoginPage",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "WebAuth"
        ]
      }
    },
    "/tools": {
      "get": {
        "operationId": "WebAuthController_getToolsPage",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "WebAuth"
        ]
      }
    },
    "/web-auth/login": {
      "post": {
        "operationId": "WebAuthController_login",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "WebAuth"
        ]
      }
    },
    "/web-auth/logout": {
      "get": {
        "operationId": "WebAuthController_logout",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "WebAuth"
        ]
      }
    },
    "/web-auth/data/licences": {
      "get": {
        "operationId": "WebAuthController_getLicences",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "WebAuth"
        ]
      }
    },
    "/web-auth/data/users": {
      "get": {
        "operationId": "WebAuthController_getUsers",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "WebAuth"
        ]
      }
    },
    "/web-auth/data/integrations/easydoct": {
      "get": {
        "operationId": "WebAuthController_getEasyDoctIntegrations",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "WebAuth"
        ]
      }
    },
    "/web-auth/data/integrations/testserveur": {
      "get": {
        "operationId": "WebAuthController_getTestServeurIntegrations",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "WebAuth"
        ]
      }
    },
    "/web-auth/data/kiosk": {
      "get": {
        "operationId": "WebAuthController_getKioskConfig",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "WebAuth"
        ]
      }
    },
    "/licences": {
      "post": {
        "operationId": "LicenceController_create",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "example": "Licence Premium"
                  }
                },
                "required": [
                  "name"
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Licence créée avec succès"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Créer une nouvelle licence",
        "tags": [
          "Licences"
        ]
      },
      "get": {
        "operationId": "LicenceController_findAll",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Liste des licences"
          },
          "403": {
            "description": "Accès interdit - SUPERADMIN requis"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Récupérer toutes les licences (SUPERADMIN uniquement)",
        "tags": [
          "Licences"
        ]
      }
    },
    "/licences/dashboard-summary": {
      "get": {
        "operationId": "LicenceController_dashboardSummary",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Récapitulatif par licence"
          },
          "403": {
            "description": "Accès interdit - SUPERADMIN requis"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Récapitulatif multi-licences pour le dashboard superadmin (saveur, état config persisté, compteurs)",
        "tags": [
          "Licences"
        ]
      }
    },
    "/licences/{id}": {
      "get": {
        "operationId": "LicenceController_findOne",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "ID de la licence",
            "schema": {
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Licence trouvée"
          },
          "404": {
            "description": "Licence introuvable"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Récupérer une licence par ID",
        "tags": [
          "Licences"
        ]
      },
      "put": {
        "operationId": "LicenceController_update",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "ID de la licence",
            "schema": {
              "type": "number"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "example": "Nouveau nom"
                  },
                  "activeIntegration": {
                    "type": "string",
                    "enum": [
                      "EASYDOCT",
                      "LIBRE",
                      "TEST_SERVEUR",
                      "NONE"
                    ],
                    "example": "EASYDOCT",
                    "description": "Intégration active (LIBRE = éditeur générique du Kiosk Integration Contract)"
                  },
                  "assignedFlavor": {
                    "type": "string",
                    "enum": [
                      "EASYDOCT",
                      "LIBRE"
                    ],
                    "nullable": true,
                    "example": "EASYDOCT",
                    "description": "Saveur imposée aux administrateurs (superadmin uniquement ; null = non assignée)"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Licence mise à jour"
          },
          "404": {
            "description": "Licence introuvable"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Mettre à jour une licence",
        "tags": [
          "Licences"
        ]
      },
      "delete": {
        "operationId": "LicenceController_remove",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "ID de la licence",
            "schema": {
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Licence supprimée"
          },
          "404": {
            "description": "Licence introuvable"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Supprimer une licence",
        "tags": [
          "Licences"
        ]
      }
    },
    "/auth/login": {
      "post": {
        "operationId": "AuthController_login",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "email": {
                    "type": "string",
                    "example": "user@example.com"
                  },
                  "password": {
                    "type": "string",
                    "example": "password123"
                  }
                },
                "required": [
                  "email",
                  "password"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Connexion réussie, token JWT retourné",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "access_token": {
                      "type": "string"
                    },
                    "user": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Email ou mot de passe invalide"
          }
        },
        "summary": "Se connecter et obtenir un token JWT",
        "tags": [
          "Authentication"
        ]
      }
    },
    "/auth/profile": {
      "get": {
        "operationId": "AuthController_getProfile",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Profil récupéré avec succès"
          },
          "401": {
            "description": "Token manquant ou invalide"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Récupérer le profil de l'utilisateur connecté",
        "tags": [
          "Authentication"
        ]
      }
    },
    "/auth/accessibleLicences": {
      "get": {
        "operationId": "AuthController_accessibleLicences",
        "parameters": [],
        "responses": {
          "200": {
            "description": "{ licences: [{ id, name }] }"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Licences accessibles à l'utilisateur courant (superadmin : toutes ; login externe : celles accordées par l'éditeur)",
        "tags": [
          "Authentication"
        ]
      }
    },
    "/auth/switchLicence": {
      "post": {
        "description": "Génère un nouveau JWT avec la licence spécifiée. Superadmin : n'importe quelle licence ; admin : uniquement les licences accordées (login externe éditeur ou licence par défaut).",
        "operationId": "AuthController_switchLicence",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "licenceId": {
                    "type": "number",
                    "example": 1,
                    "description": "ID de la licence à utiliser"
                  }
                },
                "required": [
                  "licenceId"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Nouveau token JWT généré avec la licence spécifiée",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "access_token": {
                      "type": "string",
                      "description": "Nouveau JWT avec la licence switchée"
                    },
                    "currentLicenceId": {
                      "type": "number",
                      "description": "ID de la licence active"
                    },
                    "user": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Accès interdit - SUPERADMIN requis"
          },
          "404": {
            "description": "Licence introuvable"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Changer de licence temporairement (superadmin : tout ; admin : son périmètre)",
        "tags": [
          "Authentication"
        ]
      }
    },
    "/users": {
      "post": {
        "operationId": "UserController_create",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "email": {
                    "type": "string",
                    "example": "user@example.com"
                  },
                  "password": {
                    "type": "string",
                    "example": "password123"
                  },
                  "firstName": {
                    "type": "string",
                    "example": "John"
                  },
                  "lastName": {
                    "type": "string",
                    "example": "Doe"
                  },
                  "phone": {
                    "type": "string",
                    "example": "+33 6 12 34 56 78"
                  },
                  "role": {
                    "type": "string",
                    "enum": [
                      "user",
                      "admin",
                      "superadmin"
                    ],
                    "example": "user"
                  },
                  "defaultLicenceId": {
                    "type": "number",
                    "example": 1
                  },
                  "canAccessCockpit": {
                    "type": "boolean",
                    "example": true
                  }
                },
                "required": [
                  "email",
                  "password",
                  "role"
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Utilisateur créé avec succès"
          },
          "409": {
            "description": "Email déjà utilisé"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Créer un nouvel utilisateur",
        "tags": [
          "Users"
        ]
      },
      "get": {
        "operationId": "UserController_findAll",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Liste des utilisateurs"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Récupérer les utilisateurs (admin : ceux de sa licence)",
        "tags": [
          "Users"
        ]
      }
    },
    "/users/invite": {
      "post": {
        "operationId": "UserController_invite",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "email": {
                    "type": "string",
                    "example": "user@example.com"
                  },
                  "firstName": {
                    "type": "string",
                    "example": "John"
                  },
                  "lastName": {
                    "type": "string",
                    "example": "Doe"
                  },
                  "role": {
                    "type": "string",
                    "enum": [
                      "user",
                      "admin",
                      "superadmin"
                    ],
                    "example": "user"
                  },
                  "defaultLicenceId": {
                    "type": "number",
                    "example": 1
                  }
                },
                "required": [
                  "email"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Invitation envoyée"
          },
          "409": {
            "description": "Email déjà utilisé"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Inviter un utilisateur par email (admin : sur sa licence uniquement)",
        "tags": [
          "Users"
        ]
      }
    },
    "/users/{id}/resend-invitation": {
      "post": {
        "operationId": "UserController_resendInvitation",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Invitation renvoyée"
          },
          "400": {
            "description": "Compte déjà activé ou email injoignable"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Renvoyer l'invitation d'un compte jamais activé (nouveau token, admin : sa licence uniquement)",
        "tags": [
          "Users"
        ]
      }
    },
    "/users/forgot-password": {
      "post": {
        "operationId": "UserController_forgotPassword",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "email": {
                    "type": "string"
                  }
                },
                "required": [
                  "email"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Toujours success (ne révèle pas si le compte existe)"
          }
        },
        "summary": "Demander un email de réinitialisation de mot de passe",
        "tags": [
          "Users"
        ]
      }
    },
    "/users/set-password": {
      "post": {
        "operationId": "UserController_setPassword",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "email": {
                    "type": "string"
                  },
                  "token": {
                    "type": "string"
                  },
                  "password": {
                    "type": "string"
                  }
                },
                "required": [
                  "email",
                  "token",
                  "password"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Mot de passe défini"
          },
          "400": {
            "description": "Invitation invalide ou expirée"
          }
        },
        "summary": "Définir le mot de passe depuis un lien d'invitation",
        "tags": [
          "Users"
        ]
      }
    },
    "/users/{id}": {
      "get": {
        "operationId": "UserController_findOne",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "ID de l'utilisateur",
            "schema": {
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Utilisateur trouvé"
          },
          "404": {
            "description": "Utilisateur introuvable"
          }
        },
        "summary": "Récupérer un utilisateur par ID",
        "tags": [
          "Users"
        ]
      },
      "put": {
        "operationId": "UserController_update",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "ID de l'utilisateur",
            "schema": {
              "type": "number"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "email": {
                    "type": "string"
                  },
                  "password": {
                    "type": "string"
                  },
                  "firstName": {
                    "type": "string"
                  },
                  "lastName": {
                    "type": "string"
                  },
                  "phone": {
                    "type": "string"
                  },
                  "role": {
                    "type": "string",
                    "enum": [
                      "user",
                      "admin",
                      "superadmin"
                    ]
                  },
                  "defaultLicenceId": {
                    "type": "number"
                  },
                  "canAccessCockpit": {
                    "type": "boolean"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Utilisateur mis à jour"
          },
          "404": {
            "description": "Utilisateur introuvable"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Mettre à jour un utilisateur",
        "tags": [
          "Users"
        ]
      },
      "delete": {
        "operationId": "UserController_remove",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "ID de l'utilisateur",
            "schema": {
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Utilisateur supprimé"
          },
          "404": {
            "description": "Utilisateur introuvable"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Supprimer un utilisateur",
        "tags": [
          "Users"
        ]
      }
    },
    "/users/validate": {
      "post": {
        "operationId": "UserController_validate",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "email": {
                    "type": "string",
                    "example": "user@example.com"
                  },
                  "password": {
                    "type": "string",
                    "example": "password123"
                  }
                },
                "required": [
                  "email",
                  "password"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Credentials validés"
          }
        },
        "summary": "Valider les credentials d'un utilisateur",
        "tags": [
          "Users"
        ]
      }
    },
    "/licences/{licenceId}/integration/easydoct": {
      "post": {
        "operationId": "setIntegrationEasyDoct",
        "parameters": [
          {
            "name": "licenceId",
            "required": true,
            "in": "path",
            "description": "ID de la licence",
            "schema": {
              "type": "number"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "officeId": {
                    "type": "string",
                    "example": "office-123"
                  },
                  "officeVisibleId": {
                    "type": "string",
                    "example": "office-visible-456"
                  },
                  "targetUrl": {
                    "type": "string",
                    "example": "http://localhost/easydoct.com",
                    "description": "Fallback historique des deux base URLs (compat)"
                  },
                  "contractBaseUrl": {
                    "type": "string",
                    "nullable": true,
                    "description": "Base URL du contrat (apiborneIntegrationService/v1)"
                  },
                  "configServiceBaseUrl": {
                    "type": "string",
                    "nullable": true,
                    "description": "Base URL du config service EasyDoct legacy (apiborneConfigService) — vide = pas de forwards référentiels"
                  },
                  "supportedRoutes": {
                    "type": "object",
                    "nullable": true,
                    "description": "HISTORIQUE, ignoré — toutes les routes du contrat sont obligatoires (implémentation minimale acceptée). Toléré pour compat."
                  }
                },
                "required": []
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Intégration EasyDoct créée/mise à jour"
          },
          "404": {
            "description": "Licence introuvable"
          },
          "409": {
            "description": "La licence a déjà une autre intégration"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Créer ou mettre à jour l'intégration éditeur (contrat) d'une licence — EasyDoct ou tout éditeur implémentant le Kiosk Integration Contract",
        "tags": [
          "Integrations"
        ]
      },
      "delete": {
        "operationId": "removeIntegrationEasyDoct",
        "parameters": [
          {
            "name": "licenceId",
            "required": true,
            "in": "path",
            "description": "ID de la licence",
            "schema": {
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Intégration EasyDoct supprimée"
          },
          "404": {
            "description": "Licence ou intégration introuvable"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Supprimer l'intégration EasyDoct d'une licence",
        "tags": [
          "Integrations"
        ]
      }
    },
    "/licences/{licenceId}/integration/test-serveur": {
      "post": {
        "operationId": "setIntegrationTestServeur",
        "parameters": [
          {
            "name": "licenceId",
            "required": true,
            "in": "path",
            "description": "ID de la licence",
            "schema": {
              "type": "number"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "serverUrl": {
                    "type": "string",
                    "example": "https://test.example.com",
                    "nullable": true
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Intégration TestServeur créée/mise à jour"
          },
          "404": {
            "description": "Licence introuvable"
          },
          "409": {
            "description": "La licence a déjà une autre intégration"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Créer ou mettre à jour l'intégration TestServeur pour une licence",
        "tags": [
          "Integrations"
        ]
      },
      "delete": {
        "operationId": "removeIntegrationTestServeur",
        "parameters": [
          {
            "name": "licenceId",
            "required": true,
            "in": "path",
            "description": "ID de la licence",
            "schema": {
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Intégration TestServeur supprimée"
          },
          "404": {
            "description": "Licence ou intégration introuvable"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Supprimer l'intégration TestServeur d'une licence",
        "tags": [
          "Integrations"
        ]
      }
    },
    "/licences/{licenceId}/config-check": {
      "get": {
        "operationId": "getConfigCheck",
        "parameters": [
          {
            "name": "licenceId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "force",
            "required": false,
            "in": "query",
            "description": "true = re-sonder même si une validation est persistée (bouton Relancer)",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "{ connectivity: {...}, integration: {...} }"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "État de la configuration de la licence : connectivité KioskReactor (définie + sondée) et intégration éditeur (endpoint contrat sondé) — pilote le verrouillage de l'admin",
        "tags": [
          "Integrations"
        ]
      }
    },
    "/licences/{licenceId}/contract-test": {
      "post": {
        "operationId": "runContractTest",
        "parameters": [
          {
            "name": "licenceId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "number"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "route"
                ],
                "properties": {
                  "route": {
                    "type": "string",
                    "description": "identifyPatients | getAppointmentByCode | getAppointmentById | listAppointmentDocuments | getNotificationReadiness | staffSignIn | getOfficePlaces | getExamTypes | getPractitioners | getRooms | getExams | getDocumentTypes"
                  },
                  "params": {
                    "type": "object",
                    "description": "Entrées utilisateur selon la route : criteria identify (lastName, firstName, birthDate, socialSecurityId), code, appointmentId, login/password, deviceId (optionnel)"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Rapport { ok, status, durationMs, request, response, checks }"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Banc de test du contrat : exécute UN appel réel (lecture) vers l'éditeur avec les entrées fournies et rend un rapport détaillé (requête, statut, durée, réponse, checks de conformité)",
        "tags": [
          "Integrations"
        ]
      }
    },
    "/licences/{licenceId}/config-referentials": {
      "get": {
        "operationId": "getConfigReferentials",
        "parameters": [
          {
            "name": "licenceId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "{ flavor, officePlaces, examTypes, practitioners, rooms, exams }"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Contenu des référentiels de l'éditeur (lieux, types d'examen, praticiens, salles, examens) tels que vus par le serveur ApiBorne — page « Référentiels éditeur » de l'admin",
        "tags": [
          "Integrations"
        ]
      }
    },
    "/api/kioskReactorSetting/saveUpdateKioskReactorSetting": {
      "post": {
        "operationId": "saveUpdateKioskReactorSetting",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "userSessionKey": {
                    "type": "string",
                    "description": "JWT token"
                  },
                  "projectAuthorizationKey": {
                    "type": "string"
                  },
                  "brandId": {
                    "type": "string"
                  },
                  "brandAuthorizationKey": {
                    "type": "string"
                  },
                  "enableFeature": {
                    "type": "boolean"
                  },
                  "sesamReaderBaseHostUrl": {
                    "type": "string"
                  },
                  "useRetryOnApiFailure": {
                    "type": "boolean"
                  },
                  "retryOnApiFailureCount": {
                    "type": "integer"
                  },
                  "retryOnApiFailureStartHour": {
                    "type": "string"
                  },
                  "retryOnApiFailureEndHour": {
                    "type": "string"
                  },
                  "contractEncryptionPublicKey": {
                    "type": "string",
                    "nullable": true,
                    "description": "Clé publique RSA (PEM SPKI, >= 2048 bits) du chiffrement de bout en bout du contrat — vide/null = désactivé"
                  }
                },
                "required": [
                  "userSessionKey"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Configuration sauvegardÃ©e avec succÃ¨s",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "KioskReactorSetting": {
                      "type": "object"
                    },
                    "SessionKey": {
                      "type": "string"
                    },
                    "HasError": {
                      "type": "boolean",
                      "default": false
                    }
                  }
                }
              }
            }
          }
        },
        "summary": "Sauvegarder ou mettre Ã  jour la configuration KioskReactorSetting",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/getKioskReactorSetting/{userSessionKey}": {
      "get": {
        "operationId": "getKioskReactorSetting",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Configuration rÃ©cupÃ©rÃ©e avec succÃ¨s",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "KioskReactorSetting": {
                      "type": "object"
                    },
                    "SessionKey": {
                      "type": "string"
                    },
                    "HasError": {
                      "type": "boolean",
                      "default": false
                    }
                  }
                }
              }
            }
          }
        },
        "summary": "RÃ©cupÃ©rer la configuration KioskReactorSetting",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/kioskReactorSettingFeatures/getKioskReactorSettingFeatures/{userSessionKey}": {
      "get": {
        "operationId": "KioskReactorSetting_GetKioskReactorSettingFeatures",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Configuration récupérée"
          }
        },
        "summary": "Récupérer la configuration globale KioskReactorSettingFeatures",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/kioskReactorSettingFeatures/getKioskReactorSettingFeaturesByOfficePlaceId/{officePlaceId}/{userSessionKey}": {
      "get": {
        "operationId": "KioskReactorSetting_GetKioskReactorSettingFeaturesByOfficePlaceId",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "officePlaceId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Configuration par office place récupérée"
          }
        },
        "summary": "Récupérer la configuration KioskReactorSettingFeatures par office place",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/kioskReactorSettingFeatures/saveUpdateKioskReactorSettingFeatures": {
      "post": {
        "operationId": "KioskReactorSetting_SaveUpdateKioskReactorSettingFeatures",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Configuration sauvegardée"
          }
        },
        "summary": "Sauvegarder ou mettre à jour la config globale KioskReactorSettingFeatures",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/kioskReactorSettingFeatures/saveUpdateKioskReactorSettingFeaturesByOfficePlaceId": {
      "post": {
        "operationId": "KioskReactorSetting_SaveUpdateKioskReactorSettingFeaturesByOfficePlaceId",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Configuration par office place sauvegardée"
          }
        },
        "summary": "Sauvegarder ou mettre à jour la config par office place",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/kioskReactorSettingMessages/getKioskReactorSettingMessages/{userSessionKey}": {
      "get": {
        "operationId": "KioskReactorSetting_GetKioskReactorSettingMessages",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Configuration rÃ©cupÃ©rÃ©e"
          }
        },
        "summary": "RÃ©cupÃ©rer la configuration KioskReactorSettingMessages",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/kioskReactorSettingMessages/saveUpdateKioskReactorSettingMessages": {
      "post": {
        "operationId": "KioskReactorSetting_SaveUpdateKioskReactorSettingMessages",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Configuration sauvegardÃ©e"
          }
        },
        "summary": "Sauvegarder ou mettre Ã  jour KioskReactorSettingMessages",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/kioskReactorSettingPrinterCodes/getKioskReactorSettingPrinterCodes/{userSessionKey}": {
      "get": {
        "operationId": "KioskReactorSetting_GetKioskReactorSettingPrinterCodes",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Configuration rÃ©cupÃ©rÃ©e"
          }
        },
        "summary": "RÃ©cupÃ©rer la configuration KioskReactorSettingPrinterCodes",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/kioskReactorSettingPrinterCodes/saveUpdateKioskReactorSettingPrinterCodes": {
      "post": {
        "operationId": "KioskReactorSetting_SaveUpdateKioskReactorSettingPrinterCodes",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Configuration sauvegardÃ©e"
          }
        },
        "summary": "Sauvegarder ou mettre Ã  jour KioskReactorSettingPrinterCodes",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/kioskReactorSettingCheckinAppointmentDetail/getKioskReactorSettingCheckinAppointmentDetail/{userSessionKey}": {
      "get": {
        "operationId": "KioskReactorSetting_GetKioskReactorSettingCheckinAppointmentDetail",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Configuration récupérée"
          }
        },
        "summary": "Récupérer la configuration globale CheckinAppointmentDetail",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/kioskReactorSettingCheckinAppointmentDetail/getKioskReactorSettingCheckinAppointmentDetailByOfficePlaceId/{officePlaceId}/{userSessionKey}": {
      "get": {
        "operationId": "KioskReactorSetting_GetKioskReactorSettingCheckinAppointmentDetailByOfficePlaceId",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "officePlaceId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Configuration par office place récupérée"
          }
        },
        "summary": "Récupérer la configuration CheckinAppointmentDetail par office place",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/kioskReactorSettingCheckinAppointmentDetail/saveUpdateKioskReactorSettingCheckinAppointmentDetail": {
      "post": {
        "operationId": "KioskReactorSetting_SaveUpdateKioskReactorSettingCheckinAppointmentDetail",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Configuration sauvegardée"
          }
        },
        "summary": "Sauvegarder ou mettre à jour la config globale CheckinAppointmentDetail",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/kioskReactorSettingCheckinAppointmentDetail/saveUpdateKioskReactorSettingCheckinAppointmentDetailByOfficePlaceId": {
      "post": {
        "operationId": "KioskReactorSetting_SaveUpdateKioskReactorSettingCheckinAppointmentDetailByOfficePlaceId",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Configuration par office place sauvegardée"
          }
        },
        "summary": "Sauvegarder ou mettre à jour la config par office place",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/kioskReactorCheckInSystemNotifySetting/getKioskReactorCheckInSystemNotifySetting/{userSessionKey}": {
      "get": {
        "operationId": "KioskReactorSetting_GetKioskReactorCheckInSystemNotifySetting",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Configuration récupérée"
          }
        },
        "summary": "Récupérer la configuration globale KioskReactorCheckInSystemNotifySetting",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/kioskReactorCheckInSystemNotifySetting/getKioskReactorCheckInSystemNotifySettingByOfficePlaceId/{officePlaceId}/{userSessionKey}": {
      "get": {
        "operationId": "KioskReactorSetting_GetKioskReactorCheckInSystemNotifySettingByOfficePlaceId",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "officePlaceId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Configuration par office place récupérée"
          }
        },
        "summary": "Récupérer la configuration KioskReactorCheckInSystemNotifySetting par office place",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/kioskReactorCheckInSystemNotifySetting/saveUpdateKioskReactorCheckInSystemNotifySetting": {
      "post": {
        "operationId": "KioskReactorSetting_SaveUpdateKioskReactorCheckInSystemNotifySetting",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Configuration sauvegardée"
          }
        },
        "summary": "Sauvegarder ou mettre à jour la config globale KioskReactorCheckInSystemNotifySetting",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/kioskReactorCheckInSystemNotifySetting/saveUpdateKioskReactorCheckInSystemNotifySettingByOfficePlaceId": {
      "post": {
        "operationId": "KioskReactorSetting_SaveUpdateKioskReactorCheckInSystemNotifySettingByOfficePlaceId",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Configuration par office place sauvegardée"
          }
        },
        "summary": "Sauvegarder ou mettre à jour la config par office place",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/kioskReactorDirectAdmissionSetting/getKioskReactorDirectAdmissionSetting/{userSessionKey}": {
      "get": {
        "operationId": "KioskReactorSetting_GetKioskReactorDirectAdmissionSetting",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Configuration rÃ©cupÃ©rÃ©e"
          }
        },
        "summary": "RÃ©cupÃ©rer la configuration KioskReactorDirectAdmissionSetting",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/kioskReactorDirectAdmissionSetting/saveUpdateKioskReactorDirectAdmissionSetting": {
      "post": {
        "operationId": "KioskReactorSetting_SaveUpdateKioskReactorDirectAdmissionSetting",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Configuration sauvegardÃ©e"
          }
        },
        "summary": "Sauvegarder ou mettre Ã  jour KioskReactorDirectAdmissionSetting",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/kioskReactorSettingDisplay/getKioskReactorSettingDisplay/{userSessionKey}": {
      "get": {
        "operationId": "KioskReactorSetting_GetKioskReactorDisplaySetting",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Configuration rÃ©cupÃ©rÃ©e"
          }
        },
        "summary": "RÃ©cupÃ©rer la configuration KioskReactorSettingDisplay",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/kioskReactorSettingDisplay/saveUpdateKioskReactorSettingDisplay": {
      "post": {
        "operationId": "KioskReactorSetting_SaveUpdateKioskReactorDisplaySetting",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Configuration sauvegardÃ©e"
          }
        },
        "summary": "Sauvegarder ou mettre Ã  jour KioskReactorSettingDisplay",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/getKioskReactorSettingPatientLateAnomalies": {
      "post": {
        "operationId": "KioskReactorSetting_GetKioskReactorSettingPatientLateAnomalies",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Liste des anomalies récupérée"
          }
        },
        "summary": "Récupérer toutes les anomalies patient late",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/saveUpdateKioskReactorSettingPatientLateAnomaly": {
      "post": {
        "operationId": "KioskReactorSetting_SaveUpdateKioskReactorSettingPatientLateAnomaly",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Anomalie sauvegardée"
          }
        },
        "summary": "Sauvegarder ou mettre à jour une anomalie patient late",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/deleteKioskReactorSettingPatientLateAnomaly": {
      "post": {
        "operationId": "KioskReactorSetting_DeleteKioskReactorSettingPatientLateAnomaly",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Anomalie supprimée"
          }
        },
        "summary": "Supprimer une anomalie patient late",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/getKioskReactorSettingPatientAgeAnomalies": {
      "post": {
        "operationId": "KioskReactorSetting_GetKioskReactorSettingPatientAgeAnomalies",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Liste des anomalies récupérée"
          }
        },
        "summary": "Récupérer toutes les anomalies patient age",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/saveUpdateKioskReactorSettingPatientAgeAnomaly": {
      "post": {
        "operationId": "KioskReactorSetting_SaveUpdateKioskReactorSettingPatientAgeAnomaly",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Anomalie sauvegardée"
          }
        },
        "summary": "Sauvegarder ou mettre à jour une anomalie patient age",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/deleteKioskReactorSettingPatientAgeAnomaly": {
      "post": {
        "operationId": "KioskReactorSetting_DeleteKioskReactorSettingPatientAgeAnomaly",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Anomalie supprimée"
          }
        },
        "summary": "Supprimer une anomalie patient age",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSettingPatientInfoBookingOptions/getKioskReactorSettingPatientInfoBookingOptions/{userSessionKey}": {
      "get": {
        "operationId": "KioskReactorSettingPatientInfoBookingOptions_Get",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Configuration récupérée"
          }
        },
        "summary": "Récupérer la configuration PatientInfoBookingOptions",
        "tags": [
          "KioskReactorSettingPatientInfoBookingOptions"
        ]
      }
    },
    "/api/kioskReactorSettingPatientInfoBookingOptions/saveUpdateKioskReactorSettingPatientInfoBookingOptions": {
      "post": {
        "operationId": "KioskReactorSettingPatientInfoBookingOptions_SaveUpdate",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Configuration sauvegardée"
          }
        },
        "summary": "Sauvegarder ou mettre à jour PatientInfoBookingOptions",
        "tags": [
          "KioskReactorSettingPatientInfoBookingOptions"
        ]
      }
    },
    "/api/kioskReactorSetting/kioskReactorSettingRequiredDocumentSetting/getKioskReactorSettingRequiredDocumentSettings/{userSessionKey}": {
      "get": {
        "operationId": "KioskReactorSetting_GetKioskReactorSettingRequiredDocumentSettings",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste des paramètres de documents requis"
          }
        },
        "summary": "Récupérer les paramètres des documents requis (tous les types, avec overrides)",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/kioskReactorSettingRequiredDocumentSetting/saveUpdateKioskReactorSettingRequiredDocumentSetting": {
      "post": {
        "operationId": "KioskReactorSetting_SaveUpdateKioskReactorSettingRequiredDocumentSetting",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Paramètre sauvegardé"
          }
        },
        "summary": "Sauvegarder ou réinitialiser l'override d'un document requis",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/kioskReactorSettingRequestMessage/getKioskReactorSettingRequestMessages/{userSessionKey}": {
      "get": {
        "operationId": "KioskReactorSetting_GetKioskReactorSettingRequestMessages",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "{ KioskReactorSettingRequestMessages: [...] }"
          }
        },
        "summary": "Lister les messages de demande guichet (une entrée par lieu)",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/kioskReactorSettingRequestMessage/saveUpdateKioskReactorSettingRequestMessage": {
      "post": {
        "operationId": "KioskReactorSetting_SaveUpdateKioskReactorSettingRequestMessage",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Message sauvegardé"
          }
        },
        "summary": "Sauvegarder le message de demande guichet d'un lieu (upsert par officePlaceId)",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/kioskReactorSettingRequestMessage/getKioskReactorSettingWrongPlaceMessageDetails/{userSessionKey}": {
      "get": {
        "operationId": "KioskReactorSetting_GetKioskReactorSettingWrongPlaceMessageDetails",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "{ KioskReactorSettingWrongPlaceMessageDetails: [...] }"
          }
        },
        "summary": "Lister les messages « mauvais lieu » (une entrée par lieu)",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/kioskReactorSettingRequestMessage/saveUpdateKioskReactorSettingWrongPlaceMessageDetail": {
      "post": {
        "operationId": "KioskReactorSetting_SaveUpdateKioskReactorSettingWrongPlaceMessageDetail",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Message sauvegardé"
          }
        },
        "summary": "Sauvegarder le message « mauvais lieu » d'un lieu (upsert par officePlaceId)",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/kioskReactorSetting/configImport/importLegacyConfig": {
      "post": {
        "operationId": "KioskReactorSetting_ImportLegacyConfig",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Rapport d'import par groupe de configuration"
          }
        },
        "summary": "Importer l'ancienne configuration kiosk depuis un serveur EasyDoct (legacy)",
        "tags": [
          "KioskReactorSetting"
        ]
      }
    },
    "/api/exam/getExams/{token}": {
      "get": {
        "operationId": "ExamController_getExamsByToken",
        "parameters": [
          {
            "name": "token",
            "required": true,
            "in": "path",
            "description": "JWT token utilisateur",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste des examens"
          },
          "401": {
            "description": "Token invalide ou expiré"
          }
        },
        "summary": "Examens (EasyDoct forwardé ; route config du contrat en saveur libre)",
        "tags": [
          "Exams"
        ]
      }
    },
    "/api/officePlace/getOfficePlaces/{token}/{examTypeId}/{examId}/{filterNoRooms}": {
      "get": {
        "operationId": "OfficePlaceController_getOfficePlaces",
        "parameters": [
          {
            "name": "token",
            "required": true,
            "in": "path",
            "description": "JWT token utilisateur",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "examTypeId",
            "required": true,
            "in": "path",
            "description": "ID du type d'examen (0 si non applicable)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "examId",
            "required": true,
            "in": "path",
            "description": "ID de l'examen (0 si non applicable)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "filterNoRooms",
            "required": true,
            "in": "path",
            "description": "Filtre pour exclure les salles (true/false)",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "{ xOfficePlaces: [{ id, name }] }"
          },
          "401": {
            "description": "Token invalide ou expiré"
          }
        },
        "summary": "Lieux de consultation (EasyDoct forwardé, ou route config du contrat en saveur libre)",
        "tags": [
          "OfficePlaces"
        ]
      }
    },
    "/api/kioskAnomaly/saveUpdateKioskAnomaly": {
      "post": {
        "operationId": "KioskAnomalyController_saveUpdateKioskAnomaly",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "number",
                    "example": 1,
                    "description": "ID de l'anomalie (omis pour création, requis pour mise à jour)"
                  },
                  "name": {
                    "type": "string",
                    "example": "Anomalie test"
                  },
                  "description": {
                    "type": "string",
                    "example": "Description de l'anomalie"
                  },
                  "color": {
                    "type": "string",
                    "example": "#FF0000"
                  },
                  "code": {
                    "type": "string",
                    "example": "ANO001"
                  },
                  "keepForAppointment": {
                    "type": "boolean",
                    "example": false
                  },
                  "userSessionKey": {
                    "type": "string",
                    "description": "JWT token utilisateur (requis) - l'anomalie sera créée pour la licence de cet utilisateur"
                  }
                },
                "required": [
                  "name",
                  "userSessionKey"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Anomalie créée/mise à jour avec succès"
          },
          "401": {
            "description": "Token invalide"
          }
        },
        "summary": "Créer ou mettre à jour une anomalie kiosk",
        "tags": [
          "KioskAnomaly"
        ]
      }
    },
    "/api/kioskAnomaly/getKioskAnomalies/{userSessionKey}": {
      "get": {
        "operationId": "KioskAnomalyController_getKioskAnomalies",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "description": "JWT token utilisateur",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste des anomalies"
          },
          "401": {
            "description": "Token invalide"
          }
        },
        "summary": "Récupérer toutes les anomalies kiosk",
        "tags": [
          "KioskAnomaly"
        ]
      }
    },
    "/api/kioskAnomaly/deleteKioskAnomaly/{kioskAnomalyId}/{userSessionKey}": {
      "post": {
        "operationId": "KioskAnomalyController_deleteKioskAnomaly",
        "parameters": [
          {
            "name": "kioskAnomalyId",
            "required": true,
            "in": "path",
            "description": "ID de l'anomalie à supprimer",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "description": "JWT token utilisateur",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Anomalie supprimée avec succès"
          },
          "401": {
            "description": "Token invalide"
          },
          "404": {
            "description": "Anomalie introuvable"
          }
        },
        "summary": "Supprimer une anomalie kiosk",
        "tags": [
          "KioskAnomaly"
        ]
      }
    },
    "/api/kioskDevice/saveKioskDevice": {
      "post": {
        "operationId": "KioskDeviceController_saveKioskDevice",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "externalId": {
                    "type": "string",
                    "example": "KIOSK-001",
                    "description": "Identifiant externe unique du device"
                  },
                  "deviceName": {
                    "type": "string",
                    "example": "Kiosk Reception",
                    "description": "Nom du device"
                  },
                  "officePlaceIds": {
                    "type": "array",
                    "items": {
                      "type": "number"
                    },
                    "example": [
                      1,
                      2,
                      3
                    ],
                    "description": "IDs des lieux de consultation"
                  },
                  "defaultTicketPrinter": {
                    "type": "boolean",
                    "example": false
                  },
                  "officePrinterIp": {
                    "type": "string",
                    "example": "192.168.1.100"
                  },
                  "userSessionKey": {
                    "type": "string",
                    "description": "JWT token utilisateur (requis) - le device sera créé pour la licence de cet utilisateur"
                  }
                },
                "required": [
                  "externalId",
                  "userSessionKey"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Device créé avec succès"
          },
          "401": {
            "description": "Token invalide"
          },
          "409": {
            "description": "ExternalId déjà existant"
          }
        },
        "summary": "Créer un nouveau device kiosk",
        "tags": [
          "KioskDevice"
        ]
      }
    },
    "/api/kioskDevice/updateKioskDevice": {
      "post": {
        "operationId": "KioskDeviceController_updateKioskDevice",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "number",
                    "example": 1,
                    "description": "ID du device à mettre à jour"
                  },
                  "externalId": {
                    "type": "string",
                    "example": "KIOSK-001"
                  },
                  "deviceName": {
                    "type": "string",
                    "example": "Kiosk Reception Updated"
                  },
                  "officePlaceIds": {
                    "type": "array",
                    "items": {
                      "type": "number"
                    },
                    "example": [
                      1,
                      2,
                      3
                    ]
                  },
                  "defaultTicketPrinter": {
                    "type": "boolean",
                    "example": true
                  },
                  "userSessionKey": {
                    "type": "string",
                    "description": "JWT token utilisateur (requis)"
                  }
                },
                "required": [
                  "id",
                  "userSessionKey"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Device mis à jour avec succès"
          },
          "401": {
            "description": "Token invalide"
          },
          "404": {
            "description": "Device introuvable"
          }
        },
        "summary": "Mettre à jour un device kiosk",
        "tags": [
          "KioskDevice"
        ]
      }
    },
    "/api/kioskDevice/deleteKioskDevice": {
      "post": {
        "operationId": "KioskDeviceController_deleteKioskDevice",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "number",
                    "example": 1,
                    "description": "ID du device à supprimer"
                  },
                  "userSessionKey": {
                    "type": "string",
                    "description": "JWT token utilisateur (requis)"
                  }
                },
                "required": [
                  "id",
                  "userSessionKey"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Device supprimé avec succès"
          },
          "401": {
            "description": "Token invalide"
          },
          "404": {
            "description": "Device introuvable"
          }
        },
        "summary": "Supprimer un device kiosk",
        "tags": [
          "KioskDevice"
        ]
      }
    },
    "/api/kioskDevice/getKioskDevices/{userSessionKey}": {
      "get": {
        "operationId": "KioskDeviceController_getKioskDevices",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "description": "JWT token utilisateur",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste des devices"
          },
          "401": {
            "description": "Token invalide"
          }
        },
        "summary": "Récupérer tous les devices kiosk pour la licence de l'utilisateur",
        "tags": [
          "KioskDevice"
        ]
      }
    },
    "/api/kioskDevice/getKioskDevicesInAllOffices/{userSessionKey}": {
      "get": {
        "operationId": "KioskDeviceController_getKioskDevicesInAllOffices",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "description": "JWT token utilisateur",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de tous les devices"
          },
          "401": {
            "description": "Token invalide"
          }
        },
        "summary": "Récupérer tous les devices kiosk de toutes les licences",
        "tags": [
          "KioskDevice"
        ]
      }
    },
    "/api/kioskDevice/getKioskDeviceByExternalId/{externalId}": {
      "get": {
        "operationId": "KioskDeviceController_getKioskDeviceByExternalId",
        "parameters": [
          {
            "name": "externalId",
            "required": true,
            "in": "path",
            "description": "ExternalId du device",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Device trouvé (kioskDeviceInfo = device + kioskConfig format EasyDoct + kioskAnomalies)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetKioskDeviceByExternalIdResultDto"
                }
              }
            }
          },
          "404": {
            "description": "Device introuvable"
          }
        },
        "summary": "Récupérer un device kiosk par son ExternalId",
        "tags": [
          "KioskDevice"
        ]
      }
    },
    "/api/kioskTheme/saveUpdateKioskTheme": {
      "post": {
        "operationId": "KioskThemeController_saveUpdateKioskTheme",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "number",
                    "example": 1,
                    "description": "ID du thème (omis pour création, requis pour mise à jour)"
                  },
                  "name": {
                    "type": "string",
                    "example": "Theme Modern",
                    "description": "Nom du thème"
                  },
                  "base64JsonStyle": {
                    "type": "string",
                    "example": "eyJjb2xvcnMiOnsicHJpbWFyeSI6IiMwMDdiZmYifX0=",
                    "description": "Style JSON encodé en base64"
                  },
                  "externalId": {
                    "type": "string",
                    "example": "THEME-001"
                  },
                  "visibleId": {
                    "type": "string",
                    "example": "T001"
                  },
                  "creationUser": {
                    "type": "string",
                    "example": "admin@example.com"
                  },
                  "lastModificationUser": {
                    "type": "string",
                    "example": "admin@example.com"
                  },
                  "userSessionKey": {
                    "type": "string",
                    "description": "JWT token utilisateur (requis)"
                  }
                },
                "required": [
                  "name",
                  "userSessionKey"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Thème créé/mis à jour avec succès"
          },
          "401": {
            "description": "Token invalide"
          }
        },
        "summary": "Créer ou mettre à jour un thème kiosk",
        "tags": [
          "KioskTheme"
        ]
      }
    },
    "/api/kioskTheme/getKioskThemes/{userSessionKey}": {
      "get": {
        "operationId": "KioskThemeController_getKioskThemes",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "description": "JWT token utilisateur",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste des thèmes complets"
          },
          "401": {
            "description": "Token invalide"
          }
        },
        "summary": "Récupérer tous les thèmes kiosk complets",
        "tags": [
          "KioskTheme"
        ]
      }
    },
    "/api/kioskTheme/getLightKioskThemes/{userSessionKey}": {
      "get": {
        "operationId": "KioskThemeController_getLightKioskThemes",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "description": "JWT token utilisateur",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste des thèmes légers"
          },
          "401": {
            "description": "Token invalide"
          }
        },
        "summary": "Récupérer tous les thèmes kiosk légers (sans Base64JsonStyle)",
        "tags": [
          "KioskTheme"
        ]
      }
    },
    "/api/kioskTheme/deleteKioskTheme": {
      "post": {
        "operationId": "KioskThemeController_deleteKioskTheme",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "number",
                    "example": 1,
                    "description": "ID du thème à supprimer"
                  },
                  "userSessionKey": {
                    "type": "string",
                    "description": "JWT token utilisateur (requis)"
                  }
                },
                "required": [
                  "id",
                  "userSessionKey"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Thème supprimé avec succès"
          },
          "401": {
            "description": "Token invalide"
          },
          "404": {
            "description": "Thème introuvable"
          }
        },
        "summary": "Supprimer un thème kiosk",
        "tags": [
          "KioskTheme"
        ]
      }
    },
    "/api/kioskInformation/saveKioskInformation": {
      "post": {
        "operationId": "KioskInformation_SaveKioskInformation",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "userSessionKey": {
                    "type": "string",
                    "description": "JWT token utilisateur"
                  },
                  "name": {
                    "type": "string"
                  },
                  "information": {
                    "type": "string"
                  },
                  "imageUrl": {
                    "type": "string"
                  },
                  "enabled": {
                    "type": "boolean"
                  },
                  "examTypeIds": {
                    "type": "string"
                  },
                  "kioskInformationDisplayStep": {
                    "type": "number"
                  }
                },
                "required": [
                  "userSessionKey"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Information créée avec succès"
          },
          "401": {
            "description": "Token invalide"
          }
        },
        "summary": "Créer une nouvelle information kiosk",
        "tags": [
          "KioskInformation"
        ]
      }
    },
    "/api/kioskInformation/updateKioskInformation": {
      "post": {
        "operationId": "KioskInformation_UpdateKioskInformation",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "userSessionKey": {
                    "type": "string",
                    "description": "JWT token utilisateur"
                  },
                  "id": {
                    "type": "number",
                    "description": "ID de l'information à modifier"
                  },
                  "name": {
                    "type": "string"
                  },
                  "information": {
                    "type": "string"
                  },
                  "imageUrl": {
                    "type": "string"
                  },
                  "enabled": {
                    "type": "boolean"
                  }
                },
                "required": [
                  "userSessionKey",
                  "id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Information mise à jour avec succès"
          },
          "401": {
            "description": "Token invalide"
          },
          "404": {
            "description": "Information introuvable"
          }
        },
        "summary": "Mettre à jour une information kiosk existante",
        "tags": [
          "KioskInformation"
        ]
      }
    },
    "/api/kioskInformation/updateKioskInformationForReorder": {
      "post": {
        "operationId": "KioskInformation_UpdateKioskInformationForReorder",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "userSessionKey": {
                    "type": "string",
                    "description": "JWT token utilisateur"
                  },
                  "kioskInformationId": {
                    "type": "number",
                    "description": "ID de l'information à réordonner"
                  },
                  "targetKioskInformationGroupId": {
                    "type": "number",
                    "description": "ID du groupe cible (null = sans groupe)",
                    "nullable": true
                  },
                  "targetIndex": {
                    "type": "number",
                    "description": "Index cible dans la liste"
                  }
                },
                "required": [
                  "userSessionKey",
                  "kioskInformationId"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Ordre mis à jour avec succès"
          },
          "401": {
            "description": "Token invalide"
          },
          "404": {
            "description": "Information introuvable"
          }
        },
        "summary": "Mettre à jour l'ordre d'une information kiosk",
        "tags": [
          "KioskInformation"
        ]
      }
    },
    "/api/kioskInformation/getKioskInformations/{userSessionKey}": {
      "get": {
        "operationId": "KioskInformation_GetKioskInformations",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "description": "JWT token utilisateur",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste des informations"
          },
          "401": {
            "description": "Token invalide"
          }
        },
        "summary": "Récupérer toutes les informations kiosk",
        "tags": [
          "KioskInformation"
        ]
      }
    },
    "/api/kioskInformation/deleteKioskInformation/{userSessionKey}/{kioskInformationId}": {
      "post": {
        "operationId": "KioskInformation_DeleteKioskInformation",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "description": "JWT token utilisateur",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "kioskInformationId",
            "required": true,
            "in": "path",
            "description": "ID de l'information à supprimer",
            "schema": {
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Information supprimée avec succès"
          },
          "401": {
            "description": "Token invalide"
          },
          "404": {
            "description": "Information introuvable"
          }
        },
        "summary": "Supprimer une information kiosk",
        "tags": [
          "KioskInformation"
        ]
      }
    },
    "/api/examType/getExamTypes/{userSessionKey}": {
      "get": {
        "operationId": "ExamTypeController_getExamTypes",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "description": "JWT token utilisateur",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste des types d'examens"
          }
        },
        "summary": "Récupérer les types d'examens depuis EasyDoct (préfixes de tickets locaux fusionnés)",
        "tags": [
          "ExamTypes"
        ]
      }
    },
    "/api/examType/updateKioskTicketPrefix": {
      "post": {
        "operationId": "ExamTypeController_updateKioskTicketPrefix",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "userSessionKey": {
                    "type": "string"
                  },
                  "examTypeId": {
                    "type": "number"
                  },
                  "prefix": {
                    "type": "string"
                  }
                },
                "required": [
                  "userSessionKey",
                  "examTypeId"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Préfixe mis à jour"
          }
        },
        "summary": "Mettre à jour le préfixe de ticket d'un type d'examen (stockage local)",
        "tags": [
          "ExamTypes"
        ]
      }
    },
    "/api/practitioner/getPractitionerResources/{token}": {
      "get": {
        "operationId": "PractitionerController_getPractitionerResources",
        "parameters": [
          {
            "name": "token",
            "required": true,
            "in": "path",
            "description": "JWT token utilisateur",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste des ressources praticiens"
          },
          "401": {
            "description": "Token invalide ou expiré"
          }
        },
        "summary": "Praticiens (EasyDoct forwardé ; route config du contrat en saveur libre)",
        "tags": [
          "Practitioner"
        ]
      }
    },
    "/api/room/getRoomResourcesWithExamTypes/{token}": {
      "get": {
        "operationId": "RoomController_getRoomResourcesWithExamTypes",
        "parameters": [
          {
            "name": "token",
            "required": true,
            "in": "path",
            "description": "JWT token utilisateur",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste des salles avec types d'examens"
          },
          "401": {
            "description": "Token invalide ou expiré"
          }
        },
        "summary": "Salles (EasyDoct forwardé ; route config du contrat en saveur libre)",
        "tags": [
          "Room"
        ]
      }
    },
    "/api/kioskInformationGroup/saveUpdateKioskInformationGroup": {
      "post": {
        "operationId": "KioskInformationGroup_SaveUpdateKioskInformationGroup",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "userSessionKey": {
                    "type": "string",
                    "description": "JWT token utilisateur"
                  },
                  "Id": {
                    "type": "number",
                    "description": "ID du groupe (0 pour création)"
                  },
                  "name": {
                    "type": "string",
                    "description": "Nom du groupe (max 100 caractères)"
                  }
                },
                "required": [
                  "userSessionKey"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Groupe créé/mis à jour avec succès"
          },
          "401": {
            "description": "Token invalide"
          }
        },
        "summary": "Créer ou mettre à jour un groupe d'informations kiosk",
        "tags": [
          "KioskInformationGroup"
        ]
      }
    },
    "/api/kioskInformationGroup/getKioskInformationGroups/{userSessionKey}": {
      "get": {
        "operationId": "KioskInformationGroup_GetKioskInformationGroups",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "description": "JWT token utilisateur",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste des groupes d'informations"
          },
          "401": {
            "description": "Token invalide"
          }
        },
        "summary": "Récupérer tous les groupes d'informations kiosk",
        "tags": [
          "KioskInformationGroup"
        ]
      }
    },
    "/api/kioskInformationGroup/deleteKioskInformationGroup/{kioskInformationGroupId}/{userSessionKey}": {
      "post": {
        "operationId": "KioskInformationGroup_DeleteKioskInformationGroup",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "description": "JWT token utilisateur",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "kioskInformationGroupId",
            "required": true,
            "in": "path",
            "description": "ID du groupe à supprimer",
            "schema": {
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Groupe supprimé avec succès"
          },
          "401": {
            "description": "Token invalide"
          }
        },
        "summary": "Supprimer un groupe d'informations kiosk",
        "tags": [
          "KioskInformationGroup"
        ]
      }
    },
    "/api/kioskInformationGroup/moveKioskInformationGroup/{kioskInformationGroupId}/{moveLeft}": {
      "post": {
        "operationId": "KioskInformationGroup_MoveKioskInformationGroup",
        "parameters": [
          {
            "name": "kioskInformationGroupId",
            "required": true,
            "in": "path",
            "description": "ID du groupe à déplacer",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "moveLeft",
            "required": true,
            "in": "path",
            "description": "true pour déplacer vers la gauche, false vers la droite",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "userSessionKey",
            "required": true,
            "in": "query",
            "description": "JWT token utilisateur",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Groupe déplacé avec succès"
          },
          "401": {
            "description": "Token invalide"
          }
        },
        "summary": "Déplacer un groupe d'informations kiosk",
        "tags": [
          "KioskInformationGroup"
        ]
      }
    },
    "/api/kioskCheckInCriteria/getKioskCheckInCriterias/{userSessionKey}": {
      "get": {
        "operationId": "KioskCheckInCriteria_GetKioskCheckInCriterias",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "description": "JWT token utilisateur",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste des critères"
          },
          "401": {
            "description": "Token invalide"
          }
        },
        "summary": "Récupérer tous les critères de check-in kiosk",
        "tags": [
          "KioskCheckInCriteria"
        ]
      }
    },
    "/api/kioskCheckInCriteria/saveKioskCheckInCriteria": {
      "post": {
        "operationId": "KioskCheckInCriteria_SaveKioskCheckInCriteria",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "userSessionKey": {
                    "type": "string"
                  },
                  "question": {
                    "type": "string"
                  },
                  "imageUrl": {
                    "type": "string"
                  },
                  "enabled": {
                    "type": "boolean"
                  },
                  "blockingOnYes": {
                    "type": "boolean"
                  },
                  "examTypeIds": {
                    "type": "string"
                  },
                  "examIds": {
                    "type": "string"
                  },
                  "deviceIds": {
                    "type": "string"
                  },
                  "commonKioskAnomalyIds": {
                    "type": "string"
                  },
                  "matchAnomalyConditionsType": {
                    "type": "number"
                  },
                  "kioskAnomalyId": {
                    "type": "number"
                  }
                },
                "required": [
                  "userSessionKey",
                  "question"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Critère créé avec succès"
          },
          "401": {
            "description": "Token invalide"
          }
        },
        "summary": "Créer un nouveau critère de check-in kiosk",
        "tags": [
          "KioskCheckInCriteria"
        ]
      }
    },
    "/api/kioskCheckInCriteria/updateKioskCheckInCriteria": {
      "post": {
        "operationId": "KioskCheckInCriteria_UpdateKioskCheckInCriteria",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "userSessionKey": {
                    "type": "string"
                  },
                  "kioskCheckInCriteriaId": {
                    "type": "number"
                  },
                  "question": {
                    "type": "string"
                  },
                  "imageUrl": {
                    "type": "string"
                  },
                  "enabled": {
                    "type": "boolean"
                  },
                  "blockingOnYes": {
                    "type": "boolean"
                  },
                  "examTypeIds": {
                    "type": "string"
                  },
                  "examIds": {
                    "type": "string"
                  },
                  "deviceIds": {
                    "type": "string"
                  },
                  "commonKioskAnomalyIds": {
                    "type": "string"
                  },
                  "kioskAnomalyMatchCondition": {
                    "type": "number"
                  },
                  "kioskAnomalyId": {
                    "type": "number"
                  }
                },
                "required": [
                  "userSessionKey",
                  "kioskCheckInCriteriaId"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Critère mis à jour avec succès"
          },
          "401": {
            "description": "Token invalide"
          }
        },
        "summary": "Mettre à jour un critère de check-in kiosk",
        "tags": [
          "KioskCheckInCriteria"
        ]
      }
    },
    "/api/kioskCheckInCriteria/deleteKioskCheckInCriteria/{userSessionKey}/{kioskCheckInCriteriaId}": {
      "post": {
        "operationId": "KioskCheckInCriteria_DeleteKioskCheckInCriteria",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "kioskCheckInCriteriaId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Critère supprimé avec succès"
          },
          "401": {
            "description": "Token invalide"
          }
        },
        "summary": "Supprimer un critère de check-in kiosk",
        "tags": [
          "KioskCheckInCriteria"
        ]
      }
    },
    "/api/kioskBoard/getKioskBoards/{userSessionKey}": {
      "get": {
        "operationId": "KioskBoardController_getKioskBoards",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste des tableaux d'affichage"
          }
        },
        "summary": "Récupérer les tableaux d'affichage",
        "tags": [
          "KioskBoard"
        ]
      }
    },
    "/api/kioskBoard/getKioskBoardsInAllOffices/{userSessionKey}": {
      "get": {
        "operationId": "KioskBoardController_getKioskBoardsInAllOffices",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste des tableaux d'affichage"
          }
        },
        "summary": "Récupérer les tableaux d'affichage de tous les cabinets",
        "tags": [
          "KioskBoard"
        ]
      }
    },
    "/api/kioskBoard/saveKioskBoard": {
      "post": {
        "operationId": "KioskBoardController_saveKioskBoard",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Tableau d'affichage créé"
          }
        },
        "summary": "Créer un tableau d'affichage",
        "tags": [
          "KioskBoard"
        ]
      }
    },
    "/api/kioskBoard/updateKioskBoard": {
      "post": {
        "operationId": "KioskBoardController_updateKioskBoard",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Tableau d'affichage mis à jour"
          }
        },
        "summary": "Mettre à jour un tableau d'affichage",
        "tags": [
          "KioskBoard"
        ]
      }
    },
    "/api/kioskBoard/deleteKioskBoard": {
      "post": {
        "operationId": "KioskBoardController_deleteKioskBoard",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Tableau d'affichage supprimé"
          }
        },
        "summary": "Supprimer un tableau d'affichage",
        "tags": [
          "KioskBoard"
        ]
      }
    },
    "/api/kioskBoard/getCallToKioskDeskKioskBoards/{userSessionKey}": {
      "get": {
        "operationId": "KioskBoardController_getCallToKioskDeskKioskBoards",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste des tableaux d'appel"
          }
        },
        "summary": "Récupérer les tableaux d'appel au bureau",
        "tags": [
          "KioskBoard"
        ]
      }
    },
    "/api/kioskBoard/getCallToKioskDeskKioskBoardsInAllOffices/{userSessionKey}": {
      "get": {
        "operationId": "KioskBoardController_getCallToKioskDeskKioskBoardsInAllOffices",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste des tableaux d'appel"
          }
        },
        "summary": "Récupérer les tableaux d'appel de tous les cabinets",
        "tags": [
          "KioskBoard"
        ]
      }
    },
    "/api/kioskBoard/getCallToKioskDeskKioskBoardCurrentUser/{userSessionKey}": {
      "get": {
        "operationId": "KioskBoardController_getCallToKioskDeskKioskBoardCurrentUser",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Tableau d'appel de l'utilisateur"
          }
        },
        "summary": "Récupérer le tableau d'appel de l'utilisateur courant",
        "tags": [
          "KioskBoard"
        ]
      }
    },
    "/api/kioskBoard/createCallToKioskDeskKioskBoard": {
      "post": {
        "operationId": "KioskBoardController_createCallToKioskDeskKioskBoard",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Tableau d'appel créé"
          }
        },
        "summary": "Créer un tableau d'appel au bureau",
        "tags": [
          "KioskBoard"
        ]
      }
    },
    "/api/kioskBoard/updateCallToKioskDeskKioskBoard": {
      "post": {
        "operationId": "KioskBoardController_updateCallToKioskDeskKioskBoard",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Tableau d'appel mis à jour"
          }
        },
        "summary": "Mettre à jour un tableau d'appel au bureau",
        "tags": [
          "KioskBoard"
        ]
      }
    },
    "/api/kioskBoard/deleteCallToKioskDeskKioskBoard": {
      "post": {
        "operationId": "KioskBoardController_deleteCallToKioskDeskKioskBoard",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Tableau d'appel supprimé"
          }
        },
        "summary": "Supprimer un tableau d'appel au bureau",
        "tags": [
          "KioskBoard"
        ]
      }
    },
    "/api/kioskDesk/getKioskDesks/{userSessionKey}": {
      "get": {
        "operationId": "KioskDeskController_getKioskDesks",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste des guichets"
          }
        },
        "summary": "Récupérer les guichets",
        "tags": [
          "KioskDesk"
        ]
      }
    },
    "/api/kioskDesk/getRemainingKioskDesks/{userSessionKey}": {
      "get": {
        "operationId": "KioskDeskController_getRemainingKioskDesks",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste des guichets restants"
          }
        },
        "summary": "Récupérer les guichets restants",
        "tags": [
          "KioskDesk"
        ]
      }
    },
    "/api/kioskDesk/getKioskDesksWithAssociatedUsers/{userSessionKey}": {
      "get": {
        "operationId": "KioskDeskController_getKioskDesksWithAssociatedUsers",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste des guichets avec utilisateurs"
          }
        },
        "summary": "Récupérer les guichets avec utilisateurs associés",
        "tags": [
          "KioskDesk"
        ]
      }
    },
    "/api/kioskDesk/saveKioskDesk": {
      "post": {
        "operationId": "KioskDeskController_saveKioskDesk",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Guichet créé"
          }
        },
        "summary": "Créer un guichet",
        "tags": [
          "KioskDesk"
        ]
      }
    },
    "/api/kioskDesk/updateKioskDesk": {
      "post": {
        "operationId": "KioskDeskController_updateKioskDesk",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Guichet mis à jour"
          }
        },
        "summary": "Mettre à jour un guichet",
        "tags": [
          "KioskDesk"
        ]
      }
    },
    "/api/kioskDesk/deleteKioskDesk": {
      "post": {
        "operationId": "KioskDeskController_deleteKioskDesk",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Guichet supprimé"
          }
        },
        "summary": "Supprimer un guichet",
        "tags": [
          "KioskDesk"
        ]
      }
    },
    "/api/user/getUsersDetail/{token}": {
      "get": {
        "operationId": "KioskDeskUserForwardController_getUsersDetail",
        "parameters": [
          {
            "name": "token",
            "required": true,
            "in": "path",
            "description": "JWT token utilisateur",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "{ officeUsersDetail: [...] }"
          },
          "401": {
            "description": "Token invalide ou expiré"
          }
        },
        "summary": "Utilisateurs du cabinet (EasyDoct forwardé ; liste vide en saveur libre)",
        "tags": [
          "User"
        ]
      }
    },
    "/api/kioskDeskRequestReason/getKioskDeskRequestReasons/{userSessionKey}": {
      "get": {
        "operationId": "KioskDeskRequestReasonController_getKioskDeskRequestReasons",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste des motifs"
          }
        },
        "summary": "Récupérer les motifs de demande guichet",
        "tags": [
          "KioskDeskRequestReason"
        ]
      }
    },
    "/api/kioskDeskRequestReason/saveKioskDeskRequestReason": {
      "post": {
        "operationId": "KioskDeskRequestReasonController_saveKioskDeskRequestReason",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Motif créé"
          }
        },
        "summary": "Créer un motif de demande guichet",
        "tags": [
          "KioskDeskRequestReason"
        ]
      }
    },
    "/api/kioskDeskRequestReason/updateKioskDeskRequestReason": {
      "post": {
        "operationId": "KioskDeskRequestReasonController_updateKioskDeskRequestReason",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Motif mis à jour"
          }
        },
        "summary": "Mettre à jour un motif de demande guichet",
        "tags": [
          "KioskDeskRequestReason"
        ]
      }
    },
    "/api/kioskDeskRequestReason/moveKioskDeskRequestReason/{kioskDeskRequestReasonId}/{moveLeft}": {
      "post": {
        "operationId": "KioskDeskRequestReasonController_moveKioskDeskRequestReason",
        "parameters": [
          {
            "name": "kioskDeskRequestReasonId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "moveLeft",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Motif déplacé"
          }
        },
        "summary": "Déplacer un motif de demande guichet dans l'ordre d'affichage",
        "tags": [
          "KioskDeskRequestReason"
        ]
      }
    },
    "/api/kioskDeskRequestReason/deleteKioskDeskRequestReason": {
      "post": {
        "operationId": "KioskDeskRequestReasonController_deleteKioskDeskRequestReason",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Motif supprimé"
          }
        },
        "summary": "Supprimer un motif de demande guichet",
        "tags": [
          "KioskDeskRequestReason"
        ]
      }
    },
    "/api/kioskTicket/reserve": {
      "post": {
        "operationId": "KioskTicketController_reserve",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "kioskDeviceExternalId",
                  "officePlaceId",
                  "reservationUid"
                ],
                "properties": {
                  "kioskDeviceExternalId": {
                    "type": "string"
                  },
                  "officePlaceId": {
                    "type": "number"
                  },
                  "reservationUid": {
                    "type": "string",
                    "description": "Uid unique par tentative logique — même uid ⇒ même numéro"
                  },
                  "prefix": {
                    "type": "string",
                    "nullable": true,
                    "description": "Préfixe RDV calculé côté borne"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Réservation (number, formattedNumber, status)"
          }
        },
        "summary": "Réserver un numéro de ticket avant le check-in contrat (idempotent par reservationUid)",
        "tags": [
          "KioskTicket"
        ]
      }
    },
    "/api/kioskTicket/confirm": {
      "post": {
        "operationId": "KioskTicketController_confirm",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "reservationUid"
                ],
                "properties": {
                  "reservationUid": {
                    "type": "string"
                  },
                  "contractAppointmentId": {
                    "type": "string",
                    "nullable": true
                  },
                  "patientDisplayName": {
                    "type": "string",
                    "nullable": true,
                    "deprecated": true,
                    "description": "IGNORÉ — le nom du patient n'est jamais persisté (donnée sensible)"
                  },
                  "examLabel": {
                    "type": "string",
                    "nullable": true
                  },
                  "kioskCheckinAnomalyIds": {
                    "type": "array",
                    "items": {
                      "type": "integer"
                    },
                    "nullable": true
                  },
                  "paramedicCheckIn": {
                    "type": "boolean",
                    "description": "Check-in effectué par un accompagnant/brancardier (mode paramédical)"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Réservation confirmée"
          }
        },
        "summary": "Confirmer une réservation après succès du check-in (détails Suivi)",
        "tags": [
          "KioskTicket"
        ]
      }
    },
    "/api/kioskTicket/issueForAppointment": {
      "post": {
        "operationId": "KioskTicketController_issueForAppointment",
        "parameters": [
          {
            "name": "authorization",
            "required": true,
            "in": "header",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Authorization",
            "in": "header",
            "description": "brandAuthorizationKey de la licence (KioskReactorSetting)",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "officePlaceId",
                  "requestUid"
                ],
                "properties": {
                  "licenceUuid": {
                    "type": "string",
                    "nullable": true,
                    "description": "UUID de la licence ApiBorne — identification de RÉFÉRENCE (admin, page Connectivité), prime sur tout autre identifiant"
                  },
                  "officeVisibleId": {
                    "type": "string",
                    "nullable": true,
                    "description": "Uuid de l'office éditeur (EasyDoct : Office.VisibleId) — repli des intégrations historiques qui n'envoient pas le licenceUuid"
                  },
                  "brandId": {
                    "type": "string",
                    "nullable": true,
                    "description": "BrandId KioskReactor de la licence (requis sans officeVisibleId/licenceUuid ; sinon vérifié)"
                  },
                  "officeId": {
                    "type": "string",
                    "nullable": true,
                    "description": "Id office éditeur — repli legacy via integrationEasyDocts"
                  },
                  "officePlaceId": {
                    "type": "number",
                    "description": "Id du lieu de soins du RDV — sert à la séquence par lieu ET au décalage de numérotation configuré par lieu (Numéros de ticket)"
                  },
                  "requestUid": {
                    "type": "string",
                    "description": "Uid d'idempotence, UNIQUE PAR GÉNÉRATION (rejeu réseau seulement — une re-génération legacy consomme un nouveau numéro)"
                  },
                  "prefix": {
                    "type": "string",
                    "nullable": true,
                    "description": "Préfixe explicite (démo/compat). Absent → calculé ICI depuis la conf Mongo (enableTicketExamTypePrefix + examTypeTicketPrefixes, repli 2 lettres du type)"
                  },
                  "examTypeId": {
                    "type": "number",
                    "nullable": true,
                    "description": "Id du type d'examen (référentiel éditeur) — pour le préfixe calculé"
                  },
                  "examTypeLabel": {
                    "type": "string",
                    "nullable": true,
                    "description": "Libellé du type d'examen — repli du préfixe calculé"
                  },
                  "contractAppointmentId": {
                    "type": "string",
                    "nullable": true,
                    "description": "Id contrat du RDV ({id}~{visibleId})"
                  },
                  "patientDisplayName": {
                    "type": "string",
                    "nullable": true,
                    "deprecated": true,
                    "description": "IGNORÉ — le nom du patient n'est jamais persisté (donnée sensible)"
                  },
                  "examLabel": {
                    "type": "string",
                    "nullable": true
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "{ number, formattedNumber, day }"
          }
        },
        "summary": "Émettre un ticket pour une arrivée pointée dans EasyDoct (flag UseExternalConfiguration) — même séquence que la borne, ticket confirmé visible au Cockpit, idempotent par requestUid",
        "tags": [
          "KioskTicket"
        ]
      }
    },
    "/api/kioskTicket/appointmentStatusChanged": {
      "post": {
        "operationId": "KioskTicketController_appointmentStatusChanged",
        "parameters": [
          {
            "name": "authorization",
            "required": true,
            "in": "header",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Authorization",
            "in": "header",
            "description": "brandAuthorizationKey de la licence (KioskReactorSetting)",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "contractAppointmentId",
                  "status"
                ],
                "properties": {
                  "officeVisibleId": {
                    "type": "string",
                    "nullable": true,
                    "description": "Uuid de l'office éditeur — repli des intégrations historiques (licenceUuid prime)"
                  },
                  "licenceUuid": {
                    "type": "string",
                    "nullable": true,
                    "description": "UUID de la licence ApiBorne — identification de référence (admin, page Connectivité)"
                  },
                  "brandId": {
                    "type": "string",
                    "nullable": true,
                    "description": "Requis sans officeVisibleId/licenceUuid"
                  },
                  "officeId": {
                    "type": "string",
                    "nullable": true,
                    "description": "Repli legacy (integrationEasyDocts)"
                  },
                  "contractAppointmentId": {
                    "type": "string",
                    "description": "Id contrat du RDV ({id}~{visibleId})"
                  },
                  "status": {
                    "type": "string",
                    "enum": [
                      "scheduled",
                      "checkedIn",
                      "inCare",
                      "done",
                      "cancelled"
                    ],
                    "description": "État courant du RDV (référentiel contrat)"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "{ updated: nombre de tickets mis à jour }"
          }
        },
        "summary": "Notification push d'EasyDoct (UseExternalConfiguration) à chaque changement d'état d'un RDV — met à jour externalStatus des tickets du jour, invalide le cache Cockpit et émet l'event Firestore",
        "tags": [
          "KioskTicket"
        ]
      }
    },
    "/api/kioskTicket/cancelForAppointment": {
      "post": {
        "operationId": "KioskTicketController_cancelForAppointment",
        "parameters": [
          {
            "name": "authorization",
            "required": true,
            "in": "header",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Authorization",
            "in": "header",
            "description": "brandAuthorizationKey de la licence (KioskReactorSetting)",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "contractAppointmentId"
                ],
                "properties": {
                  "officeVisibleId": {
                    "type": "string",
                    "nullable": true,
                    "description": "Uuid de l'office éditeur — repli des intégrations historiques (licenceUuid prime)"
                  },
                  "licenceUuid": {
                    "type": "string",
                    "nullable": true,
                    "description": "UUID de la licence ApiBorne — identification de référence (admin, page Connectivité)"
                  },
                  "brandId": {
                    "type": "string",
                    "nullable": true,
                    "description": "Requis sans officeVisibleId/licenceUuid"
                  },
                  "officeId": {
                    "type": "string",
                    "nullable": true,
                    "description": "Repli legacy (integrationEasyDocts)"
                  },
                  "contractAppointmentId": {
                    "type": "string",
                    "description": "Id contrat du RDV ({id}~{visibleId})"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "{ cancelled: nombre de tickets annulés }"
          }
        },
        "summary": "Annulation par l'éditeur des tickets du jour d'un RDV (refaire l'accueil) : tickets passés `cancelled`, retirés du Cockpit ; le prochain passage borne réserve un nouveau numéro",
        "tags": [
          "KioskTicket"
        ]
      }
    },
    "/api/kioskTicket/getCheckinNotifySettings": {
      "post": {
        "operationId": "KioskTicketController_getCheckinNotifySettings",
        "parameters": [
          {
            "name": "authorization",
            "required": true,
            "in": "header",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Authorization",
            "in": "header",
            "description": "brandAuthorizationKey de la licence (KioskReactorSetting)",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "officeVisibleId": {
                    "type": "string",
                    "nullable": true,
                    "description": "Uuid de l'office éditeur — repli des intégrations historiques (licenceUuid prime)"
                  },
                  "licenceUuid": {
                    "type": "string",
                    "nullable": true
                  },
                  "brandId": {
                    "type": "string",
                    "nullable": true,
                    "description": "Requis sans officeVisibleId/licenceUuid"
                  },
                  "officeId": {
                    "type": "string",
                    "nullable": true,
                    "description": "Repli legacy"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "{ settings: [entrée globale (officePlaceId null) + entrées par lieu] }"
          }
        },
        "summary": "Réglages « Accueil RIS » (checkInSystemNotifySettings) de la licence, lus par EasyDoct quand UseExternalConfiguration est actif — la conf Mongo (admin ApiBorne) est la source de vérité des conditions de notification",
        "tags": [
          "KioskTicket"
        ]
      }
    },
    "/api/kioskTicket/printTicket": {
      "post": {
        "operationId": "KioskTicketController_printTicket",
        "parameters": [
          {
            "name": "authorization",
            "required": true,
            "in": "header",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Authorization",
            "in": "header",
            "description": "brandAuthorizationKey de la licence (KioskReactorSetting)",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "officePlaceId"
                ],
                "properties": {
                  "officeVisibleId": {
                    "type": "string",
                    "nullable": true,
                    "description": "Uuid de l'office éditeur (résolution prioritaire)"
                  },
                  "licenceUuid": {
                    "type": "string",
                    "nullable": true
                  },
                  "brandId": {
                    "type": "string",
                    "nullable": true
                  },
                  "officeId": {
                    "type": "string",
                    "nullable": true
                  },
                  "officePlaceId": {
                    "type": "number",
                    "description": "Lieu du RDV — sélectionne la borne cible"
                  },
                  "kioskDeskId": {
                    "type": "number",
                    "nullable": true,
                    "description": "Guichet du demandeur — son imprimante bureau est prioritaire si configurée"
                  },
                  "language": {
                    "type": "string",
                    "nullable": true,
                    "description": "Variante de template (fr par défaut)"
                  },
                  "data": {
                    "type": "object",
                    "nullable": true,
                    "description": "Données Mustache du ticket (contexte minimal : numéro, patient, examen…) — clés dupliquées Pascal/camel au rendu"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "{ printed, deviceExternalId }"
          }
        },
        "summary": "Réimpression d'un ticket demandée par l'éditeur (UseExternalConfiguration) — template Mustache, borne cible et IP résolus depuis la conf Mongo, commande envoyée au cloud KioskReactor",
        "tags": [
          "KioskTicket"
        ]
      }
    },
    "/api/kioskTicket/release": {
      "post": {
        "operationId": "KioskTicketController_release",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "reservationUid"
                ],
                "properties": {
                  "reservationUid": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Réservation relâchée"
          }
        },
        "summary": "Relâcher une réservation après échec du check-in (statut failed)",
        "tags": [
          "KioskTicket"
        ]
      }
    },
    "/api/kioskTicket/createKioskDeskRequest": {
      "post": {
        "operationId": "KioskTicketController_createKioskDeskRequest",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "kioskDeviceExternalId",
                  "officePlaceId",
                  "requestUid"
                ],
                "properties": {
                  "kioskDeviceExternalId": {
                    "type": "string"
                  },
                  "officePlaceId": {
                    "type": "number"
                  },
                  "requestUid": {
                    "type": "string"
                  },
                  "kioskDeskRequestReasonId": {
                    "type": "number",
                    "nullable": true
                  },
                  "cause": {
                    "type": "string"
                  },
                  "firstName": {
                    "type": "string"
                  },
                  "lastName": {
                    "type": "string"
                  },
                  "kioskRequestType": {
                    "type": "number",
                    "nullable": true,
                    "description": "1 = ticket de sortie (SOR), sinon REQ"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Forme legacy { appointmentTicketNumber, appointmentTicketNumberWithPrefix }"
          }
        },
        "summary": "Créer une demande guichet (numéro + persistance, forme legacy en retour, idempotent par requestUid)",
        "tags": [
          "KioskTicket"
        ]
      }
    },
    "/api/kioskTicket/getKioskTickets/{userSessionKey}": {
      "get": {
        "operationId": "KioskTicketController_getKioskTickets",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "day",
            "required": false,
            "in": "query",
            "description": "Jour YYYY-MM-DD (Europe/Paris)",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste des tickets, tri heure desc"
          }
        },
        "summary": "Suivi admin : tickets RDV du jour (défaut jour courant, borné aux 7 derniers)",
        "tags": [
          "KioskTicket"
        ]
      }
    },
    "/api/kioskTicket/getKioskDeskRequests/{userSessionKey}": {
      "get": {
        "operationId": "KioskTicketController_getKioskDeskRequests",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "day",
            "required": false,
            "in": "query",
            "description": "Jour YYYY-MM-DD (Europe/Paris)",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste des demandes, tri heure desc"
          }
        },
        "summary": "Suivi admin : demandes guichet du jour (défaut jour courant, borné aux 7 derniers)",
        "tags": [
          "KioskTicket"
        ]
      }
    },
    "/api/cockpit/signIn": {
      "post": {
        "operationId": "CockpitController_signIn",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "login",
                  "password"
                ],
                "properties": {
                  "login": {
                    "type": "string"
                  },
                  "password": {
                    "type": "string"
                  },
                  "sources": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "local",
                        "external"
                      ]
                    },
                    "description": "Sources à tenter (défaut : toutes)"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "{ pendingSessionKey, offices: [{licenceId, name}] }"
          }
        },
        "summary": "Login Cockpit étape 1 : valide les identifiants et renvoie les licences accessibles. Le serveur gère toujours les deux sources ('local' = comptes ApiBorne, 'external' = éditeur via le contrat staff/sign-in) ; le client choisit celles à tenter via `sources`",
        "tags": [
          "Cockpit"
        ]
      }
    },
    "/api/cockpit/signInLicence": {
      "post": {
        "operationId": "CockpitController_signInLicence",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "pendingSessionKey",
                  "licenceId"
                ],
                "properties": {
                  "pendingSessionKey": {
                    "type": "string"
                  },
                  "licenceId": {
                    "type": "number"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "{ userSessionKey, userFirstNameLastName, email }"
          }
        },
        "summary": "Login Cockpit étape 2 : établit la session sur une licence (JWT userSessionKey)",
        "tags": [
          "Cockpit"
        ]
      }
    },
    "/api/cockpit/getOfficeConfig/{userSessionKey}": {
      "get": {
        "operationId": "CockpitController_getOfficeConfig",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "userConfig + kioskConfig.features + userAgendaSettings"
          }
        },
        "summary": "Équivalent minimal du officeConfig EasyDoct consommé par le Cockpit",
        "tags": [
          "Cockpit"
        ]
      }
    },
    "/api/cockpit/getKioskDeskId/{userSessionKey}": {
      "get": {
        "operationId": "CockpitController_getKioskDeskId",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Guichet occupé par l'utilisateur + email",
        "tags": [
          "Cockpit"
        ]
      }
    },
    "/api/cockpit/getCallToKioskDeskKioskBoards/{userSessionKey}": {
      "get": {
        "operationId": "CockpitController_getBoards",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Boards de la licence (AppointmentStatesList en tableau)",
        "tags": [
          "Cockpit"
        ]
      }
    },
    "/api/cockpit/getCallToKioskDeskKioskBoardCurrentUser/{userSessionKey}": {
      "get": {
        "operationId": "CockpitController_getCurrentUserBoard",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Board lié au guichet occupé par l'utilisateur",
        "tags": [
          "Cockpit"
        ]
      }
    },
    "/api/cockpit/getKioskDesksWithAssociatedUsers/{userSessionKey}": {
      "get": {
        "operationId": "CockpitController_getKioskDesksWithAssociatedUsers",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Guichets + utilisateur occupant (jointure cockpitUserSettings)",
        "tags": [
          "Cockpit"
        ]
      }
    },
    "/api/cockpit/updateTicketStatus": {
      "post": {
        "operationId": "CockpitController_updateTicketStatus",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "userSessionKey",
                  "kioskTicketId"
                ],
                "properties": {
                  "userSessionKey": {
                    "type": "string"
                  },
                  "kioskTicketId": {
                    "type": "number"
                  },
                  "status": {
                    "type": "string",
                    "description": "Défaut : 'next' (avance d'un cran)"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "{ externalStatus }"
          }
        },
        "summary": "Change le statut du RDV lié à un ticket chez l'éditeur externe (contrat PUT /appointments/{id}/status) — status: 'next' | 'checkedIn' | 'inCare' | 'done'",
        "tags": [
          "Cockpit"
        ]
      }
    },
    "/api/cockpit/getKioskAppointments/{userSessionKey}": {
      "get": {
        "operationId": "CockpitController_getKioskAppointments",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "freshIds",
            "required": false,
            "in": "query",
            "description": "Ids (CSV) dont l'état vient de changer (signal Firestore) : ids tickets apiborne ou ids RDV éditeur — le cache de réconciliation est bypassé pour ces RDV",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Tickets RDV du jour réconciliés avec l'agenda de l'éditeur externe (source de vérité) — annulés/supprimés exclus, externalStatus exposé",
        "tags": [
          "Cockpit"
        ]
      }
    },
    "/api/cockpit/updateUserAgendaDisplaySetting": {
      "post": {
        "operationId": "CockpitController_updateUserAgendaDisplaySetting",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "userSessionKey": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "{ HasError, kioskDeskIdModifed }"
          }
        },
        "summary": "Sauvegarde des réglages board de l'utilisateur (payload legacy)",
        "tags": [
          "Cockpit"
        ]
      }
    },
    "/api/cockpit/getKioskDeskRequests/{userSessionKey}/{officePlaceId}": {
      "get": {
        "operationId": "CockpitController_getKioskDeskRequests",
        "parameters": [
          {
            "name": "userSessionKey",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "officePlaceId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Demandes guichet du jour d'un lieu (forme wire EasyDoct)",
        "tags": [
          "Cockpit"
        ]
      }
    },
    "/api/cockpit/callToKioskDeskRequest": {
      "post": {
        "operationId": "CockpitController_callToKioskDeskRequest",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "userSessionKey",
                  "kioskDeskRequestId"
                ],
                "properties": {
                  "userSessionKey": {
                    "type": "string"
                  },
                  "kioskDeskRequestId": {
                    "type": "number"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Appelle une demande au guichet occupé par l'utilisateur",
        "tags": [
          "Cockpit"
        ]
      }
    },
    "/api/cockpit/cancelCallToKioskDeskRequest": {
      "post": {
        "operationId": "CockpitController_cancelCallToKioskDeskRequest",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "userSessionKey",
                  "kioskDeskRequestId"
                ],
                "properties": {
                  "userSessionKey": {
                    "type": "string"
                  },
                  "kioskDeskRequestId": {
                    "type": "number"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Annule l'appel d'une demande (retour en attente)",
        "tags": [
          "Cockpit"
        ]
      }
    },
    "/api/cockpit/callTicketToDesk": {
      "post": {
        "operationId": "CockpitController_callTicketToDesk",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "userSessionKey",
                  "kioskTicketId"
                ],
                "properties": {
                  "userSessionKey": {
                    "type": "string"
                  },
                  "kioskTicketId": {
                    "type": "number"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Appelle un patient accueilli (ticket) au guichet occupé par l'utilisateur",
        "tags": [
          "Cockpit"
        ]
      }
    },
    "/api/cockpit/cancelCallTicket": {
      "post": {
        "operationId": "CockpitController_cancelCallTicket",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "userSessionKey",
                  "kioskTicketId"
                ],
                "properties": {
                  "userSessionKey": {
                    "type": "string"
                  },
                  "kioskTicketId": {
                    "type": "number"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Annule l'appel d'un patient accueilli (retour en attente)",
        "tags": [
          "Cockpit"
        ]
      }
    },
    "/api/cockpit/updateKioskDeskRequest": {
      "post": {
        "operationId": "CockpitController_updateKioskDeskRequest",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "userSessionKey",
                  "Id"
                ],
                "properties": {
                  "userSessionKey": {
                    "type": "string"
                  },
                  "Id": {
                    "type": "number"
                  },
                  "Processed": {
                    "type": "boolean"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Met à jour une demande (bascule Processed)",
        "tags": [
          "Cockpit"
        ]
      }
    },
    "/kiosk-reactor/brands": {
      "get": {
        "operationId": "listKioskReactorBrands",
        "parameters": [],
        "responses": {
          "200": {
            "description": "[{ brandId, brandName, contactEmail }]"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Lister les companies (brands) KioskReactor par nom — sans les clés",
        "tags": [
          "KioskReactor"
        ]
      },
      "post": {
        "operationId": "createKioskReactorBrand",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "brandName"
                ],
                "properties": {
                  "brandName": {
                    "type": "string",
                    "description": "Nom de la company"
                  },
                  "contactEmail": {
                    "type": "string",
                    "nullable": true
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Credentials de la company créée"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Créer une NOUVELLE company KioskReactor (brand + projet « ApiBorne » par défaut, clés UUID) — n'affecte aucun document existant",
        "tags": [
          "KioskReactor"
        ]
      }
    },
    "/kiosk-reactor/brands/{brandId}": {
      "get": {
        "operationId": "getKioskReactorBrand",
        "parameters": [
          {
            "name": "brandId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "{ brandId, brandName, brandAuthorizationKey, projects: [{ id, name, authKey }] }"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Credentials d'une company (clé de marque + projets)",
        "tags": [
          "KioskReactor"
        ]
      }
    },
    "/support/contact": {
      "post": {
        "operationId": "SupportController_contact",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "example": "John Doe"
                  },
                  "email": {
                    "type": "string",
                    "example": "user@example.com"
                  },
                  "phone": {
                    "type": "string",
                    "example": "+33 6 12 34 56 78"
                  },
                  "message": {
                    "type": "string",
                    "example": "Bonjour, j’ai une question…"
                  }
                },
                "required": [
                  "email",
                  "message"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Message envoyé au support"
          },
          "400": {
            "description": "Email ou message manquant"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ],
        "summary": "Envoyer un message au support",
        "tags": [
          "Support"
        ]
      }
    }
  },
  "info": {
    "title": "API ApiBorne",
    "description": "API de gestion des utilisateurs, licences et authentification",
    "version": "1.0",
    "contact": {}
  },
  "tags": [],
  "servers": [],
  "components": {
    "securitySchemes": {
      "bearer": {
        "scheme": "bearer",
        "bearerFormat": "JWT",
        "type": "http"
      }
    },
    "schemas": {
      "XKioskDeviceDto": {
        "type": "object",
        "properties": {}
      },
      "XKioskConfigDto": {
        "type": "object",
        "properties": {
          "KioskReactorSetting": {
            "type": "object",
            "description": "Bloc KioskReactorSetting (feuilles camelCase)"
          },
          "KioskReactorSettingFeatures": {
            "type": "object"
          },
          "KioskReactorSettingMessages": {
            "type": "object"
          },
          "KioskReactorSettingPrinterCodes": {
            "type": "object"
          },
          "KioskReactorSettingCheckinAppointmentDetail": {
            "type": "object",
            "description": "Détail check-in global (officePlaceId null)"
          },
          "KioskReactorSettingCheckinAppointmentDetails": {
            "description": "Détails check-in par lieu du device",
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "KioskReactorDirectAdmissionSetting": {
            "type": "object"
          },
          "KioskReactorSettingDisplay": {
            "type": "object"
          },
          "KioskReactorSettingPatientInfoBookingOptions": {
            "type": "object"
          },
          "KioskReactorSettingRequestMessages": {
            "description": "Toujours vide côté ApiBorne (pas de collection)",
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "KioskReactorSettingWrongPlaceMessageDetails": {
            "description": "Toujours vide côté ApiBorne (pas de collection)",
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "KioskReactorSettingPatientLateAnomalies": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "KioskReactorSettingPatientAgeAnomalies": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "KioskReactorSettingRequiredDocumentLabels": {
            "description": "XKioskRequiredDocumentLabel[] (PascalCase : AppointmentFileType, CustomLabel, AvailableOnPhone)",
            "type": "array",
            "items": {
              "type": "object"
            }
          }
        },
        "required": [
          "KioskReactorSetting",
          "KioskReactorSettingFeatures",
          "KioskReactorSettingMessages",
          "KioskReactorSettingPrinterCodes",
          "KioskReactorSettingCheckinAppointmentDetail",
          "KioskReactorSettingCheckinAppointmentDetails",
          "KioskReactorDirectAdmissionSetting",
          "KioskReactorSettingDisplay",
          "KioskReactorSettingPatientInfoBookingOptions",
          "KioskReactorSettingRequestMessages",
          "KioskReactorSettingWrongPlaceMessageDetails",
          "KioskReactorSettingPatientLateAnomalies",
          "KioskReactorSettingPatientAgeAnomalies",
          "KioskReactorSettingRequiredDocumentLabels"
        ]
      },
      "XKioskAnomalyByExternalIdDto": {
        "type": "object",
        "properties": {
          "Global": {
            "type": "boolean",
            "description": "Anomalie commune (non liée à une licence)"
          },
          "Description": {
            "type": "string",
            "nullable": true
          },
          "Name": {
            "type": "string"
          },
          "Color": {
            "type": "string",
            "nullable": true
          },
          "Code": {
            "type": "string",
            "nullable": true,
            "description": "Code métier vendor-neutral (ex 'DI', 'PR')"
          },
          "Id": {
            "type": "number"
          },
          "KeepForAppointment": {
            "type": "boolean"
          }
        },
        "required": [
          "Global",
          "Name",
          "Id",
          "KeepForAppointment"
        ]
      },
      "XKioskDeviceInfoDto": {
        "type": "object",
        "properties": {
          "kioskDevice": {
            "$ref": "#/components/schemas/XKioskDeviceDto"
          },
          "kioskConfig": {
            "nullable": true,
            "description": "null si la licence du device n’a pas de KioskReactorSetting",
            "allOf": [
              {
                "$ref": "#/components/schemas/XKioskConfigDto"
              }
            ]
          },
          "kioskAnomalies": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/XKioskAnomalyByExternalIdDto"
            }
          },
          "kioskDeskRequestReasons": {
            "description": "Motifs de requête guichet (clé ApiBorne, absente de la réponse EasyDoct) — champs PascalCase legacy (Id, Name, Description, PrintTicket, OfficePlaceIds…), ordonnés par la chaîne Previous/Next",
            "type": "array",
            "items": {
              "type": "object"
            }
          }
        },
        "required": [
          "kioskDevice",
          "kioskAnomalies"
        ]
      },
      "GetKioskDeviceByExternalIdResultDto": {
        "type": "object",
        "properties": {
          "kioskDeviceInfo": {
            "$ref": "#/components/schemas/XKioskDeviceInfoDto"
          }
        }
      }
    }
  }
}