{
    "openapi": "3.0.0",
    "info": {
        "title": "F-RH — API RH",
        "description": "API des modules Effectifs, Recrutement, Congés & absences, Documents, Performance, Paie et Paramètres (authentification, structure organisationnelle, collaborateurs, pipeline de recrutement, congés, documents, entretiens de performance, bulletins de paie). Backend Laravel sans ORM — toutes les routes interrogent la base via le Query Builder.",
        "contact": {
            "email": "dev@f-rh.fr"
        },
        "version": "1.0.0"
    },
    "servers": [
        {
            "url": "https://rh.leruisseau.name/api_rh/public",
            "description": "Environnement de développement"
        }
    ],
    "paths": {
        "/api/public/first-login": {
            "post": {
                "tags": [
                    "Authentification"
                ],
                "summary": "Demander son lien de première connexion",
                "description": "Aucune authentification requise. Vérifie que l'e-mail correspond à un compte en attente d'activation, génère un lien valable 7 jours et l'envoie par e-mail.",
                "operationId": "1ba28f04a1d0bd6a30984eec99559851",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "email"
                                ],
                                "properties": {
                                    "email": {
                                        "type": "string",
                                        "format": "email",
                                        "example": "i.benali@atrium.co"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Lien envoyé par e-mail"
                    },
                    "404": {
                        "description": "Aucun compte trouvé avec cette adresse"
                    },
                    "422": {
                        "description": "Compte déjà activé, ou erreur de validation"
                    }
                }
            }
        },
        "/api/public/activation/{token}": {
            "get": {
                "tags": [
                    "Authentification"
                ],
                "summary": "Vérifier un lien d'activation de compte",
                "description": "Aucune authentification requise. Retourne le nom/e-mail du compte si le lien est valide, non expiré, et pas déjà utilisé.",
                "operationId": "fccb2bbd3ee66300e251de174f53143a",
                "parameters": [
                    {
                        "name": "token",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "404": {
                        "description": "Lien invalide, expiré ou déjà utilisé"
                    }
                }
            },
            "post": {
                "tags": [
                    "Authentification"
                ],
                "summary": "Créer son mot de passe (première connexion)",
                "description": "Aucune authentification requise. Active le compte : à partir de là, il peut se connecter via /api/auth/login. Le lien devient inutilisable après ce premier passage.",
                "operationId": "c6b08136233b0177a2f2cac5cf134934",
                "parameters": [
                    {
                        "name": "token",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "password",
                                    "password_confirmation"
                                ],
                                "properties": {
                                    "password": {
                                        "type": "string",
                                        "format": "password",
                                        "example": "motdepasse123"
                                    },
                                    "password_confirmation": {
                                        "type": "string",
                                        "format": "password",
                                        "example": "motdepasse123"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Compte activé"
                    },
                    "404": {
                        "description": "Lien invalide, expiré ou déjà utilisé"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                }
            }
        },
        "/api/auth/login": {
            "post": {
                "tags": [
                    "Authentification"
                ],
                "summary": "Se connecter",
                "description": "Vérifie l'e-mail et le mot de passe, retourne un token à conserver.",
                "operationId": "dd51a484b7fa0f97c7680fdbde14cf5f",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "email",
                                    "password"
                                ],
                                "properties": {
                                    "email": {
                                        "type": "string",
                                        "format": "email",
                                        "example": "s.diallo@atrium.co"
                                    },
                                    "password": {
                                        "type": "string",
                                        "format": "password",
                                        "example": "password"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "422": {
                        "description": "Erreur de validation ou identifiants incorrects"
                    }
                }
            }
        },
        "/api/auth/register": {
            "post": {
                "tags": [
                    "Authentification"
                ],
                "summary": "Créer un utilisateur",
                "description": "Enregistre un nouveau compte utilisateur avec un mot de passe immédiatement utilisable — pensé pour créer des comptes admin/hr_manager/manager. Les comptes des collaborateurs (rôle employee) sont créés automatiquement à la création de leur fiche (POST /employees), avec activation différée par lien plutôt que par ce endpoint.",
                "operationId": "c7bb21a0d87049e161b8e4c9b0d909f2",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "name",
                                    "email",
                                    "password",
                                    "password_confirmation"
                                ],
                                "properties": {
                                    "name": {
                                        "type": "string",
                                        "example": "Inès Benali"
                                    },
                                    "email": {
                                        "type": "string",
                                        "format": "email",
                                        "example": "i.benali@atrium.co"
                                    },
                                    "password": {
                                        "type": "string",
                                        "format": "password",
                                        "example": "motdepasse123"
                                    },
                                    "password_confirmation": {
                                        "type": "string",
                                        "format": "password",
                                        "example": "motdepasse123"
                                    },
                                    "role": {
                                        "description": "Défaut : employee",
                                        "type": "string",
                                        "enum": [
                                            "admin",
                                            "hr_manager",
                                            "manager",
                                            "employee"
                                        ],
                                        "example": "employee"
                                    },
                                    "employee_id": {
                                        "description": "Rattache le compte à une fiche collaborateur existante",
                                        "type": "string",
                                        "format": "uuid",
                                        "nullable": true
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Utilisateur créé"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                }
            }
        },
        "/api/auth/logout": {
            "post": {
                "tags": [
                    "Authentification"
                ],
                "summary": "Se déconnecter",
                "description": "Révoque uniquement le token utilisé pour cette requête.",
                "operationId": "df9bdc6c7a6d9f20b983526b2ec0f698",
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/auth/me": {
            "get": {
                "tags": [
                    "Authentification"
                ],
                "summary": "Utilisateur authentifié",
                "description": "Retourne l'utilisateur correspondant au token envoyé.",
                "operationId": "b5de204f5e452ef51327c691aa99e77c",
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/auth/password": {
            "patch": {
                "tags": [
                    "Authentification"
                ],
                "summary": "Changer son propre mot de passe",
                "description": "Nécessite le mot de passe actuel. Accessible à tout utilisateur authentifié, quel que soit son rôle.",
                "operationId": "15bfa443d944576d03c4dffdf82b76a4",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "current_password",
                                    "password",
                                    "password_confirmation"
                                ],
                                "properties": {
                                    "current_password": {
                                        "type": "string",
                                        "format": "password"
                                    },
                                    "password": {
                                        "type": "string",
                                        "format": "password",
                                        "example": "nouveaumotdepasse123"
                                    },
                                    "password_confirmation": {
                                        "type": "string",
                                        "format": "password",
                                        "example": "nouveaumotdepasse123"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Mot de passe mis à jour"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "422": {
                        "description": "Mot de passe actuel incorrect, ou erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/candidates": {
            "get": {
                "tags": [
                    "Recrutement"
                ],
                "summary": "Liste des candidats",
                "description": "Filtrable par poste et par étape du pipeline — alimente le kanban Recrutement.",
                "operationId": "c05cd65a3a82fb13680e02a577ca9bd6",
                "parameters": [
                    {
                        "name": "job_posting_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "stage",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "applied",
                                "interview",
                                "offer",
                                "hired"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Recrutement"
                ],
                "summary": "Ajouter un candidat",
                "description": "Réservé aux rôles admin et hr_manager.",
                "operationId": "e57aa026db5a266bc1a38bc5b7eedce0",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "job_posting_id",
                                    "first_name",
                                    "last_name",
                                    "email"
                                ],
                                "properties": {
                                    "job_posting_id": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "first_name": {
                                        "type": "string",
                                        "example": "Chloé"
                                    },
                                    "last_name": {
                                        "type": "string",
                                        "example": "Mercier"
                                    },
                                    "email": {
                                        "type": "string",
                                        "format": "email",
                                        "example": "chloe.mercier@mail.com"
                                    },
                                    "phone": {
                                        "type": "string",
                                        "example": "06 11 22 33 44"
                                    },
                                    "source": {
                                        "type": "string",
                                        "example": "LinkedIn"
                                    },
                                    "rating": {
                                        "type": "integer",
                                        "example": 3
                                    },
                                    "notes": {
                                        "type": "string"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Candidat créé"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/candidates/{id}": {
            "get": {
                "tags": [
                    "Recrutement"
                ],
                "summary": "Détail d'un candidat",
                "operationId": "ee1893b31a639f1e4d96cbb6e2a855c1",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "404": {
                        "description": "Candidat introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "delete": {
                "tags": [
                    "Recrutement"
                ],
                "summary": "Retirer un candidat",
                "description": "Suppression douce — réservé aux rôles admin et hr_manager.",
                "operationId": "93615c1f677171fecd7fff894cae45b5",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Candidat archivé"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Candidat introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "patch": {
                "tags": [
                    "Recrutement"
                ],
                "summary": "Mettre à jour un candidat",
                "description": "Réservé aux rôles admin et hr_manager. Pour changer uniquement l'étape du pipeline, préférer PATCH /candidates/{id}/stage.",
                "operationId": "f05c35e1a664cba71179b58d789cf2e7",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "first_name": {
                                        "type": "string"
                                    },
                                    "last_name": {
                                        "type": "string"
                                    },
                                    "email": {
                                        "type": "string",
                                        "format": "email"
                                    },
                                    "phone": {
                                        "type": "string"
                                    },
                                    "rating": {
                                        "type": "integer"
                                    },
                                    "notes": {
                                        "type": "string"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Candidat mis à jour"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Candidat introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/candidates/{id}/stage": {
            "patch": {
                "tags": [
                    "Recrutement"
                ],
                "summary": "Faire avancer un candidat dans le pipeline",
                "description": "Change uniquement l'étape (colonne du kanban) — réservé aux rôles admin et hr_manager.",
                "operationId": "cb0486174ede725ab34579ae2417c5d6",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "stage"
                                ],
                                "properties": {
                                    "stage": {
                                        "type": "string",
                                        "enum": [
                                            "applied",
                                            "interview",
                                            "offer",
                                            "hired"
                                        ],
                                        "example": "interview"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Étape mise à jour"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Candidat introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/company-settings": {
            "get": {
                "tags": [
                    "Paramètres — Structure organisationnelle"
                ],
                "summary": "Informations de l'entreprise",
                "description": "Lecture ouverte à tout utilisateur connecté (pas seulement admin/hr_manager) — devise/fuseau horaire sont utilisés pour l'affichage dans toute l'app (formatage des montants sur les bulletins de paie, y compris les vues self-service manager/employee), pas une donnée sensible comme la masse salariale. Écriture réservée à admin/hr_manager (voir PATCH ci-dessous).",
                "operationId": "995af29606c8e13f2d76dc4fe90f7826",
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "patch": {
                "tags": [
                    "Paramètres — Structure organisationnelle"
                ],
                "summary": "Mettre à jour les informations de l'entreprise",
                "description": "Réservé aux rôles admin et hr_manager.",
                "operationId": "f69f38e1a384eadc1292984f50652f75",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "legal_name": {
                                        "type": "string",
                                        "example": "Atrium SAS"
                                    },
                                    "siret": {
                                        "type": "string",
                                        "example": "812 345 678 00021"
                                    },
                                    "address": {
                                        "type": "string",
                                        "example": "14 rue des Tanneurs, 44000 Nantes"
                                    },
                                    "collective_agreement": {
                                        "type": "string",
                                        "example": "Syntec"
                                    },
                                    "currency": {
                                        "type": "string",
                                        "example": "Euro (€)"
                                    },
                                    "timezone": {
                                        "type": "string",
                                        "example": "Europe/Paris"
                                    },
                                    "fiscal_year_start": {
                                        "type": "string",
                                        "example": "1er janvier"
                                    },
                                    "review_cycle": {
                                        "type": "string",
                                        "example": "Annuel"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Mis à jour"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/contract-types": {
            "get": {
                "tags": [
                    "Paramètres — Structure organisationnelle"
                ],
                "summary": "Liste des types de contrat",
                "operationId": "dedbec8a4ebab356f134a4295ae7429a",
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Paramètres — Structure organisationnelle"
                ],
                "summary": "Créer un type de contrat",
                "description": "Réservé aux rôles admin et hr_manager.",
                "operationId": "10ec3867016bd342e109ec6c24d01722",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "code",
                                    "label"
                                ],
                                "properties": {
                                    "code": {
                                        "type": "string",
                                        "example": "APPRENTISSAGE"
                                    },
                                    "label": {
                                        "type": "string",
                                        "example": "Contrat d'apprentissage"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Type de contrat créé"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/contract-types/{id}": {
            "get": {
                "tags": [
                    "Paramètres — Structure organisationnelle"
                ],
                "summary": "Détail d'un type de contrat",
                "operationId": "933cac2f8d60075b8a089f1e434858a3",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "404": {
                        "description": "Type de contrat introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "delete": {
                "tags": [
                    "Paramètres — Structure organisationnelle"
                ],
                "summary": "Supprimer un type de contrat",
                "description": "Réservé aux rôles admin et hr_manager. Refusé si des collaborateurs l'utilisent.",
                "operationId": "cd49fd4e6bec12b3b08268d8652d2e4e",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Type de contrat supprimé"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Type de contrat introuvable"
                    },
                    "422": {
                        "description": "Type de contrat encore utilisé par des collaborateurs"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "patch": {
                "tags": [
                    "Paramètres — Structure organisationnelle"
                ],
                "summary": "Mettre à jour un type de contrat",
                "description": "Réservé aux rôles admin et hr_manager.",
                "operationId": "690d562fade12e3861ad6510039cf763",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "code": {
                                        "type": "string"
                                    },
                                    "label": {
                                        "type": "string"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Type de contrat mis à jour"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Type de contrat introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/dashboard/overview": {
            "get": {
                "tags": [
                    "Vue d'ensemble"
                ],
                "summary": "Toutes les données du tableau de bord",
                "description": "Ouvert à tout utilisateur connecté. Un seul appel agrégeant KPI, évolution des effectifs (6 mois), composition par département, funnel de recrutement, congés en attente, entretiens à planifier, anniversaires d'entrée et points d'attention.",
                "operationId": "aa916ea9a152b88ff8d02de260dd3390",
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/departments": {
            "get": {
                "tags": [
                    "Paramètres — Structure organisationnelle"
                ],
                "summary": "Liste des départements",
                "operationId": "e8478e3a557995e1da564073521762f6",
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Paramètres — Structure organisationnelle"
                ],
                "summary": "Créer un département",
                "description": "Réservé aux rôles admin et hr_manager.",
                "operationId": "9a3a8ebf7326b72fd181c15603cdd21e",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "name"
                                ],
                                "properties": {
                                    "name": {
                                        "type": "string",
                                        "example": "Support technique"
                                    },
                                    "color_hex": {
                                        "type": "string",
                                        "example": "#1C2B3A"
                                    },
                                    "lead_user_id": {
                                        "type": "string",
                                        "format": "uuid",
                                        "nullable": true
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Département créé"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/departments/{id}": {
            "get": {
                "tags": [
                    "Paramètres — Structure organisationnelle"
                ],
                "summary": "Détail d'un département",
                "operationId": "ba8d49f7da851631d9985375effc9b2d",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "404": {
                        "description": "Département introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "delete": {
                "tags": [
                    "Paramètres — Structure organisationnelle"
                ],
                "summary": "Archiver un département",
                "description": "Suppression douce — réservé aux rôles admin et hr_manager. Les collaborateurs déjà rattachés ne sont pas affectés.",
                "operationId": "4f695822af3d4a6db6f902305be6d0de",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Département archivé"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Département introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "patch": {
                "tags": [
                    "Paramètres — Structure organisationnelle"
                ],
                "summary": "Mettre à jour un département",
                "description": "Réservé aux rôles admin et hr_manager.",
                "operationId": "6630d7f248b5afd06cf68398e68f52f9",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "name": {
                                        "type": "string"
                                    },
                                    "color_hex": {
                                        "type": "string"
                                    },
                                    "lead_user_id": {
                                        "type": "string",
                                        "format": "uuid",
                                        "nullable": true
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Département mis à jour"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Département introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/documents": {
            "get": {
                "tags": [
                    "Documents"
                ],
                "summary": "Liste des documents",
                "description": "Filtrable par collaborateur, catégorie et statut. Un rôle manager ou employee ne voit que ses propres documents et ceux marqués visible_to_all — admin/hr_manager voient tout.",
                "operationId": "0eeb1a024876b0279b451f715fb6ed7f",
                "parameters": [
                    {
                        "name": "employee_id",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    },
                    {
                        "name": "category",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "contrat",
                                "avenant",
                                "attestation",
                                "frais",
                                "paie",
                                "rgpd",
                                "modele"
                            ]
                        }
                    },
                    {
                        "name": "status",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "none",
                                "pending",
                                "signed",
                                "expired"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Documents"
                ],
                "summary": "Déposer un document",
                "description": "Réservé aux rôles admin et hr_manager. Upload multipart (champ 'file') + métadonnées.",
                "operationId": "c9fef7703e9cd343c6c74a1a2fcf023e",
                "requestBody": {
                    "required": true,
                    "content": {
                        "multipart/form-data": {
                            "schema": {
                                "required": [
                                    "file",
                                    "category",
                                    "name"
                                ],
                                "properties": {
                                    "file": {
                                        "type": "string",
                                        "format": "binary"
                                    },
                                    "category": {
                                        "type": "string",
                                        "enum": [
                                            "contrat",
                                            "avenant",
                                            "attestation",
                                            "frais",
                                            "paie",
                                            "rgpd",
                                            "modele"
                                        ]
                                    },
                                    "name": {
                                        "type": "string",
                                        "example": "Contrat de travail — CDI"
                                    },
                                    "employee_id": {
                                        "description": "Laisser vide pour un document interne (RGPD, modèle...)",
                                        "type": "string",
                                        "format": "uuid",
                                        "nullable": true
                                    },
                                    "status": {
                                        "description": "Défaut : none",
                                        "type": "string",
                                        "enum": [
                                            "none",
                                            "pending",
                                            "signed",
                                            "expired"
                                        ]
                                    },
                                    "visible_to_all": {
                                        "description": "Défaut : false",
                                        "type": "boolean"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Document créé"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/documents/{id}": {
            "get": {
                "tags": [
                    "Documents"
                ],
                "summary": "Détail d'un document",
                "operationId": "c6cc59b0640a09a31ed2a7965f93d67b",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Ce document ne t'est pas accessible"
                    },
                    "404": {
                        "description": "Document introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "delete": {
                "tags": [
                    "Documents"
                ],
                "summary": "Archiver un document",
                "description": "Suppression douce — réservé aux rôles admin et hr_manager. Le fichier reste sur le disque (pas de purge automatique).",
                "operationId": "6b128368bb7ca99054b61fa94cd12162",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Document archivé"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Document introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "patch": {
                "tags": [
                    "Documents"
                ],
                "summary": "Modifier les métadonnées d'un document",
                "description": "Réservé aux rôles admin et hr_manager. Ne permet pas de remplacer le fichier — seulement son nom, sa catégorie, son statut, sa visibilité, ou son rattachement.",
                "operationId": "080ab25a21faf37e49564a632a1954d8",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "name": {
                                        "type": "string"
                                    },
                                    "category": {
                                        "type": "string",
                                        "enum": [
                                            "contrat",
                                            "avenant",
                                            "attestation",
                                            "frais",
                                            "paie",
                                            "rgpd",
                                            "modele"
                                        ]
                                    },
                                    "employee_id": {
                                        "type": "string",
                                        "format": "uuid",
                                        "nullable": true
                                    },
                                    "status": {
                                        "type": "string",
                                        "enum": [
                                            "none",
                                            "pending",
                                            "signed",
                                            "expired"
                                        ]
                                    },
                                    "visible_to_all": {
                                        "type": "boolean"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Document mis à jour"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Document introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/documents/{id}/download": {
            "get": {
                "tags": [
                    "Documents"
                ],
                "summary": "Télécharger le fichier d'un document",
                "description": "Vérifie les mêmes droits d'accès que la consultation (admin/hr_manager : tout ; manager/employee : ses propres documents + ceux visible_to_all).",
                "operationId": "82e9bca1bbc2236748b6450b0502a5f0",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Contenu binaire du fichier"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Ce document ne t'est pas accessible"
                    },
                    "404": {
                        "description": "Document ou fichier introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/employee-allowance-assignments": {
            "get": {
                "tags": [
                    "Paie"
                ],
                "summary": "Liste des assignations d'indemnités",
                "description": "Réservé aux rôles admin et hr_manager. Filtrable par type d'indemnité ou par collaborateur.",
                "operationId": "75c1b5cc6863f0ee45ea5c11dd5c1f8c",
                "parameters": [
                    {
                        "name": "allowance_type_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "employee_id",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    },
                    {
                        "name": "status",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "active",
                                "inactive"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Paie"
                ],
                "summary": "Assigner une indemnité à un collaborateur",
                "description": "Réservé aux rôles admin et hr_manager. amount omis reprend payroll_allowance_types.default_amount. Si une assignation existe déjà (même inactive) pour ce couple, elle est réactivée avec le nouveau montant plutôt que dupliquée.",
                "operationId": "3a8099d553382a4e69fe268c64624760",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "allowance_type_id",
                                    "employee_id"
                                ],
                                "properties": {
                                    "allowance_type_id": {
                                        "type": "integer"
                                    },
                                    "employee_id": {
                                        "type": "string",
                                        "format": "uuid"
                                    },
                                    "amount": {
                                        "type": "number"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Assignation créée"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/employee-allowance-assignments/{id}": {
            "delete": {
                "tags": [
                    "Paie"
                ],
                "summary": "Supprimer une assignation",
                "description": "Réservé aux rôles admin et hr_manager. Suppression réelle — pour arrêter une indemnité sans effacer l'historique, préférer PATCH status=inactive.",
                "operationId": "7a317bde509a732d8924a5d26a884c2e",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Assignation supprimée"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Assignation introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "patch": {
                "tags": [
                    "Paie"
                ],
                "summary": "Modifier une assignation (montant ou statut)",
                "description": "Réservé aux rôles admin et hr_manager. Passer status à inactive arrête la reconduction automatique de cette indemnité dès le prochain bulletin créé pour ce collaborateur (renseigne ended_at automatiquement) — sans toucher aux bulletins déjà émis.",
                "operationId": "f7752f3c4b2191a2f62e99798cb89675",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "amount": {
                                        "type": "number"
                                    },
                                    "status": {
                                        "type": "string",
                                        "enum": [
                                            "active",
                                            "inactive"
                                        ]
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Assignation mise à jour"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Assignation introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/employee-bonus-assignments": {
            "get": {
                "tags": [
                    "Paie"
                ],
                "summary": "Liste des assignations de primes",
                "description": "Réservé aux rôles admin et hr_manager. Filtrable par type de prime ou par collaborateur.",
                "operationId": "aede676e431e1b8b146ad853eb4f7988",
                "parameters": [
                    {
                        "name": "bonus_type_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "employee_id",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    },
                    {
                        "name": "status",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "active",
                                "inactive"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Paie"
                ],
                "summary": "Assigner une prime à un collaborateur",
                "description": "Réservé aux rôles admin et hr_manager. amount omis reprend payroll_bonus_types.default_amount. Si une assignation existe déjà pour ce couple collaborateur/type de prime (même inactive), elle est réactivée avec le nouveau montant plutôt que dupliquée.",
                "operationId": "bd42379fb2b4013b856eaea597a16d14",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "bonus_type_id",
                                    "employee_id"
                                ],
                                "properties": {
                                    "bonus_type_id": {
                                        "type": "integer"
                                    },
                                    "employee_id": {
                                        "type": "string",
                                        "format": "uuid"
                                    },
                                    "amount": {
                                        "type": "number"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Assignation créée"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/employee-bonus-assignments/{id}": {
            "delete": {
                "tags": [
                    "Paie"
                ],
                "summary": "Supprimer une assignation",
                "description": "Réservé aux rôles admin et hr_manager. Suppression réelle — pour arrêter une prime sans effacer l'historique, préférer PATCH status=inactive.",
                "operationId": "d82be7462f16a18ce51d20e76a9c8677",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Assignation supprimée"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Assignation introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "patch": {
                "tags": [
                    "Paie"
                ],
                "summary": "Modifier une assignation (montant ou statut)",
                "description": "Réservé aux rôles admin et hr_manager. Passer status à inactive arrête la reconduction automatique de cette prime dès le prochain bulletin créé pour ce collaborateur (renseigne ended_at automatiquement) — sans toucher aux bulletins déjà émis.",
                "operationId": "abf67cf8824f810e20812cdb16193cb7",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "amount": {
                                        "type": "number"
                                    },
                                    "status": {
                                        "type": "string",
                                        "enum": [
                                            "active",
                                            "inactive"
                                        ]
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Assignation mise à jour"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Assignation introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/employees": {
            "get": {
                "tags": [
                    "Effectifs"
                ],
                "summary": "Liste des collaborateurs",
                "description": "Recherche, filtres et pagination — reflète les contrôles de la page Effectifs du dashboard. La réponse inclut aussi `stats` (bandeau KPI) : total, actifs, en période d'essai, en congé et ancienneté moyenne, toujours calculés sur l'ensemble des collaborateurs, indépendamment des filtres appliqués à `data`.",
                "operationId": "b9b73e1873c5fe36b951f014f711e4fa",
                "parameters": [
                    {
                        "name": "q",
                        "in": "query",
                        "description": "Recherche libre (nom, e-mail, intitulé de poste)",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "department_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "site_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "status",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "trial",
                                "active",
                                "leave",
                                "offboarding",
                                "terminated"
                            ]
                        }
                    },
                    {
                        "name": "sort",
                        "in": "query",
                        "description": "Ex: last_name, hire_date, -hire_date",
                        "schema": {
                            "type": "string",
                            "default": "last_name"
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "default": 20,
                            "maximum": 500
                        }
                    },
                    {
                        "name": "page",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "default": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Effectifs"
                ],
                "summary": "Créer un collaborateur",
                "description": "Réservé aux rôles admin et hr_manager.",
                "operationId": "781d9d682a574c5e2c1dab17f782b5cd",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "first_name",
                                    "last_name",
                                    "email",
                                    "department_id",
                                    "job_title_id",
                                    "site_id",
                                    "contract_type_id",
                                    "status",
                                    "hire_date"
                                ],
                                "properties": {
                                    "first_name": {
                                        "type": "string",
                                        "example": "Inès"
                                    },
                                    "last_name": {
                                        "type": "string",
                                        "example": "Benali"
                                    },
                                    "email": {
                                        "type": "string",
                                        "format": "email",
                                        "example": "i.benali@atrium.co"
                                    },
                                    "phone": {
                                        "type": "string",
                                        "example": "06 11 22 33 44"
                                    },
                                    "department_id": {
                                        "type": "integer",
                                        "example": 6
                                    },
                                    "service_id": {
                                        "type": "integer",
                                        "nullable": true
                                    },
                                    "job_title_id": {
                                        "type": "integer",
                                        "example": 6
                                    },
                                    "site_id": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "contract_type_id": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "manager_id": {
                                        "type": "string",
                                        "format": "uuid",
                                        "nullable": true
                                    },
                                    "status": {
                                        "type": "string",
                                        "enum": [
                                            "trial",
                                            "active",
                                            "leave",
                                            "offboarding",
                                            "terminated"
                                        ],
                                        "example": "trial"
                                    },
                                    "hire_date": {
                                        "type": "string",
                                        "format": "date",
                                        "example": "2026-08-20"
                                    },
                                    "gross_monthly_salary": {
                                        "type": "number",
                                        "example": 2800
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Collaborateur créé — un compte utilisateur (rôle employee) est créé en parallèle, en attente d'activation. Le collaborateur l'active lui-même depuis l'écran de connexion (bouton Première connexion)."
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/employees/{id}": {
            "get": {
                "tags": [
                    "Effectifs"
                ],
                "summary": "Détail d'un collaborateur",
                "description": "Inclut direct_reports (les collaborateurs qu'il manage).",
                "operationId": "de09c8d9afb3f7114d227ad0645940ac",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "404": {
                        "description": "Collaborateur introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "delete": {
                "tags": [
                    "Effectifs"
                ],
                "summary": "Archiver un collaborateur",
                "description": "Suppression douce (soft delete) — réservé aux rôles admin et hr_manager. Désactive aussi son compte utilisateur lié : il ne peut plus se connecter.",
                "operationId": "dc1326c2f6b4bed0201d62396ddfd970",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Collaborateur archivé"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Collaborateur introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "patch": {
                "tags": [
                    "Effectifs"
                ],
                "summary": "Mettre à jour un collaborateur",
                "description": "Mise à jour partielle — réservé aux rôles admin et hr_manager.",
                "operationId": "6a8acba774154a0aa47c6a1d94e5b02e",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "first_name": {
                                        "type": "string"
                                    },
                                    "last_name": {
                                        "type": "string"
                                    },
                                    "email": {
                                        "type": "string",
                                        "format": "email"
                                    },
                                    "status": {
                                        "type": "string",
                                        "enum": [
                                            "trial",
                                            "active",
                                            "leave",
                                            "offboarding",
                                            "terminated"
                                        ]
                                    },
                                    "department_id": {
                                        "type": "integer"
                                    },
                                    "job_title_id": {
                                        "type": "integer"
                                    },
                                    "site_id": {
                                        "type": "integer"
                                    },
                                    "contract_type_id": {
                                        "type": "integer"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Fiche mise à jour"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Collaborateur introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/job-postings": {
            "get": {
                "tags": [
                    "Recrutement"
                ],
                "summary": "Liste des postes ouverts",
                "description": "Filtrable par département et statut. Inclut le nombre de candidatures actives par poste.",
                "operationId": "9f08ff064ed5561e2d317266cdfc90c9",
                "parameters": [
                    {
                        "name": "department_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "status",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "open",
                                "closed"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Recrutement"
                ],
                "summary": "Ouvrir un poste",
                "description": "Réservé aux rôles admin et hr_manager.",
                "operationId": "e1d7665183e90831757c04e24b9ded6e",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "department_id",
                                    "title"
                                ],
                                "properties": {
                                    "department_id": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "title": {
                                        "type": "string",
                                        "example": "Développeur back-end"
                                    },
                                    "opened_at": {
                                        "type": "string",
                                        "format": "date",
                                        "example": "2026-08-11"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Poste créé — la réponse inclut public_token et public_application_path, à combiner avec l'URL du backend pour obtenir le lien de candidature à partager (ex: https://ton-domaine.fr/careers-apply.html?token=...)."
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/job-postings/{id}": {
            "get": {
                "tags": [
                    "Recrutement"
                ],
                "summary": "Détail d'un poste ouvert",
                "operationId": "7d31c34c1d02f66d18f81b4e5bf48b13",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "404": {
                        "description": "Poste introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "delete": {
                "tags": [
                    "Recrutement"
                ],
                "summary": "Clôturer un poste",
                "description": "Un poste n'est jamais supprimé, seulement clôturé (status=closed) — réservé aux rôles admin et hr_manager.",
                "operationId": "26ff88dbee3bad3d6e368af6ad3329dc",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Poste clôturé"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Poste introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "patch": {
                "tags": [
                    "Recrutement"
                ],
                "summary": "Mettre à jour un poste",
                "description": "Réservé aux rôles admin et hr_manager.",
                "operationId": "4b9d15f66b2c1773d4960cc85f36380e",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "department_id": {
                                        "type": "integer"
                                    },
                                    "title": {
                                        "type": "string"
                                    },
                                    "status": {
                                        "type": "string",
                                        "enum": [
                                            "open",
                                            "closed"
                                        ]
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Poste mis à jour"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Poste introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/job-titles": {
            "get": {
                "tags": [
                    "Paramètres — Structure organisationnelle"
                ],
                "summary": "Liste des postes",
                "description": "Filtrable par département.",
                "operationId": "8cfe4bfbaee0e6c347b4831269f3d7ee",
                "parameters": [
                    {
                        "name": "department_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Paramètres — Structure organisationnelle"
                ],
                "summary": "Créer un poste",
                "description": "Réservé aux rôles admin et hr_manager.",
                "operationId": "2d3b5081888d1473404aca10b231dfad",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "department_id",
                                    "title"
                                ],
                                "properties": {
                                    "department_id": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "title": {
                                        "type": "string",
                                        "example": "Développeur back-end"
                                    },
                                    "seniority_level": {
                                        "type": "string",
                                        "enum": [
                                            "junior",
                                            "confirme",
                                            "senior",
                                            "lead",
                                            "direction"
                                        ],
                                        "example": "confirme"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Poste créé"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/job-titles/{id}": {
            "get": {
                "tags": [
                    "Paramètres — Structure organisationnelle"
                ],
                "summary": "Détail d'un poste",
                "operationId": "0bfce8da210f19945e1e4ac9ef6d484d",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "404": {
                        "description": "Poste introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "delete": {
                "tags": [
                    "Paramètres — Structure organisationnelle"
                ],
                "summary": "Archiver un poste",
                "description": "Suppression douce — réservé aux rôles admin et hr_manager.",
                "operationId": "f2bfab97ea6dd89431cc8e9ace5d199b",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Poste archivé"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Poste introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "patch": {
                "tags": [
                    "Paramètres — Structure organisationnelle"
                ],
                "summary": "Mettre à jour un poste",
                "description": "Réservé aux rôles admin et hr_manager.",
                "operationId": "fddac540f2036fc8f2e4288c9e21e1a2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "department_id": {
                                        "type": "integer"
                                    },
                                    "title": {
                                        "type": "string"
                                    },
                                    "seniority_level": {
                                        "type": "string",
                                        "enum": [
                                            "junior",
                                            "confirme",
                                            "senior",
                                            "lead",
                                            "direction"
                                        ]
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Poste mis à jour"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Poste introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/leave-balances": {
            "get": {
                "tags": [
                    "Congés & absences"
                ],
                "summary": "Soldes de congés de l'équipe",
                "description": "Un solde par collaborateur pour l'année demandée (défaut : année en cours). Un utilisateur de rôle employee ne voit jamais que son propre solde, quel que soit le filtre employee_id envoyé. Le nombre de jours consommés est recalculé à partir des demandes approuvées, jamais stocké séparément.",
                "operationId": "fc59909f269cdb92defafdc5ef55f7cc",
                "parameters": [
                    {
                        "name": "year",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "example": 2026
                        }
                    },
                    {
                        "name": "employee_id",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/leave-balances/{employeeId}": {
            "get": {
                "tags": [
                    "Congés & absences"
                ],
                "summary": "Solde d'un collaborateur",
                "operationId": "f2dc4861681867cfdea658e2840bab88",
                "parameters": [
                    {
                        "name": "employeeId",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    },
                    {
                        "name": "year",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "404": {
                        "description": "Aucune allocation pour cette année"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "patch": {
                "tags": [
                    "Congés & absences"
                ],
                "summary": "Ajuster l'allocation annuelle d'un collaborateur",
                "description": "Réservé aux rôles admin et hr_manager. Crée l'allocation de l'année si elle n'existe pas encore.",
                "operationId": "7a30dccfa6ec8f3e3de65b5fe32b19e8",
                "parameters": [
                    {
                        "name": "employeeId",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "year": {
                                        "type": "integer",
                                        "example": 2026
                                    },
                                    "cp_days_allocated": {
                                        "type": "number",
                                        "example": 25
                                    },
                                    "rtt_days_allocated": {
                                        "type": "number",
                                        "example": 10
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Allocation mise à jour"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/leave-policy": {
            "get": {
                "tags": [
                    "Congés & absences"
                ],
                "summary": "Règles de congés par défaut",
                "description": "Réservé aux rôles admin et hr_manager. cp_days_per_year/rtt_days_per_year sont repris comme valeurs par défaut par /leave-balances à la création d'un premier solde pour un collaborateur. Les 3 autres champs sont des réglages de configuration, pas encore appliqués dans la logique de validation des demandes.",
                "operationId": "3fe8f24b4c96330a1e2c33355c994d52",
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "patch": {
                "tags": [
                    "Congés & absences"
                ],
                "summary": "Mettre à jour les règles de congés par défaut",
                "description": "Réservé aux rôles admin et hr_manager. Ne modifie jamais les soldes déjà attribués (leave_balances existants) — seulement la valeur par défaut utilisée pour les PROCHAINS soldes créés.",
                "operationId": "845b7cf8bda80e8be7d84ccec8107ab0",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "cp_days_per_year": {
                                        "type": "number",
                                        "example": 25
                                    },
                                    "rtt_days_per_year": {
                                        "type": "number",
                                        "example": 10
                                    },
                                    "carry_over_allowed": {
                                        "type": "boolean"
                                    },
                                    "manager_validation_required": {
                                        "type": "boolean"
                                    },
                                    "minimum_notice_days": {
                                        "type": "integer",
                                        "example": 5
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Mis à jour"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/leave-requests": {
            "get": {
                "tags": [
                    "Congés & absences"
                ],
                "summary": "Liste des demandes de congés",
                "description": "Filtrable par collaborateur, statut, type, et période (pour le planning d'équipe). Un utilisateur de rôle employee ne voit jamais que ses propres demandes, quel que soit le filtre employee_id envoyé.",
                "operationId": "d38b7a8c83b8855dcb779f1200defbca",
                "parameters": [
                    {
                        "name": "employee_id",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    },
                    {
                        "name": "status",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "pending",
                                "approved",
                                "rejected",
                                "cancelled"
                            ]
                        }
                    },
                    {
                        "name": "type",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "cp",
                                "rtt",
                                "maladie",
                                "sanssolde"
                            ]
                        }
                    },
                    {
                        "name": "from",
                        "in": "query",
                        "description": "Date de début de période (inclut toute demande chevauchante)",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "to",
                        "in": "query",
                        "description": "Date de fin de période",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Congés & absences"
                ],
                "summary": "Déposer une demande de congé",
                "description": "Statut initial toujours 'pending' — nécessite une validation. Un utilisateur de rôle employee ne peut déposer une demande qu'en son propre nom : employee_id est ignoré et remplacé par sa propre fiche.",
                "operationId": "761cfb41f958b683815a424378f54f47",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "employee_id",
                                    "type",
                                    "start_date",
                                    "end_date"
                                ],
                                "properties": {
                                    "employee_id": {
                                        "type": "string",
                                        "format": "uuid"
                                    },
                                    "type": {
                                        "type": "string",
                                        "enum": [
                                            "cp",
                                            "rtt",
                                            "maladie",
                                            "sanssolde"
                                        ],
                                        "example": "cp"
                                    },
                                    "start_date": {
                                        "type": "string",
                                        "format": "date",
                                        "example": "2026-08-24"
                                    },
                                    "end_date": {
                                        "type": "string",
                                        "format": "date",
                                        "example": "2026-08-28"
                                    },
                                    "note": {
                                        "type": "string"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Demande créée"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/leave-requests/{id}": {
            "get": {
                "tags": [
                    "Congés & absences"
                ],
                "summary": "Détail d'une demande de congé",
                "operationId": "fb58adcc17c443e2cf4878b8136dab3b",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "404": {
                        "description": "Demande introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "delete": {
                "tags": [
                    "Congés & absences"
                ],
                "summary": "Annuler une demande de congé",
                "description": "Passe le statut à 'cancelled' plutôt que de supprimer la ligne.",
                "operationId": "d2ac6971a1fb07455aae7c30887bf27a",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Demande annulée"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "404": {
                        "description": "Demande introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "patch": {
                "tags": [
                    "Congés & absences"
                ],
                "summary": "Modifier une demande de congé",
                "description": "Uniquement les dates/note — le statut passe par les actions dédiées approve/reject.",
                "operationId": "fe7e963c28e862d7a5bb5620c90a6e95",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "type": {
                                        "type": "string",
                                        "enum": [
                                            "cp",
                                            "rtt",
                                            "maladie",
                                            "sanssolde"
                                        ]
                                    },
                                    "start_date": {
                                        "type": "string",
                                        "format": "date"
                                    },
                                    "end_date": {
                                        "type": "string",
                                        "format": "date"
                                    },
                                    "note": {
                                        "type": "string"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Demande mise à jour"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "404": {
                        "description": "Demande introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/leave-requests/{id}/approve": {
            "patch": {
                "tags": [
                    "Congés & absences"
                ],
                "summary": "Valider une demande de congé",
                "description": "Réservé aux rôles admin, hr_manager et manager.",
                "operationId": "13cf8a678001e9e0e3a6dde5f0e021c4",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Demande validée"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Demande introuvable"
                    },
                    "422": {
                        "description": "La demande n'est plus en attente"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/leave-requests/{id}/reject": {
            "patch": {
                "tags": [
                    "Congés & absences"
                ],
                "summary": "Refuser une demande de congé",
                "description": "Réservé aux rôles admin, hr_manager et manager.",
                "operationId": "a179ac823e3456cc314353b004f28535",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Demande refusée"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Demande introuvable"
                    },
                    "422": {
                        "description": "La demande n'est plus en attente"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/payroll-allowance-types": {
            "get": {
                "tags": [
                    "Paie"
                ],
                "summary": "Catalogue des types d'indemnités",
                "description": "Réservé aux rôles admin et hr_manager. Inclut le nombre de bénéficiaires actifs et le total mensuel engagé par type. Même principe exact que les primes (voir /payroll-bonus-types) — catalogue persistant, reconduction automatique tant qu'une assignation reste active.",
                "operationId": "0b9ba8ad14d497d60ed8b60ea26761cd",
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Paie"
                ],
                "summary": "Créer un type d'indemnité",
                "description": "Réservé aux rôles admin et hr_manager.",
                "operationId": "3a4632cb7aaf785d5153b448838790ec",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "name",
                                    "default_amount"
                                ],
                                "properties": {
                                    "name": {
                                        "type": "string",
                                        "example": "Indemnité de logement"
                                    },
                                    "default_amount": {
                                        "type": "number",
                                        "example": 100
                                    },
                                    "description": {
                                        "type": "string"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Type d'indemnité créé"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/payroll-allowance-types/{id}": {
            "patch": {
                "tags": [
                    "Paie"
                ],
                "summary": "Mettre à jour un type d'indemnité",
                "description": "Réservé aux rôles admin et hr_manager. is_active=false désactive le TYPE entier : plus aucune assignation active de ce type ne compte dans les prochains bulletins, sans avoir à désactiver chaque collaborateur un par un. Ne modifie pas le montant des assignations déjà en cours (elles gardent leur montant individualisé).",
                "operationId": "b34494bd36f9b221335ced894119c486",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "name": {
                                        "type": "string"
                                    },
                                    "default_amount": {
                                        "type": "number"
                                    },
                                    "description": {
                                        "type": "string"
                                    },
                                    "is_active": {
                                        "type": "boolean"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Type d'indemnité mis à jour"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Type d'indemnité introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/payroll-bonus-types": {
            "get": {
                "tags": [
                    "Paie"
                ],
                "summary": "Catalogue des types de primes",
                "description": "Réservé aux rôles admin et hr_manager. Inclut le nombre de bénéficiaires actifs et le total mensuel engagé par type.",
                "operationId": "06e5f4bee94a77d1dfb8bcebbb27e701",
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Paie"
                ],
                "summary": "Créer un type de prime",
                "description": "Réservé aux rôles admin et hr_manager.",
                "operationId": "ca3afa4c55e89b7f0623af8d6b3ea1fd",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "name",
                                    "default_amount"
                                ],
                                "properties": {
                                    "name": {
                                        "type": "string",
                                        "example": "Prime de transport"
                                    },
                                    "default_amount": {
                                        "type": "number",
                                        "example": 50
                                    },
                                    "description": {
                                        "type": "string"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Type de prime créé"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/payroll-bonus-types/{id}": {
            "patch": {
                "tags": [
                    "Paie"
                ],
                "summary": "Mettre à jour un type de prime",
                "description": "Réservé aux rôles admin et hr_manager. is_active=false désactive le TYPE entier : plus aucune assignation active de ce type ne compte dans les prochains bulletins, sans avoir à désactiver chaque collaborateur un par un. Ne modifie pas le montant des assignations déjà en cours (elles gardent leur montant individualisé).",
                "operationId": "9215ed201854b0e7326d948a353ac0b6",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "name": {
                                        "type": "string"
                                    },
                                    "default_amount": {
                                        "type": "number"
                                    },
                                    "description": {
                                        "type": "string"
                                    },
                                    "is_active": {
                                        "type": "boolean"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Type de prime mis à jour"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Type de prime introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/payroll-cycles": {
            "get": {
                "tags": [
                    "Paie"
                ],
                "summary": "Liste des cycles de paie",
                "description": "Inclut le nombre de bulletins, la masse brute/nette totale, le total des primes et le coût employeur (uniquement la somme de ce qui a été saisi, jamais estimé) par cycle. Réservé aux rôles admin et hr_manager (un manager ou un employee n'a jamais de vue d'ensemble de la masse salariale, seulement de son propre bulletin — voir /payslips).",
                "operationId": "8fb902eefb979d5015cd5ba561427482",
                "parameters": [
                    {
                        "name": "status",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "draft",
                                "processing",
                                "closed"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Paie"
                ],
                "summary": "Créer un cycle de paie",
                "description": "Réservé aux rôles admin et hr_manager.",
                "operationId": "f37c10fee4605c2dde89d0a78f0942d1",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "name",
                                    "period_month",
                                    "period_year"
                                ],
                                "properties": {
                                    "name": {
                                        "type": "string",
                                        "example": "Juillet 2026"
                                    },
                                    "period_month": {
                                        "type": "integer",
                                        "example": 7
                                    },
                                    "period_year": {
                                        "type": "integer",
                                        "example": 2026
                                    },
                                    "pay_date": {
                                        "type": "string",
                                        "format": "date",
                                        "example": "2026-07-30"
                                    },
                                    "status": {
                                        "description": "Défaut : draft",
                                        "type": "string",
                                        "enum": [
                                            "draft",
                                            "processing",
                                            "closed"
                                        ]
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Cycle créé"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/payroll-cycles/{id}": {
            "patch": {
                "tags": [
                    "Paie"
                ],
                "summary": "Mettre à jour un cycle de paie",
                "description": "Réservé aux rôles admin et hr_manager — sert notamment à clôturer un cycle (status=closed) une fois tous les bulletins validés.",
                "operationId": "a9cfa7cf92f0dd934b975843e479d060",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "name": {
                                        "type": "string"
                                    },
                                    "pay_date": {
                                        "type": "string",
                                        "format": "date"
                                    },
                                    "status": {
                                        "type": "string",
                                        "enum": [
                                            "draft",
                                            "processing",
                                            "closed"
                                        ]
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Cycle mis à jour"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Cycle introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/payroll-cycles/{id}/generate-payslips": {
            "post": {
                "tags": [
                    "Paie"
                ],
                "summary": "Générer automatiquement les bulletins manquants du cycle",
                "description": "Réservé aux rôles admin et hr_manager. Crée un bulletin (statut brouillon) pour chaque collaborateur encore rémunéré (tous les statuts sauf terminated) qui n'en a pas déjà un sur ce cycle — salaire de base repris de employees.gross_monthly_salary, primes/indemnités reprises des assignations actives, CNSS/ITS calculés automatiquement (voir PayrollTaxCalculator, même formule que la création individuelle). Les collaborateurs sans salaire renseigné sont ignorés et listés dans skipped plutôt que bloquer toute la génération. Idempotent : rejouer cette action ne duplique jamais un bulletin déjà existant (contrainte unique cycle_id+employee_id) — utile après l'arrivée d'un nouveau collaborateur en cours de cycle, il suffit de relancer.",
                "operationId": "94180e482810f0b1c3985995ae12d114",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Génération effectuée — voir created/skipped dans la réponse"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Cycle introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/payslips": {
            "get": {
                "tags": [
                    "Paie"
                ],
                "summary": "Liste des bulletins de paie",
                "description": "Filtrable par cycle, collaborateur, statut. admin/hr_manager voient tout ; manager et employee ne voient jamais que leur propre bulletin.",
                "operationId": "b4c5287c3ccded81e32c27a9ba3f97d8",
                "parameters": [
                    {
                        "name": "cycle_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "employee_id",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    },
                    {
                        "name": "status",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "draft",
                                "validated",
                                "sent"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Paie"
                ],
                "summary": "Créer un bulletin de paie",
                "description": "Réservé aux rôles admin et hr_manager. gross_salary, cnss_amount, its_amount et net_salary ne se saisissent jamais directement — recalculés automatiquement à partir de base_salary/overtime_amount/bonuses_amount/allowances_amount, comme sur un vrai bulletin. CNSS = 3,6% du salaire BRUT COMPLET (heures sup. incluses). ITS = barème progressif par tranches sur le revenu imposable (= brut − CNSS). Si base_salary est omis, reprend employees.gross_monthly_salary. bonuses_amount ET allowances_amount ne sont PAS des champs saisissables : ils sont automatiquement calculés à partir des primes/indemnités actuellement actives pour ce collaborateur (modules Primes — /payroll-bonus-types — et Indemnités — /payroll-allowance-types) — les assigner avant ou après la création du bulletin donne le même résultat.",
                "operationId": "8f30ed1c0aa1a8a8859b7f78f2bf4e3f",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "cycle_id",
                                    "employee_id"
                                ],
                                "properties": {
                                    "cycle_id": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "employee_id": {
                                        "type": "string",
                                        "format": "uuid"
                                    },
                                    "base_salary": {
                                        "type": "number",
                                        "example": 3200
                                    },
                                    "overtime_amount": {
                                        "type": "number",
                                        "example": 0
                                    },
                                    "salary_advance": {
                                        "type": "number",
                                        "example": 0
                                    },
                                    "payment_method": {
                                        "type": "string",
                                        "example": "Virement bancaire"
                                    },
                                    "employer_cost": {
                                        "type": "number",
                                        "example": 4300
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Bulletin créé"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/payslips/{id}": {
            "get": {
                "tags": [
                    "Paie"
                ],
                "summary": "Détail d'un bulletin",
                "operationId": "c3f7772c478e111db3e351d823638462",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Ce bulletin ne t'est pas accessible"
                    },
                    "404": {
                        "description": "Bulletin introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "delete": {
                "tags": [
                    "Paie"
                ],
                "summary": "Supprimer un bulletin",
                "description": "Réservé aux rôles admin et hr_manager. Suppression réelle — ne supprime pas le document PDF lié, seulement le lien.",
                "operationId": "f4e9472882a21ed421d8086324910e2f",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Bulletin supprimé"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Bulletin introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "patch": {
                "tags": [
                    "Paie"
                ],
                "summary": "Mettre à jour un bulletin",
                "description": "Réservé aux rôles admin et hr_manager. gross_salary/cnss_amount/its_amount/net_salary sont recalculés dès que base_salary ou overtime_amount change. document_id doit référencer un document existant (catégorie 'paie' recommandée, voir module Documents). bonuses_amount et allowances_amount ne sont modifiables QUE via les modules Primes/Indemnités (voir /employee-bonus-assignments et /employee-allowance-assignments) ; cnss_amount et its_amount ne sont JAMAIS modifiables directement, uniquement recalculés automatiquement (3,6% du salaire brut complet pour la CNSS, barème progressif sur le revenu imposable pour l'ITS).",
                "operationId": "eca5559ce8f05f1ca6c2fc1ffab8bc4c",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "base_salary": {
                                        "type": "number"
                                    },
                                    "overtime_amount": {
                                        "type": "number"
                                    },
                                    "salary_advance": {
                                        "type": "number"
                                    },
                                    "payment_method": {
                                        "type": "string"
                                    },
                                    "employer_cost": {
                                        "type": "number"
                                    },
                                    "status": {
                                        "type": "string",
                                        "enum": [
                                            "draft",
                                            "validated",
                                            "sent"
                                        ]
                                    },
                                    "document_id": {
                                        "type": "string",
                                        "format": "uuid",
                                        "nullable": true
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Bulletin mis à jour"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Bulletin introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/payslips/{id}/download": {
            "get": {
                "tags": [
                    "Paie"
                ],
                "summary": "Télécharger le PDF d'un bulletin",
                "description": "Raccourci vers le document lié (document_id) — mêmes règles d'accès que GET /payslips. 404 si aucun document n'est encore associé.",
                "operationId": "7b1503a361b396437737729bac8b88b5",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Contenu binaire du fichier"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Ce bulletin ne t'est pas accessible"
                    },
                    "404": {
                        "description": "Bulletin, document ou fichier introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/performance-cycles": {
            "get": {
                "tags": [
                    "Performance"
                ],
                "summary": "Liste des cycles d'entretien",
                "description": "Inclut le nombre d'entretiens et le nombre d'entretiens complétés par cycle.",
                "operationId": "e0d11dda9ce4537f558290f8a00533e0",
                "parameters": [
                    {
                        "name": "status",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "draft",
                                "active",
                                "closed"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Performance"
                ],
                "summary": "Créer un cycle d'entretien",
                "description": "Réservé aux rôles admin et hr_manager.",
                "operationId": "0b47ff6f0fd86a18fa64569f3c5d36f4",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "name",
                                    "start_date",
                                    "end_date"
                                ],
                                "properties": {
                                    "name": {
                                        "type": "string",
                                        "example": "S2 2026"
                                    },
                                    "start_date": {
                                        "type": "string",
                                        "format": "date",
                                        "example": "2026-07-01"
                                    },
                                    "end_date": {
                                        "type": "string",
                                        "format": "date",
                                        "example": "2026-09-30"
                                    },
                                    "status": {
                                        "description": "Défaut : active",
                                        "type": "string",
                                        "enum": [
                                            "draft",
                                            "active",
                                            "closed"
                                        ]
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Cycle créé"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/performance-cycles/{id}": {
            "patch": {
                "tags": [
                    "Performance"
                ],
                "summary": "Mettre à jour un cycle d'entretien",
                "description": "Réservé aux rôles admin et hr_manager — sert notamment à clôturer un cycle (status=closed).",
                "operationId": "072fe035981b633f5204fc86c7a0a821",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "name": {
                                        "type": "string"
                                    },
                                    "start_date": {
                                        "type": "string",
                                        "format": "date"
                                    },
                                    "end_date": {
                                        "type": "string",
                                        "format": "date"
                                    },
                                    "status": {
                                        "type": "string",
                                        "enum": [
                                            "draft",
                                            "active",
                                            "closed"
                                        ]
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Cycle mis à jour"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Cycle introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/performance-reviews": {
            "get": {
                "tags": [
                    "Performance"
                ],
                "summary": "Liste des entretiens de performance",
                "description": "Filtrable par cycle, collaborateur, statut. Un manager ne voit que les entretiens de son équipe directe (employees.manager_id) ; un employee ne voit que le sien.",
                "operationId": "a5c71019d445542d7aabfbed4099412b",
                "parameters": [
                    {
                        "name": "cycle_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "employee_id",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    },
                    {
                        "name": "department_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "status",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "scheduled",
                                "in_progress",
                                "completed",
                                "late"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Performance"
                ],
                "summary": "Planifier un entretien",
                "description": "Réservé aux rôles admin et hr_manager.",
                "operationId": "3d7fa95a6d3529cd91525596c551245b",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "cycle_id",
                                    "employee_id"
                                ],
                                "properties": {
                                    "cycle_id": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "employee_id": {
                                        "type": "string",
                                        "format": "uuid"
                                    },
                                    "scheduled_at": {
                                        "type": "string",
                                        "format": "date"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Entretien créé"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/performance-reviews/{id}": {
            "get": {
                "tags": [
                    "Performance"
                ],
                "summary": "Détail d'un entretien",
                "description": "Inclut les objectifs et compétences évaluées.",
                "operationId": "275714e53fd45f4797740e4e32b53cb9",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Cet entretien ne t'est pas accessible"
                    },
                    "404": {
                        "description": "Entretien introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "delete": {
                "tags": [
                    "Performance"
                ],
                "summary": "Supprimer un entretien",
                "description": "Réservé aux rôles admin et hr_manager. Suppression réelle (pas de soft delete) — objectifs et compétences liés supprimés en cascade.",
                "operationId": "9f228c9c83249c2e88b3db9b18ce6579",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Entretien supprimé"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Entretien introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "patch": {
                "tags": [
                    "Performance"
                ],
                "summary": "Mettre à jour un entretien",
                "description": "Réservé aux rôles admin et hr_manager. Les tableaux goals/competencies, s'ils sont envoyés, REMPLACENT entièrement les objectifs/compétences existants de cet entretien (pas de fusion).",
                "operationId": "d906c31db6a14991a38af6297c2867f0",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "status": {
                                        "type": "string",
                                        "enum": [
                                            "scheduled",
                                            "in_progress",
                                            "completed",
                                            "late"
                                        ]
                                    },
                                    "overall_rating": {
                                        "type": "integer",
                                        "maximum": 5,
                                        "minimum": 0
                                    },
                                    "potential_rating": {
                                        "description": "1=faible, 2=moyen, 3=élevé — axe de la matrice de talents",
                                        "type": "integer",
                                        "maximum": 3,
                                        "minimum": 1
                                    },
                                    "notes": {
                                        "type": "string"
                                    },
                                    "scheduled_at": {
                                        "type": "string",
                                        "format": "date"
                                    },
                                    "goals": {
                                        "type": "array",
                                        "items": {
                                            "properties": {
                                                "label": {
                                                    "type": "string",
                                                    "example": "Réduire la dette technique"
                                                },
                                                "progress_percent": {
                                                    "type": "integer",
                                                    "example": 70
                                                }
                                            },
                                            "type": "object"
                                        }
                                    },
                                    "competencies": {
                                        "type": "array",
                                        "items": {
                                            "properties": {
                                                "label": {
                                                    "type": "string",
                                                    "example": "Rigueur technique"
                                                },
                                                "rating": {
                                                    "type": "integer",
                                                    "example": 4
                                                }
                                            },
                                            "type": "object"
                                        }
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Entretien mis à jour"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Entretien introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/platform-users": {
            "get": {
                "tags": [
                    "Authentification"
                ],
                "summary": "Liste des utilisateurs de la plateforme",
                "description": "Réservé aux rôles admin et hr_manager. Comptes ayant accès à l'application, distincts des fiches collaborateurs.",
                "operationId": "083ccb8f5efa1da1af7bf233e4bdb60b",
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Authentification"
                ],
                "summary": "Inviter un utilisateur",
                "description": "Réservé aux rôles admin et hr_manager. Crée le compte avec un mot de passe défini immédiatement (pas un lien d'activation envoyé par e-mail — cette infrastructure n'existe pas encore dans le projet, contrairement à l'activation des comptes collaborateurs).",
                "operationId": "d64b92c44915a51e15668253730da152",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "name",
                                    "email",
                                    "password",
                                    "role"
                                ],
                                "properties": {
                                    "name": {
                                        "type": "string"
                                    },
                                    "email": {
                                        "type": "string",
                                        "format": "email"
                                    },
                                    "password": {
                                        "type": "string",
                                        "minLength": 6
                                    },
                                    "role": {
                                        "type": "string",
                                        "enum": [
                                            "admin",
                                            "hr_manager",
                                            "manager",
                                            "employee"
                                        ]
                                    },
                                    "employee_id": {
                                        "type": "string",
                                        "format": "uuid",
                                        "nullable": true
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Utilisateur créé"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/platform-users/{id}": {
            "patch": {
                "tags": [
                    "Authentification"
                ],
                "summary": "Modifier le rôle ou le statut d'un utilisateur",
                "description": "Réservé aux rôles admin et hr_manager. is_active=false désactive le compte (bloque la connexion) sans supprimer la ligne — préserve l'historique et les références.",
                "operationId": "2104db1bf0bbbefa2da4ea434deee3cc",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "role": {
                                        "type": "string",
                                        "enum": [
                                            "admin",
                                            "hr_manager",
                                            "manager",
                                            "employee"
                                        ]
                                    },
                                    "is_active": {
                                        "type": "boolean"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Mis à jour"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Utilisateur introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/public/job-postings/{token}": {
            "get": {
                "tags": [
                    "Recrutement"
                ],
                "summary": "Consulter un poste via son lien public",
                "description": "Aucune authentification requise. Ne retourne le poste que s'il est encore ouvert (status=open) — sert à afficher l'intitulé sur la page de candidature avant que le candidat ne remplisse le formulaire.",
                "operationId": "4a05a7763e00aea3bcb054c1141a9cf3",
                "parameters": [
                    {
                        "name": "token",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "404": {
                        "description": "Lien invalide ou poste clôturé"
                    }
                }
            }
        },
        "/api/public/job-postings/{token}/apply": {
            "post": {
                "tags": [
                    "Recrutement"
                ],
                "summary": "Déposer une candidature via le lien public",
                "description": "Aucune authentification requise. Crée un candidat à l'étape 'applied', source fixée à 'Lien public' pour le suivi.",
                "operationId": "f9291d6939b12d0588ce5f090038728b",
                "parameters": [
                    {
                        "name": "token",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "first_name",
                                    "last_name",
                                    "email"
                                ],
                                "properties": {
                                    "first_name": {
                                        "type": "string",
                                        "example": "Chloé"
                                    },
                                    "last_name": {
                                        "type": "string",
                                        "example": "Mercier"
                                    },
                                    "email": {
                                        "type": "string",
                                        "format": "email",
                                        "example": "chloe.mercier@mail.com"
                                    },
                                    "phone": {
                                        "type": "string",
                                        "example": "06 11 22 33 44"
                                    },
                                    "message": {
                                        "description": "Lettre de motivation / message libre du candidat",
                                        "type": "string"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Candidature envoyée"
                    },
                    "404": {
                        "description": "Lien invalide ou poste clôturé"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                }
            }
        },
        "/api/roles": {
            "get": {
                "tags": [
                    "Authentification"
                ],
                "summary": "Liste des rôles avec nombre d'utilisateurs",
                "description": "Réservé aux rôles admin et hr_manager.",
                "operationId": "ca86f0a206144dfbd695b749b4b28f9d",
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/roles/{id}": {
            "patch": {
                "tags": [
                    "Authentification"
                ],
                "summary": "Modifier le nom/la description d'un rôle",
                "description": "Réservé aux rôles admin et hr_manager. Ne modifie jamais le slug ni les permissions associées — uniquement le libellé affiché.",
                "operationId": "a1b7aa3b5473029dd44e26f1736b413c",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "name": {
                                        "type": "string"
                                    },
                                    "description": {
                                        "type": "string"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Mis à jour"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Rôle introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/services": {
            "get": {
                "tags": [
                    "Paramètres — Structure organisationnelle"
                ],
                "summary": "Liste des services",
                "description": "Filtrable par département.",
                "operationId": "97de511018def32ca0ccbc800756c538",
                "parameters": [
                    {
                        "name": "department_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Paramètres — Structure organisationnelle"
                ],
                "summary": "Créer un service",
                "description": "Réservé aux rôles admin et hr_manager.",
                "operationId": "0634f2b3ac65bd2815f4b6459f0db97c",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "department_id",
                                    "name"
                                ],
                                "properties": {
                                    "department_id": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "name": {
                                        "type": "string",
                                        "example": "Support niveau 2"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Service créé"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/services/{id}": {
            "get": {
                "tags": [
                    "Paramètres — Structure organisationnelle"
                ],
                "summary": "Détail d'un service",
                "operationId": "dce5b306a141bdec91eff8a15534d7d7",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "404": {
                        "description": "Service introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "delete": {
                "tags": [
                    "Paramètres — Structure organisationnelle"
                ],
                "summary": "Archiver un service",
                "description": "Suppression douce — réservé aux rôles admin et hr_manager.",
                "operationId": "9f75ff1ee1d79f882f516173057387ec",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Service archivé"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Service introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "patch": {
                "tags": [
                    "Paramètres — Structure organisationnelle"
                ],
                "summary": "Mettre à jour un service",
                "description": "Réservé aux rôles admin et hr_manager.",
                "operationId": "95a98c3117f31522386bb790a3a25ae6",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "department_id": {
                                        "type": "integer"
                                    },
                                    "name": {
                                        "type": "string"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Service mis à jour"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Service introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/sites": {
            "get": {
                "tags": [
                    "Paramètres — Structure organisationnelle"
                ],
                "summary": "Liste des sites",
                "operationId": "a80e31c61764092a9710da892b4f6281",
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Paramètres — Structure organisationnelle"
                ],
                "summary": "Créer un site",
                "description": "Réservé aux rôles admin et hr_manager.",
                "operationId": "1c99621d9a5bfd1e1ba8c7e8b2859cb2",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "name"
                                ],
                                "properties": {
                                    "name": {
                                        "type": "string",
                                        "example": "Bureau Marseille"
                                    },
                                    "city": {
                                        "type": "string",
                                        "example": "Marseille"
                                    },
                                    "address": {
                                        "type": "string",
                                        "example": "12 rue de la Canebière"
                                    },
                                    "is_remote": {
                                        "type": "boolean",
                                        "example": false
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Site créé"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/sites/{id}": {
            "get": {
                "tags": [
                    "Paramètres — Structure organisationnelle"
                ],
                "summary": "Détail d'un site",
                "operationId": "6cb37121f58990b845aa524133eb6cc2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "success"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "404": {
                        "description": "Site introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "delete": {
                "tags": [
                    "Paramètres — Structure organisationnelle"
                ],
                "summary": "Supprimer un site",
                "description": "Réservé aux rôles admin et hr_manager. Refusé si des collaborateurs y sont rattachés.",
                "operationId": "81c5be3931ccc205206b70a79fc5e8f6",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Site supprimé"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Site introuvable"
                    },
                    "422": {
                        "description": "Site encore utilisé par des collaborateurs"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "patch": {
                "tags": [
                    "Paramètres — Structure organisationnelle"
                ],
                "summary": "Mettre à jour un site",
                "description": "Réservé aux rôles admin et hr_manager.",
                "operationId": "c6d609c60d2161ff96a8d643b2948d81",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "name": {
                                        "type": "string"
                                    },
                                    "city": {
                                        "type": "string"
                                    },
                                    "address": {
                                        "type": "string"
                                    },
                                    "is_remote": {
                                        "type": "boolean"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Site mis à jour"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Site introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        }
    },
    "components": {
        "securitySchemes": {
            "bearerAuth": {
                "type": "http",
                "scheme": "bearer",
                "description": "Token opaque retourné par /api/auth/login, à envoyer dans l'en-tête Authorization: Bearer {token}. Vérifié côté serveur contre la table access_tokens (empreinte SHA-256, pas de JWT)."
            }
        }
    },
    "tags": [
        {
            "name": "Authentification",
            "description": "Connexion, déconnexion, utilisateur courant"
        },
        {
            "name": "Effectifs",
            "description": "Gestion des collaborateurs"
        },
        {
            "name": "Recrutement",
            "description": "Postes ouverts et pipeline de candidats"
        },
        {
            "name": "Congés & absences",
            "description": "Demandes de congés, validation, soldes"
        },
        {
            "name": "Documents",
            "description": "Contrats, avenants, attestations, notes de frais, upload/téléchargement"
        },
        {
            "name": "Performance",
            "description": "Cycles d'entretien, objectifs, compétences"
        },
        {
            "name": "Paie",
            "description": "Cycles de paie, bulletins, masse salariale"
        },
        {
            "name": "Paramètres — Structure organisationnelle",
            "description": "Départements, services, postes, sites, types de contrat"
        },
        {
            "name": "Vue d'ensemble",
            "description": "Vue d'ensemble"
        }
    ],
    "security": [
        {
            "bearerAuth": []
        }
    ]
}