---
openapi: 3.0.3
info:
  title: BTP Xpress API
  description: Backend REST API for BTP Xpress application
  version: 1.0.0
tags:
- name: Abonnements
  description: Gestion des abonnements d'entreprise
- name: Authentification
  description: Informations utilisateur et statut d'authentification
- name: Bons de Commande
  description: Gestion des bons de commande BTP
- name: Budgets
  description: Gestion du suivi budgétaire
- name: CalculsTechniques
  description: Calculs techniques ultra-détaillés BTP - Système le plus avancé d'Afrique
- name: Chantiers
  description: Gestion des chantiers BTP
- name: Clients
  description: Gestion des clients
- name: Dashboard
  description: Tableau de bord et métriques BTP
- name: Devis
  description: Gestion des devis
- name: Disponibilités
  description: Gestion des disponibilités et absences des employés
- name: Documents
  description: Gestion des documents et fichiers BTP
- name: Employés
  description: Gestion des employés
- name: Factures
  description: Gestion des factures BTP
- name: Fournisseurs
  description: Gestion des fournisseurs BTP
- name: Maintenances
  description: Gestion de la maintenance du matériel BTP
- name: Matériels
  description: Gestion des matériels et équipements
- name: Messages
  description: Gestion de la messagerie interne
- name: Notifications
  description: Gestion des notifications système BTP
- name: Phase Templates
  description: Gestion des templates de phases BTP
- name: Phases de Chantier
  description: Gestion des phases de chantier BTP
- name: Photos
  description: Gestion spécialisée des photos de chantiers BTP
- name: Planning
  description: Gestion du planning et des événements BTP
- name: Profils d'Entreprise
  description: Gestion des profils d'entreprise
- name: Reports
  description: Génération de rapports et exports BTP
- name: Sous-Phase Templates
  description: Gestion des templates de sous-phases BTP
- name: Stocks
  description: Gestion des stocks et inventaires BTP
- name: Types de Chantier
  description: Gestion des types de chantier BTP
- name: Tâche Templates
  description: Gestion granulaire des templates de tâches BTP
- name: Utilisateurs
  description: Gestion des utilisateurs du système
- name: Zones Climatiques
  description: Gestion des zones climatiques et contraintes BTP
- name: Équipes
  description: Gestion des équipes de travail BTP
paths:
  /api/permissions/all:
    get:
      tags:
      - Permission Resource
      responses:
        "200":
          description: OK
  /api/permissions/categories:
    get:
      tags:
      - Permission Resource
      responses:
        "200":
          description: OK
  /api/permissions/check/{role}/{permission}:
    get:
      tags:
      - Permission Resource
      parameters:
      - name: permission
        in: path
        required: true
        schema:
          type: string
      - name: role
        in: path
        required: true
        schema:
          type: string
      responses:
        "200":
          description: OK
  /api/permissions/compare/{role1}/{role2}:
    get:
      tags:
      - Permission Resource
      parameters:
      - name: role1
        in: path
        required: true
        schema:
          type: string
      - name: role2
        in: path
        required: true
        schema:
          type: string
      responses:
        "200":
          description: OK
  /api/permissions/gestionnaire:
    get:
      tags:
      - Permission Resource
      responses:
        "200":
          description: OK
  /api/permissions/role/{role}:
    get:
      tags:
      - Permission Resource
      parameters:
      - name: role
        in: path
        required: true
        schema:
          type: string
      responses:
        "200":
          description: OK
  /api/permissions/roles:
    get:
      tags:
      - Permission Resource
      responses:
        "200":
          description: OK
  /api/permissions/validate:
    post:
      tags:
      - Permission Resource
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ValidationRequest"
      responses:
        "200":
          description: OK
  /api/v1/abonnements:
    get:
      tags:
      - Abonnements
      summary: Récupérer tous les abonnements
      parameters:
      - name: statut
        in: query
        description: Statut
        schema:
          type: string
      - name: type
        in: query
        description: Type d'abonnement
        schema:
          type: string
      responses:
        "200":
          description: Liste des abonnements récupérée avec succès
    post:
      tags:
      - Abonnements
      summary: Créer un nouvel abonnement
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Abonnement"
      responses:
        "201":
          description: Abonnement créé avec succès
        "400":
          description: Données invalides
        "409":
          description: Un abonnement actif existe déjà
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/abonnements/actifs:
    get:
      tags:
      - Abonnements
      summary: Récupérer tous les abonnements actifs
      responses:
        "200":
          description: Liste des abonnements actifs
  /api/v1/abonnements/annuel:
    post:
      tags:
      - Abonnements
      summary: Créer un abonnement annuel
      parameters:
      - name: entrepriseId
        in: query
        description: ID de l'entreprise
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      - name: methodePaiement
        in: query
        description: Méthode de paiement
        schema:
          type: string
      - name: type
        in: query
        description: Type d'abonnement
        required: true
        schema:
          type: string
      responses:
        "201":
          description: Abonnement annuel créé avec succès
        "400":
          description: Données invalides
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/abonnements/bientot-expires:
    get:
      tags:
      - Abonnements
      summary: Récupérer les abonnements qui arrivent à expiration
      parameters:
      - name: jours
        in: query
        description: Nombre de jours
        schema:
          format: int32
          default: 7
          type: integer
      responses:
        "200":
          description: Liste des abonnements bientôt expirés
  /api/v1/abonnements/entreprise/{entrepriseId}:
    get:
      tags:
      - Abonnements
      summary: Récupérer l'abonnement actif d'une entreprise
      parameters:
      - name: entrepriseId
        in: path
        description: ID de l'entreprise
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Abonnement actif trouvé
        "404":
          description: Aucun abonnement actif pour cette entreprise
  /api/v1/abonnements/entreprise/{entrepriseId}/historique:
    get:
      tags:
      - Abonnements
      summary: Récupérer l'historique des abonnements d'une entreprise
      parameters:
      - name: entrepriseId
        in: path
        description: ID de l'entreprise
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Historique récupéré avec succès
  /api/v1/abonnements/expires:
    get:
      tags:
      - Abonnements
      summary: Récupérer tous les abonnements expirés
      responses:
        "200":
          description: Liste des abonnements expirés
  /api/v1/abonnements/mensuel:
    post:
      tags:
      - Abonnements
      summary: Créer un abonnement mensuel
      parameters:
      - name: entrepriseId
        in: query
        description: ID de l'entreprise
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      - name: methodePaiement
        in: query
        description: Méthode de paiement
        schema:
          type: string
      - name: type
        in: query
        description: Type d'abonnement
        required: true
        schema:
          type: string
      responses:
        "201":
          description: Abonnement mensuel créé avec succès
        "400":
          description: Données invalides
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/abonnements/plans:
    get:
      tags:
      - Abonnements
      summary: Récupérer les plans tarifaires disponibles
      responses:
        "200":
          description: Plans récupérés avec succès
  /api/v1/abonnements/statistics:
    get:
      tags:
      - Abonnements
      summary: Récupérer les statistiques des abonnements
      responses:
        "200":
          description: Statistiques récupérées avec succès
  /api/v1/abonnements/{id}:
    get:
      tags:
      - Abonnements
      summary: Récupérer un abonnement par ID
      parameters:
      - name: id
        in: path
        description: ID de l'abonnement
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Abonnement trouvé
        "404":
          description: Abonnement non trouvé
    put:
      tags:
      - Abonnements
      summary: Mettre à jour un abonnement
      parameters:
      - name: id
        in: path
        description: ID de l'abonnement
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Abonnement"
      responses:
        "200":
          description: Abonnement mis à jour avec succès
        "404":
          description: Abonnement non trouvé
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
    delete:
      tags:
      - Abonnements
      summary: Supprimer définitivement un abonnement
      parameters:
      - name: id
        in: path
        description: ID de l'abonnement
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "204":
          description: Abonnement supprimé définitivement
        "404":
          description: Abonnement non trouvé
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/abonnements/{id}/annuler:
    post:
      tags:
      - Abonnements
      summary: Annuler un abonnement
      parameters:
      - name: id
        in: path
        description: ID de l'abonnement
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "204":
          description: Abonnement annulé avec succès
        "404":
          description: Abonnement non trouvé
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/abonnements/{id}/changer-type:
    put:
      tags:
      - Abonnements
      summary: Changer le type d'abonnement (upgrade/downgrade)
      parameters:
      - name: id
        in: path
        description: ID de l'abonnement
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      - name: type
        in: query
        description: Nouveau type
        required: true
        schema:
          type: string
      responses:
        "200":
          description: Type changé avec succès
        "404":
          description: Abonnement non trouvé
        "400":
          description: Type invalide
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/abonnements/{id}/reactiver:
    post:
      tags:
      - Abonnements
      summary: Réactiver un abonnement suspendu
      parameters:
      - name: id
        in: path
        description: ID de l'abonnement
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "204":
          description: Abonnement réactivé avec succès
        "404":
          description: Abonnement non trouvé
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/abonnements/{id}/renouveler:
    post:
      tags:
      - Abonnements
      summary: Renouveler un abonnement
      parameters:
      - name: id
        in: path
        description: ID de l'abonnement
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      - name: annuel
        in: query
        description: Renouvellement annuel
        schema:
          default: false
          type: boolean
      responses:
        "200":
          description: Abonnement renouvelé avec succès
        "404":
          description: Abonnement non trouvé
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/abonnements/{id}/suspendre:
    post:
      tags:
      - Abonnements
      summary: Suspendre un abonnement
      parameters:
      - name: id
        in: path
        description: ID de l'abonnement
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "204":
          description: Abonnement suspendu avec succès
        "404":
          description: Abonnement non trouvé
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/abonnements/{id}/toggle-auto-renew:
    put:
      tags:
      - Abonnements
      summary: Activer/désactiver le renouvellement automatique
      parameters:
      - name: id
        in: path
        description: ID de l'abonnement
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Renouvellement automatique modifié
        "404":
          description: Abonnement non trouvé
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/auth/status:
    get:
      tags:
      - Authentification
      summary: Statut d'authentification
      description: Vérifie l'état de l'authentification de l'utilisateur
      responses:
        "200":
          description: Statut récupéré
  /api/v1/auth/user:
    get:
      tags:
      - Authentification
      summary: Informations utilisateur connecté
      description: Récupère les informations de l'utilisateur connecté depuis le token
        JWT Keycloak
      responses:
        "200":
          description: Informations utilisateur récupérées
        "401":
          description: Non authentifié
  /api/v1/bons-commande:
    get:
      tags:
      - Bons de Commande
      summary: Récupérer tous les bons de commande
      description: Retourne la liste complète des bons de commande
      responses:
        "200":
          description: Liste des bons de commande récupérée avec succès
    post:
      tags:
      - Bons de Commande
      summary: Créer un nouveau bon de commande
      description: Crée un nouveau bon de commande
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/BonCommande"
      responses:
        "201":
          description: Bon de commande créé avec succès
        "400":
          description: Données invalides
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/bons-commande/numero/{numero}:
    get:
      tags:
      - Bons de Commande
      summary: Récupérer un bon de commande par numéro
      description: Recherche un bon de commande par son numéro
      parameters:
      - name: numero
        in: path
        description: Numéro du bon de commande
        required: true
        schema:
          type: string
      responses:
        "200":
          description: Bon de commande trouvé
        "404":
          description: Bon de commande non trouvé
  /api/v1/bons-commande/search:
    get:
      tags:
      - Bons de Commande
      summary: Rechercher des bons de commande
      description: Recherche textuelle dans les bons de commande
      parameters:
      - name: term
        in: query
        description: Terme de recherche
        schema:
          type: string
      responses:
        "200":
          description: Résultats de recherche
        "400":
          description: Terme de recherche requis
  /api/v1/bons-commande/statistiques:
    get:
      tags:
      - Bons de Commande
      summary: Récupérer les statistiques des bons de commande
      description: Retourne des statistiques globales
      responses:
        "200":
          description: Statistiques récupérées avec succès
  /api/v1/bons-commande/statut/{statut}:
    get:
      tags:
      - Bons de Commande
      summary: Récupérer les bons de commande par statut
      description: Filtre les bons de commande par statut
      parameters:
      - name: statut
        in: path
        description: Statut du bon de commande
        required: true
        schema:
          $ref: "#/components/schemas/StatutBonCommande"
      responses:
        "200":
          description: Liste des bons de commande filtrés
  /api/v1/bons-commande/urgents:
    get:
      tags:
      - Bons de Commande
      summary: Récupérer les bons de commande urgents
      description: Liste les bons de commande prioritaires
      responses:
        "200":
          description: Liste des bons de commande urgents
  /api/v1/bons-commande/{id}:
    get:
      tags:
      - Bons de Commande
      summary: Récupérer un bon de commande par ID
      description: Retourne les détails d'un bon de commande
      parameters:
      - name: id
        in: path
        description: ID du bon de commande
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Bon de commande trouvé
        "404":
          description: Bon de commande non trouvé
    put:
      tags:
      - Bons de Commande
      summary: Mettre à jour un bon de commande
      description: Met à jour les informations d'un bon de commande
      parameters:
      - name: id
        in: path
        description: ID du bon de commande
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/BonCommande"
      responses:
        "200":
          description: Bon de commande mis à jour avec succès
        "404":
          description: Bon de commande non trouvé
        "400":
          description: Données invalides
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
    delete:
      tags:
      - Bons de Commande
      summary: Supprimer un bon de commande
      description: Supprime un bon de commande
      parameters:
      - name: id
        in: path
        description: ID du bon de commande
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "204":
          description: Bon de commande supprimé avec succès
        "404":
          description: Bon de commande non trouvé
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/bons-commande/{id}/annuler:
    post:
      tags:
      - Bons de Commande
      summary: Annuler un bon de commande
      description: Annule un bon de commande
      parameters:
      - name: id
        in: path
        description: ID du bon de commande
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              additionalProperties:
                type: string
      responses:
        "200":
          description: Bon de commande annulé avec succès
        "404":
          description: Bon de commande non trouvé
        "400":
          description: Le bon de commande ne peut pas être annulé
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/bons-commande/{id}/valider:
    post:
      tags:
      - Bons de Commande
      summary: Valider un bon de commande
      description: Valide un bon de commande en attente
      parameters:
      - name: id
        in: path
        description: ID du bon de commande
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              additionalProperties:
                type: string
      responses:
        "200":
          description: Bon de commande validé avec succès
        "404":
          description: Bon de commande non trouvé
        "400":
          description: Le bon de commande ne peut pas être validé
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/budgets:
    get:
      tags:
      - Budgets
      summary: Récupérer tous les budgets
      parameters:
      - name: search
        in: query
        description: Terme de recherche
        schema:
          type: string
      - name: statut
        in: query
        description: Statut du budget
        schema:
          type: string
      - name: tendance
        in: query
        description: Tendance du budget
        schema:
          type: string
      responses:
        "200":
          description: Liste des budgets récupérée avec succès
    post:
      tags:
      - Budgets
      summary: Créer un nouveau budget
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Budget"
      responses:
        "201":
          description: Budget créé avec succès
        "400":
          description: Données invalides
  /api/v1/budgets/attention:
    get:
      tags:
      - Budgets
      summary: Récupérer les budgets nécessitant une attention
      responses:
        "200":
          description: Budgets nécessitant attention récupérés avec succès
  /api/v1/budgets/chantier/{chantierId}:
    get:
      tags:
      - Budgets
      summary: Récupérer le budget d'un chantier
      parameters:
      - name: chantierId
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Budget du chantier récupéré avec succès
        "404":
          description: Budget non trouvé pour ce chantier
  /api/v1/budgets/depassement:
    get:
      tags:
      - Budgets
      summary: Récupérer les budgets en dépassement
      responses:
        "200":
          description: Budgets en dépassement récupérés avec succès
  /api/v1/budgets/statistiques:
    get:
      tags:
      - Budgets
      summary: Récupérer les statistiques globales des budgets
      responses:
        "200":
          description: Statistiques récupérées avec succès
  /api/v1/budgets/{id}:
    get:
      tags:
      - Budgets
      summary: Récupérer un budget par son ID
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Budget récupéré avec succès
        "404":
          description: Budget non trouvé
    put:
      tags:
      - Budgets
      summary: Mettre à jour un budget
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Budget"
      responses:
        "200":
          description: Budget mis à jour avec succès
        "404":
          description: Budget non trouvé
        "400":
          description: Données invalides
    delete:
      tags:
      - Budgets
      summary: Supprimer un budget
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "204":
          description: Budget supprimé avec succès
        "404":
          description: Budget non trouvé
  /api/v1/budgets/{id}/alertes:
    post:
      tags:
      - Budgets
      summary: Ajouter une alerte à un budget
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              type: string
      responses:
        "200":
          description: Alerte ajoutée avec succès
        "404":
          description: Budget non trouvé
    delete:
      tags:
      - Budgets
      summary: Supprimer les alertes d'un budget
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Alertes supprimées avec succès
        "404":
          description: Budget non trouvé
  /api/v1/budgets/{id}/avancement:
    put:
      tags:
      - Budgets
      summary: Mettre à jour l'avancement d'un budget
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              type: number
      responses:
        "200":
          description: Avancement mis à jour avec succès
        "404":
          description: Budget non trouvé
  /api/v1/budgets/{id}/depenses:
    put:
      tags:
      - Budgets
      summary: Mettre à jour les dépenses d'un budget
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              type: number
      responses:
        "200":
          description: Dépenses mises à jour avec succès
        "404":
          description: Budget non trouvé
  /api/v1/calculs-techniques/beton-arme:
    post:
      tags:
      - CalculsTechniques
      summary: Calcul béton armé avec adaptation climatique africaine
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ParametresCalculBetonArme"
      responses:
        "200":
          description: Calcul complet béton + armatures + adaptations
  /api/v1/calculs-techniques/briques-mur:
    post:
      tags:
      - CalculsTechniques
      summary: Calcul ultra-précis quantité briques pour mur
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ParametresCalculBriques"
      responses:
        "200":
          description: Calcul réussi avec détails complets
        "400":
          description: Paramètres invalides
        "404":
          description: Matériau ou zone climatique non trouvée
  /api/v1/calculs-techniques/dosages-beton:
    get:
      tags:
      - CalculsTechniques
      summary: Liste des dosages béton standard avec adaptations climatiques
      responses:
        "200":
          description: Dosages disponibles
  /api/v1/calculs-techniques/materiaux:
    get:
      tags:
      - CalculsTechniques
      summary: Liste des matériaux BTP avec spécifications détaillées
      parameters:
      - name: categorie
        in: query
        schema:
          type: string
      - name: zone
        in: query
        schema:
          type: string
      responses:
        "200":
          description: Catalogue matériaux ultra-détaillé
  /api/v1/calculs-techniques/mortier-maconnerie:
    post:
      tags:
      - CalculsTechniques
      summary: Calcul mortier pour maçonnerie traditionnelle
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ParametresCalculMortier"
      responses:
        "200":
          description: Quantités mortier calculées
  /api/v1/calculs-techniques/zones-climatiques:
    get:
      tags:
      - CalculsTechniques
      summary: Zones climatiques africaines avec contraintes construction
      responses:
        "200":
          description: Zones climatiques détaillées
  /api/v1/chantiers:
    get:
      tags:
      - Chantiers
      summary: Récupérer tous les chantiers
      parameters:
      - name: clientId
        in: query
        description: ID du client
        schema:
          type: string
      - name: search
        in: query
        description: Terme de recherche
        schema:
          type: string
      - name: statut
        in: query
        description: Statut du chantier
        schema:
          type: string
      responses:
        "200":
          description: Liste des chantiers récupérée avec succès
    post:
      tags:
      - Chantiers
      summary: Créer un nouveau chantier
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ChantierCreateDTO"
      responses:
        "201":
          description: Chantier créé avec succès
        "400":
          description: Données invalides
  /api/v1/chantiers/actifs:
    get:
      tags:
      - Chantiers
      summary: Récupérer tous les chantiers actifs
      responses:
        "200":
          description: Liste des chantiers actifs récupérée avec succès
  /api/v1/chantiers/count:
    get:
      tags:
      - Chantiers
      summary: Compter le nombre de chantiers
      responses:
        "200":
          description: Nombre de chantiers récupéré avec succès
  /api/v1/chantiers/date-range:
    get:
      tags:
      - Chantiers
      parameters:
      - name: dateDebut
        in: query
        schema:
          type: string
      - name: dateFin
        in: query
        schema:
          type: string
      responses:
        "200":
          description: OK
  /api/v1/chantiers/en-cours:
    get:
      tags:
      - Chantiers
      responses:
        "200":
          description: OK
  /api/v1/chantiers/planifies:
    get:
      tags:
      - Chantiers
      responses:
        "200":
          description: OK
  /api/v1/chantiers/stats:
    get:
      tags:
      - Chantiers
      summary: Obtenir les statistiques des chantiers
      responses:
        "200":
          description: Statistiques récupérées avec succès
  /api/v1/chantiers/statut/{statut}:
    get:
      tags:
      - Chantiers
      parameters:
      - name: statut
        in: path
        required: true
        schema:
          type: string
      responses:
        "200":
          description: OK
  /api/v1/chantiers/termines:
    get:
      tags:
      - Chantiers
      responses:
        "200":
          description: OK
  /api/v1/chantiers/{id}:
    get:
      tags:
      - Chantiers
      summary: Récupérer un chantier par ID
      parameters:
      - name: id
        in: path
        description: ID du chantier
        required: true
        schema:
          type: string
      responses:
        "200":
          description: Chantier récupéré avec succès
        "404":
          description: Chantier non trouvé
    put:
      tags:
      - Chantiers
      summary: Mettre à jour un chantier
      parameters:
      - name: id
        in: path
        description: ID du chantier
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ChantierCreateDTO"
      responses:
        "200":
          description: Chantier mis à jour avec succès
        "400":
          description: Données invalides
        "404":
          description: Chantier non trouvé
    delete:
      tags:
      - Chantiers
      summary: Supprimer un chantier
      parameters:
      - name: id
        in: path
        description: ID du chantier
        required: true
        schema:
          type: string
      - name: permanent
        in: query
        description: "Suppression définitive (true) ou logique (false, défaut)"
        schema:
          default: false
          type: boolean
      responses:
        "204":
          description: Chantier supprimé avec succès
        "400":
          description: ID invalide
        "404":
          description: Chantier non trouvé
        "409":
          description: Impossible de supprimer
  /api/v1/chantiers/{id}/statut:
    put:
      tags:
      - Chantiers
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UpdateStatutRequest"
      responses:
        "200":
          description: OK
  /api/v1/clients:
    get:
      tags:
      - Clients
      summary: Récupérer tous les clients
      parameters:
      - name: page
        in: query
        description: Numéro de page (0-based)
        schema:
          format: int32
          default: 0
          type: integer
      - name: size
        in: query
        description: Taille de la page
        schema:
          format: int32
          default: 20
          type: integer
      responses:
        "200":
          description: Liste des clients récupérée avec succès
    post:
      tags:
      - Clients
      summary: Créer un nouveau client
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ClientCreateDTO"
      responses:
        "201":
          description: Client créé avec succès
        "400":
          description: Données invalides
  /api/v1/clients/count:
    get:
      tags:
      - Clients
      summary: Compter le nombre de clients
      responses:
        "200":
          description: Nombre de clients
  /api/v1/clients/search:
    get:
      tags:
      - Clients
      summary: Rechercher des clients
      parameters:
      - name: email
        in: query
        description: Email
        schema:
          type: string
      - name: entreprise
        in: query
        description: Entreprise
        schema:
          type: string
      - name: nom
        in: query
        description: Nom du client
        schema:
          type: string
      - name: ville
        in: query
        description: Ville
        schema:
          type: string
      responses:
        "200":
          description: Résultats de recherche
  /api/v1/clients/{id}:
    get:
      tags:
      - Clients
      summary: Récupérer un client par ID
      parameters:
      - name: id
        in: path
        description: ID du client
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Client trouvé
        "404":
          description: Client non trouvé
    put:
      tags:
      - Clients
      summary: Mettre à jour un client
      parameters:
      - name: id
        in: path
        description: ID du client
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Client"
      responses:
        "200":
          description: Client mis à jour avec succès
        "404":
          description: Client non trouvé
        "400":
          description: Données invalides
    delete:
      tags:
      - Clients
      summary: Supprimer un client
      parameters:
      - name: id
        in: path
        description: ID du client
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "204":
          description: Client supprimé avec succès
        "404":
          description: Client non trouvé
  /api/v1/comparaisons-fournisseurs:
    get:
      tags:
      - Comparaison Fournisseur Resource
      parameters:
      - name: page
        in: query
        schema:
          format: int32
          default: 0
          type: integer
      - name: size
        in: query
        schema:
          format: int32
          default: 50
          type: integer
      responses:
        "200":
          description: OK
  /api/v1/comparaisons-fournisseurs/criteres-comparaison:
    get:
      tags:
      - Comparaison Fournisseur Resource
      responses:
        "200":
          description: OK
  /api/v1/comparaisons-fournisseurs/delais-fournisseurs:
    get:
      tags:
      - Comparaison Fournisseur Resource
      responses:
        "200":
          description: OK
  /api/v1/comparaisons-fournisseurs/disponibles-delai:
    get:
      tags:
      - Comparaison Fournisseur Resource
      parameters:
      - name: maxJours
        in: query
        schema:
          format: int32
          default: 30
          type: integer
      responses:
        "200":
          description: OK
  /api/v1/comparaisons-fournisseurs/evolution-prix/{materielId}:
    get:
      tags:
      - Comparaison Fournisseur Resource
      parameters:
      - name: materielId
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      - name: dateDebut
        in: query
        required: true
        schema:
          $ref: "#/components/schemas/LocalDate"
      - name: dateFin
        in: query
        required: true
        schema:
          $ref: "#/components/schemas/LocalDate"
      responses:
        "200":
          description: OK
  /api/v1/comparaisons-fournisseurs/fournisseur/{fournisseurId}:
    get:
      tags:
      - Comparaison Fournisseur Resource
      parameters:
      - name: fournisseurId
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: OK
  /api/v1/comparaisons-fournisseurs/gamme-prix:
    get:
      tags:
      - Comparaison Fournisseur Resource
      parameters:
      - name: prixMax
        in: query
        required: true
        schema:
          type: number
      - name: prixMin
        in: query
        required: true
        schema:
          type: number
      responses:
        "200":
          description: OK
  /api/v1/comparaisons-fournisseurs/lancer-comparaison:
    post:
      tags:
      - Comparaison Fournisseur Resource
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/LancerComparaisonRequest"
      responses:
        "200":
          description: OK
  /api/v1/comparaisons-fournisseurs/materiel/{materielId}:
    get:
      tags:
      - Comparaison Fournisseur Resource
      parameters:
      - name: materielId
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: OK
  /api/v1/comparaisons-fournisseurs/meilleures-offres/{materielId}:
    get:
      tags:
      - Comparaison Fournisseur Resource
      parameters:
      - name: materielId
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      - name: limite
        in: query
        schema:
          format: int32
          default: 5
          type: integer
      responses:
        "200":
          description: OK
  /api/v1/comparaisons-fournisseurs/rapport/{sessionId}:
    get:
      tags:
      - Comparaison Fournisseur Resource
      parameters:
      - name: sessionId
        in: path
        required: true
        schema:
          type: string
      responses:
        "200":
          description: OK
  /api/v1/comparaisons-fournisseurs/recommandees:
    get:
      tags:
      - Comparaison Fournisseur Resource
      responses:
        "200":
          description: OK
  /api/v1/comparaisons-fournisseurs/search:
    get:
      tags:
      - Comparaison Fournisseur Resource
      parameters:
      - name: terme
        in: query
        schema:
          type: string
      responses:
        "200":
          description: OK
  /api/v1/comparaisons-fournisseurs/session/{sessionId}:
    get:
      tags:
      - Comparaison Fournisseur Resource
      parameters:
      - name: sessionId
        in: path
        required: true
        schema:
          type: string
      responses:
        "200":
          description: OK
  /api/v1/comparaisons-fournisseurs/session/{sessionId}/classer:
    put:
      tags:
      - Comparaison Fournisseur Resource
      parameters:
      - name: sessionId
        in: path
        required: true
        schema:
          type: string
      responses:
        "200":
          description: OK
  /api/v1/comparaisons-fournisseurs/statistiques:
    get:
      tags:
      - Comparaison Fournisseur Resource
      responses:
        "200":
          description: OK
  /api/v1/comparaisons-fournisseurs/{id}:
    get:
      tags:
      - Comparaison Fournisseur Resource
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: OK
    put:
      tags:
      - Comparaison Fournisseur Resource
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UpdateComparaisonRequest"
      responses:
        "200":
          description: OK
  /api/v1/comparaisons-fournisseurs/{id}/calculer-scores:
    put:
      tags:
      - Comparaison Fournisseur Resource
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CalculerScoresRequest"
      responses:
        "200":
          description: OK
  /api/v1/dashboard:
    get:
      tags:
      - Dashboard
      summary: Tableau de bord principal
      description: Récupère les métriques principales du système BTP
      responses:
        "200":
          description: Métriques du dashboard récupérées
  /api/v1/dashboard/activites-recentes:
    get:
      tags:
      - Dashboard
      summary: Activités récentes
      description: Liste des dernières activités du système
      parameters:
      - name: limit
        in: query
        description: Nombre d'activités à récupérer
        schema:
          format: int32
          default: 10
          type: integer
      responses:
        "200":
          description: Activités récentes récupérées
  /api/v1/dashboard/alertes:
    get:
      tags:
      - Dashboard
      summary: Alertes et notifications
      description: Alertes nécessitant une attention immédiate
      responses:
        "200":
          description: Alertes récupérées
  /api/v1/dashboard/chantiers:
    get:
      tags:
      - Dashboard
      summary: Dashboard des chantiers
      description: Métriques détaillées des chantiers
      responses:
        "200":
          description: Métriques des chantiers récupérées
  /api/v1/dashboard/finances:
    get:
      tags:
      - Dashboard
      summary: Métriques financières
      description: Calculs financiers en temps réel basés sur les chantiers
      parameters:
      - name: periode
        in: query
        description: Période en jours
        schema:
          format: int32
          default: 30
          type: integer
        example: 30
      responses:
        "200":
          description: Métriques financières récupérées
  /api/v1/dashboard/kpi:
    get:
      tags:
      - Dashboard
      summary: Indicateurs clés de performance
      description: KPIs principaux du système BTP
      parameters:
      - name: periode
        in: query
        description: Période en jours
        schema:
          format: int32
          default: 30
          type: integer
        example: 30
      responses:
        "200":
          description: KPIs récupérés
  /api/v1/dashboard/maintenance:
    get:
      tags:
      - Dashboard
      summary: Dashboard de maintenance
      description: Métriques de maintenance du matériel
      responses:
        "200":
          description: Métriques de maintenance récupérées
  /api/v1/dashboard/planning:
    get:
      tags:
      - Dashboard
      summary: Dashboard du planning
      description: Vue d'ensemble du planning
      parameters:
      - name: date
        in: query
        description: Date de référence (yyyy-mm-dd)
        schema:
          default: ""
          type: string
      responses:
        "200":
          description: Planning récupéré
  /api/v1/dashboard/ressources:
    get:
      tags:
      - Dashboard
      summary: Dashboard des ressources
      description: État des ressources humaines et matérielles
      responses:
        "200":
          description: État des ressources récupéré
  /api/v1/dashboard/resume-quotidien:
    get:
      tags:
      - Dashboard
      summary: Résumé quotidien
      description: Résumé de l'activité quotidienne
      responses:
        "200":
          description: Résumé quotidien récupéré
  /api/v1/devis:
    get:
      tags:
      - Devis
      summary: Récupérer tous les devis
      parameters:
      - name: page
        in: query
        description: Numéro de page (0-based)
        schema:
          format: int32
          default: 0
          type: integer
      - name: size
        in: query
        description: Taille de la page
        schema:
          format: int32
          default: 20
          type: integer
      responses:
        "200":
          description: Liste des devis récupérée avec succès
    post:
      tags:
      - Devis
      summary: Créer un nouveau devis
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Devis"
      responses:
        "201":
          description: Devis créé avec succès
        "400":
          description: Données invalides
  /api/v1/devis/acceptes:
    get:
      tags:
      - Devis
      summary: Récupérer les devis acceptés
      responses:
        "200":
          description: Devis acceptés récupérés
  /api/v1/devis/chantier/{chantierId}:
    get:
      tags:
      - Devis
      summary: Récupérer les devis d'un chantier
      parameters:
      - name: chantierId
        in: path
        description: ID du chantier
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Devis du chantier récupérés
  /api/v1/devis/client/{clientId}:
    get:
      tags:
      - Devis
      summary: Récupérer les devis d'un client
      parameters:
      - name: clientId
        in: path
        description: ID du client
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Devis du client récupérés
  /api/v1/devis/count:
    get:
      tags:
      - Devis
      summary: Compter le nombre de devis
      responses:
        "200":
          description: Nombre de devis
  /api/v1/devis/count/statut/{statut}:
    get:
      tags:
      - Devis
      summary: Compter le nombre de devis par statut
      parameters:
      - name: statut
        in: path
        description: Statut du devis
        required: true
        schema:
          $ref: "#/components/schemas/StatutDevis"
      responses:
        "200":
          description: Nombre de devis par statut
  /api/v1/devis/en-attente:
    get:
      tags:
      - Devis
      summary: Récupérer les devis en attente
      responses:
        "200":
          description: Devis en attente récupérés
  /api/v1/devis/expiring:
    get:
      tags:
      - Devis
      summary: Récupérer les devis expirant bientôt
      parameters:
      - name: before
        in: query
        description: "Date limite (format: YYYY-MM-DD)"
        schema:
          type: string
      responses:
        "200":
          description: Devis expirant bientôt récupérés
  /api/v1/devis/numero/{numero}:
    get:
      tags:
      - Devis
      summary: Récupérer un devis par numéro
      parameters:
      - name: numero
        in: path
        description: Numéro du devis
        required: true
        schema:
          type: string
      responses:
        "200":
          description: Devis trouvé
        "404":
          description: Devis non trouvé
  /api/v1/devis/search:
    get:
      tags:
      - Devis
      summary: Rechercher des devis
      parameters:
      - name: dateDebut
        in: query
        description: "Date de début d'émission (format: YYYY-MM-DD)"
        schema:
          type: string
      - name: dateFin
        in: query
        description: "Date de fin d'émission (format: YYYY-MM-DD)"
        schema:
          type: string
      responses:
        "200":
          description: Résultats de recherche
  /api/v1/devis/statut/{statut}:
    get:
      tags:
      - Devis
      summary: Récupérer les devis par statut
      parameters:
      - name: statut
        in: path
        description: Statut du devis
        required: true
        schema:
          $ref: "#/components/schemas/StatutDevis"
      responses:
        "200":
          description: Devis par statut récupérés
  /api/v1/devis/{id}:
    get:
      tags:
      - Devis
      summary: Récupérer un devis par ID
      parameters:
      - name: id
        in: path
        description: ID du devis
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Devis trouvé
        "404":
          description: Devis non trouvé
    put:
      tags:
      - Devis
      summary: Mettre à jour un devis
      parameters:
      - name: id
        in: path
        description: ID du devis
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Devis"
      responses:
        "200":
          description: Devis mis à jour avec succès
        "404":
          description: Devis non trouvé
        "400":
          description: Données invalides
    delete:
      tags:
      - Devis
      summary: Supprimer un devis
      parameters:
      - name: id
        in: path
        description: ID du devis
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "204":
          description: Devis supprimé avec succès
        "404":
          description: Devis non trouvé
        "400":
          description: Devis ne peut pas être supprimé
  /api/v1/devis/{id}/envoyer:
    put:
      tags:
      - Devis
      summary: Envoyer un devis
      parameters:
      - name: id
        in: path
        description: ID du devis
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Devis envoyé avec succès
        "404":
          description: Devis non trouvé
        "400":
          description: Devis ne peut pas être envoyé
  /api/v1/devis/{id}/pdf:
    get:
      tags:
      - Devis
      summary: Générer le PDF d'un devis
      parameters:
      - name: id
        in: path
        description: ID du devis
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: PDF généré avec succès
        "404":
          description: Devis non trouvé
  /api/v1/devis/{id}/statut:
    put:
      tags:
      - Devis
      summary: Mettre à jour le statut d'un devis
      parameters:
      - name: id
        in: path
        description: ID du devis
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      - name: statut
        in: query
        description: Nouveau statut
        required: true
        schema:
          $ref: "#/components/schemas/StatutDevis"
      responses:
        "200":
          description: Statut mis à jour avec succès
        "404":
          description: Devis non trouvé
        "400":
          description: Transition de statut invalide
  /api/v1/disponibilites:
    get:
      tags:
      - Disponibilités
      summary: Lister toutes les disponibilités
      description: Récupère la liste paginée de toutes les disponibilités avec filtres
        optionnels
      parameters:
      - name: approuvee
        in: query
        description: Filtrer par statut d'approbation
        schema:
          type: boolean
      - name: employeId
        in: query
        description: Filtrer par employé (UUID)
        schema:
          $ref: "#/components/schemas/UUID"
      - name: page
        in: query
        description: Numéro de page (0-indexé)
        schema:
          format: int32
          default: 0
          type: integer
        example: 0
      - name: size
        in: query
        description: Taille de page
        schema:
          format: int32
          default: 20
          type: integer
        example: 20
      - name: type
        in: query
        description: Filtrer par type de disponibilité
        schema:
          type: string
      responses:
        "200":
          description: Liste des disponibilités récupérée avec succès
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Disponibilite"
    post:
      tags:
      - Disponibilités
      summary: Créer une nouvelle disponibilité
      description: Créé une nouvelle demande de disponibilité pour un employé
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreateDisponibiliteRequest"
      responses:
        "201":
          description: Disponibilité créée avec succès
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Disponibilite"
        "400":
          description: Données invalides ou conflit détecté
  /api/v1/disponibilites/actuelles:
    get:
      tags:
      - Disponibilités
      summary: Lister les disponibilités actuelles
      description: Récupère toutes les disponibilités actuellement actives
      responses:
        "200":
          description: Disponibilités actuelles récupérées
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Disponibilite"
  /api/v1/disponibilites/employe/{employeId}/conflits:
    get:
      tags:
      - Disponibilités
      summary: Rechercher les conflits de disponibilité
      description: Trouve les conflits de disponibilité pour un employé et une période
      parameters:
      - name: employeId
        in: path
        description: Identifiant de l'employé
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      - name: dateDebut
        in: query
        description: Date/heure de début
        required: true
        schema:
          $ref: "#/components/schemas/LocalDateTime"
      - name: dateFin
        in: query
        description: Date/heure de fin
        required: true
        schema:
          $ref: "#/components/schemas/LocalDateTime"
      - name: excludeId
        in: query
        description: ID à exclure de la recherche
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Conflits trouvés
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Disponibilite"
  /api/v1/disponibilites/employe/{employeId}/disponible:
    get:
      tags:
      - Disponibilités
      summary: Vérifier la disponibilité d'un employé
      description: Vérifie si un employé est disponible pour une période donnée
      parameters:
      - name: employeId
        in: path
        description: Identifiant de l'employé
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      - name: dateDebut
        in: query
        description: Date/heure de début
        required: true
        schema:
          $ref: "#/components/schemas/LocalDateTime"
      - name: dateFin
        in: query
        description: Date/heure de fin
        required: true
        schema:
          $ref: "#/components/schemas/LocalDateTime"
      responses:
        "200":
          description: Statut de disponibilité retourné
  /api/v1/disponibilites/en-attente:
    get:
      tags:
      - Disponibilités
      summary: Lister les demandes en attente
      description: Récupère toutes les demandes de disponibilité en attente d'approbation
      responses:
        "200":
          description: Demandes en attente récupérées
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Disponibilite"
  /api/v1/disponibilites/futures:
    get:
      tags:
      - Disponibilités
      summary: Lister les disponibilités futures
      description: Récupère toutes les disponibilités programmées pour le futur
      responses:
        "200":
          description: Disponibilités futures récupérées
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Disponibilite"
  /api/v1/disponibilites/periode:
    get:
      tags:
      - Disponibilités
      summary: Lister les disponibilités pour une période
      description: Récupère toutes les disponibilités dans une période donnée
      parameters:
      - name: dateDebut
        in: query
        description: Date de début (yyyy-mm-dd)
        required: true
        schema:
          $ref: "#/components/schemas/LocalDate"
      - name: dateFin
        in: query
        description: Date de fin (yyyy-mm-dd)
        required: true
        schema:
          $ref: "#/components/schemas/LocalDate"
      responses:
        "200":
          description: Disponibilités de la période récupérées
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Disponibilite"
  /api/v1/disponibilites/statistiques:
    get:
      tags:
      - Disponibilités
      summary: Obtenir les statistiques des disponibilités
      description: Récupère les statistiques globales des disponibilités
      responses:
        "200":
          description: Statistiques récupérées avec succès
  /api/v1/disponibilites/statistiques/par-employe:
    get:
      tags:
      - Disponibilités
      summary: Statistiques par employé
      description: Récupère les statistiques de disponibilité par employé
      responses:
        "200":
          description: Statistiques par employé récupérées
  /api/v1/disponibilites/statistiques/par-type:
    get:
      tags:
      - Disponibilités
      summary: Statistiques par type de disponibilité
      description: Récupère les statistiques détaillées par type
      responses:
        "200":
          description: Statistiques par type récupérées
  /api/v1/disponibilites/{id}:
    get:
      tags:
      - Disponibilités
      summary: Récupérer une disponibilité par ID
      description: Récupère les détails d'une disponibilité spécifique
      parameters:
      - name: id
        in: path
        description: Identifiant unique de la disponibilité
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Disponibilité trouvée
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Disponibilite"
        "404":
          description: Disponibilité non trouvée
    put:
      tags:
      - Disponibilités
      summary: Mettre à jour une disponibilité
      description: Met à jour les informations d'une disponibilité existante
      parameters:
      - name: id
        in: path
        description: Identifiant de la disponibilité
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UpdateDisponibiliteRequest"
      responses:
        "200":
          description: Disponibilité mise à jour avec succès
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Disponibilite"
        "404":
          description: Disponibilité non trouvée
        "400":
          description: Données invalides
    delete:
      tags:
      - Disponibilités
      summary: Supprimer une disponibilité
      description: Supprime définitivement une disponibilité
      parameters:
      - name: id
        in: path
        description: Identifiant de la disponibilité
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "204":
          description: Disponibilité supprimée avec succès
        "404":
          description: Disponibilité non trouvée
        "400":
          description: Impossible de supprimer
  /api/v1/disponibilites/{id}/approuver:
    post:
      tags:
      - Disponibilités
      summary: Approuver une demande de disponibilité
      description: Approuve une demande de disponibilité en attente
      parameters:
      - name: id
        in: path
        description: Identifiant de la disponibilité
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Disponibilité approuvée avec succès
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Disponibilite"
        "404":
          description: Disponibilité non trouvée
        "400":
          description: Disponibilité déjà approuvée
  /api/v1/disponibilites/{id}/rejeter:
    post:
      tags:
      - Disponibilités
      summary: Rejeter une demande de disponibilité
      description: Rejette une demande de disponibilité avec une raison
      parameters:
      - name: id
        in: path
        description: Identifiant de la disponibilité
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/RejetDisponibiliteRequest"
      responses:
        "200":
          description: Disponibilité rejetée avec succès
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Disponibilite"
        "404":
          description: Disponibilité non trouvée
        "400":
          description: Impossible de rejeter
  /api/v1/documents:
    get:
      tags:
      - Documents
      summary: Lister tous les documents
      description: Récupère la liste paginée de tous les documents avec filtres optionnels
      parameters:
      - name: chantierId
        in: query
        description: Filtrer par chantier (UUID)
        schema:
          $ref: "#/components/schemas/UUID"
      - name: clientId
        in: query
        description: Filtrer par client (UUID)
        schema:
          $ref: "#/components/schemas/UUID"
      - name: employeId
        in: query
        description: Filtrer par employé (UUID)
        schema:
          $ref: "#/components/schemas/UUID"
      - name: materielId
        in: query
        description: Filtrer par matériel (UUID)
        schema:
          $ref: "#/components/schemas/UUID"
      - name: page
        in: query
        description: Numéro de page (0-indexé)
        schema:
          format: int32
          default: 0
          type: integer
        example: 0
      - name: public
        in: query
        description: Afficher seulement les documents publics
        schema:
          type: boolean
      - name: search
        in: query
        description: Terme de recherche
        schema:
          type: string
      - name: size
        in: query
        description: Taille de page
        schema:
          format: int32
          default: 20
          type: integer
        example: 20
      - name: type
        in: query
        description: Filtrer par type de document
        schema:
          type: string
      responses:
        "200":
          description: Liste des documents récupérée avec succès
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Document"
  /api/v1/documents/images:
    get:
      tags:
      - Documents
      summary: Lister les documents images
      description: Récupère tous les documents de type image
      responses:
        "200":
          description: Images récupérées
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Document"
  /api/v1/documents/orphelins:
    get:
      tags:
      - Documents
      summary: Lister les documents orphelins
      description: Récupère les documents non liés à une entité spécifique
      responses:
        "200":
          description: Documents orphelins récupérés
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Document"
  /api/v1/documents/pdfs:
    get:
      tags:
      - Documents
      summary: Lister les documents PDF
      description: Récupère tous les documents PDF
      responses:
        "200":
          description: PDFs récupérés
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Document"
  /api/v1/documents/publics:
    get:
      tags:
      - Documents
      summary: Lister les documents publics
      description: Récupère tous les documents marqués comme publics
      responses:
        "200":
          description: Documents publics récupérés
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Document"
  /api/v1/documents/recents:
    get:
      tags:
      - Documents
      summary: Lister les documents récents
      description: Récupère les documents les plus récemment ajoutés
      parameters:
      - name: limite
        in: query
        description: Nombre de documents à retourner
        schema:
          format: int32
          default: 10
          type: integer
        example: 10
      responses:
        "200":
          description: Documents récents récupérés
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Document"
  /api/v1/documents/statistiques:
    get:
      tags:
      - Documents
      summary: Obtenir les statistiques des documents
      description: Récupère les statistiques globales des documents
      responses:
        "200":
          description: Statistiques récupérées avec succès
  /api/v1/documents/statistiques/par-extension:
    get:
      tags:
      - Documents
      summary: Statistiques par extension de fichier
      description: Récupère les statistiques par extension de fichier
      responses:
        "200":
          description: Statistiques par extension récupérées
  /api/v1/documents/statistiques/par-type:
    get:
      tags:
      - Documents
      summary: Statistiques par type de document
      description: Récupère les statistiques détaillées par type
      responses:
        "200":
          description: Statistiques par type récupérées
  /api/v1/documents/statistiques/tendances-upload:
    get:
      tags:
      - Documents
      summary: Tendances des uploads
      description: Récupère les tendances d'upload sur plusieurs mois
      parameters:
      - name: mois
        in: query
        description: Nombre de mois
        schema:
          format: int32
          default: 12
          type: integer
        example: 12
      responses:
        "200":
          description: Tendances d'upload récupérées
  /api/v1/documents/upload:
    post:
      tags:
      - Documents
      summary: Uploader un nouveau document
      description: Upload un fichier avec ses métadonnées
      requestBody:
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                nom:
                  type: string
                description:
                  type: string
                type:
                  type: string
                file:
                  $ref: "#/components/schemas/FileUpload"
                fileName:
                  type: string
                contentType:
                  type: string
                fileSize:
                  format: int64
                  type: integer
                chantierId:
                  $ref: "#/components/schemas/UUID"
                materielId:
                  $ref: "#/components/schemas/UUID"
                equipeId:
                  $ref: "#/components/schemas/UUID"
                employeId:
                  $ref: "#/components/schemas/UUID"
      responses:
        "201":
          description: Document uploadé avec succès
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Document"
        "400":
          description: Données invalides ou fichier non supporté
  /api/v1/documents/{id}:
    get:
      tags:
      - Documents
      summary: Récupérer un document par ID
      description: Récupère les métadonnées d'un document spécifique
      parameters:
      - name: id
        in: path
        description: Identifiant unique du document
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Document trouvé
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Document"
        "404":
          description: Document non trouvé
    put:
      tags:
      - Documents
      summary: Mettre à jour un document
      description: Met à jour les métadonnées d'un document
      parameters:
      - name: id
        in: path
        description: Identifiant du document
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UpdateDocumentRequest"
      responses:
        "200":
          description: Document mis à jour avec succès
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Document"
        "404":
          description: Document non trouvé
    delete:
      tags:
      - Documents
      summary: Supprimer un document
      description: Supprime définitivement un document et son fichier
      parameters:
      - name: id
        in: path
        description: Identifiant du document
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "204":
          description: Document supprimé avec succès
        "404":
          description: Document non trouvé
  /api/v1/documents/{id}/download:
    get:
      tags:
      - Documents
      summary: Télécharger un document
      description: Télécharge le fichier physique d'un document
      parameters:
      - name: id
        in: path
        description: Identifiant du document
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Fichier téléchargé avec succès
        "404":
          description: Document ou fichier non trouvé
  /api/v1/documents/{id}/preview:
    get:
      tags:
      - Documents
      summary: Prévisualiser un document
      description: Affiche le document dans le navigateur (pour images et PDFs)
      parameters:
      - name: id
        in: path
        description: Identifiant du document
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Prévisualisation disponible
        "404":
          description: Document non trouvé
  /api/v1/employes:
    get:
      tags:
      - Employés
      summary: Récupérer tous les employés
      parameters:
      - name: search
        in: query
        description: Terme de recherche
        schema:
          type: string
      - name: statut
        in: query
        description: Statut de l'employé
        schema:
          type: string
      responses:
        "200":
          description: Liste des employés récupérée avec succès
  /api/v1/employes/actifs:
    get:
      tags:
      - Employés
      summary: Récupérer les employés actifs
      responses:
        "200":
          description: Liste des employés actifs récupérée avec succès
  /api/v1/employes/count:
    get:
      tags:
      - Employés
      summary: Compter le nombre d'employés
      responses:
        "200":
          description: Nombre d'employés retourné avec succès
  /api/v1/employes/disponibles:
    get:
      tags:
      - Employés
      summary: Récupérer les employés disponibles
      parameters:
      - name: dateDebut
        in: query
        description: Date de début (YYYY-MM-DD)
        schema:
          type: string
      - name: dateFin
        in: query
        description: Date de fin (YYYY-MM-DD)
        schema:
          type: string
      responses:
        "200":
          description: Liste des employés disponibles récupérée avec succès
        "400":
          description: Paramètres de date manquants
  /api/v1/employes/stats:
    get:
      tags:
      - Employés
      summary: Obtenir les statistiques des employés
      responses:
        "200":
          description: Statistiques récupérées avec succès
  /api/v1/employes/{id}:
    get:
      tags:
      - Employés
      summary: Récupérer un employé par ID
      parameters:
      - name: id
        in: path
        description: ID de l'employé
        required: true
        schema:
          type: string
      responses:
        "200":
          description: Employé récupéré avec succès
        "404":
          description: Employé non trouvé
  /api/v1/entreprise-profiles:
    get:
      tags:
      - Profils d'Entreprise
      summary: Récupérer tous les profils d'entreprise visibles
      description: "Retourne la liste complète des profils d'entreprise visibles,\
        \ triés par note"
      parameters:
      - name: page
        in: query
        description: Numéro de page (0-based)
        schema:
          format: int32
          default: 0
          type: integer
      - name: size
        in: query
        description: Taille de la page
        schema:
          format: int32
          default: 20
          type: integer
      responses:
        "200":
          description: Liste des profils récupérée avec succès
    post:
      tags:
      - Profils d'Entreprise
      summary: Créer un nouveau profil d'entreprise
      description: Crée un nouveau profil d'entreprise pour un utilisateur
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EntrepriseProfile"
      responses:
        "201":
          description: Profil créé avec succès
        "400":
          description: Données invalides
        "409":
          description: Un profil existe déjà pour cet utilisateur
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/entreprise-profiles/search:
    get:
      tags:
      - Profils d'Entreprise
      summary: Rechercher des profils d'entreprise
      description: Recherche textuelle complète dans les profils
      parameters:
      - name: certifie
        in: query
        description: Certifié uniquement
        schema:
          type: boolean
      - name: q
        in: query
        description: Terme de recherche
        schema:
          type: string
      - name: region
        in: query
        description: Région
        schema:
          type: string
      - name: specialite
        in: query
        description: Spécialité
        schema:
          type: string
      - name: typeAbonnement
        in: query
        description: Type d'abonnement
        schema:
          $ref: "#/components/schemas/TypeAbonnement"
      - name: ville
        in: query
        description: Ville
        schema:
          type: string
      - name: zone
        in: query
        description: Zone d'intervention
        schema:
          type: string
      responses:
        "200":
          description: Résultats de recherche
  /api/v1/entreprise-profiles/statistics:
    get:
      tags:
      - Profils d'Entreprise
      summary: Récupérer les statistiques des profils
      description: Retourne des statistiques globales sur les profils d'entreprise
      responses:
        "200":
          description: Statistiques récupérées avec succès
  /api/v1/entreprise-profiles/top-rated:
    get:
      tags:
      - Profils d'Entreprise
      summary: Récupérer les profils les mieux notés
      description: Retourne les profils d'entreprise avec les meilleures notes
      parameters:
      - name: limit
        in: query
        description: Nombre de profils à retourner
        schema:
          format: int32
          default: 10
          type: integer
      responses:
        "200":
          description: Liste des profils les mieux notés
  /api/v1/entreprise-profiles/user/{userId}:
    get:
      tags:
      - Profils d'Entreprise
      summary: Récupérer le profil d'un utilisateur
      description: Retourne le profil d'entreprise associé à un utilisateur
      parameters:
      - name: userId
        in: path
        description: ID de l'utilisateur
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Profil trouvé
        "404":
          description: Profil non trouvé pour cet utilisateur
  /api/v1/entreprise-profiles/{id}:
    get:
      tags:
      - Profils d'Entreprise
      summary: Récupérer un profil d'entreprise par ID
      description: Retourne les détails complets d'un profil d'entreprise
      parameters:
      - name: id
        in: path
        description: ID du profil
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Profil trouvé
        "404":
          description: Profil non trouvé
    put:
      tags:
      - Profils d'Entreprise
      summary: Mettre à jour un profil d'entreprise
      description: Met à jour les informations d'un profil d'entreprise existant
      parameters:
      - name: id
        in: path
        description: ID du profil
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EntrepriseProfile"
      responses:
        "200":
          description: Profil mis à jour avec succès
        "404":
          description: Profil non trouvé
        "400":
          description: Données invalides
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
    delete:
      tags:
      - Profils d'Entreprise
      summary: Supprimer un profil d'entreprise
      description: Supprime (désactive) un profil d'entreprise
      parameters:
      - name: id
        in: path
        description: ID du profil
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "204":
          description: Profil supprimé avec succès
        "404":
          description: Profil non trouvé
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/entreprise-profiles/{id}/increment-clients:
    put:
      tags:
      - Profils d'Entreprise
      summary: Incrémenter le nombre de clients servis
      description: Incrémente le compteur de clients servis pour un profil
      parameters:
      - name: id
        in: path
        description: ID du profil
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Compteur incrémenté avec succès
        "404":
          description: Profil non trouvé
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/entreprise-profiles/{id}/increment-projects:
    put:
      tags:
      - Profils d'Entreprise
      summary: Incrémenter le nombre de projets réalisés
      description: Incrémente le compteur de projets réalisés pour un profil
      parameters:
      - name: id
        in: path
        description: ID du profil
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Compteur incrémenté avec succès
        "404":
          description: Profil non trouvé
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/entreprise-profiles/{id}/note:
    put:
      tags:
      - Profils d'Entreprise
      summary: Mettre à jour la note d'un profil
      description: Met à jour la note globale et le nombre d'avis d'un profil
      parameters:
      - name: id
        in: path
        description: ID du profil
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      - name: nombreAvis
        in: query
        description: Nouveau nombre d'avis
        schema:
          format: int32
          default: 0
          type: integer
      - name: note
        in: query
        description: Nouvelle note globale
        required: true
        schema:
          type: number
      responses:
        "200":
          description: Note mise à jour avec succès
        "404":
          description: Profil non trouvé
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/entreprise-profiles/{id}/permanent:
    delete:
      tags:
      - Profils d'Entreprise
      summary: Supprimer définitivement un profil
      description: Supprime définitivement un profil d'entreprise de la base de données
      parameters:
      - name: id
        in: path
        description: ID du profil
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "204":
          description: Profil supprimé définitivement
        "404":
          description: Profil non trouvé
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/equipes:
    get:
      tags:
      - Équipes
      summary: Récupérer toutes les équipes
      parameters:
      - name: maxMembers
        in: query
        description: Nombre maximum de membres
        schema:
          format: int32
          type: integer
      - name: minMembers
        in: query
        description: Nombre minimum de membres
        schema:
          format: int32
          type: integer
      - name: page
        in: query
        description: Numéro de page (0-indexed)
        schema:
          format: int32
          default: 0
          type: integer
      - name: search
        in: query
        description: Terme de recherche
        schema:
          type: string
      - name: size
        in: query
        description: Taille de la page
        schema:
          format: int32
          default: 20
          type: integer
      - name: specialite
        in: query
        description: Filtrer par spécialité
        schema:
          type: string
      - name: statut
        in: query
        description: Filtrer par statut
        schema:
          type: string
      responses:
        "200":
          description: Liste des équipes récupérée avec succès
    post:
      tags:
      - Équipes
      summary: Créer une nouvelle équipe
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreateEquipeRequest"
      responses:
        "201":
          description: Équipe créée avec succès
        "400":
          description: Données invalides
  /api/v1/equipes/count:
    get:
      tags:
      - Équipes
      summary: Compter le nombre d'équipes
      parameters:
      - name: statut
        in: query
        description: Filtrer par statut
        schema:
          type: string
      responses:
        "200":
          description: Nombre d'équipes retourné avec succès
  /api/v1/equipes/disponibles:
    get:
      tags:
      - Équipes
      summary: Récupérer les équipes disponibles
      parameters:
      - name: dateDebut
        in: query
        description: Date de début (YYYY-MM-DD)
        schema:
          type: string
      - name: dateFin
        in: query
        description: Date de fin (YYYY-MM-DD)
        schema:
          type: string
      - name: specialite
        in: query
        description: Spécialité requise
        schema:
          type: string
      responses:
        "200":
          description: Liste des équipes disponibles récupérée avec succès
        "400":
          description: Paramètres de date manquants
  /api/v1/equipes/optimal:
    get:
      tags:
      - Équipes
      summary: Trouver l'équipe optimale pour un chantier
      parameters:
      - name: dateDebut
        in: query
        description: Date de début (YYYY-MM-DD)
        schema:
          type: string
      - name: dateFin
        in: query
        description: Date de fin (YYYY-MM-DD)
        schema:
          type: string
      - name: minMembers
        in: query
        description: Nombre minimum de membres
        schema:
          format: int32
          default: 1
          type: integer
      - name: specialite
        in: query
        description: Spécialité requise
        schema:
          type: string
      responses:
        "200":
          description: Équipes optimales trouvées avec succès
        "400":
          description: Critères invalides
  /api/v1/equipes/specialites:
    get:
      tags:
      - Équipes
      summary: Récupérer toutes les spécialités disponibles
      responses:
        "200":
          description: Liste des spécialités récupérée avec succès
  /api/v1/equipes/stats:
    get:
      tags:
      - Équipes
      summary: Obtenir les statistiques des équipes
      responses:
        "200":
          description: Statistiques récupérées avec succès
  /api/v1/equipes/{id}:
    get:
      tags:
      - Équipes
      summary: Récupérer une équipe par ID
      parameters:
      - name: id
        in: path
        description: ID de l'équipe
        required: true
        schema:
          type: string
      responses:
        "200":
          description: Équipe récupérée avec succès
        "404":
          description: Équipe non trouvée
    put:
      tags:
      - Équipes
      summary: Modifier une équipe
      parameters:
      - name: id
        in: path
        description: ID de l'équipe
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UpdateEquipeRequest"
      responses:
        "200":
          description: Équipe modifiée avec succès
        "404":
          description: Équipe non trouvée
        "400":
          description: Données invalides
    delete:
      tags:
      - Équipes
      summary: Supprimer une équipe
      parameters:
      - name: id
        in: path
        description: ID de l'équipe
        required: true
        schema:
          type: string
      responses:
        "204":
          description: Équipe supprimée avec succès
        "404":
          description: Équipe non trouvée
        "409":
          description: Équipe en cours d'utilisation
  /api/v1/equipes/{id}/members:
    get:
      tags:
      - Équipes
      summary: Récupérer les membres d'une équipe
      parameters:
      - name: id
        in: path
        description: ID de l'équipe
        required: true
        schema:
          type: string
      responses:
        "200":
          description: Liste des membres récupérée avec succès
        "404":
          description: Équipe non trouvée
    post:
      tags:
      - Équipes
      summary: Ajouter un membre à l'équipe
      parameters:
      - name: id
        in: path
        description: ID de l'équipe
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/AddMemberRequest"
      responses:
        "200":
          description: Membre ajouté avec succès
        "404":
          description: Équipe ou employé non trouvé
        "409":
          description: Employé déjà membre d'une autre équipe
  /api/v1/equipes/{id}/members/{employeId}:
    delete:
      tags:
      - Équipes
      summary: Retirer un membre de l'équipe
      parameters:
      - name: employeId
        in: path
        description: ID de l'employé à retirer
        required: true
        schema:
          type: string
      - name: id
        in: path
        description: ID de l'équipe
        required: true
        schema:
          type: string
      responses:
        "200":
          description: Membre retiré avec succès
        "404":
          description: Équipe ou employé non trouvé
        "409":
          description: Impossible de retirer le chef d'équipe
  /api/v1/equipes/{id}/statut:
    put:
      tags:
      - Équipes
      summary: Modifier le statut d'une équipe
      parameters:
      - name: id
        in: path
        description: ID de l'équipe
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UpdateStatutRequest1"
      responses:
        "200":
          description: Statut modifié avec succès
        "404":
          description: Équipe non trouvée
        "400":
          description: Statut invalide
  /api/v1/factures:
    get:
      tags:
      - Factures
      summary: Récupérer toutes les factures
      parameters:
      - name: chantierId
        in: query
        description: ID du chantier
        schema:
          type: string
      - name: clientId
        in: query
        description: ID du client
        schema:
          type: string
      - name: search
        in: query
        description: Terme de recherche
        schema:
          type: string
      responses:
        "200":
          description: Liste des factures récupérée avec succès
    post:
      tags:
      - Factures
      summary: Créer une nouvelle facture
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreateFactureRequest"
      responses:
        "201":
          description: Facture créée avec succès
        "400":
          description: Données invalides
  /api/v1/factures/brouillons:
    get:
      tags:
      - Factures
      summary: Récupérer les factures brouillons
      responses:
        "200":
          description: Factures brouillons récupérées
  /api/v1/factures/chiffre-affaires:
    get:
      tags:
      - Factures
      summary: Calculer le chiffre d'affaires
      parameters:
      - name: dateDebut
        in: query
        description: Date de début (YYYY-MM-DD)
        schema:
          type: string
      - name: dateFin
        in: query
        description: Date de fin (YYYY-MM-DD)
        schema:
          type: string
      responses:
        "200":
          description: Chiffre d'affaires calculé avec succès
        "400":
          description: Format de date invalide
  /api/v1/factures/count:
    get:
      tags:
      - Factures
      summary: Compter le nombre de factures
      responses:
        "200":
          description: Nombre de factures retourné avec succès
  /api/v1/factures/date-range:
    get:
      tags:
      - Factures
      summary: Récupérer les factures par plage de dates
      parameters:
      - name: dateDebut
        in: query
        description: Date de début (YYYY-MM-DD)
        schema:
          type: string
      - name: dateFin
        in: query
        description: Date de fin (YYYY-MM-DD)
        schema:
          type: string
      responses:
        "200":
          description: Liste des factures récupérée avec succès
        "400":
          description: Paramètres de date invalides
  /api/v1/factures/echues:
    get:
      tags:
      - Factures
      summary: Récupérer les factures échues
      responses:
        "200":
          description: Liste des factures échues récupérée avec succès
  /api/v1/factures/en-retard:
    get:
      tags:
      - Factures
      summary: Récupérer les factures en retard
      responses:
        "200":
          description: Factures en retard récupérées
  /api/v1/factures/envoyees:
    get:
      tags:
      - Factures
      summary: Récupérer les factures envoyées
      responses:
        "200":
          description: Factures envoyées récupérées
  /api/v1/factures/from-devis/{devisId}:
    post:
      tags:
      - Factures
      summary: Créer une facture à partir d'un devis
      parameters:
      - name: devisId
        in: path
        description: ID du devis
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "201":
          description: Facture créée à partir du devis
        "404":
          description: Devis non trouvé
        "400":
          description: Devis ne peut pas être converti
  /api/v1/factures/generate-numero:
    get:
      tags:
      - Factures
      summary: Générer un numéro de facture
      responses:
        "200":
          description: Numéro généré avec succès
  /api/v1/factures/payees:
    get:
      tags:
      - Factures
      summary: Récupérer les factures payées
      responses:
        "200":
          description: Factures payées récupérées
  /api/v1/factures/proches-echeance:
    get:
      tags:
      - Factures
      summary: Récupérer les factures proches de l'échéance
      parameters:
      - name: jours
        in: query
        description: Nombre de jours avant l'échéance
        schema:
          format: int32
          default: 7
          type: integer
      responses:
        "200":
          description: Liste des factures proches de l'échéance récupérée avec succès
  /api/v1/factures/stats:
    get:
      tags:
      - Factures
      summary: Obtenir les statistiques des factures
      responses:
        "200":
          description: Statistiques récupérées avec succès
  /api/v1/factures/statut/{statut}:
    get:
      tags:
      - Factures
      summary: Récupérer les factures par statut
      parameters:
      - name: statut
        in: path
        description: Statut des factures
        required: true
        schema:
          $ref: "#/components/schemas/StatutFacture"
      responses:
        "200":
          description: Factures par statut récupérées
  /api/v1/factures/{id}:
    get:
      tags:
      - Factures
      summary: Récupérer une facture par ID
      parameters:
      - name: id
        in: path
        description: ID de la facture
        required: true
        schema:
          type: string
      responses:
        "200":
          description: Facture récupérée avec succès
        "404":
          description: Facture non trouvée
    put:
      tags:
      - Factures
      summary: Mettre à jour une facture
      parameters:
      - name: id
        in: path
        description: ID de la facture
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UpdateFactureRequest"
      responses:
        "200":
          description: Facture mise à jour avec succès
        "400":
          description: Données invalides
        "404":
          description: Facture non trouvée
    delete:
      tags:
      - Factures
      summary: Supprimer une facture
      parameters:
      - name: id
        in: path
        description: ID de la facture
        required: true
        schema:
          type: string
      responses:
        "204":
          description: Facture supprimée avec succès
        "400":
          description: ID invalide
        "404":
          description: Facture non trouvée
  /api/v1/factures/{id}/payer:
    put:
      tags:
      - Factures
      summary: Marquer une facture comme payée
      parameters:
      - name: id
        in: path
        description: ID de la facture
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Facture marquée comme payée
        "404":
          description: Facture non trouvée
        "400":
          description: Facture ne peut pas être marquée comme payée
  /api/v1/factures/{id}/pdf:
    get:
      tags:
      - Factures
      summary: Générer le PDF d'une facture
      parameters:
      - name: id
        in: path
        description: ID de la facture
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: PDF généré avec succès
        "404":
          description: Facture non trouvée
  /api/v1/factures/{id}/statut:
    put:
      tags:
      - Factures
      summary: Mettre à jour le statut d'une facture
      parameters:
      - name: id
        in: path
        description: ID de la facture
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      - name: statut
        in: query
        description: Nouveau statut
        required: true
        schema:
          $ref: "#/components/schemas/StatutFacture"
      responses:
        "200":
          description: Statut mis à jour avec succès
        "404":
          description: Facture non trouvée
        "400":
          description: Transition de statut invalide
  /api/v1/fournisseurs:
    get:
      tags:
      - Fournisseurs
      summary: Récupère tous les fournisseurs
      parameters:
      - name: page
        in: query
        schema:
          format: int32
          default: 0
          type: integer
      - name: search
        in: query
        schema:
          type: string
      - name: size
        in: query
        schema:
          format: int32
          default: 10
          type: integer
      responses:
        "200":
          description: Liste des fournisseurs
    post:
      tags:
      - Fournisseurs
      summary: Crée un nouveau fournisseur
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Fournisseur"
      responses:
        "201":
          description: Fournisseur créé avec succès
        "400":
          description: Données invalides
        "409":
          description: Conflit - fournisseur existant
  /api/v1/fournisseurs/search:
    get:
      tags:
      - Fournisseurs
      summary: Recherche des fournisseurs
      parameters:
      - name: q
        in: query
        schema:
          type: string
      responses:
        "200":
          description: Résultats de la recherche
  /api/v1/fournisseurs/stats:
    get:
      tags:
      - Fournisseurs
      summary: Récupère les statistiques des fournisseurs
      responses:
        "200":
          description: Statistiques des fournisseurs
  /api/v1/fournisseurs/{id}:
    get:
      tags:
      - Fournisseurs
      summary: Récupère un fournisseur par ID
      parameters:
      - name: id
        in: path
        description: ID du fournisseur
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Fournisseur trouvé
        "404":
          description: Fournisseur non trouvé
    put:
      tags:
      - Fournisseurs
      summary: Met à jour un fournisseur existant
      parameters:
      - name: id
        in: path
        description: ID du fournisseur
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Fournisseur"
      responses:
        "200":
          description: Fournisseur mis à jour avec succès
        "400":
          description: Données invalides
        "404":
          description: Fournisseur non trouvé
    delete:
      tags:
      - Fournisseurs
      summary: Supprime un fournisseur
      parameters:
      - name: id
        in: path
        description: ID du fournisseur
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "204":
          description: Fournisseur supprimé avec succès
        "404":
          description: Fournisseur non trouvé
  /api/v1/fournisseurs/{id}/activate:
    put:
      tags:
      - Fournisseurs
      summary: Active un fournisseur
      parameters:
      - name: id
        in: path
        description: ID du fournisseur
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Fournisseur activé avec succès
        "404":
          description: Fournisseur non trouvé
  /api/v1/fournisseurs/{id}/deactivate:
    put:
      tags:
      - Fournisseurs
      summary: Désactive un fournisseur
      parameters:
      - name: id
        in: path
        description: ID du fournisseur
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Fournisseur désactivé avec succès
        "404":
          description: Fournisseur non trouvé
  /api/v1/health:
    get:
      tags:
      - Health Resource
      responses:
        "200":
          description: OK
  /api/v1/livraisons-materiel:
    get:
      tags:
      - Livraison Materiel Resource
      parameters:
      - name: page
        in: query
        schema:
          format: int32
          default: 0
          type: integer
      - name: size
        in: query
        schema:
          format: int32
          default: 50
          type: integer
      responses:
        "200":
          description: OK
    post:
      tags:
      - Livraison Materiel Resource
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreerLivraisonRequest"
      responses:
        "200":
          description: OK
  /api/v1/livraisons-materiel/avec-incidents:
    get:
      tags:
      - Livraison Materiel Resource
      responses:
        "200":
          description: OK
  /api/v1/livraisons-materiel/chantier/{chantierId}:
    get:
      tags:
      - Livraison Materiel Resource
      parameters:
      - name: chantierId
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: OK
  /api/v1/livraisons-materiel/du-jour:
    get:
      tags:
      - Livraison Materiel Resource
      responses:
        "200":
          description: OK
  /api/v1/livraisons-materiel/en-cours:
    get:
      tags:
      - Livraison Materiel Resource
      responses:
        "200":
          description: OK
  /api/v1/livraisons-materiel/en-retard:
    get:
      tags:
      - Livraison Materiel Resource
      responses:
        "200":
          description: OK
  /api/v1/livraisons-materiel/necessitant-action:
    get:
      tags:
      - Livraison Materiel Resource
      responses:
        "200":
          description: OK
  /api/v1/livraisons-materiel/numero/{numero}:
    get:
      tags:
      - Livraison Materiel Resource
      parameters:
      - name: numero
        in: path
        required: true
        schema:
          type: string
      responses:
        "200":
          description: OK
  /api/v1/livraisons-materiel/optimiser-itineraires:
    post:
      tags:
      - Livraison Materiel Resource
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/OptimiserItinerairesRequest"
      responses:
        "200":
          description: OK
  /api/v1/livraisons-materiel/performance-transporteurs:
    get:
      tags:
      - Livraison Materiel Resource
      responses:
        "200":
          description: OK
  /api/v1/livraisons-materiel/prioritaires:
    get:
      tags:
      - Livraison Materiel Resource
      responses:
        "200":
          description: OK
  /api/v1/livraisons-materiel/reservation/{reservationId}:
    get:
      tags:
      - Livraison Materiel Resource
      parameters:
      - name: reservationId
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: OK
  /api/v1/livraisons-materiel/search:
    get:
      tags:
      - Livraison Materiel Resource
      parameters:
      - name: terme
        in: query
        schema:
          type: string
      responses:
        "200":
          description: OK
  /api/v1/livraisons-materiel/statistiques:
    get:
      tags:
      - Livraison Materiel Resource
      responses:
        "200":
          description: OK
  /api/v1/livraisons-materiel/statut/{statut}:
    get:
      tags:
      - Livraison Materiel Resource
      parameters:
      - name: statut
        in: path
        required: true
        schema:
          type: string
      responses:
        "200":
          description: OK
  /api/v1/livraisons-materiel/tableau-bord:
    get:
      tags:
      - Livraison Materiel Resource
      responses:
        "200":
          description: OK
  /api/v1/livraisons-materiel/tracking-actif:
    get:
      tags:
      - Livraison Materiel Resource
      responses:
        "200":
          description: OK
  /api/v1/livraisons-materiel/transporteur/{transporteur}:
    get:
      tags:
      - Livraison Materiel Resource
      parameters:
      - name: transporteur
        in: path
        required: true
        schema:
          type: string
      responses:
        "200":
          description: OK
  /api/v1/livraisons-materiel/{id}:
    get:
      tags:
      - Livraison Materiel Resource
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: OK
    put:
      tags:
      - Livraison Materiel Resource
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UpdateLivraisonRequest"
      responses:
        "200":
          description: OK
  /api/v1/livraisons-materiel/{id}/annuler:
    put:
      tags:
      - Livraison Materiel Resource
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/AnnulerLivraisonRequest"
      responses:
        "200":
          description: OK
  /api/v1/livraisons-materiel/{id}/commencer-dechargement:
    put:
      tags:
      - Livraison Materiel Resource
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/OperateurRequest"
      responses:
        "200":
          description: OK
  /api/v1/livraisons-materiel/{id}/demarrer-preparation:
    put:
      tags:
      - Livraison Materiel Resource
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/OperateurRequest"
      responses:
        "200":
          description: OK
  /api/v1/livraisons-materiel/{id}/demarrer-transit:
    put:
      tags:
      - Livraison Materiel Resource
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/DemarrerTransitRequest"
      responses:
        "200":
          description: OK
  /api/v1/livraisons-materiel/{id}/eta:
    get:
      tags:
      - Livraison Materiel Resource
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: OK
  /api/v1/livraisons-materiel/{id}/finaliser:
    put:
      tags:
      - Livraison Materiel Resource
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/FinalisationRequest"
      responses:
        "200":
          description: OK
  /api/v1/livraisons-materiel/{id}/marquer-prete:
    put:
      tags:
      - Livraison Materiel Resource
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/MarquerPreteRequest"
      responses:
        "200":
          description: OK
  /api/v1/livraisons-materiel/{id}/position-gps:
    put:
      tags:
      - Livraison Materiel Resource
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PositionGPSRequest"
      responses:
        "200":
          description: OK
  /api/v1/livraisons-materiel/{id}/retarder:
    put:
      tags:
      - Livraison Materiel Resource
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/RetarderLivraisonRequest"
      responses:
        "200":
          description: OK
  /api/v1/livraisons-materiel/{id}/signaler-arrivee:
    put:
      tags:
      - Livraison Materiel Resource
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SignalerArriveeRequest"
      responses:
        "200":
          description: OK
  /api/v1/livraisons-materiel/{id}/signaler-incident:
    put:
      tags:
      - Livraison Materiel Resource
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SignalerIncidentRequest"
      responses:
        "200":
          description: OK
  /api/v1/maintenances:
    get:
      tags:
      - Maintenances
      summary: Lister toutes les maintenances
      description: Récupère la liste paginée de toutes les maintenances avec filtres
        optionnels
      parameters:
      - name: materielId
        in: query
        description: Filtrer par matériel (UUID)
        schema:
          $ref: "#/components/schemas/UUID"
      - name: page
        in: query
        description: Numéro de page (0-indexé)
        schema:
          format: int32
          default: 0
          type: integer
        example: 0
      - name: search
        in: query
        description: Terme de recherche
        schema:
          type: string
      - name: size
        in: query
        description: Taille de page
        schema:
          format: int32
          default: 20
          type: integer
        example: 20
      - name: statut
        in: query
        description: Filtrer par statut
        schema:
          type: string
      - name: technicien
        in: query
        description: Filtrer par technicien
        schema:
          type: string
      - name: type
        in: query
        description: Filtrer par type de maintenance
        schema:
          type: string
      responses:
        "200":
          description: Liste des maintenances récupérée avec succès
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MaintenanceMateriel"
    post:
      tags:
      - Maintenances
      summary: Créer une nouvelle maintenance
      description: Créé une nouvelle maintenance pour un matériel
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreateMaintenanceRequest"
      responses:
        "201":
          description: Maintenance créée avec succès
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MaintenanceMateriel"
        "400":
          description: Données invalides
  /api/v1/maintenances/attention-requise:
    get:
      tags:
      - Maintenances
      summary: Matériel nécessitant une attention
      description: Récupère le matériel nécessitant une attention immédiate
      responses:
        "200":
          description: Matériel nécessitant attention récupéré
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MaintenanceMateriel"
  /api/v1/maintenances/correctives:
    get:
      tags:
      - Maintenances
      summary: Lister les maintenances correctives
      description: Récupère toutes les maintenances correctives
      responses:
        "200":
          description: Maintenances correctives récupérées
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MaintenanceMateriel"
  /api/v1/maintenances/cout-total-periode:
    get:
      tags:
      - Maintenances
      summary: Coût total de maintenance pour une période
      description: Calcule le coût total de maintenance pour une période donnée
      parameters:
      - name: dateDebut
        in: query
        description: Date de début
        required: true
        schema:
          $ref: "#/components/schemas/LocalDate"
      - name: dateFin
        in: query
        description: Date de fin
        required: true
        schema:
          $ref: "#/components/schemas/LocalDate"
      responses:
        "200":
          description: Coût total calculé
  /api/v1/maintenances/en-cours:
    get:
      tags:
      - Maintenances
      summary: Lister les maintenances en cours
      description: Récupère toutes les maintenances actuellement en cours
      responses:
        "200":
          description: Maintenances en cours récupérées
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MaintenanceMateriel"
  /api/v1/maintenances/en-retard:
    get:
      tags:
      - Maintenances
      summary: Lister les maintenances en retard
      description: Récupère toutes les maintenances planifiées en retard
      responses:
        "200":
          description: Maintenances en retard récupérées
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MaintenanceMateriel"
  /api/v1/maintenances/materiel/{materielId}/cout-total:
    get:
      tags:
      - Maintenances
      summary: Coût total de maintenance d'un matériel
      description: Calcule le coût total de maintenance d'un matériel
      parameters:
      - name: materielId
        in: path
        description: Identifiant du matériel
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Coût total calculé
  /api/v1/maintenances/materiel/{materielId}/derniere:
    get:
      tags:
      - Maintenances
      summary: Dernière maintenance d'un matériel
      description: Récupère la dernière maintenance effectuée sur un matériel
      parameters:
      - name: materielId
        in: path
        description: Identifiant du matériel
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Dernière maintenance trouvée
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MaintenanceMateriel"
        "404":
          description: Aucune maintenance trouvée
  /api/v1/maintenances/periode:
    get:
      tags:
      - Maintenances
      summary: Lister les maintenances pour une période
      description: Récupère toutes les maintenances dans une période donnée
      parameters:
      - name: dateDebut
        in: query
        description: Date de début (yyyy-mm-dd)
        required: true
        schema:
          $ref: "#/components/schemas/LocalDate"
      - name: dateFin
        in: query
        description: Date de fin (yyyy-mm-dd)
        required: true
        schema:
          $ref: "#/components/schemas/LocalDate"
      responses:
        "200":
          description: Maintenances de la période récupérées
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MaintenanceMateriel"
  /api/v1/maintenances/planifiees:
    get:
      tags:
      - Maintenances
      summary: Lister les maintenances planifiées
      description: Récupère toutes les maintenances planifiées
      responses:
        "200":
          description: Maintenances planifiées récupérées
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MaintenanceMateriel"
  /api/v1/maintenances/preventives:
    get:
      tags:
      - Maintenances
      summary: Lister les maintenances préventives
      description: Récupère toutes les maintenances préventives
      responses:
        "200":
          description: Maintenances préventives récupérées
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MaintenanceMateriel"
  /api/v1/maintenances/prochaines:
    get:
      tags:
      - Maintenances
      summary: Lister les prochaines maintenances
      description: Récupère les maintenances planifiées dans les prochains jours
      parameters:
      - name: jours
        in: query
        description: Nombre de jours à venir
        schema:
          format: int32
          default: 30
          type: integer
        example: 30
      responses:
        "200":
          description: Prochaines maintenances récupérées
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MaintenanceMateriel"
  /api/v1/maintenances/statistiques:
    get:
      tags:
      - Maintenances
      summary: Obtenir les statistiques des maintenances
      description: Récupère les statistiques globales des maintenances
      responses:
        "200":
          description: Statistiques récupérées avec succès
  /api/v1/maintenances/statistiques/par-statut:
    get:
      tags:
      - Maintenances
      summary: Statistiques par statut
      description: Récupère les statistiques par statut de maintenance
      responses:
        "200":
          description: Statistiques par statut récupérées
  /api/v1/maintenances/statistiques/par-technicien:
    get:
      tags:
      - Maintenances
      summary: Statistiques par technicien
      description: Récupère les statistiques de maintenance par technicien
      responses:
        "200":
          description: Statistiques par technicien récupérées
  /api/v1/maintenances/statistiques/par-type:
    get:
      tags:
      - Maintenances
      summary: Statistiques par type de maintenance
      description: Récupère les statistiques détaillées par type
      responses:
        "200":
          description: Statistiques par type récupérées
  /api/v1/maintenances/statistiques/tendances-cout:
    get:
      tags:
      - Maintenances
      summary: Tendances des coûts de maintenance
      description: Récupère les tendances des coûts sur plusieurs mois
      parameters:
      - name: mois
        in: query
        description: Nombre de mois
        schema:
          format: int32
          default: 12
          type: integer
        example: 12
      responses:
        "200":
          description: Tendances des coûts récupérées
  /api/v1/maintenances/terminees:
    get:
      tags:
      - Maintenances
      summary: Lister les maintenances terminées
      description: Récupère toutes les maintenances terminées
      responses:
        "200":
          description: Maintenances terminées récupérées
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MaintenanceMateriel"
  /api/v1/maintenances/{id}:
    get:
      tags:
      - Maintenances
      summary: Récupérer une maintenance par ID
      description: Récupère les détails d'une maintenance spécifique
      parameters:
      - name: id
        in: path
        description: Identifiant unique de la maintenance
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Maintenance trouvée
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MaintenanceMateriel"
        "404":
          description: Maintenance non trouvée
    put:
      tags:
      - Maintenances
      summary: Mettre à jour une maintenance
      description: Met à jour les informations d'une maintenance existante
      parameters:
      - name: id
        in: path
        description: Identifiant de la maintenance
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UpdateMaintenanceRequest"
      responses:
        "200":
          description: Maintenance mise à jour avec succès
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MaintenanceMateriel"
        "404":
          description: Maintenance non trouvée
        "400":
          description: Données invalides
    delete:
      tags:
      - Maintenances
      summary: Supprimer une maintenance
      description: Supprime définitivement une maintenance
      parameters:
      - name: id
        in: path
        description: Identifiant de la maintenance
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "204":
          description: Maintenance supprimée avec succès
        "404":
          description: Maintenance non trouvée
        "400":
          description: Impossible de supprimer
  /api/v1/maintenances/{id}/statut:
    put:
      tags:
      - Maintenances
      summary: Mettre à jour le statut d'une maintenance
      description: Change le statut d'une maintenance existante
      parameters:
      - name: id
        in: path
        description: Identifiant de la maintenance
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UpdateStatutRequest2"
      responses:
        "200":
          description: Statut mis à jour avec succès
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MaintenanceMateriel"
        "404":
          description: Maintenance non trouvée
        "400":
          description: Transition de statut invalide
  /api/v1/maintenances/{id}/terminer:
    post:
      tags:
      - Maintenances
      summary: Terminer une maintenance
      description: Marque une maintenance comme terminée avec les détails finaux
      parameters:
      - name: id
        in: path
        description: Identifiant de la maintenance
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/TerminerMaintenanceRequest"
      responses:
        "200":
          description: Maintenance terminée avec succès
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MaintenanceMateriel"
        "404":
          description: Maintenance non trouvée
        "400":
          description: Maintenance déjà terminée
  /api/v1/materiels:
    get:
      tags:
      - Matériels
      summary: Récupérer tous les matériels
      parameters:
      - name: page
        in: query
        description: Numéro de page (0-based)
        schema:
          format: int32
          default: 0
          type: integer
      - name: size
        in: query
        description: Taille de la page
        schema:
          format: int32
          default: 20
          type: integer
      responses:
        "200":
          description: Liste des matériels récupérée avec succès
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
    post:
      tags:
      - Matériels
      summary: Créer un nouveau matériel
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Materiel"
      responses:
        "201":
          description: Matériel créé avec succès
        "400":
          description: Données invalides
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/materiels/by-type/{type}:
    get:
      tags:
      - Matériels
      summary: Récupérer les matériels par type
      parameters:
      - name: type
        in: path
        description: Type de matériel
        required: true
        schema:
          type: string
      responses:
        "200":
          description: Liste des matériels du type spécifié
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/materiels/count:
    get:
      tags:
      - Matériels
      summary: Compter le nombre de matériels
      responses:
        "200":
          description: Nombre de matériels
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/materiels/disponibles:
    get:
      tags:
      - Matériels
      summary: Récupérer les matériels disponibles
      parameters:
      - name: dateDebut
        in: query
        description: Date de début (YYYY-MM-DD)
        schema:
          type: string
      - name: dateFin
        in: query
        description: Date de fin (YYYY-MM-DD)
        schema:
          type: string
      - name: type
        in: query
        description: Type de matériel
        schema:
          type: string
      responses:
        "200":
          description: Liste des matériels disponibles
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/materiels/maintenance-prevue:
    get:
      tags:
      - Matériels
      summary: Récupérer les matériels avec maintenance prévue
      parameters:
      - name: jours
        in: query
        description: Nombre de jours à venir
        schema:
          format: int32
          default: 30
          type: integer
      responses:
        "200":
          description: Liste des matériels nécessitant une maintenance
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/materiels/search:
    get:
      tags:
      - Matériels
      summary: Rechercher des matériels
      parameters:
      - name: localisation
        in: query
        description: Localisation
        schema:
          type: string
      - name: marque
        in: query
        description: Marque
        schema:
          type: string
      - name: nom
        in: query
        description: Nom du matériel
        schema:
          type: string
      - name: statut
        in: query
        description: Statut
        schema:
          type: string
      - name: type
        in: query
        description: Type
        schema:
          type: string
      responses:
        "200":
          description: Résultats de recherche
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/materiels/stats:
    get:
      tags:
      - Matériels
      summary: Récupérer les statistiques des matériels
      responses:
        "200":
          description: Statistiques des matériels
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/materiels/valeur-totale:
    get:
      tags:
      - Matériels
      summary: Récupérer la valeur totale du parc matériel
      responses:
        "200":
          description: Valeur totale du parc matériel
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/materiels/{id}:
    get:
      tags:
      - Matériels
      summary: Récupérer un matériel par ID
      parameters:
      - name: id
        in: path
        description: ID du matériel
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Matériel trouvé
        "404":
          description: Matériel non trouvé
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
    put:
      tags:
      - Matériels
      summary: Mettre à jour un matériel
      parameters:
      - name: id
        in: path
        description: ID du matériel
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Materiel"
      responses:
        "200":
          description: Matériel mis à jour avec succès
        "404":
          description: Matériel non trouvé
        "400":
          description: Données invalides
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
    delete:
      tags:
      - Matériels
      summary: Supprimer un matériel
      parameters:
      - name: id
        in: path
        description: ID du matériel
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "204":
          description: Matériel supprimé avec succès
        "404":
          description: Matériel non trouvé
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/materiels/{id}/liberer:
    post:
      tags:
      - Matériels
      summary: Libérer un matériel
      parameters:
      - name: id
        in: path
        description: ID du matériel
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Matériel libéré avec succès
        "404":
          description: Matériel non trouvé
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/materiels/{id}/reserve:
    post:
      tags:
      - Matériels
      summary: Réserver un matériel
      parameters:
      - name: id
        in: path
        description: ID du matériel
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      - name: dateDebut
        in: query
        description: Date de début de réservation
        schema:
          type: string
      - name: dateFin
        in: query
        description: Date de fin de réservation
        schema:
          type: string
      responses:
        "200":
          description: Matériel réservé avec succès
        "404":
          description: Matériel non trouvé
        "400":
          description: Matériel non disponible
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/messages:
    get:
      tags:
      - Messages
      summary: Obtenir tous les messages
      description: Récupère la liste de tous les messages actifs
      parameters:
      - name: page
        in: query
        schema:
          format: int32
          default: 0
          type: integer
      - name: size
        in: query
        schema:
          format: int32
          default: 20
          type: integer
      responses:
        "200":
          description: Liste des messages récupérée
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
    post:
      tags:
      - Messages
      summary: Envoyer un message
      description: Crée et envoie un nouveau message
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EnvoyerMessageForm"
      responses:
        "201":
          description: Message envoyé avec succès
        "400":
          description: Données invalides
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/messages/archives/{userId}:
    get:
      tags:
      - Messages
      summary: Obtenir les messages archivés
      description: Messages archivés d'un utilisateur
      parameters:
      - name: userId
        in: path
        description: ID de l'utilisateur
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Messages archivés récupérés
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/messages/boite-envoi/{userId}:
    get:
      tags:
      - Messages
      summary: Obtenir la boîte d'envoi
      description: Messages envoyés par un utilisateur
      parameters:
      - name: userId
        in: path
        description: ID de l'utilisateur
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Boîte d'envoi récupérée
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/messages/boite-reception/{userId}:
    get:
      tags:
      - Messages
      summary: Obtenir la boîte de réception
      description: Messages reçus par un utilisateur
      parameters:
      - name: userId
        in: path
        description: ID de l'utilisateur
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Boîte de réception récupérée
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/messages/conversation/{user1Id}/{user2Id}:
    get:
      tags:
      - Messages
      summary: Obtenir une conversation
      description: Conversation entre deux utilisateurs
      parameters:
      - name: user1Id
        in: path
        description: ID du premier utilisateur
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      - name: user2Id
        in: path
        description: ID du second utilisateur
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Conversation récupérée
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/messages/diffuser:
    post:
      tags:
      - Messages
      summary: Diffuser un message
      description: Envoie un message à plusieurs destinataires
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/DiffuserMessageForm"
      responses:
        "201":
          description: Message diffusé avec succès
        "400":
          description: Données invalides
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/messages/importants/{userId}:
    get:
      tags:
      - Messages
      summary: Obtenir les messages importants
      description: Messages marqués comme importants
      parameters:
      - name: userId
        in: path
        description: ID de l'utilisateur
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Messages importants récupérés
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/messages/marquer-tous-lus/{userId}:
    put:
      tags:
      - Messages
      summary: Marquer tous comme lus
      description: Marque tous les messages non lus comme lus
      parameters:
      - name: userId
        in: path
        description: ID de l'utilisateur
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Messages marqués comme lus
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/messages/non-lus/{userId}:
    get:
      tags:
      - Messages
      summary: Obtenir les messages non lus
      description: Messages non lus d'un utilisateur
      parameters:
      - name: userId
        in: path
        description: ID de l'utilisateur
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Messages non lus récupérés
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/messages/recherche:
    get:
      tags:
      - Messages
      summary: Rechercher des messages
      description: Recherche textuelle dans les messages
      parameters:
      - name: terme
        in: query
        description: Terme de recherche
        required: true
        schema:
          type: string
      - name: userId
        in: query
        description: ID utilisateur pour filtrer
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Résultats de recherche
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/messages/statistiques:
    get:
      tags:
      - Messages
      summary: Statistiques globales
      description: Statistiques générales de la messagerie
      responses:
        "200":
          description: Statistiques récupérées
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/messages/statistiques/{userId}:
    get:
      tags:
      - Messages
      summary: Statistiques utilisateur
      description: Statistiques de messagerie d'un utilisateur
      parameters:
      - name: userId
        in: path
        description: ID de l'utilisateur
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Statistiques utilisateur récupérées
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/messages/tableau-bord/{userId}:
    get:
      tags:
      - Messages
      summary: Tableau de bord utilisateur
      description: Tableau de bord personnalisé de messagerie
      parameters:
      - name: userId
        in: path
        description: ID de l'utilisateur
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Tableau de bord récupéré
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/messages/{id}:
    get:
      tags:
      - Messages
      summary: Obtenir un message par ID
      description: Récupère un message spécifique
      parameters:
      - name: id
        in: path
        description: ID du message
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Message trouvé
        "404":
          description: Message non trouvé
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/messages/{messageId}/archiver/{userId}:
    put:
      tags:
      - Messages
      summary: Archiver un message
      description: Archive un message
      parameters:
      - name: messageId
        in: path
        description: ID du message
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      - name: userId
        in: path
        description: ID de l'utilisateur
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Message archivé
        "400":
          description: Action non autorisée
        "404":
          description: Message non trouvé
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/messages/{messageId}/marquer-important/{userId}:
    put:
      tags:
      - Messages
      summary: Marquer comme important
      description: Marque un message comme important
      parameters:
      - name: messageId
        in: path
        description: ID du message
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      - name: userId
        in: path
        description: ID de l'utilisateur
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Message marqué comme important
        "400":
          description: Action non autorisée
        "404":
          description: Message non trouvé
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/messages/{messageId}/marquer-lu/{userId}:
    put:
      tags:
      - Messages
      summary: Marquer comme lu
      description: Marque un message comme lu
      parameters:
      - name: messageId
        in: path
        description: ID du message
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      - name: userId
        in: path
        description: ID de l'utilisateur
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Message marqué comme lu
        "400":
          description: Action non autorisée
        "404":
          description: Message non trouvé
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/messages/{messageId}/repondre:
    post:
      tags:
      - Messages
      summary: Répondre à un message
      description: Crée une réponse à un message existant
      parameters:
      - name: messageId
        in: path
        description: ID du message parent
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/RepondreMessageForm"
      responses:
        "201":
          description: Réponse envoyée avec succès
        "400":
          description: Données invalides
        "404":
          description: Message parent non trouvé
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/messages/{messageId}/{userId}:
    delete:
      tags:
      - Messages
      summary: Supprimer un message
      description: Supprime un message (soft delete)
      parameters:
      - name: messageId
        in: path
        description: ID du message
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      - name: userId
        in: path
        description: ID de l'utilisateur
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "204":
          description: Message supprimé
        "400":
          description: Action non autorisée
        "404":
          description: Message non trouvé
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/notifications:
    get:
      tags:
      - Notifications
      summary: Lister toutes les notifications
      description: Récupère toutes les notifications avec pagination et filtres
      parameters:
      - name: nonLues
        in: query
        description: Afficher seulement les non lues
        schema:
          default: false
          type: boolean
      - name: page
        in: query
        description: Numéro de page (0-indexé)
        schema:
          format: int32
          default: 0
          type: integer
        example: 0
      - name: priorite
        in: query
        description: Filtrer par priorité
        schema:
          type: string
      - name: size
        in: query
        description: Taille de page
        schema:
          format: int32
          default: 20
          type: integer
        example: 20
      - name: type
        in: query
        description: Filtrer par type de notification
        schema:
          type: string
      - name: userId
        in: query
        description: Filtrer par utilisateur (UUID)
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Liste des notifications récupérée
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Notification"
    post:
      tags:
      - Notifications
      summary: Créer une nouvelle notification
      description: Crée et envoie une nouvelle notification
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreateNotificationRequest"
      responses:
        "201":
          description: Notification créée avec succès
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Notification"
        "400":
          description: Données invalides
  /api/v1/notifications/automatiques/chantiers:
    post:
      tags:
      - Notifications
      summary: Générer notifications de chantiers
      description: Génère automatiquement les notifications pour les chantiers en
        retard ou critiques
      responses:
        "201":
          description: Notifications de chantiers générées
  /api/v1/notifications/automatiques/maintenance:
    post:
      tags:
      - Notifications
      summary: Générer notifications de maintenance
      description: Génère automatiquement les notifications de maintenance en retard
      responses:
        "201":
          description: Notifications de maintenance générées
  /api/v1/notifications/broadcast:
    post:
      tags:
      - Notifications
      summary: Diffuser une notification
      description: Envoie une notification à tous les utilisateurs ou à un groupe
        spécifique
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/BroadcastNotificationRequest"
      responses:
        "201":
          description: Notification diffusée avec succès
        "400":
          description: Données invalides
  /api/v1/notifications/non-lues:
    get:
      tags:
      - Notifications
      summary: Notifications non lues
      description: Récupère toutes les notifications non lues du système
      parameters:
      - name: userId
        in: query
        description: Filtrer par utilisateur (UUID)
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Notifications non lues récupérées
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Notification"
  /api/v1/notifications/recentes:
    get:
      tags:
      - Notifications
      summary: Notifications récentes
      description: Récupère les notifications les plus récentes
      parameters:
      - name: limite
        in: query
        description: Nombre de notifications à retourner
        schema:
          format: int32
          default: 10
          type: integer
        example: 10
      - name: userId
        in: query
        description: Filtrer par utilisateur (UUID)
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Notifications récentes récupérées
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Notification"
  /api/v1/notifications/statistiques:
    get:
      tags:
      - Notifications
      summary: Statistiques des notifications
      description: Récupère les statistiques globales des notifications
      parameters:
      - name: userId
        in: query
        description: Filtrer par utilisateur (UUID)
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Statistiques récupérées
  /api/v1/notifications/tableau-bord:
    get:
      tags:
      - Notifications
      summary: Tableau de bord des notifications
      description: Tableau de bord complet avec métriques et alertes
      parameters:
      - name: userId
        in: query
        description: Filtrer par utilisateur (UUID)
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Tableau de bord récupéré
  /api/v1/notifications/user/{userId}:
    get:
      tags:
      - Notifications
      summary: Notifications d'un utilisateur
      description: Récupère toutes les notifications d'un utilisateur spécifique
      parameters:
      - name: userId
        in: path
        description: Identifiant de l'utilisateur
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      - name: nonLues
        in: query
        description: Afficher seulement les non lues
        schema:
          default: false
          type: boolean
      responses:
        "200":
          description: Notifications de l'utilisateur récupérées
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Notification"
  /api/v1/notifications/user/{userId}/anciennes:
    delete:
      tags:
      - Notifications
      summary: Supprimer les anciennes notifications
      description: Supprime les notifications anciennes d'un utilisateur (plus de
        X jours)
      parameters:
      - name: userId
        in: path
        description: Identifiant de l'utilisateur
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      - name: jours
        in: query
        description: "Nombre de jours (défaut: 30)"
        schema:
          format: int32
          default: 30
          type: integer
        example: 30
      responses:
        "200":
          description: Anciennes notifications supprimées
  /api/v1/notifications/user/{userId}/marquer-toutes-lues:
    put:
      tags:
      - Notifications
      summary: Marquer toutes les notifications d'un utilisateur comme lues
      description: Marque toutes les notifications non lues d'un utilisateur comme
        lues
      parameters:
      - name: userId
        in: path
        description: Identifiant de l'utilisateur
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Toutes les notifications marquées comme lues
  /api/v1/notifications/{id}:
    get:
      tags:
      - Notifications
      summary: Récupérer une notification par ID
      description: Récupère les détails d'une notification spécifique
      parameters:
      - name: id
        in: path
        description: Identifiant unique de la notification
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Notification trouvée
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Notification"
        "404":
          description: Notification non trouvée
    delete:
      tags:
      - Notifications
      summary: Supprimer une notification
      description: Supprime définitivement une notification
      parameters:
      - name: id
        in: path
        description: Identifiant de la notification
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "204":
          description: Notification supprimée avec succès
        "404":
          description: Notification non trouvée
  /api/v1/notifications/{id}/marquer-lue:
    put:
      tags:
      - Notifications
      summary: Marquer une notification comme lue
      description: Change le statut d'une notification à 'lue'
      parameters:
      - name: id
        in: path
        description: Identifiant de la notification
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Notification marquée comme lue
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Notification"
        "404":
          description: Notification non trouvée
  /api/v1/notifications/{id}/marquer-non-lue:
    put:
      tags:
      - Notifications
      summary: Marquer une notification comme non lue
      description: Change le statut d'une notification à 'non lue'
      parameters:
      - name: id
        in: path
        description: Identifiant de la notification
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Notification marquée comme non lue
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Notification"
        "404":
          description: Notification non trouvée
  /api/v1/phase-templates:
    get:
      tags:
      - Phase Templates
      summary: Récupère tous les templates actifs
      responses:
        "200":
          description: Liste de tous les templates actifs
    post:
      tags:
      - Phase Templates
      summary: Crée un nouveau template de phase
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PhaseTemplate"
      responses:
        "201":
          description: Template créé avec succès
        "400":
          description: Données invalides
        "409":
          description: Conflit - template existant pour cet ordre
  /api/v1/phase-templates/by-type/{typeChantier}:
    get:
      tags:
      - Phase Templates
      summary: Récupère tous les templates pour un type de chantier
      parameters:
      - name: typeChantier
        in: path
        description: Type de chantier BTP
        required: true
        schema:
          type: string
      responses:
        "200":
          description: Liste des templates pour le type de chantier
        "400":
          description: Type de chantier invalide
  /api/v1/phase-templates/complexite/{typeChantier}:
    get:
      tags:
      - Phase Templates
      summary: Analyse la complexité d'un type de chantier
      parameters:
      - name: typeChantier
        in: path
        description: Type de chantier BTP
        required: true
        schema:
          type: string
      responses:
        "200":
          description: Analyse de complexité
        "400":
          description: Type de chantier invalide
  /api/v1/phase-templates/duree-estimee/{typeChantier}:
    get:
      tags:
      - Phase Templates
      summary: Calcule la durée totale estimée pour un type de chantier
      parameters:
      - name: typeChantier
        in: path
        description: Type de chantier BTP
        required: true
        schema:
          type: string
      responses:
        "200":
          description: Durée totale en jours
        "400":
          description: Type de chantier invalide
  /api/v1/phase-templates/generer-phases:
    post:
      tags:
      - Phase Templates
      summary: Génère automatiquement les phases pour un chantier
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GenerationPhasesRequest"
      responses:
        "201":
          description: Phases générées avec succès
        "400":
          description: Paramètres invalides
        "404":
          description: Chantier non trouvé
  /api/v1/phase-templates/initialize:
    post:
      tags:
      - Phase Templates
      summary: Initialise les templates de phases par défaut
      responses:
        "200":
          description: Templates initialisés avec succès
        "409":
          description: Templates déjà existants
  /api/v1/phase-templates/previsualisation/{typeChantier}:
    get:
      tags:
      - Phase Templates
      summary: Prévisualise les phases qui seraient générées pour un type de chantier
      parameters:
      - name: typeChantier
        in: path
        description: Type de chantier BTP
        required: true
        schema:
          type: string
      responses:
        "200":
          description: Prévisualisation des phases
        "400":
          description: Type de chantier invalide
  /api/v1/phase-templates/types-chantier:
    get:
      tags:
      - Phase Templates
      summary: Récupère tous les types de chantiers disponibles
      responses:
        "200":
          description: Liste des types de chantiers
  /api/v1/phase-templates/{id}:
    get:
      tags:
      - Phase Templates
      summary: Récupère un template par son ID avec ses sous-phases
      parameters:
      - name: id
        in: path
        description: Identifiant du template
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Template trouvé
        "404":
          description: Template non trouvé
    put:
      tags:
      - Phase Templates
      summary: Met à jour un template de phase
      parameters:
      - name: id
        in: path
        description: Identifiant du template
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PhaseTemplate"
      responses:
        "200":
          description: Template mis à jour avec succès
        "400":
          description: Données invalides
        "404":
          description: Template non trouvé
        "409":
          description: Conflit - ordre d'exécution déjà utilisé
    delete:
      tags:
      - Phase Templates
      summary: Supprime un template (désactivation)
      parameters:
      - name: id
        in: path
        description: Identifiant du template
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "204":
          description: Template supprimé avec succès
        "404":
          description: Template non trouvé
  /api/v1/phases-chantier:
    get:
      tags:
      - Phases de Chantier
      summary: Récupérer toutes les phases
      parameters:
      - name: chantiersActifs
        in: query
        description: Filtrer par chantiers actifs seulement (true/false)
        schema:
          default: false
          type: boolean
      - name: statut
        in: query
        description: Statut de la phase
        schema:
          type: string
      responses:
        "200":
          description: Liste des phases récupérée avec succès
    post:
      tags:
      - Phases de Chantier
      summary: Créer une nouvelle phase
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PhaseCreateRequest"
      responses:
        "201":
          description: Phase créée avec succès
        "400":
          description: Données invalides
  /api/v1/phases-chantier/chantier/{chantierId}:
    get:
      tags:
      - Phases de Chantier
      summary: Récupérer les phases d'un chantier
      parameters:
      - name: chantierId
        in: path
        description: ID du chantier
        required: true
        schema:
          type: string
      responses:
        "200":
          description: Phases du chantier récupérées avec succès
        "400":
          description: ID de chantier invalide
  /api/v1/phases-chantier/critiques:
    get:
      tags:
      - Phases de Chantier
      summary: Récupérer les phases critiques
      responses:
        "200":
          description: OK
  /api/v1/phases-chantier/en-cours:
    get:
      tags:
      - Phases de Chantier
      summary: Récupérer les phases en cours
      responses:
        "200":
          description: OK
  /api/v1/phases-chantier/en-retard:
    get:
      tags:
      - Phases de Chantier
      summary: Récupérer les phases en retard
      responses:
        "200":
          description: OK
  /api/v1/phases-chantier/statistiques:
    get:
      tags:
      - Phases de Chantier
      summary: Récupérer les statistiques des phases
      responses:
        "200":
          description: OK
  /api/v1/phases-chantier/{id}:
    get:
      tags:
      - Phases de Chantier
      summary: Récupérer une phase par ID
      parameters:
      - name: id
        in: path
        description: ID de la phase
        required: true
        schema:
          type: string
      responses:
        "200":
          description: Phase récupérée avec succès
        "404":
          description: Phase non trouvée
    put:
      tags:
      - Phases de Chantier
      summary: Mettre à jour une phase
      parameters:
      - name: id
        in: path
        description: ID de la phase
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PhaseCreateRequest"
      responses:
        "200":
          description: Phase mise à jour avec succès
    delete:
      tags:
      - Phases de Chantier
      summary: Supprimer une phase
      parameters:
      - name: id
        in: path
        description: ID de la phase
        required: true
        schema:
          type: string
      responses:
        "204":
          description: Phase supprimée avec succès
  /api/v1/phases-chantier/{id}/avancement:
    put:
      tags:
      - Phases de Chantier
      summary: Mettre à jour l'avancement d'une phase
      parameters:
      - name: id
        in: path
        description: ID de la phase
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/AvancementRequest"
      responses:
        "200":
          description: OK
  /api/v1/phases-chantier/{id}/demarrer:
    post:
      tags:
      - Phases de Chantier
      summary: Démarrer une phase
      parameters:
      - name: id
        in: path
        description: ID de la phase
        required: true
        schema:
          type: string
      responses:
        "200":
          description: OK
  /api/v1/phases-chantier/{id}/reprendre:
    post:
      tags:
      - Phases de Chantier
      summary: Reprendre une phase suspendue
      parameters:
      - name: id
        in: path
        description: ID de la phase
        required: true
        schema:
          type: string
      responses:
        "200":
          description: OK
  /api/v1/phases-chantier/{id}/suspendre:
    post:
      tags:
      - Phases de Chantier
      summary: Suspendre une phase
      parameters:
      - name: id
        in: path
        description: ID de la phase
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SuspendrePhaseRequest"
      responses:
        "200":
          description: OK
  /api/v1/phases-chantier/{id}/terminer:
    post:
      tags:
      - Phases de Chantier
      summary: Terminer une phase
      parameters:
      - name: id
        in: path
        description: ID de la phase
        required: true
        schema:
          type: string
      responses:
        "200":
          description: OK
  /api/v1/photos:
    get:
      tags:
      - Photos
      summary: Lister toutes les photos
      description: Récupère la liste de toutes les photos de chantiers
      parameters:
      - name: chantierId
        in: query
        description: Filtrer par chantier (UUID)
        schema:
          $ref: "#/components/schemas/UUID"
      - name: employeId
        in: query
        description: Filtrer par employé (UUID)
        schema:
          $ref: "#/components/schemas/UUID"
      - name: page
        in: query
        description: Numéro de page (0-indexé)
        schema:
          format: int32
          default: 0
          type: integer
        example: 0
      - name: size
        in: query
        description: Taille de page
        schema:
          format: int32
          default: 20
          type: integer
        example: 20
      - name: tags
        in: query
        description: Terme de recherche dans les tags
        schema:
          type: string
      responses:
        "200":
          description: Liste des photos récupérée avec succès
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Document"
  /api/v1/photos/chantier/{chantierId}:
    get:
      tags:
      - Photos
      summary: Photos d'un chantier
      description: Récupère toutes les photos d'un chantier spécifique
      parameters:
      - name: chantierId
        in: path
        description: Identifiant du chantier
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Photos du chantier récupérées
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Document"
  /api/v1/photos/employe/{employeId}:
    get:
      tags:
      - Photos
      summary: Photos prises par un employé
      description: Récupère toutes les photos prises par un employé
      parameters:
      - name: employeId
        in: path
        description: Identifiant de l'employé
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Photos de l'employé récupérées
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Document"
  /api/v1/photos/galerie/{chantierId}:
    get:
      tags:
      - Photos
      summary: Galerie photos d'un chantier
      description: Récupère toutes les photos d'un chantier pour affichage galerie
      parameters:
      - name: chantierId
        in: path
        description: Identifiant du chantier
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Galerie récupérée
  /api/v1/photos/recentes:
    get:
      tags:
      - Photos
      summary: Photos récentes
      description: Récupère les photos les plus récemment ajoutées
      parameters:
      - name: limite
        in: query
        description: Nombre de photos à retourner
        schema:
          format: int32
          default: 10
          type: integer
        example: 10
      responses:
        "200":
          description: Photos récentes récupérées
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Document"
  /api/v1/photos/statistiques:
    get:
      tags:
      - Photos
      summary: Statistiques des photos
      description: Récupère les statistiques spécifiques aux photos
      responses:
        "200":
          description: Statistiques récupérées
  /api/v1/photos/upload:
    post:
      tags:
      - Photos
      summary: Uploader une photo de chantier
      description: Upload une photo avec optimisations spécifiques aux images
      requestBody:
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                nom:
                  type: string
                description:
                  type: string
                file:
                  $ref: "#/components/schemas/FileUpload"
                fileName:
                  type: string
                contentType:
                  type: string
                chantierId:
                  $ref: "#/components/schemas/UUID"
                materielId:
                  $ref: "#/components/schemas/UUID"
                equipeId:
                  $ref: "#/components/schemas/UUID"
                employeId:
                  $ref: "#/components/schemas/UUID"
                localisation:
                  type: string
                latitude:
                  format: double
                  type: number
                longitude:
                  format: double
                  type: number
      responses:
        "201":
          description: Photo uploadée avec succès
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Document"
        "400":
          description: Fichier non valide ou trop volumineux
  /api/v1/photos/upload-multiple:
    post:
      tags:
      - Photos
      summary: Uploader plusieurs photos
      description: Upload multiple de photos en une seule requête
      requestBody:
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                '*':
                  type: array
                  items:
                    $ref: "#/components/schemas/FileUpload"
                chantierId:
                  $ref: "#/components/schemas/UUID"
                description:
                  type: string
      responses:
        "201":
          description: Photos uploadées avec succès
        "400":
          description: Erreur dans l'upload
  /api/v1/photos/{id}:
    get:
      tags:
      - Photos
      summary: Récupérer une photo par ID
      description: Récupère les métadonnées d'une photo spécifique
      parameters:
      - name: id
        in: path
        description: Identifiant unique de la photo
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Photo trouvée
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Document"
        "404":
          description: Photo non trouvée
  /api/v1/photos/{id}/thumbnail:
    get:
      tags:
      - Photos
      summary: Miniature d'une photo
      description: Récupère une version miniature de la photo
      parameters:
      - name: id
        in: path
        description: Identifiant de la photo
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Miniature récupérée
        "404":
          description: Photo non trouvée
  /api/v1/photos/{id}/view:
    get:
      tags:
      - Photos
      summary: Visualiser une photo
      description: Affiche la photo en taille originale
      parameters:
      - name: id
        in: path
        description: Identifiant de la photo
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Photo affichée
        "404":
          description: Photo non trouvée
  /api/v1/planning:
    get:
      tags:
      - Planning
      summary: Récupérer la vue planning général
      parameters:
      - name: chantierId
        in: query
        description: ID du chantier (optionnel)
        schema:
          type: string
      - name: dateDebut
        in: query
        description: Date de début (YYYY-MM-DD)
        schema:
          type: string
      - name: dateFin
        in: query
        description: Date de fin (YYYY-MM-DD)
        schema:
          type: string
      - name: equipeId
        in: query
        description: ID de l'équipe (optionnel)
        schema:
          type: string
      - name: type
        in: query
        description: Type d'événement (optionnel)
        schema:
          type: string
      responses:
        "200":
          description: Planning général récupéré avec succès
        "400":
          description: Paramètres de date invalides
  /api/v1/planning/check-availability:
    post:
      tags:
      - Planning
      summary: Vérifier la disponibilité des ressources
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/AvailabilityCheckRequest"
      responses:
        "200":
          description: Disponibilité vérifiée avec succès
        "400":
          description: Données invalides
  /api/v1/planning/conflicts:
    get:
      tags:
      - Planning
      summary: Détecter les conflits de ressources
      parameters:
      - name: dateDebut
        in: query
        description: Date de début pour la vérification
        schema:
          type: string
      - name: dateFin
        in: query
        description: Date de fin pour la vérification
        schema:
          type: string
      - name: resourceType
        in: query
        description: "Type de ressource (EMPLOYE, MATERIEL, EQUIPE)"
        schema:
          type: string
      responses:
        "200":
          description: Conflits détectés avec succès
        "400":
          description: Paramètres invalides
  /api/v1/planning/events:
    get:
      tags:
      - Planning
      summary: Récupérer tous les événements de planning
      parameters:
      - name: chantierId
        in: query
        description: ID du chantier
        schema:
          type: string
      - name: dateDebut
        in: query
        description: Date de début (YYYY-MM-DD)
        schema:
          type: string
      - name: dateFin
        in: query
        description: Date de fin (YYYY-MM-DD)
        schema:
          type: string
      - name: type
        in: query
        description: Type d'événement
        schema:
          type: string
      responses:
        "200":
          description: Liste des événements récupérée avec succès
    post:
      tags:
      - Planning
      summary: Créer un nouvel événement de planning
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreateEventRequest"
      responses:
        "201":
          description: Événement créé avec succès
        "400":
          description: Données invalides
        "409":
          description: Conflit de ressources détecté
  /api/v1/planning/events/{id}:
    get:
      tags:
      - Planning
      summary: Récupérer un événement par ID
      parameters:
      - name: id
        in: path
        description: ID de l'événement
        required: true
        schema:
          type: string
      responses:
        "200":
          description: Événement récupéré avec succès
        "404":
          description: Événement non trouvé
    put:
      tags:
      - Planning
      summary: Modifier un événement de planning
      parameters:
      - name: id
        in: path
        description: ID de l'événement
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UpdateEventRequest"
      responses:
        "200":
          description: Événement modifié avec succès
        "404":
          description: Événement non trouvé
        "409":
          description: Conflit de ressources détecté
    delete:
      tags:
      - Planning
      summary: Supprimer un événement de planning
      parameters:
      - name: id
        in: path
        description: ID de l'événement
        required: true
        schema:
          type: string
      responses:
        "204":
          description: Événement supprimé avec succès
        "404":
          description: Événement non trouvé
  /api/v1/planning/month/{date}:
    get:
      tags:
      - Planning
      summary: Récupérer le planning mensuel
      parameters:
      - name: date
        in: path
        description: Date de référence (YYYY-MM-DD)
        required: true
        schema:
          type: string
      responses:
        "200":
          description: Planning mensuel récupéré avec succès
        "400":
          description: Date invalide
  /api/v1/planning/stats:
    get:
      tags:
      - Planning
      summary: Obtenir les statistiques du planning
      parameters:
      - name: dateDebut
        in: query
        description: Période de début (YYYY-MM-DD)
        schema:
          type: string
      - name: dateFin
        in: query
        description: Période de fin (YYYY-MM-DD)
        schema:
          type: string
      responses:
        "200":
          description: Statistiques récupérées avec succès
  /api/v1/planning/week/{date}:
    get:
      tags:
      - Planning
      summary: Récupérer le planning hebdomadaire
      parameters:
      - name: date
        in: path
        description: Date de référence (YYYY-MM-DD)
        required: true
        schema:
          type: string
      responses:
        "200":
          description: Planning hebdomadaire récupéré avec succès
        "400":
          description: Date invalide
  /api/v1/plannings-materiel:
    get:
      tags:
      - Planning Materiel Resource
      parameters:
      - name: page
        in: query
        schema:
          format: int32
          default: 0
          type: integer
      - name: size
        in: query
        schema:
          format: int32
          default: 50
          type: integer
      responses:
        "200":
          description: OK
    post:
      tags:
      - Planning Materiel Resource
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreatePlanningRequest"
      responses:
        "200":
          description: OK
  /api/v1/plannings-materiel/avec-conflits:
    get:
      tags:
      - Planning Materiel Resource
      responses:
        "200":
          description: OK
  /api/v1/plannings-materiel/check-conflits:
    get:
      tags:
      - Planning Materiel Resource
      parameters:
      - name: dateDebut
        in: query
        required: true
        schema:
          $ref: "#/components/schemas/LocalDate"
      - name: dateFin
        in: query
        required: true
        schema:
          $ref: "#/components/schemas/LocalDate"
      - name: excludeId
        in: query
        schema:
          $ref: "#/components/schemas/UUID"
      - name: materielId
        in: query
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: OK
  /api/v1/plannings-materiel/disponibilite/{materielId}:
    get:
      tags:
      - Planning Materiel Resource
      parameters:
      - name: materielId
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      - name: dateDebut
        in: query
        required: true
        schema:
          $ref: "#/components/schemas/LocalDate"
      - name: dateFin
        in: query
        required: true
        schema:
          $ref: "#/components/schemas/LocalDate"
      responses:
        "200":
          description: OK
  /api/v1/plannings-materiel/en-cours:
    get:
      tags:
      - Planning Materiel Resource
      responses:
        "200":
          description: OK
  /api/v1/plannings-materiel/en-retard-validation:
    get:
      tags:
      - Planning Materiel Resource
      responses:
        "200":
          description: OK
  /api/v1/plannings-materiel/materiel/{materielId}:
    get:
      tags:
      - Planning Materiel Resource
      parameters:
      - name: materielId
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: OK
  /api/v1/plannings-materiel/necessitant-attention:
    get:
      tags:
      - Planning Materiel Resource
      responses:
        "200":
          description: OK
  /api/v1/plannings-materiel/optimiser:
    post:
      tags:
      - Planning Materiel Resource
      responses:
        "200":
          description: OK
  /api/v1/plannings-materiel/periode:
    get:
      tags:
      - Planning Materiel Resource
      parameters:
      - name: dateDebut
        in: query
        schema:
          $ref: "#/components/schemas/LocalDate"
      - name: dateFin
        in: query
        schema:
          $ref: "#/components/schemas/LocalDate"
      responses:
        "200":
          description: OK
  /api/v1/plannings-materiel/prioritaires:
    get:
      tags:
      - Planning Materiel Resource
      responses:
        "200":
          description: OK
  /api/v1/plannings-materiel/search:
    get:
      tags:
      - Planning Materiel Resource
      parameters:
      - name: terme
        in: query
        schema:
          type: string
      responses:
        "200":
          description: OK
  /api/v1/plannings-materiel/statistiques:
    get:
      tags:
      - Planning Materiel Resource
      responses:
        "200":
          description: OK
  /api/v1/plannings-materiel/statut/{statut}:
    get:
      tags:
      - Planning Materiel Resource
      parameters:
      - name: statut
        in: path
        required: true
        schema:
          type: string
      responses:
        "200":
          description: OK
  /api/v1/plannings-materiel/tableau-bord:
    get:
      tags:
      - Planning Materiel Resource
      responses:
        "200":
          description: OK
  /api/v1/plannings-materiel/taux-utilisation:
    get:
      tags:
      - Planning Materiel Resource
      parameters:
      - name: dateDebut
        in: query
        required: true
        schema:
          $ref: "#/components/schemas/LocalDate"
      - name: dateFin
        in: query
        required: true
        schema:
          $ref: "#/components/schemas/LocalDate"
      responses:
        "200":
          description: OK
  /api/v1/plannings-materiel/type/{type}:
    get:
      tags:
      - Planning Materiel Resource
      parameters:
      - name: type
        in: path
        required: true
        schema:
          type: string
      responses:
        "200":
          description: OK
  /api/v1/plannings-materiel/verifier-conflits:
    post:
      tags:
      - Planning Materiel Resource
      responses:
        "200":
          description: OK
  /api/v1/plannings-materiel/{id}:
    get:
      tags:
      - Planning Materiel Resource
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: OK
    put:
      tags:
      - Planning Materiel Resource
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UpdatePlanningRequest"
      responses:
        "200":
          description: OK
  /api/v1/plannings-materiel/{id}/archiver:
    put:
      tags:
      - Planning Materiel Resource
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: OK
  /api/v1/plannings-materiel/{id}/mettre-en-revision:
    put:
      tags:
      - Planning Materiel Resource
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/RevisionPlanningRequest"
      responses:
        "200":
          description: OK
  /api/v1/plannings-materiel/{id}/optimiser:
    put:
      tags:
      - Planning Materiel Resource
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: OK
  /api/v1/plannings-materiel/{id}/reactiver:
    put:
      tags:
      - Planning Materiel Resource
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: OK
  /api/v1/plannings-materiel/{id}/suspendre:
    put:
      tags:
      - Planning Materiel Resource
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: OK
  /api/v1/plannings-materiel/{id}/valider:
    put:
      tags:
      - Planning Materiel Resource
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ValiderPlanningRequest"
      responses:
        "200":
          description: OK
  /api/v1/reports/chantiers:
    get:
      tags:
      - Reports
      summary: Rapport des chantiers
      description: Génère un rapport détaillé des chantiers avec filtres
      parameters:
      - name: dateDebut
        in: query
        description: Date de début (yyyy-mm-dd)
        schema:
          type: string
      - name: dateFin
        in: query
        description: Date de fin (yyyy-mm-dd)
        schema:
          type: string
      - name: format
        in: query
        description: Format d'export
        schema:
          default: json
          type: string
        example: json
      - name: statut
        in: query
        description: Statut des chantiers
        schema:
          type: string
      responses:
        "200":
          description: Rapport généré avec succès
  /api/v1/reports/chantiers/{id}/detail:
    get:
      tags:
      - Reports
      summary: Rapport détaillé d'un chantier
      description: Génère un rapport complet pour un chantier spécifique
      parameters:
      - name: id
        in: path
        description: Identifiant du chantier
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      - name: format
        in: query
        description: Format d'export
        schema:
          default: json
          type: string
        example: json
      responses:
        "200":
          description: Rapport de chantier généré
        "404":
          description: Chantier non trouvé
  /api/v1/reports/export/csv/chantiers:
    get:
      tags:
      - Reports
      summary: Export CSV des chantiers
      description: Exporte la liste des chantiers au format CSV
      responses:
        "200":
          description: Export CSV généré
  /api/v1/reports/export/csv/maintenance:
    get:
      tags:
      - Reports
      summary: Export CSV des maintenances
      description: Exporte la liste des maintenances au format CSV
      responses:
        "200":
          description: Export CSV généré
  /api/v1/reports/financier:
    get:
      tags:
      - Reports
      summary: Rapport financier
      description: Rapport sur les budgets et coûts des chantiers
      parameters:
      - name: annee
        in: query
        description: Année de référence
        schema:
          format: int32
          type: integer
        example: 2025
      - name: format
        in: query
        description: Format d'export
        schema:
          default: json
          type: string
        example: json
      responses:
        "200":
          description: Rapport financier généré
  /api/v1/reports/maintenance:
    get:
      tags:
      - Reports
      summary: Rapport de maintenance
      description: Génère un rapport sur l'état de la maintenance du matériel
      parameters:
      - name: format
        in: query
        description: Format d'export
        schema:
          default: json
          type: string
        example: json
      - name: periode
        in: query
        description: Nombre de jours pour l'historique
        schema:
          format: int32
          default: 30
          type: integer
        example: 30
      responses:
        "200":
          description: Rapport de maintenance généré
  /api/v1/reports/ressources-humaines:
    get:
      tags:
      - Reports
      summary: Rapport des ressources humaines
      description: "Rapport sur les employés, équipes et disponibilités"
      parameters:
      - name: format
        in: query
        description: Format d'export
        schema:
          default: json
          type: string
        example: json
      responses:
        "200":
          description: Rapport RH généré
  /api/v1/reservations-materiel:
    get:
      tags:
      - Reservation Materiel Resource
      parameters:
      - name: page
        in: query
        schema:
          format: int32
          default: 0
          type: integer
      - name: size
        in: query
        schema:
          format: int32
          default: 50
          type: integer
      responses:
        "200":
          description: OK
    post:
      tags:
      - Reservation Materiel Resource
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreateReservationRequest"
      responses:
        "200":
          description: OK
  /api/v1/reservations-materiel/chantier/{chantierId}:
    get:
      tags:
      - Reservation Materiel Resource
      parameters:
      - name: chantierId
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: OK
  /api/v1/reservations-materiel/check-conflits:
    get:
      tags:
      - Reservation Materiel Resource
      parameters:
      - name: dateDebut
        in: query
        required: true
        schema:
          $ref: "#/components/schemas/LocalDate"
      - name: dateFin
        in: query
        required: true
        schema:
          $ref: "#/components/schemas/LocalDate"
      - name: excludeId
        in: query
        schema:
          $ref: "#/components/schemas/UUID"
      - name: materielId
        in: query
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: OK
  /api/v1/reservations-materiel/disponibilite/{materielId}:
    get:
      tags:
      - Reservation Materiel Resource
      parameters:
      - name: materielId
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      - name: dateDebut
        in: query
        required: true
        schema:
          $ref: "#/components/schemas/LocalDate"
      - name: dateFin
        in: query
        required: true
        schema:
          $ref: "#/components/schemas/LocalDate"
      responses:
        "200":
          description: OK
  /api/v1/reservations-materiel/en-attente-validation:
    get:
      tags:
      - Reservation Materiel Resource
      responses:
        "200":
          description: OK
  /api/v1/reservations-materiel/en-retard:
    get:
      tags:
      - Reservation Materiel Resource
      responses:
        "200":
          description: OK
  /api/v1/reservations-materiel/materiel/{materielId}:
    get:
      tags:
      - Reservation Materiel Resource
      parameters:
      - name: materielId
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: OK
  /api/v1/reservations-materiel/periode:
    get:
      tags:
      - Reservation Materiel Resource
      parameters:
      - name: dateDebut
        in: query
        schema:
          $ref: "#/components/schemas/LocalDate"
      - name: dateFin
        in: query
        schema:
          $ref: "#/components/schemas/LocalDate"
      responses:
        "200":
          description: OK
  /api/v1/reservations-materiel/prioritaires:
    get:
      tags:
      - Reservation Materiel Resource
      responses:
        "200":
          description: OK
  /api/v1/reservations-materiel/reference/{reference}:
    get:
      tags:
      - Reservation Materiel Resource
      parameters:
      - name: reference
        in: path
        required: true
        schema:
          type: string
      responses:
        "200":
          description: OK
  /api/v1/reservations-materiel/search:
    get:
      tags:
      - Reservation Materiel Resource
      parameters:
      - name: terme
        in: query
        schema:
          type: string
      responses:
        "200":
          description: OK
  /api/v1/reservations-materiel/statistiques:
    get:
      tags:
      - Reservation Materiel Resource
      responses:
        "200":
          description: OK
  /api/v1/reservations-materiel/statut/{statut}:
    get:
      tags:
      - Reservation Materiel Resource
      parameters:
      - name: statut
        in: path
        required: true
        schema:
          type: string
      responses:
        "200":
          description: OK
  /api/v1/reservations-materiel/tableau-bord:
    get:
      tags:
      - Reservation Materiel Resource
      responses:
        "200":
          description: OK
  /api/v1/reservations-materiel/{id}:
    get:
      tags:
      - Reservation Materiel Resource
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: OK
    put:
      tags:
      - Reservation Materiel Resource
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UpdateReservationRequest"
      responses:
        "200":
          description: OK
  /api/v1/reservations-materiel/{id}/annuler:
    put:
      tags:
      - Reservation Materiel Resource
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/AnnulerReservationRequest"
      responses:
        "200":
          description: OK
  /api/v1/reservations-materiel/{id}/livrer:
    put:
      tags:
      - Reservation Materiel Resource
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/LivrerMaterielRequest"
      responses:
        "200":
          description: OK
  /api/v1/reservations-materiel/{id}/refuser:
    put:
      tags:
      - Reservation Materiel Resource
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/RefuserReservationRequest"
      responses:
        "200":
          description: OK
  /api/v1/reservations-materiel/{id}/retourner:
    put:
      tags:
      - Reservation Materiel Resource
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/RetournerMaterielRequest"
      responses:
        "200":
          description: OK
  /api/v1/reservations-materiel/{id}/valider:
    put:
      tags:
      - Reservation Materiel Resource
      parameters:
      - name: id
        in: path
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ValiderReservationRequest"
      responses:
        "200":
          description: OK
  /api/v1/sous-phase-templates:
    post:
      tags:
      - Sous-Phase Templates
      summary: Crée une nouvelle sous-phase template
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SousPhaseTemplate"
      responses:
        "201":
          description: Sous-phase template créée avec succès
        "400":
          description: Données invalides
        "404":
          description: Phase template parent non trouvée
        "409":
          description: Conflit - sous-phase existante pour cet ordre
  /api/v1/sous-phase-templates/by-phase/{phaseTemplateId}:
    get:
      tags:
      - Sous-Phase Templates
      summary: Récupère toutes les sous-phases d'une phase template
      parameters:
      - name: phaseTemplateId
        in: path
        description: ID de la phase template parent
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Liste des sous-phases pour la phase template
        "404":
          description: Phase template non trouvée
  /api/v1/sous-phase-templates/count/by-phase/{phaseTemplateId}:
    get:
      tags:
      - Sous-Phase Templates
      summary: Compte le nombre de sous-phases pour une phase template
      parameters:
      - name: phaseTemplateId
        in: path
        description: ID de la phase template parent
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Nombre de sous-phases actives
        "404":
          description: Phase template non trouvée
  /api/v1/sous-phase-templates/critiques/by-phase/{phaseTemplateId}:
    get:
      tags:
      - Sous-Phase Templates
      summary: Récupère les sous-phases critiques d'une phase template
      parameters:
      - name: phaseTemplateId
        in: path
        description: ID de la phase template parent
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Liste des sous-phases critiques
        "404":
          description: Phase template non trouvée
  /api/v1/sous-phase-templates/duree-totale/by-phase/{phaseTemplateId}:
    get:
      tags:
      - Sous-Phase Templates
      summary: Calcule la durée totale des sous-phases d'une phase template
      parameters:
      - name: phaseTemplateId
        in: path
        description: ID de la phase template parent
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Durée totale en jours
        "404":
          description: Phase template non trouvée
  /api/v1/sous-phase-templates/search:
    get:
      tags:
      - Sous-Phase Templates
      summary: Recherche de sous-phases par nom
      parameters:
      - name: phaseTemplateId
        in: query
        description: ID de la phase template parent
        schema:
          $ref: "#/components/schemas/UUID"
      - name: searchTerm
        in: query
        description: Terme de recherche
        schema:
          type: string
      responses:
        "200":
          description: Liste des sous-phases correspondantes
        "400":
          description: Paramètres de recherche invalides
        "404":
          description: Phase template non trouvée
  /api/v1/sous-phase-templates/with-materials/by-phase/{phaseTemplateId}:
    get:
      tags:
      - Sous-Phase Templates
      summary: Récupère les sous-phases avec matériels spécifiques
      parameters:
      - name: phaseTemplateId
        in: path
        description: ID de la phase template parent
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Liste des sous-phases avec matériels
        "404":
          description: Phase template non trouvée
  /api/v1/sous-phase-templates/with-qualified-workers/by-phase/{phaseTemplateId}:
    get:
      tags:
      - Sous-Phase Templates
      summary: Récupère les sous-phases nécessitant du personnel qualifié
      parameters:
      - name: phaseTemplateId
        in: path
        description: ID de la phase template parent
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Liste des sous-phases avec personnel qualifié requis
        "404":
          description: Phase template non trouvée
  /api/v1/sous-phase-templates/{id}:
    get:
      tags:
      - Sous-Phase Templates
      summary: Récupère une sous-phase template par son ID
      parameters:
      - name: id
        in: path
        description: Identifiant de la sous-phase template
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Sous-phase template trouvée
        "404":
          description: Sous-phase template non trouvée
    put:
      tags:
      - Sous-Phase Templates
      summary: Met à jour une sous-phase template
      parameters:
      - name: id
        in: path
        description: Identifiant de la sous-phase template
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SousPhaseTemplate"
      responses:
        "200":
          description: Sous-phase template mise à jour avec succès
        "400":
          description: Données invalides
        "404":
          description: Sous-phase template non trouvée
        "409":
          description: Conflit - ordre d'exécution déjà utilisé
    delete:
      tags:
      - Sous-Phase Templates
      summary: Supprime une sous-phase template (désactivation)
      parameters:
      - name: id
        in: path
        description: Identifiant de la sous-phase template
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "204":
          description: Sous-phase template supprimée avec succès
        "404":
          description: Sous-phase template non trouvée
  /api/v1/sous-phase-templates/{id}/reactiver:
    put:
      tags:
      - Sous-Phase Templates
      summary: Réactive une sous-phase template
      parameters:
      - name: id
        in: path
        description: Identifiant de la sous-phase template
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Sous-phase template réactivée avec succès
        "404":
          description: Sous-phase template non trouvée
  /api/v1/stocks:
    get:
      tags:
      - Stocks
      summary: Récupérer tous les stocks
      description: Retourne la liste complète des articles en stock
      responses:
        "200":
          description: Liste des stocks récupérée avec succès
    post:
      tags:
      - Stocks
      summary: Créer un nouveau stock
      description: Crée un nouvel article en stock
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Stock"
      responses:
        "201":
          description: Stock créé avec succès
        "400":
          description: Données invalides
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/stocks/categorie/{categorie}:
    get:
      tags:
      - Stocks
      summary: Récupérer les stocks par catégorie
      description: Filtre les stocks par catégorie
      parameters:
      - name: categorie
        in: path
        description: Catégorie de stock
        required: true
        schema:
          type: string
      responses:
        "200":
          description: Liste des stocks filtrés
  /api/v1/stocks/reference/{reference}:
    get:
      tags:
      - Stocks
      summary: Récupérer un stock par référence
      description: Recherche un article en stock par sa référence
      parameters:
      - name: reference
        in: path
        description: Référence du stock
        required: true
        schema:
          type: string
      responses:
        "200":
          description: Stock trouvé
        "404":
          description: Stock non trouvé
  /api/v1/stocks/rupture:
    get:
      tags:
      - Stocks
      summary: Récupérer les stocks en rupture
      description: Liste les articles en rupture de stock
      responses:
        "200":
          description: Liste des stocks en rupture
  /api/v1/stocks/search:
    get:
      tags:
      - Stocks
      summary: Rechercher des stocks
      description: Recherche textuelle dans les stocks
      parameters:
      - name: term
        in: query
        description: Terme de recherche
        schema:
          type: string
      responses:
        "200":
          description: Résultats de recherche
        "400":
          description: Terme de recherche requis
  /api/v1/stocks/statistiques:
    get:
      tags:
      - Stocks
      summary: Récupérer les statistiques des stocks
      description: Retourne des statistiques globales sur les stocks
      responses:
        "200":
          description: Statistiques récupérées avec succès
  /api/v1/stocks/statut/{statut}:
    get:
      tags:
      - Stocks
      summary: Récupérer les stocks par statut
      description: Filtre les stocks par statut
      parameters:
      - name: statut
        in: path
        description: Statut du stock
        required: true
        schema:
          $ref: "#/components/schemas/StatutStock"
      responses:
        "200":
          description: Liste des stocks filtrés
  /api/v1/stocks/valeur-totale:
    get:
      tags:
      - Stocks
      summary: Calculer la valeur totale du stock
      description: Calcule la valeur totale de tous les stocks
      responses:
        "200":
          description: Valeur totale calculée
  /api/v1/stocks/{id}:
    get:
      tags:
      - Stocks
      summary: Récupérer un stock par ID
      description: Retourne les détails d'un article en stock
      parameters:
      - name: id
        in: path
        description: ID du stock
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Stock trouvé
        "404":
          description: Stock non trouvé
    put:
      tags:
      - Stocks
      summary: Mettre à jour un stock
      description: Met à jour les informations d'un article en stock
      parameters:
      - name: id
        in: path
        description: ID du stock
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Stock"
      responses:
        "200":
          description: Stock mis à jour avec succès
        "404":
          description: Stock non trouvé
        "400":
          description: Données invalides
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
    delete:
      tags:
      - Stocks
      summary: Supprimer un stock
      description: Supprime un article du stock
      parameters:
      - name: id
        in: path
        description: ID du stock
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "204":
          description: Stock supprimé avec succès
        "404":
          description: Stock non trouvé
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/stocks/{id}/entree:
    post:
      tags:
      - Stocks
      summary: Enregistrer une entrée de stock
      description: Ajoute une quantité au stock
      parameters:
      - name: id
        in: path
        description: ID du stock
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              additionalProperties: {}
      responses:
        "200":
          description: Entrée enregistrée avec succès
        "404":
          description: Stock non trouvé
        "400":
          description: Données invalides
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/stocks/{id}/sortie:
    post:
      tags:
      - Stocks
      summary: Enregistrer une sortie de stock
      description: Retire une quantité du stock
      parameters:
      - name: id
        in: path
        description: ID du stock
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              additionalProperties: {}
      responses:
        "200":
          description: Sortie enregistrée avec succès
        "404":
          description: Stock non trouvé
        "400":
          description: Quantité insuffisante
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/tache-templates:
    post:
      tags:
      - Tâche Templates
      summary: Crée une nouvelle tâche template
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/TacheTemplate"
      responses:
        "201":
          description: Tâche template créée avec succès
        "400":
          description: Données invalides
        "404":
          description: Sous-phase template parent non trouvée
  /api/v1/tache-templates/batch:
    post:
      tags:
      - Tâche Templates
      summary: Crée plusieurs tâches templates en lot
      requestBody:
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: "#/components/schemas/TacheTemplate"
      responses:
        "201":
          description: Tâches créées avec succès
        "400":
          description: Données invalides
  /api/v1/tache-templates/bloquantes/by-sous-phase/{sousPhaseId}:
    get:
      tags:
      - Tâche Templates
      summary: Récupère toutes les tâches bloquantes d'une sous-phase
      parameters:
      - name: sousPhaseId
        in: path
        description: ID de la sous-phase template
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Liste des tâches bloquantes
        "404":
          description: Sous-phase template non trouvée
  /api/v1/tache-templates/by-sous-phase/{sousPhaseId}:
    get:
      tags:
      - Tâche Templates
      summary: Récupère toutes les tâches d'une sous-phase template
      parameters:
      - name: sousPhaseId
        in: path
        description: ID de la sous-phase template parent
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Liste des tâches pour la sous-phase template
        "404":
          description: Sous-phase template non trouvée
  /api/v1/tache-templates/by-sous-phase/{sousPhaseId}/actives:
    get:
      tags:
      - Tâche Templates
      summary: Récupère toutes les tâches actives d'une sous-phase template
      parameters:
      - name: sousPhaseId
        in: path
        description: ID de la sous-phase template
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Liste des tâches actives
        "404":
          description: Sous-phase template non trouvée
  /api/v1/tache-templates/by-type-chantier/{typeChantier}:
    get:
      tags:
      - Tâche Templates
      summary: Récupère toutes les tâches d'un type de chantier
      parameters:
      - name: typeChantier
        in: path
        description: Type de chantier BTP
        required: true
        schema:
          type: string
      responses:
        "200":
          description: Liste des tâches pour le type de chantier
        "400":
          description: Type de chantier invalide
  /api/v1/tache-templates/critiques/by-sous-phase/{sousPhaseId}:
    get:
      tags:
      - Tâche Templates
      summary: Récupère toutes les tâches critiques d'une sous-phase
      parameters:
      - name: sousPhaseId
        in: path
        description: ID de la sous-phase template
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Liste des tâches critiques
        "404":
          description: Sous-phase template non trouvée
  /api/v1/tache-templates/reorder/by-sous-phase/{sousPhaseId}:
    put:
      tags:
      - Tâche Templates
      summary: Réorganise l'ordre des tâches dans une sous-phase
      parameters:
      - name: sousPhaseId
        in: path
        description: ID de la sous-phase template
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              type: array
              items:
                format: uuid
                pattern: "[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}"
                type: string
      responses:
        "200":
          description: Tâches réorganisées avec succès
        "400":
          description: Liste des IDs invalide
        "404":
          description: Sous-phase template non trouvée
  /api/v1/tache-templates/search:
    get:
      tags:
      - Tâche Templates
      summary: Recherche de tâches par nom ou description
      parameters:
      - name: q
        in: query
        description: Terme de recherche
        schema:
          type: string
      responses:
        "200":
          description: Liste des tâches correspondantes
        "400":
          description: Paramètre de recherche manquant
  /api/v1/tache-templates/stats/by-sous-phase/{sousPhaseId}:
    get:
      tags:
      - Tâche Templates
      summary: Calcule les statistiques d'une sous-phase basées sur ses tâches
      parameters:
      - name: sousPhaseId
        in: path
        description: ID de la sous-phase template
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Statistiques de la sous-phase
        "404":
          description: Sous-phase template non trouvée
  /api/v1/tache-templates/template-vide:
    get:
      tags:
      - Tâche Templates
      summary: Récupère un template vide pour la création d'une nouvelle tâche
      responses:
        "200":
          description: Template vide
  /api/v1/tache-templates/validate:
    post:
      tags:
      - Tâche Templates
      summary: Valide les données d'une tâche template
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/TacheTemplate"
      responses:
        "200":
          description: Résultat de validation
  /api/v1/tache-templates/{id}:
    get:
      tags:
      - Tâche Templates
      summary: Récupère une tâche template par son ID
      parameters:
      - name: id
        in: path
        description: Identifiant de la tâche template
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "200":
          description: Tâche template trouvée
        "404":
          description: Tâche template non trouvée
    put:
      tags:
      - Tâche Templates
      summary: Met à jour une tâche template
      parameters:
      - name: id
        in: path
        description: Identifiant de la tâche template
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/TacheTemplate"
      responses:
        "200":
          description: Tâche template mise à jour avec succès
        "400":
          description: Données invalides
        "404":
          description: Tâche template non trouvée
    delete:
      tags:
      - Tâche Templates
      summary: Supprime définitivement une tâche template
      parameters:
      - name: id
        in: path
        description: Identifiant de la tâche template
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "204":
          description: Tâche template supprimée avec succès
        "404":
          description: Tâche template non trouvée
  /api/v1/tache-templates/{id}/deactivate:
    put:
      tags:
      - Tâche Templates
      summary: Désactive une tâche template
      parameters:
      - name: id
        in: path
        description: Identifiant de la tâche template
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "204":
          description: Tâche template désactivée avec succès
        "404":
          description: Tâche template non trouvée
  /api/v1/tache-templates/{id}/duplicate:
    post:
      tags:
      - Tâche Templates
      summary: Duplique une tâche template vers une autre sous-phase
      parameters:
      - name: id
        in: path
        description: ID de la tâche template à dupliquer
        required: true
        schema:
          $ref: "#/components/schemas/UUID"
      - name: newSousPhaseId
        in: query
        description: ID de la nouvelle sous-phase parent
        schema:
          $ref: "#/components/schemas/UUID"
      responses:
        "201":
          description: Tâche template dupliquée avec succès
        "404":
          description: Tâche template ou sous-phase de destination non trouvée
  /api/v1/types-chantier:
    get:
      tags:
      - Types de Chantier
      summary: Récupérer tous les types de chantier
      parameters:
      - name: includeInactive
        in: query
        description: Inclure les types inactifs
        schema:
          default: false
          type: boolean
      responses:
        "200":
          description: Liste des types de chantier récupérée avec succès
    post:
      tags:
      - Types de Chantier
      summary: Créer un nouveau type de chantier
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/TypeChantier"
      responses:
        "201":
          description: Type de chantier créé avec succès
        "400":
          description: Données invalides
  /api/v1/types-chantier/code/{code}:
    get:
      tags:
      - Types de Chantier
      summary: Récupérer un type de chantier par code
      parameters:
      - name: code
        in: path
        description: Code du type de chantier
        required: true
        schema:
          type: string
      responses:
        "200":
          description: OK
  /api/v1/types-chantier/par-categorie:
    get:
      tags:
      - Types de Chantier
      summary: Récupérer les types de chantier groupés par catégorie
      responses:
        "200":
          description: OK
  /api/v1/types-chantier/statistiques:
    get:
      tags:
      - Types de Chantier
      summary: Récupérer les statistiques des types de chantier
      responses:
        "200":
          description: OK
  /api/v1/types-chantier/{id}:
    get:
      tags:
      - Types de Chantier
      summary: Récupérer un type de chantier par ID
      parameters:
      - name: id
        in: path
        description: ID du type de chantier
        required: true
        schema:
          type: string
      responses:
        "200":
          description: Type de chantier récupéré avec succès
        "404":
          description: Type de chantier non trouvé
    put:
      tags:
      - Types de Chantier
      summary: Mettre à jour un type de chantier
      parameters:
      - name: id
        in: path
        description: ID du type de chantier
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/TypeChantier"
      responses:
        "200":
          description: OK
    delete:
      tags:
      - Types de Chantier
      summary: Supprimer un type de chantier (soft delete)
      parameters:
      - name: id
        in: path
        description: ID du type de chantier
        required: true
        schema:
          type: string
      responses:
        "200":
          description: OK
  /api/v1/types-chantier/{id}/reactivate:
    post:
      tags:
      - Types de Chantier
      summary: Réactiver un type de chantier
      parameters:
      - name: id
        in: path
        description: ID du type de chantier
        required: true
        schema:
          type: string
      responses:
        "200":
          description: OK
  /api/v1/users:
    get:
      tags:
      - Utilisateurs
      summary: Récupère tous les utilisateurs
      parameters:
      - name: page
        in: query
        description: Numéro de page (0-indexed)
        schema:
          format: int32
          default: 0
          type: integer
      - name: role
        in: query
        description: Filtrer par rôle
        schema:
          type: string
      - name: search
        in: query
        description: Terme de recherche
        schema:
          type: string
      - name: size
        in: query
        description: Taille de la page
        schema:
          format: int32
          default: 20
          type: integer
      - name: status
        in: query
        description: Filtrer par statut
        schema:
          type: string
      responses:
        "200":
          description: Liste des utilisateurs
        "401":
          description: Non authentifié
        "403":
          description: Accès refusé
      security:
      - JWT: []
    post:
      tags:
      - Utilisateurs
      summary: Crée un nouvel utilisateur
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreateUserRequest"
      responses:
        "201":
          description: Utilisateur créé avec succès
        "400":
          description: Données invalides
        "409":
          description: Email déjà utilisé
        "403":
          description: Accès refusé
      security:
      - JWT: []
  /api/v1/users/count:
    get:
      tags:
      - Utilisateurs
      summary: Compter le nombre d'utilisateurs
      parameters:
      - name: status
        in: query
        description: Filtrer par statut
        schema:
          type: string
      responses:
        "200":
          description: Nombre d'utilisateurs retourné avec succès
        "403":
          description: Accès refusé
      security:
      - JWT: []
  /api/v1/users/pending:
    get:
      tags:
      - Utilisateurs
      summary: Récupérer les utilisateurs en attente de validation
      responses:
        "200":
          description: Liste des utilisateurs en attente récupérée avec succès
        "403":
          description: Accès refusé
      security:
      - JWT: []
  /api/v1/users/stats:
    get:
      tags:
      - Utilisateurs
      summary: Récupère les statistiques des utilisateurs
      responses:
        "200":
          description: Statistiques des utilisateurs
        "403":
          description: Accès refusé
      security:
      - JWT: []
  /api/v1/users/{id}:
    get:
      tags:
      - Utilisateurs
      summary: Récupère un utilisateur par ID
      parameters:
      - name: id
        in: path
        description: ID de l'utilisateur
        required: true
        schema:
          type: string
      responses:
        "200":
          description: Utilisateur trouvé
        "404":
          description: Utilisateur non trouvé
        "403":
          description: Accès refusé
      security:
      - JWT: []
    put:
      tags:
      - Utilisateurs
      summary: Met à jour un utilisateur
      parameters:
      - name: id
        in: path
        description: ID de l'utilisateur
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UpdateUserRequest"
      responses:
        "200":
          description: Utilisateur mis à jour avec succès
        "400":
          description: Données invalides
        "404":
          description: Utilisateur non trouvé
        "403":
          description: Accès refusé
      security:
      - JWT: []
    delete:
      tags:
      - Utilisateurs
      summary: Supprime un utilisateur
      parameters:
      - name: id
        in: path
        description: ID de l'utilisateur
        required: true
        schema:
          type: string
      responses:
        "204":
          description: Utilisateur supprimé avec succès
        "404":
          description: Utilisateur non trouvé
        "403":
          description: Accès refusé
      security:
      - JWT: []
  /api/v1/users/{id}/approve:
    post:
      tags:
      - Utilisateurs
      summary: Approuve un utilisateur en attente
      parameters:
      - name: id
        in: path
        description: ID de l'utilisateur
        required: true
        schema:
          type: string
      responses:
        "200":
          description: Utilisateur approuvé avec succès
        "404":
          description: Utilisateur non trouvé
        "403":
          description: Accès refusé
      security:
      - JWT: []
  /api/v1/users/{id}/reject:
    post:
      tags:
      - Utilisateurs
      summary: Rejette un utilisateur en attente
      parameters:
      - name: id
        in: path
        description: ID de l'utilisateur
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/RejectUserRequest"
      responses:
        "200":
          description: Utilisateur rejeté avec succès
        "404":
          description: Utilisateur non trouvé
        "403":
          description: Accès refusé
      security:
      - JWT: []
  /api/v1/users/{id}/role:
    put:
      tags:
      - Utilisateurs
      summary: Met à jour le rôle d'un utilisateur
      parameters:
      - name: id
        in: path
        description: ID de l'utilisateur
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UpdateRoleRequest"
      responses:
        "200":
          description: Rôle mis à jour avec succès
        "400":
          description: Rôle invalide
        "404":
          description: Utilisateur non trouvé
        "403":
          description: Accès refusé
      security:
      - JWT: []
  /api/v1/users/{id}/status:
    put:
      tags:
      - Utilisateurs
      summary: Met à jour le statut d'un utilisateur
      parameters:
      - name: id
        in: path
        description: ID de l'utilisateur
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UpdateStatusRequest"
      responses:
        "200":
          description: Statut mis à jour avec succès
        "400":
          description: Statut invalide
        "404":
          description: Utilisateur non trouvé
        "403":
          description: Accès refusé
      security:
      - JWT: []
  /api/v1/zones-climatiques:
    get:
      tags:
      - Zones Climatiques
      summary: Récupérer toutes les zones climatiques actives
      description: Retourne la liste complète des zones climatiques actives
      responses:
        "200":
          description: Liste des zones climatiques récupérée avec succès
    post:
      tags:
      - Zones Climatiques
      summary: Créer une nouvelle zone climatique
      description: Crée une nouvelle zone climatique
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ZoneClimatique"
      responses:
        "201":
          description: Zone climatique créée avec succès
        "400":
          description: Données invalides ou code déjà existant
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/zones-climatiques/all:
    get:
      tags:
      - Zones Climatiques
      summary: Récupérer toutes les zones (actives et inactives)
      description: Retourne la liste complète incluant les zones désactivées
      responses:
        "200":
          description: Liste complète des zones climatiques
  /api/v1/zones-climatiques/code/{code}:
    get:
      tags:
      - Zones Climatiques
      summary: Récupérer une zone par code
      description: Retourne les détails d'une zone climatique par son code unique
      parameters:
      - name: code
        in: path
        required: true
        schema:
          type: string
      responses:
        "200":
          description: Zone climatique trouvée
        "404":
          description: Zone climatique non trouvée
  /api/v1/zones-climatiques/pluviometrie:
    get:
      tags:
      - Zones Climatiques
      summary: Rechercher par pluviométrie
      description: Retourne les zones dont la pluviométrie annuelle est dans la plage
        spécifiée
      parameters:
      - name: max
        in: query
        description: Pluviométrie maximale (mm)
        schema:
          format: int32
          type: integer
        example: 2000
      - name: min
        in: query
        description: Pluviométrie minimale (mm)
        schema:
          format: int32
          type: integer
        example: 500
      responses:
        "200":
          description: Zones trouvées
  /api/v1/zones-climatiques/risque-cyclones:
    get:
      tags:
      - Zones Climatiques
      summary: Zones avec risque cyclonique
      description: Retourne toutes les zones présentant un risque cyclonique
      responses:
        "200":
          description: Zones cycloniques trouvées
  /api/v1/zones-climatiques/risque-seisme:
    get:
      tags:
      - Zones Climatiques
      summary: Zones avec risque sismique
      description: Retourne toutes les zones présentant un risque sismique
      responses:
        "200":
          description: Zones sismiques trouvées
  /api/v1/zones-climatiques/search:
    get:
      tags:
      - Zones Climatiques
      summary: Recherche avancée
      description: Recherche avancée avec critères multiples
      parameters:
      - name: corrosionMarine
        in: query
        schema:
          type: boolean
      - name: pluvioMax
        in: query
        schema:
          format: int32
          type: integer
      - name: pluvioMin
        in: query
        schema:
          format: int32
          type: integer
      - name: risqueSeisme
        in: query
        schema:
          type: boolean
      - name: tempMax
        in: query
        schema:
          type: number
      - name: tempMin
        in: query
        schema:
          type: number
      - name: texte
        in: query
        schema:
          type: string
      responses:
        "200":
          description: Résultats de la recherche
  /api/v1/zones-climatiques/statistiques:
    get:
      tags:
      - Zones Climatiques
      summary: Statistiques des zones climatiques
      description: Retourne des statistiques globales sur les zones climatiques
      responses:
        "200":
          description: Statistiques calculées
  /api/v1/zones-climatiques/temperature-range:
    get:
      tags:
      - Zones Climatiques
      summary: Rechercher par plage de température
      description: Retourne les zones dont la température moyenne est dans la plage
        spécifiée
      parameters:
      - name: max
        in: query
        description: Température maximale (°C)
        schema:
          type: number
        example: 40
      - name: min
        in: query
        description: Température minimale (°C)
        schema:
          type: number
        example: 15
      responses:
        "200":
          description: Zones trouvées
  /api/v1/zones-climatiques/{id}:
    get:
      tags:
      - Zones Climatiques
      summary: Récupérer une zone par ID
      description: Retourne les détails d'une zone climatique
      parameters:
      - name: id
        in: path
        description: ID de la zone climatique
        required: true
        schema:
          format: int64
          type: integer
      responses:
        "200":
          description: Zone climatique trouvée
        "404":
          description: Zone climatique non trouvée
    put:
      tags:
      - Zones Climatiques
      summary: Modifier une zone climatique
      description: Met à jour les informations d'une zone
      parameters:
      - name: id
        in: path
        required: true
        schema:
          format: int64
          type: integer
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ZoneClimatique"
      responses:
        "200":
          description: Zone modifiée avec succès
        "404":
          description: Zone non trouvée
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
    delete:
      tags:
      - Zones Climatiques
      summary: Supprimer une zone climatique
      description: Supprime définitivement une zone
      parameters:
      - name: id
        in: path
        required: true
        schema:
          format: int64
          type: integer
      responses:
        "204":
          description: Zone supprimée avec succès
        "404":
          description: Zone non trouvée
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/zones-climatiques/{id}/activate:
    put:
      tags:
      - Zones Climatiques
      summary: Activer une zone climatique
      description: Réactive une zone désactivée
      parameters:
      - name: id
        in: path
        required: true
        schema:
          format: int64
          type: integer
      responses:
        "200":
          description: Zone activée avec succès
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
  /api/v1/zones-climatiques/{id}/deactivate:
    put:
      tags:
      - Zones Climatiques
      summary: Désactiver une zone climatique
      description: Désactive une zone
      parameters:
      - name: id
        in: path
        required: true
        schema:
          format: int64
          type: integer
      responses:
        "200":
          description: Zone désactivée avec succès
        "401":
          description: Not Authorized
        "403":
          description: Not Allowed
      security:
      - SecurityScheme: []
components:
  schemas:
    Abonnement:
      required:
      - entreprise
      - typeAbonnement
      - statut
      - dateDebut
      - dateFin
      - prixPaye
      type: object
      properties:
        id:
          $ref: "#/components/schemas/UUID"
        entreprise:
          $ref: "#/components/schemas/EntrepriseProfile"
        typeAbonnement:
          $ref: "#/components/schemas/TypeAbonnement"
        statut:
          $ref: "#/components/schemas/StatutAbonnement"
        dateDebut:
          $ref: "#/components/schemas/LocalDate"
        dateFin:
          $ref: "#/components/schemas/LocalDate"
        prixPaye:
          type: number
        methodePaiement:
          type: string
        autoRenouvellement:
          type: boolean
        referencePaiement:
          type: string
        dateDerniereFacture:
          $ref: "#/components/schemas/LocalDate"
        dateProchainPrelevement:
          $ref: "#/components/schemas/LocalDate"
        misesEnRelationUtilisees:
          format: int32
          type: integer
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        notes:
          type: string
    AdaptationClimatique:
      type: object
      properties:
        id:
          format: int64
          type: integer
        nomAdaptation:
          type: string
        codeAdaptation:
          type: string
        typeAdaptation:
          $ref: "#/components/schemas/TypeAdaptation"
        description:
          type: string
        justificationTechnique:
          type: string
        temperatureMinDeclenchement:
          format: int32
          type: integer
        temperatureMaxDeclenchement:
          format: int32
          type: integer
        humiditeMinDeclenchement:
          format: int32
          type: integer
        humiditeMaxDeclenchement:
          format: int32
          type: integer
        pluviometrieMinDeclenchement:
          format: int32
          type: integer
        ventsMaxDeclenchement:
          format: int32
          type: integer
        natureModification:
          $ref: "#/components/schemas/NatureModification"
        modificationComposition:
          type: string
        modificationDimensions:
          type: string
        modificationMiseEnOeuvre:
          type: string
        facteurResistance:
          type: number
        facteurDureeVie:
          type: number
        facteurCout:
          type: number
        facteurTempsMiseEnOeuvre:
          type: number
        additifsNecessaires:
          type: array
          items:
            type: string
        traitementsSpeciaux:
          type: array
          items:
            type: string
        produitsProtection:
          type: string
        saisonApplication:
          type: string
        conditionsMeteoRequises:
          type: string
        delaiCureAdapteJours:
          format: int32
          type: integer
        protectionNecessaireJours:
          format: int32
          type: integer
        coutSupplementaire:
          type: number
        pourcentageSurcout:
          type: number
        disponibiliteLocale:
          type: boolean
        fournisseursSpecialises:
          type: string
        formationSpecifiqueRequise:
          type: boolean
        competencesAdditionnelles:
          type: string
        certificationApplicateur:
          type: boolean
        testsSupplementaires:
          type: string
        frequenceControleAdaptee:
          type: string
        criteresAcceptationModifies:
          type: string
        niveauEfficacite:
          $ref: "#/components/schemas/NiveauEfficacite"
        dureeEfficaciteAnnees:
          format: int32
          type: integer
        maintenanceAdditionnelle:
          type: string
        alternativesPossibles:
          type: string
        recommandationGenerale:
          type: string
        materielBTP:
          $ref: "#/components/schemas/MaterielBTP"
        zoneClimatiqueSpecifique:
          $ref: "#/components/schemas/ZoneClimatique"
        actif:
          type: boolean
        valideeTechniquement:
          type: boolean
        approuveeReglementairement:
          type: boolean
        creePar:
          type: string
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        modifiePar:
          type: string
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        materiel:
          $ref: "#/components/schemas/MaterielBTP"
    AddMemberRequest:
      type: object
      properties:
        employeId:
          $ref: "#/components/schemas/UUID"
    AnnulerLivraisonRequest:
      required:
      - motifAnnulation
      - operateur
      type: object
      properties:
        motifAnnulation:
          type: string
        operateur:
          type: string
    AnnulerReservationRequest:
      required:
      - motifAnnulation
      type: object
      properties:
        motifAnnulation:
          type: string
    AvailabilityCheckRequest:
      type: object
      properties:
        dateDebut:
          $ref: "#/components/schemas/LocalDateTime"
        dateFin:
          $ref: "#/components/schemas/LocalDateTime"
        employeIds:
          type: array
          items:
            format: uuid
            pattern: "[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}"
            type: string
        materielIds:
          type: array
          items:
            format: uuid
            pattern: "[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}"
            type: string
        equipeId:
          $ref: "#/components/schemas/UUID"
    AvancementRequest:
      type: object
      properties:
        pourcentage:
          format: double
          type: number
    BonCommande:
      required:
      - numero
      - fournisseur
      type: object
      properties:
        id:
          $ref: "#/components/schemas/UUID"
        numero:
          maxLength: 50
          pattern: \S
          type: string
        numeroInterne:
          type: string
        objet:
          maxLength: 255
          type: string
        description:
          type: string
        fournisseur:
          $ref: "#/components/schemas/Fournisseur"
        chantier:
          $ref: "#/components/schemas/Chantier"
        demandeur:
          $ref: "#/components/schemas/Employe"
        valideur:
          $ref: "#/components/schemas/Employe"
        statut:
          $ref: "#/components/schemas/StatutBonCommande"
        priorite:
          $ref: "#/components/schemas/PrioriteBonCommande"
        typeCommande:
          $ref: "#/components/schemas/TypeBonCommande"
        dateCommande:
          $ref: "#/components/schemas/LocalDate"
        dateBesoin:
          $ref: "#/components/schemas/LocalDate"
        dateLivraisonPrevue:
          $ref: "#/components/schemas/LocalDate"
        dateLivraisonReelle:
          $ref: "#/components/schemas/LocalDate"
        dateValidation:
          $ref: "#/components/schemas/LocalDate"
        dateEnvoi:
          $ref: "#/components/schemas/LocalDate"
        dateAccuseReception:
          $ref: "#/components/schemas/LocalDate"
        montantHT:
          minimum: 0
          type: number
        montantTVA:
          minimum: 0
          type: number
        montantTTC:
          minimum: 0
          type: number
        remisePourcentage:
          type: number
        remiseMontant:
          type: number
        fraisPort:
          type: number
        autreFrais:
          type: number
        conditionsPaiement:
          $ref: "#/components/schemas/ConditionsPaiement"
        adresseLivraison:
          maxLength: 255
          type: string
        adresseFacturation:
          maxLength: 255
          type: string
        modeLivraison:
          $ref: "#/components/schemas/ModeLivraison"
        instructionsLivraison:
          maxLength: 255
          type: string
        contactFournisseur:
          maxLength: 255
          type: string
        emailContact:
          maxLength: 255
          type: string
        telephoneContact:
          maxLength: 50
          type: string
        referenceFournisseur:
          maxLength: 100
          type: string
        numeroDevis:
          maxLength: 100
          type: string
        referenceMarche:
          maxLength: 100
          type: string
        livraisonPartielleAutorisee:
          type: boolean
        controleReceptionRequis:
          type: boolean
        urgente:
          type: boolean
        confidentielle:
          type: boolean
        factureRecue:
          type: boolean
        dateReceptionFacture:
          $ref: "#/components/schemas/LocalDate"
        dateCloture:
          $ref: "#/components/schemas/LocalDate"
        numeroFacture:
          maxLength: 100
          type: string
        commentaires:
          type: string
        notesInternes:
          type: string
        conditionsParticulieres:
          type: string
        motifAnnulation:
          type: string
        lignes:
          type: array
          items:
            $ref: "#/components/schemas/LigneBonCommande"
        piecesJointes:
          type: string
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        creePar:
          type: string
        modifiePar:
          type: string
        validePar:
          type: string
        envoyePar:
          type: string
        modifiable:
          type: boolean
        enRetard:
          type: boolean
        livree:
          type: boolean
        annulee:
          type: boolean
        nombreArticles:
          format: int32
          type: integer
    BroadcastNotificationRequest:
      required:
      - titre
      - message
      - type
      type: object
      properties:
        titre:
          description: Titre de la notification
          type: string
        message:
          description: Message de la notification
          type: string
        type:
          description: Type de notification
          enum:
          - INFO
          - ALERTE
          - MAINTENANCE
          - CHANTIER
          - SYSTEM
          type: string
        priorite:
          description: Priorité de la notification
          enum:
          - BASSE
          - NORMALE
          - HAUTE
          - CRITIQUE
          type: string
        userIds:
          description: Liste des IDs utilisateurs destinataires (optionnel)
          type: array
          items:
            format: uuid
            pattern: "[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}"
            type: string
        roleTarget:
          description: Rôle cible pour diffusion (optionnel)
          enum:
          - ADMIN
          - CHEF_CHANTIER
          - EMPLOYE
          - CLIENT
          type: string
        lienAction:
          description: Lien vers une action (optionnel)
          type: string
        donnees:
          description: Données supplémentaires au format JSON (optionnel)
          type: string
    Budget:
      required:
      - chantier
      - budgetTotal
      - depenseReelle
      - statut
      type: object
      properties:
        id:
          $ref: "#/components/schemas/UUID"
        chantier:
          $ref: "#/components/schemas/Chantier"
        budgetTotal:
          minimum: 0
          exclusiveMinimum: true
          type: number
        depenseReelle:
          minimum: 0
          type: number
        ecart:
          type: number
        ecartPourcentage:
          type: number
        avancementTravaux:
          maximum: 100
          minimum: 0
          type: number
        statut:
          $ref: "#/components/schemas/StatutBudget"
        tendance:
          $ref: "#/components/schemas/TendanceBudget"
        responsable:
          maxLength: 100
          type: string
        nombreAlertes:
          format: int32
          minimum: 0
          type: integer
        prochainJalon:
          maxLength: 200
          type: string
        dateDerniereMiseAJour:
          $ref: "#/components/schemas/LocalDate"
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        actif:
          type: boolean
    CalculerScoresRequest:
      type: object
      properties:
        poidsCriteres:
          type: object
          additionalProperties:
            format: int32
            type: integer
    CatalogueFournisseur:
      required:
      - fournisseur
      - materiel
      - referenceFournisseur
      - prixUnitaire
      - unitePrix
      type: object
      properties:
        id:
          $ref: "#/components/schemas/UUID"
        fournisseur:
          $ref: "#/components/schemas/Fournisseur"
        materiel:
          $ref: "#/components/schemas/Materiel"
        referenceFournisseur:
          pattern: \S
          type: string
        designationFournisseur:
          type: string
        descriptionTechnique:
          type: string
        marque:
          type: string
        modele:
          type: string
        prixUnitaire:
          minimum: 0
          type: number
        unitePrix:
          $ref: "#/components/schemas/UnitePrix"
        prixMinimalCommande:
          type: number
        quantiteMinimale:
          type: number
        quantiteParPalette:
          type: number
        remiseQuantiteSeuil:
          type: number
        remisePourcentage:
          type: number
        conditionsPaiement:
          type: string
        delaiPaiementJours:
          format: int32
          type: integer
        delaiLivraisonJours:
          format: int32
          type: integer
        zoneLivraison:
          type: string
        fraisLivraison:
          type: number
        livraisonGratuiteSeuil:
          type: number
        transporteur:
          type: string
        stockDisponible:
          type: number
        stockReserve:
          type: number
        derniereMajStock:
          $ref: "#/components/schemas/LocalDateTime"
        disponibleCommande:
          type: boolean
        dateDebutValidite:
          $ref: "#/components/schemas/LocalDate"
        dateFinValidite:
          $ref: "#/components/schemas/LocalDate"
        numeroContrat:
          type: string
        conditionsAnnulation:
          type: string
        certifications:
          type: string
        garantieMois:
          format: int32
          type: integer
        conformiteNormes:
          type: string
        noteQualite:
          type: number
        nombreCommandes:
          format: int32
          type: integer
        derniereCommande:
          $ref: "#/components/schemas/LocalDate"
        fiabiliteLivraison:
          type: number
        contactCommercial:
          type: string
        telephoneCommercial:
          type: string
        emailCommercial:
          type: string
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        creePar:
          type: string
        modifiePar:
          type: string
        actif:
          type: boolean
        quantiteDisponible:
          type: number
        conditionsSpeciales:
          type: string
        valide:
          type: boolean
        infosPrix:
          type: string
        resume:
          type: string
    CategorieMateriel:
      enum:
      - GROS_OEUVRE
      - SECOND_OEUVRE
      - FINITIONS
      - ISOLATION
      - ETANCHEITE
      - EQUIPEMENTS
      - OUTILLAGE
      type: string
    CategoriePhase:
      enum:
      - ADMINISTRATIVE
      - TECHNIQUE
      - LOGISTIQUE
      - CONTROLE
      - SECURITE
      type: string
    CategorieStock:
      enum:
      - MATERIAUX
      - OUTILLAGE
      - EQUIPEMENTS
      - SECURITE
      - FINITION
      type: string
    Chantier:
      required:
      - nom
      - adresse
      - dateDebut
      type: object
      properties:
        persistent:
          type: boolean
        id:
          $ref: "#/components/schemas/UUID"
        nom:
          pattern: \S
          type: string
        code:
          type: string
        description:
          type: string
        adresse:
          pattern: \S
          type: string
        codePostal:
          type: string
        ville:
          type: string
        dateDebut:
          $ref: "#/components/schemas/LocalDate"
        dateDebutPrevue:
          $ref: "#/components/schemas/LocalDate"
        dateDebutReelle:
          $ref: "#/components/schemas/LocalDate"
        dateFinPrevue:
          $ref: "#/components/schemas/LocalDate"
        dateFinReelle:
          $ref: "#/components/schemas/LocalDate"
        statut:
          $ref: "#/components/schemas/StatutChantier"
        montantPrevu:
          minimum: 0
          exclusiveMinimum: true
          type: number
        montantReel:
          type: number
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        actif:
          type: boolean
        typeChantier:
          $ref: "#/components/schemas/TypeChantierBTP"
        client:
          $ref: "#/components/schemas/Client"
        devis:
          type: array
          items:
            $ref: "#/components/schemas/Devis"
        factures:
          type: array
          items:
            $ref: "#/components/schemas/Facture"
        chefChantier:
          $ref: "#/components/schemas/User"
        pourcentageAvancement:
          type: number
        adresseComplete:
          type: string
        termine:
          type: boolean
        enCours:
          type: boolean
        enRetard:
          type: boolean
        montantContrat:
          type: number
        coutReel:
          type: number
    ChantierCreateDTO:
      required:
      - nom
      - adresse
      - dateDebut
      - clientId
      type: object
      properties:
        nom:
          pattern: \S
          type: string
        description:
          type: string
        adresse:
          pattern: \S
          type: string
        codePostal:
          type: string
        ville:
          type: string
        dateDebut:
          $ref: "#/components/schemas/LocalDate"
        dateFinPrevue:
          $ref: "#/components/schemas/LocalDate"
        dateFinReelle:
          $ref: "#/components/schemas/LocalDate"
        statut:
          $ref: "#/components/schemas/StatutChantier"
        montantPrevu:
          format: double
          type: number
        montantReel:
          format: double
          type: number
        actif:
          type: boolean
        clientId:
          $ref: "#/components/schemas/UUID"
    Client:
      required:
      - nom
      - prenom
      type: object
      properties:
        id:
          $ref: "#/components/schemas/UUID"
        nom:
          pattern: \S
          type: string
        prenom:
          pattern: \S
          type: string
        entreprise:
          type: string
        email:
          type: string
        telephone:
          pattern: "^(?:(?:\\+|00)33|0)\\s*[1-9](?:[\\s.-]*\\d{2}){4}$"
          type: string
        adresse:
          type: string
        codePostal:
          type: string
        ville:
          type: string
        numeroTVA:
          type: string
        siret:
          type: string
        type:
          $ref: "#/components/schemas/TypeClient"
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        actif:
          type: boolean
        compteUtilisateur:
          $ref: "#/components/schemas/User"
        nomComplet:
          type: string
        adresseComplete:
          type: string
    ClientCreateDTO:
      required:
      - nom
      - prenom
      type: object
      properties:
        nom:
          pattern: \S
          type: string
        prenom:
          pattern: \S
          type: string
        entreprise:
          type: string
        email:
          type: string
        telephone:
          type: string
        adresse:
          type: string
        codePostal:
          type: string
        ville:
          type: string
        siret:
          type: string
        numeroTVA:
          type: string
        actif:
          type: boolean
    CoefficientsStructure:
      type: object
      properties:
        vent:
          type: number
        seisme:
          type: number
        neige:
          type: number
        temperature:
          type: number
        humidite:
          type: number
    CompetenceMateriel:
      type: object
      properties:
        id:
          format: int64
          type: integer
        nomCompetence:
          type: string
        codeCompetence:
          type: string
        typeCompetence:
          $ref: "#/components/schemas/TypeCompetence"
        description:
          type: string
        domaineApplication:
          type: string
        niveauRequis:
          $ref: "#/components/schemas/NiveauCompetence1"
        experienceMinimaleAnnees:
          format: int32
          type: integer
        certificationRequise:
          type: boolean
        nomCertification:
          type: string
        organismeCertificateur:
          type: string
        formationPrealableRequise:
          type: boolean
        dureeFormationHeures:
          format: int32
          type: integer
        centreFormationRecommande:
          type: string
        coutFormationEstime:
          type: number
        supervisionRequise:
          type: boolean
        niveauSuperviseur:
          type: string
        ratioEncadrement:
          type: string
        specialisations:
          type: string
        techniquesMaitrisees:
          type: string
        outilsMaitrises:
          type: string
        formationSecuriteRequise:
          type: boolean
        habilitationsSpecifiques:
          type: string
        risquesSpecifiques:
          type: string
        disponibiliteLocale:
          type: boolean
        coutHoraireEstime:
          type: number
        coutJournalierEstime:
          type: number
        organismesFormationLocaux:
          type: string
        rendementUnitaire:
          type: number
        uniteRendement:
          type: string
        facteurDifficulte:
          type: number
        materielBTP:
          $ref: "#/components/schemas/MaterielBTP"
        actif:
          type: boolean
        critique:
          type: boolean
        creePar:
          type: string
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        modifiePar:
          type: string
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        materiel:
          $ref: "#/components/schemas/MaterielBTP"
        descriptionComplete:
          type: string
    ConditionMeteo:
      enum:
      - TOUS_TEMPS
      - TEMPS_SEC
      - PAS_DE_VENT_FORT
      - TEMPERATURE_POSITIVE
      - PAS_DE_PLUIE
      - INTERIEUR_UNIQUEMENT
      type: string
    ConditionsPaiement:
      enum:
      - COMPTANT
      - NET_15
      - NET_30
      - NET_45
      - NET_60
      - NET_90
      - FIN_MOIS_15
      - FIN_MOIS_30
      - ECHEANCE_30_60
      - ECHEANCE_30_60_90
      - VIREMENT_AVANT_LIVRAISON
      - CHEQUE_LIVRAISON
      - TRAITE_30
      - TRAITE_60
      - LETTRE_CHANGE_30
      - LETTRE_CHANGE_60
      - CARTE_CREDIT
      - VIREMENT_IMMEDIAT
      - PRELEVEMENT_AUTO
      - PERSONNALISEE
      type: string
    ContrainteConstruction:
      type: object
      properties:
        id:
          format: int64
          type: integer
        type:
          $ref: "#/components/schemas/TypeContrainte"
        nom:
          type: string
        description:
          type: string
        obligatoire:
          type: boolean
        importance:
          $ref: "#/components/schemas/NiveauImportance"
        solution:
          type: string
        justificationTechnique:
          type: string
        coutSupplementaire:
          type: number
        uniteCout:
          type: string
        impactDelaiJours:
          format: int32
          type: integer
        normeReference:
          type: string
        articleReglementaire:
          type: string
        saisonApplicable:
          type: string
        phaseConstruction:
          type: string
        materiauxConcernes:
          type: string
        outilsNecessaires:
          type: string
        competencesSpecifiques:
          type: string
        frequenceControle:
          type: string
        methodeVerification:
          type: string
        zoneClimatique:
          $ref: "#/components/schemas/ZoneClimatique"
        actif:
          type: boolean
        creePar:
          type: string
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        modifiePar:
          type: string
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        libelleComplet:
          type: string
    CreateDisponibiliteRequest:
      required:
      - employeId
      - dateDebut
      - dateFin
      - type
      type: object
      properties:
        employeId:
          description: Identifiant unique de l'employé
          type: string
          allOf:
          - $ref: "#/components/schemas/UUID"
        dateDebut:
          description: Date et heure de début de la disponibilité
          type: string
          allOf:
          - $ref: "#/components/schemas/LocalDateTime"
          example: 2024-03-15T08:00:00
        dateFin:
          description: Date et heure de fin de la disponibilité
          type: string
          allOf:
          - $ref: "#/components/schemas/LocalDateTime"
          example: 2024-03-20T18:00:00
        type:
          description: Type de disponibilité
          enum:
          - CONGE_PAYE
          - CONGE_SANS_SOLDE
          - ARRET_MALADIE
          - FORMATION
          - ABSENCE
          - HORAIRE_REDUIT
          type: string
        motif:
          description: Motif ou raison de la disponibilité
          type: string
          example: Congés annuels
    CreateEquipeRequest:
      type: object
      properties:
        nom:
          type: string
        specialite:
          type: string
        description:
          type: string
        chefEquipeId:
          $ref: "#/components/schemas/UUID"
        membresIds:
          type: array
          items:
            format: uuid
            pattern: "[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}"
            type: string
    CreateEventRequest:
      type: object
      properties:
        titre:
          type: string
        description:
          type: string
        type:
          type: string
        dateDebut:
          $ref: "#/components/schemas/LocalDateTime"
        dateFin:
          $ref: "#/components/schemas/LocalDateTime"
        chantierId:
          $ref: "#/components/schemas/UUID"
        equipeId:
          $ref: "#/components/schemas/UUID"
        employeIds:
          type: array
          items:
            format: uuid
            pattern: "[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}"
            type: string
        materielIds:
          type: array
          items:
            format: uuid
            pattern: "[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}"
            type: string
    CreateFactureRequest:
      type: object
      properties:
        numero:
          type: string
        clientId:
          $ref: "#/components/schemas/UUID"
        chantierId:
          $ref: "#/components/schemas/UUID"
        montantHT:
          type: number
        description:
          type: string
    CreateMaintenanceRequest:
      required:
      - materielId
      - type
      - description
      - datePrevue
      type: object
      properties:
        materielId:
          description: Identifiant unique du matériel
          type: string
          allOf:
          - $ref: "#/components/schemas/UUID"
        type:
          description: Type de maintenance
          enum:
          - PREVENTIVE
          - CORRECTIVE
          - REVISION
          - CONTROLE_TECHNIQUE
          - NETTOYAGE
          type: string
        description:
          description: Description détaillée de la maintenance
          type: string
          example: Révision moteur et changement d'huile
        datePrevue:
          description: Date prévue pour la maintenance
          type: string
          allOf:
          - $ref: "#/components/schemas/LocalDate"
          example: 2024-04-15
        technicien:
          description: Nom du technicien responsable
          type: string
          example: Jean Dupont
        notes:
          description: Notes additionnelles
          type: string
          example: Prévoir pièces de rechange
    CreateNotificationRequest:
      required:
      - titre
      - message
      - type
      - userId
      type: object
      properties:
        titre:
          description: Titre de la notification
          type: string
        message:
          description: Message de la notification
          type: string
        type:
          description: Type de notification
          enum:
          - INFO
          - ALERTE
          - MAINTENANCE
          - CHANTIER
          - SYSTEM
          type: string
        priorite:
          description: Priorité de la notification
          enum:
          - BASSE
          - NORMALE
          - HAUTE
          - CRITIQUE
          type: string
        userId:
          description: ID de l'utilisateur destinataire
          type: string
          allOf:
          - $ref: "#/components/schemas/UUID"
        chantierId:
          description: ID du chantier associé (optionnel)
          type: string
          allOf:
          - $ref: "#/components/schemas/UUID"
        lienAction:
          description: Lien vers une action (optionnel)
          type: string
        donnees:
          description: Données supplémentaires au format JSON (optionnel)
          type: string
    CreatePlanningRequest:
      required:
      - materielId
      - nomPlanning
      - dateDebut
      - dateFin
      - typePlanning
      type: object
      properties:
        materielId:
          $ref: "#/components/schemas/UUID"
        nomPlanning:
          type: string
        descriptionPlanning:
          type: string
        dateDebut:
          $ref: "#/components/schemas/LocalDate"
        dateFin:
          $ref: "#/components/schemas/LocalDate"
        typePlanning:
          $ref: "#/components/schemas/TypePlanning"
        planificateur:
          type: string
    CreateReservationRequest:
      required:
      - materielId
      - chantierId
      - dateDebut
      - dateFin
      - quantite
      type: object
      properties:
        materielId:
          $ref: "#/components/schemas/UUID"
        chantierId:
          $ref: "#/components/schemas/UUID"
        phaseId:
          $ref: "#/components/schemas/UUID"
        dateDebut:
          $ref: "#/components/schemas/LocalDate"
        dateFin:
          $ref: "#/components/schemas/LocalDate"
        quantite:
          type: number
        unite:
          type: string
        demandeur:
          type: string
        lieuLivraison:
          type: string
    CreateUserRequest:
      type: object
      properties:
        email:
          type: string
        password:
          type: string
        nom:
          type: string
        prenom:
          type: string
        role:
          type: string
        status:
          type: string
    CreerLivraisonRequest:
      required:
      - reservationId
      - typeTransport
      - dateLivraisonPrevue
      type: object
      properties:
        reservationId:
          $ref: "#/components/schemas/UUID"
        typeTransport:
          $ref: "#/components/schemas/TypeTransport"
        dateLivraisonPrevue:
          $ref: "#/components/schemas/LocalDate"
        heureLivraisonPrevue:
          $ref: "#/components/schemas/LocalTime"
        transporteur:
          type: string
        planificateur:
          type: string
    DemarrerTransitRequest:
      required:
      - chauffeur
      type: object
      properties:
        chauffeur:
          type: string
        heureDepart:
          $ref: "#/components/schemas/LocalTime"
    Devis:
      required:
      - numero
      - objet
      - dateEmission
      - dateValidite
      type: object
      properties:
        id:
          $ref: "#/components/schemas/UUID"
        numero:
          pattern: \S
          type: string
        objet:
          pattern: \S
          type: string
        description:
          type: string
        dateEmission:
          $ref: "#/components/schemas/LocalDate"
        dateValidite:
          $ref: "#/components/schemas/LocalDate"
        statut:
          $ref: "#/components/schemas/StatutDevis"
        montantHT:
          minimum: 0
          exclusiveMinimum: true
          type: number
        tauxTVA:
          type: number
        montantTVA:
          type: number
        montantTTC:
          type: number
        conditionsPaiement:
          type: string
        delaiExecution:
          format: int32
          type: integer
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        actif:
          type: boolean
        client:
          $ref: "#/components/schemas/Client"
        chantier:
          $ref: "#/components/schemas/Chantier"
        lignes:
          type: array
          items:
            $ref: "#/components/schemas/LigneDevis"
        valide:
          type: boolean
        accepte:
          type: boolean
        refuse:
          type: boolean
    DiffuserMessageForm:
      type: object
      properties:
        sujet:
          type: string
        contenu:
          type: string
        type:
          type: string
        priorite:
          type: string
        expediteurId:
          $ref: "#/components/schemas/UUID"
        destinataireIds:
          type: array
          items:
            format: uuid
            pattern: "[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}"
            type: string
        chantierId:
          $ref: "#/components/schemas/UUID"
        equipeId:
          $ref: "#/components/schemas/UUID"
        documentIds:
          type: array
          items:
            format: uuid
            pattern: "[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}"
            type: string
    DimensionsTechniques:
      type: object
      properties:
        longueur:
          type: number
        largeur:
          type: number
        hauteur:
          type: number
        epaisseur:
          type: number
        diametre:
          type: number
        rayonCourbure:
          type: number
        tolerance:
          type: number
        surfaceUnitaire:
          type: number
        volumeUnitaire:
          type: number
        perimetre:
          type: number
    Disponibilite:
      required:
      - employe
      - dateDebut
      - dateFin
      - type
      type: object
      properties:
        id:
          $ref: "#/components/schemas/UUID"
        employe:
          $ref: "#/components/schemas/Employe"
        dateDebut:
          $ref: "#/components/schemas/LocalDateTime"
        dateFin:
          $ref: "#/components/schemas/LocalDateTime"
        type:
          $ref: "#/components/schemas/TypeDisponibilite"
        motif:
          type: string
        approuvee:
          type: boolean
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        active:
          type: boolean
        dureeEnHeures:
          format: int64
          type: integer
    Document:
      required:
      - nom
      - nomFichier
      - cheminFichier
      - typeMime
      - tailleFichier
      - typeDocument
      type: object
      properties:
        id:
          $ref: "#/components/schemas/UUID"
        nom:
          pattern: \S
          type: string
        description:
          type: string
        nomFichier:
          pattern: \S
          type: string
        cheminFichier:
          pattern: \S
          type: string
        typeMime:
          pattern: \S
          type: string
        tailleFichier:
          format: int64
          type: integer
        typeDocument:
          $ref: "#/components/schemas/TypeDocument"
        chantier:
          $ref: "#/components/schemas/Chantier"
        materiel:
          $ref: "#/components/schemas/Materiel"
        employe:
          $ref: "#/components/schemas/Employe"
        equipe:
          $ref: "#/components/schemas/Equipe"
        client:
          $ref: "#/components/schemas/Client"
        tags:
          type: string
        estPublic:
          type: boolean
        actif:
          type: boolean
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        creePar:
          $ref: "#/components/schemas/User"
        image:
          type: boolean
        pdf:
          type: boolean
        extension:
          type: string
        tailleFormatee:
          type: string
    Employe:
      required:
      - nom
      - prenom
      - poste
      - dateEmbauche
      type: object
      properties:
        id:
          $ref: "#/components/schemas/UUID"
        nom:
          pattern: \S
          type: string
        prenom:
          pattern: \S
          type: string
        email:
          type: string
        telephone:
          pattern: "^(?:(?:\\+|00)33|0)\\s*[1-9](?:[\\s.-]*\\d{2}){4}$"
          type: string
        poste:
          pattern: \S
          type: string
        fonction:
          $ref: "#/components/schemas/FonctionEmploye"
        specialites:
          type: array
          items:
            type: string
        tauxHoraire:
          type: number
        dateEmbauche:
          $ref: "#/components/schemas/LocalDate"
        statut:
          $ref: "#/components/schemas/StatutEmploye"
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        actif:
          type: boolean
        equipe:
          $ref: "#/components/schemas/Equipe"
        disponibilites:
          type: array
          items:
            $ref: "#/components/schemas/Disponibilite"
        competences:
          type: array
          items:
            $ref: "#/components/schemas/EmployeCompetence"
        planningEvents:
          type: array
          items:
            $ref: "#/components/schemas/PlanningEvent"
        nomComplet:
          type: string
    EmployeCompetence:
      required:
      - employe
      - nom
      - niveau
      type: object
      properties:
        id:
          $ref: "#/components/schemas/UUID"
        employe:
          $ref: "#/components/schemas/Employe"
        nom:
          pattern: \S
          type: string
        niveau:
          $ref: "#/components/schemas/NiveauCompetence"
        certifiee:
          type: boolean
        dateObtention:
          $ref: "#/components/schemas/LocalDate"
        dateExpiration:
          $ref: "#/components/schemas/LocalDate"
        description:
          type: string
        expiree:
          type: boolean
    EntrepriseProfile:
      type: object
      properties:
        id:
          $ref: "#/components/schemas/UUID"
        proprietaire:
          $ref: "#/components/schemas/User"
        nomCommercial:
          type: string
        description:
          type: string
        slogan:
          type: string
        specialites:
          type: array
          items:
            type: string
        certifications:
          type: array
          items:
            type: string
        adresseComplete:
          type: string
        codePostal:
          type: string
        ville:
          type: string
        departement:
          type: string
        region:
          type: string
        zonesIntervention:
          type: array
          items:
            type: string
        siteWeb:
          type: string
        emailContact:
          type: string
        telephoneCommercial:
          type: string
        logoUrl:
          type: string
        photosRealisations:
          type: array
          items:
            type: string
        noteGlobale:
          type: number
        nombreAvis:
          format: int32
          type: integer
        nombreProjetsRealises:
          format: int32
          type: integer
        nombreClientsServis:
          format: int32
          type: integer
        visible:
          type: boolean
        certifie:
          type: boolean
        typeAbonnement:
          $ref: "#/components/schemas/TypeAbonnement"
        finAbonnement:
          $ref: "#/components/schemas/LocalDateTime"
        budgetMinProjet:
          type: number
        budgetMaxProjet:
          type: number
        accepteUrgences:
          type: boolean
        accepteWeekends:
          type: boolean
        delaiMoyenIntervention:
          format: int32
          type: integer
        chiffresAffairesAnnuel:
          type: number
        garantiesProposees:
          type: string
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        derniereMiseAJour:
          $ref: "#/components/schemas/LocalDateTime"
        derniereActivite:
          $ref: "#/components/schemas/LocalDateTime"
        abonnementActif:
          type: boolean
        premium:
          type: boolean
        enterprise:
          type: boolean
        scoreVisibilite:
          format: double
          type: number
    EnvoyerMessageForm:
      type: object
      properties:
        sujet:
          type: string
        contenu:
          type: string
        type:
          type: string
        priorite:
          type: string
        expediteurId:
          $ref: "#/components/schemas/UUID"
        destinataireId:
          $ref: "#/components/schemas/UUID"
        chantierId:
          $ref: "#/components/schemas/UUID"
        equipeId:
          $ref: "#/components/schemas/UUID"
        documentIds:
          type: array
          items:
            format: uuid
            pattern: "[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}"
            type: string
    Equipe:
      required:
      - nom
      - chef
      type: object
      properties:
        id:
          $ref: "#/components/schemas/UUID"
        nom:
          pattern: \S
          type: string
        description:
          type: string
        chef:
          $ref: "#/components/schemas/Employe"
        specialite:
          type: string
        statut:
          $ref: "#/components/schemas/StatutEquipe"
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        actif:
          type: boolean
        membres:
          type: array
          items:
            $ref: "#/components/schemas/Employe"
        chantiers:
          type: array
          items:
            $ref: "#/components/schemas/Chantier"
        planningEvents:
          type: array
          items:
            $ref: "#/components/schemas/PlanningEvent"
        specialites:
          type: array
          items:
            type: string
        nombreMembres:
          format: int32
          type: integer
    Facture:
      required:
      - numero
      - objet
      - dateEmission
      - dateEcheance
      type: object
      properties:
        id:
          $ref: "#/components/schemas/UUID"
        numero:
          pattern: \S
          type: string
        objet:
          pattern: \S
          type: string
        description:
          type: string
        dateEmission:
          $ref: "#/components/schemas/LocalDate"
        dateEcheance:
          $ref: "#/components/schemas/LocalDate"
        datePaiement:
          $ref: "#/components/schemas/LocalDate"
        statut:
          $ref: "#/components/schemas/StatutFacture"
        montantHT:
          minimum: 0
          exclusiveMinimum: true
          type: number
        tauxTVA:
          type: number
        montantTVA:
          type: number
        montantTTC:
          type: number
        montantPaye:
          type: number
        conditionsPaiement:
          type: string
        typeFacture:
          $ref: "#/components/schemas/TypeFacture"
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        actif:
          type: boolean
        client:
          $ref: "#/components/schemas/Client"
        chantier:
          $ref: "#/components/schemas/Chantier"
        devis:
          $ref: "#/components/schemas/Devis"
        lignes:
          type: array
          items:
            $ref: "#/components/schemas/LigneFacture"
        payee:
          type: boolean
        echue:
          type: boolean
        montantRestant:
          type: number
    FileUpload:
      type: object
    FinalisationRequest:
      required:
      - quantiteLivree
      - receptionnaire
      type: object
      properties:
        quantiteLivree:
          type: number
        etatMateriel:
          type: string
        observations:
          type: string
        receptionnaire:
          type: string
        conforme:
          type: boolean
        photoLivraison:
          type: string
    FonctionEmploye:
      enum:
      - CHEF_CHANTIER
      - CONDUCTEUR_TRAVAUX
      - CHEF_EQUIPE
      - OUVRIER_QUALIFIE
      - OUVRIER_SPECIALISE
      - MANOEUVRE
      - ELECTRICIEN
      - PLOMBIER
      - MACONM
      - CARRELEUR
      - PEINTRE
      - COUVREUR
      - CHARPENTIER
      - MENUISIER
      - GRUTIER
      - CONDUCTEUR_ENGINS
      - TECHNICIEN
      - INGENIEUR
      - ARCHITECTE
      - GEOMETRE
      - COMPTABLE
      - ADMINISTRATIF
      - COMMERCIAL
      - STAGIAIRE
      - APPRENTI
      - INTERIM
      type: string
    Fournisseur:
      required:
      - nom
      - contact
      - email
      type: object
      properties:
        id:
          $ref: "#/components/schemas/UUID"
        nom:
          maxLength: 255
          pattern: \S
          type: string
        contact:
          maxLength: 255
          pattern: \S
          type: string
        telephone:
          maxLength: 20
          type: string
        email:
          maxLength: 255
          pattern: \S
          type: string
        adresse:
          maxLength: 500
          type: string
        ville:
          maxLength: 100
          type: string
        codePostal:
          maxLength: 10
          type: string
        pays:
          maxLength: 100
          type: string
        siret:
          maxLength: 14
          type: string
        tva:
          maxLength: 20
          type: string
        conditionsPaiement:
          maxLength: 100
          type: string
        delaiLivraison:
          format: int32
          minimum: 0
          type: integer
        note:
          maxLength: 1000
          type: string
        actif:
          type: boolean
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        resume:
          type: string
        complet:
          type: boolean
        scoreCompletude:
          format: int32
          type: integer
        siretValide:
          type: boolean
        tvaValide:
          type: boolean
    FournisseurMateriel:
      type: object
      properties:
        id:
          format: int64
          type: integer
        nomFournisseur:
          type: string
        codeFournisseur:
          type: string
        typeFournisseur:
          type: string
        adresse:
          type: string
        ville:
          type: string
        pays:
          type: string
        telephone:
          type: string
        email:
          type: string
        siteWeb:
          type: string
        contactCommercial:
          type: string
        prixUnitaire:
          type: number
        devise:
          type: string
        uniteVente:
          type: string
        quantiteMinimum:
          type: number
        remiseQuantite:
          type: number
        delaiLivraisonJours:
          format: int32
          type: integer
        coutLivraison:
          type: number
        zoneLivraison:
          type: string
        conditionsPaiement:
          type: string
        garantieJours:
          format: int32
          type: integer
        serviceApresVente:
          type: boolean
        formationTechnique:
          type: boolean
        niveauFiabilite:
          $ref: "#/components/schemas/NiveauFiabilite"
        noteService:
          type: number
        nbCommandesRealisees:
          format: int32
          type: integer
        tauxLivraisonRetard:
          type: number
        tauxDefautsLivraison:
          type: number
        certifications:
          type: array
          items:
            type: string
        agrements:
          type: array
          items:
            type: string
        specialites:
          type: array
          items:
            type: string
        materielBTP:
          $ref: "#/components/schemas/MaterielBTP"
        actif:
          type: boolean
        prefere:
          type: boolean
        exclusif:
          type: boolean
        creePar:
          type: string
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        modifiePar:
          type: string
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        materiel:
          $ref: "#/components/schemas/MaterielBTP"
        identificationComplete:
          type: string
    FrequenceTest:
      enum:
      - CHAQUE_UNITE
      - PAR_LOT
      - ECHANTILLONNAGE
      - PERIODIQUE
      - ALEATOIRE
      - SUR_DEMANDE
      - PREMIERE_LIVRAISON
      type: string
    GenerationPhasesRequest:
      required:
      - chantierId
      - dateDebutChantier
      type: object
      properties:
        chantierId:
          $ref: "#/components/schemas/UUID"
        dateDebutChantier:
          $ref: "#/components/schemas/LocalDate"
        inclureSousPhases:
          type: boolean
    LancerComparaisonRequest:
      required:
      - materielId
      - quantiteDemandee
      type: object
      properties:
        materielId:
          $ref: "#/components/schemas/UUID"
        quantiteDemandee:
          type: number
        uniteDemandee:
          type: string
        dateDebutSouhaitee:
          $ref: "#/components/schemas/LocalDate"
        dateFinSouhaitee:
          $ref: "#/components/schemas/LocalDate"
        lieuLivraison:
          type: string
        evaluateur:
          type: string
    LigneBonCommande:
      required:
      - designation
      type: object
      properties:
        id:
          $ref: "#/components/schemas/UUID"
        bonCommande:
          $ref: "#/components/schemas/BonCommande"
        numeroLigne:
          format: int32
          minimum: 1
          type: integer
        article:
          $ref: "#/components/schemas/Stock"
        referenceArticle:
          maxLength: 100
          type: string
        designation:
          maxLength: 255
          pattern: \S
          type: string
        description:
          type: string
        quantite:
          minimum: 0
          exclusiveMinimum: true
          type: number
        quantiteLivree:
          minimum: 0
          type: number
        quantiteFacturee:
          minimum: 0
          type: number
        uniteMesure:
          $ref: "#/components/schemas/UniteMesure"
        prixUnitaireHT:
          minimum: 0
          type: number
        tauxTVA:
          minimum: 0
          exclusiveMinimum: true
          type: number
        remisePourcentage:
          type: number
        remiseMontant:
          type: number
        montantHT:
          type: number
        montantTVA:
          type: number
        montantTTC:
          type: number
        dateBesoin:
          $ref: "#/components/schemas/LocalDate"
        dateLivraisonPrevue:
          $ref: "#/components/schemas/LocalDate"
        dateLivraisonReelle:
          $ref: "#/components/schemas/LocalDate"
        marque:
          maxLength: 100
          type: string
        modele:
          maxLength: 100
          type: string
        referenceFournisseur:
          maxLength: 100
          type: string
        codeEAN:
          maxLength: 100
          type: string
        poidsUnitaire:
          type: number
        longueur:
          type: number
        largeur:
          type: number
        hauteur:
          type: number
        couleur:
          type: string
        finition:
          type: string
        statutLigne:
          $ref: "#/components/schemas/StatutLigneBonCommande"
        numeroExpedition:
          maxLength: 100
          type: string
        livraisonPartielleAutorisee:
          type: boolean
        articleRemplacementAccepte:
          type: boolean
        commentaires:
          type: string
        notesLivraison:
          type: string
        conditionsParticulieres:
          type: string
        controleQualiteRequis:
          type: boolean
        certificatRequis:
          type: boolean
        typeCertificat:
          maxLength: 255
          type: string
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        quantiteRestanteLivrer:
          type: number
        quantiteRestanteFacturer:
          type: number
        entierementLivree:
          type: boolean
        entierementFacturee:
          type: boolean
        partiellementLivree:
          type: boolean
        poidsTotal:
          type: number
    LigneDevis:
      required:
      - designation
      - quantite
      - unite
      - prixUnitaire
      type: object
      properties:
        id:
          $ref: "#/components/schemas/UUID"
        designation:
          pattern: \S
          type: string
        description:
          type: string
        quantite:
          minimum: 0
          exclusiveMinimum: true
          type: number
        unite:
          pattern: \S
          type: string
        prixUnitaire:
          minimum: 0
          exclusiveMinimum: true
          type: number
        montantLigne:
          type: number
        ordre:
          format: int32
          type: integer
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        devis:
          $ref: "#/components/schemas/Devis"
    LigneFacture:
      required:
      - designation
      - quantite
      - unite
      - prixUnitaire
      type: object
      properties:
        id:
          $ref: "#/components/schemas/UUID"
        designation:
          pattern: \S
          type: string
        description:
          type: string
        quantite:
          minimum: 0
          exclusiveMinimum: true
          type: number
        unite:
          pattern: \S
          type: string
        prixUnitaire:
          minimum: 0
          exclusiveMinimum: true
          type: number
        montantLigne:
          type: number
        ordre:
          format: int32
          type: integer
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        facture:
          $ref: "#/components/schemas/Facture"
    LivrerMaterielRequest:
      type: object
      properties:
        dateLivraison:
          $ref: "#/components/schemas/LocalDate"
        observations:
          type: string
        etatMateriel:
          type: string
    LocalDate:
      format: date
      type: string
      example: 2022-03-10
    LocalDateTime:
      format: date-time
      type: string
      example: 2022-03-10T12:15:50
    LocalTime:
      format: local-time
      type: string
      externalDocs:
        description: As defined by 'partial-time' in RFC3339
        url: https://www.rfc-editor.org/rfc/rfc3339.html#section-5.6
      example: 13:45:30.123456789
    MaintenanceMateriel:
      required:
      - materiel
      - type
      - description
      - datePrevue
      type: object
      properties:
        id:
          $ref: "#/components/schemas/UUID"
        materiel:
          $ref: "#/components/schemas/Materiel"
        type:
          $ref: "#/components/schemas/TypeMaintenance"
        description:
          pattern: \S
          type: string
        datePrevue:
          $ref: "#/components/schemas/LocalDate"
        dateRealisee:
          $ref: "#/components/schemas/LocalDate"
        cout:
          type: number
        statut:
          $ref: "#/components/schemas/StatutMaintenance"
        technicien:
          type: string
        notes:
          type: string
        prochaineMaintenance:
          $ref: "#/components/schemas/LocalDate"
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        enRetard:
          type: boolean
        terminee:
          type: boolean
    MarqueMateriel:
      type: object
      properties:
        id:
          format: int64
          type: integer
        nom:
          type: string
        code:
          type: string
        description:
          type: string
        paysOrigine:
          type: string
        fabricant:
          type: string
        distributeurOfficiel:
          type: string
        siteWeb:
          type: string
        contactTechnique:
          type: string
        niveauQualite:
          $ref: "#/components/schemas/NiveauQualite"
        certifications:
          type: array
          items:
            type: string
        garantieAnnees:
          format: int32
          type: integer
        facteurPrix:
          type: number
        disponibiliteLocale:
          type: boolean
        delaiLivraisonJours:
          format: int32
          type: integer
        zonesDistribution:
          type: array
          items:
            type: string
        noteQualite:
          type: number
        nbEvaluations:
          format: int32
          type: integer
        tauxDefauts:
          type: number
        technologiesSpecifiques:
          type: string
        avantages:
          type: string
        inconvenients:
          type: string
        materielBTP:
          $ref: "#/components/schemas/MaterielBTP"
        actif:
          type: boolean
        recommandee:
          type: boolean
        creePar:
          type: string
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        modifiePar:
          type: string
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        materiel:
          $ref: "#/components/schemas/MaterielBTP"
        nomComplet:
          type: string
    MarquerPreteRequest:
      required:
      - operateur
      type: object
      properties:
        operateur:
          type: string
        observations:
          type: string
    Materiel:
      required:
      - nom
      - type
      type: object
      properties:
        id:
          $ref: "#/components/schemas/UUID"
        nom:
          pattern: \S
          type: string
        marque:
          type: string
        modele:
          type: string
        numeroSerie:
          type: string
        type:
          $ref: "#/components/schemas/TypeMateriel"
        description:
          type: string
        dateAchat:
          $ref: "#/components/schemas/LocalDate"
        valeurAchat:
          type: number
        valeurActuelle:
          type: number
        statut:
          $ref: "#/components/schemas/StatutMateriel"
        localisation:
          type: string
        proprietaire:
          type: string
        coutUtilisation:
          type: number
        quantiteStock:
          type: number
        seuilMinimum:
          type: number
        unite:
          type: string
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        actif:
          type: boolean
        maintenances:
          type: array
          items:
            $ref: "#/components/schemas/MaintenanceMateriel"
        planningEvents:
          type: array
          items:
            $ref: "#/components/schemas/PlanningEvent"
        catalogueEntrees:
          type: array
          items:
            $ref: "#/components/schemas/CatalogueFournisseur"
        reservations:
          type: array
          items:
            $ref: "#/components/schemas/ReservationMateriel"
        designationComplete:
          type: string
        fromFournisseur:
          type: boolean
        propriete:
          $ref: "#/components/schemas/ProprieteMateriel"
        code:
          type: string
        fournisseur:
          $ref: "#/components/schemas/Fournisseur"
        infosPropriete:
          type: string
    MaterielBTP:
      type: object
      properties:
        id:
          format: int64
          type: integer
        code:
          type: string
        nom:
          type: string
        description:
          type: string
        categorie:
          $ref: "#/components/schemas/CategorieMateriel"
        sousCategorie:
          type: string
        dimensions:
          $ref: "#/components/schemas/DimensionsTechniques"
        densite:
          type: number
        resistanceCompression:
          type: number
        resistanceTraction:
          type: number
        resistanceFlexion:
          type: number
        moduleElasticite:
          type: number
        coefficientDilatation:
          type: number
        absorptionEau:
          type: number
        porosite:
          type: number
        conductiviteThermique:
          type: number
        resistanceGel:
          type: boolean
        resistanceIntemperies:
          $ref: "#/components/schemas/NiveauResistance"
        temperatureMin:
          format: int32
          type: integer
        temperatureMax:
          format: int32
          type: integer
        humiditeMax:
          format: int32
          type: integer
        resistanceUV:
          $ref: "#/components/schemas/NiveauResistance"
        resistancePluie:
          $ref: "#/components/schemas/NiveauResistance"
        resistanceVentFort:
          type: boolean
        normePrincipale:
          type: string
        classification:
          type: string
        certificationRequise:
          type: boolean
        marquageCE:
          type: boolean
        conformiteECOWAS:
          type: boolean
        conformiteSADC:
          type: boolean
        uniteBase:
          type: string
        facteurPerte:
          type: number
        facteurSurapprovisionnement:
          type: number
        modeFourniture:
          $ref: "#/components/schemas/ModeFourniture"
        quantiteParUnite:
          type: number
        poidsUnitaire:
          type: number
        formuleCalcul:
          type: string
        parametresCalcul:
          type: string
        tempsUnitaire:
          format: int32
          type: integer
        temperatureOptimaleMin:
          format: int32
          type: integer
        temperatureOptimaleMax:
          format: int32
          type: integer
        frequenceControle:
          type: string
        dureeVieEstimee:
          format: int32
          type: integer
        maintenanceRequise:
          type: boolean
        frequenceMaintenance:
          type: string
        marques:
          type: array
          items:
            $ref: "#/components/schemas/MarqueMateriel"
        fournisseurs:
          type: array
          items:
            $ref: "#/components/schemas/FournisseurMateriel"
        outillagesNecessaires:
          type: array
          items:
            $ref: "#/components/schemas/OutillageMateriel"
        competencesRequises:
          type: array
          items:
            $ref: "#/components/schemas/CompetenceMateriel"
        testsQualite:
          type: array
          items:
            $ref: "#/components/schemas/TestQualiteMateriel"
        adaptationsClimatiques:
          type: array
          items:
            $ref: "#/components/schemas/AdaptationClimatique"
        zonesAdaptees:
          type: array
          items:
            $ref: "#/components/schemas/ZoneClimatique"
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        creePar:
          type: string
        modifiePar:
          type: string
        actif:
          type: boolean
    ModeFourniture:
      enum:
      - VRAC
      - PALETTE
      - SACS
      - PIECES
      - ROULEAUX
      type: string
    ModeLivraison:
      enum:
      - LIVRAISON_CHANTIER
      - LIVRAISON_DEPOT
      - RETRAIT_FOURNISSEUR
      - TRANSPORT_PROPRE
      - MESSAGERIE
      - TRANSPORTEUR_SPECIALISE
      - LIVRAISON_EXPRESS
      - LIVRAISON_PLANIFIEE
      - LIVRAISON_PARTIELLE
      - FRANCO_DOMICILE
      - PORT_DU
      - AUTRE
      type: string
    MomentTest:
      enum:
      - PRODUCTION
      - RECEPTION
      - AVANT_MISE_EN_OEUVRE
      - PENDANT_MISE_EN_OEUVRE
      - APRES_MISE_EN_OEUVRE
      - DURCISSEMENT
      - FINAL
      type: string
    NatureModification:
      enum:
      - COMPOSITION_CHIMIQUE
      - PROPRIETES_PHYSIQUES
      - PROCEDURE_APPLICATION
      - EQUIPEMENT_SPECIALISE
      - PROTECTION_SURFACE
      - TRAITEMENT_PREALABLE
      - CURE_PROLONGEE
      - ENVIRONNEMENT_CONTROLE
      type: string
    NiveauCompetence:
      enum:
      - DEBUTANT
      - INTERMEDIAIRE
      - AVANCE
      - EXPERT
      type: string
    NiveauCompetence1:
      enum:
      - DEBUTANT
      - INITIE
      - MOYEN
      - CONFIRME
      - EXPERT
      - MAITRE
      type: string
    NiveauCriticite:
      enum:
      - CRITIQUE
      - ELEVE
      - MOYEN
      - FAIBLE
      - INFORMATIF
      type: string
    NiveauEfficacite:
      enum:
      - EXCELLENT
      - BON
      - MOYEN
      - LIMITE
      - INSUFFISANT
      type: string
    NiveauFiabilite:
      enum:
      - EXCELLENT
      - BON
      - MOYEN
      - FAIBLE
      type: string
    NiveauImportance:
      enum:
      - CRITIQUE
      - ELEVE
      - MOYEN
      - FAIBLE
      type: string
    NiveauNecessite:
      enum:
      - INDISPENSABLE
      - FORTEMENT_RECOMMANDE
      - RECOMMANDE
      - OPTIONNEL
      - ALTERNATIF
      type: string
    NiveauQualification:
      enum:
      - MANOEUVRE
      - OUVRIER_SPECIALISE
      - OUVRIER_QUALIFIE
      - COMPAGNON
      - CHEF_EQUIPE
      - TECHNICIEN
      - EXPERT
      type: string
    NiveauQualification1:
      enum:
      - MANOEUVRE
      - OUVRIER_SPECIALISE
      - OUVRIER_QUALIFIE
      - COMPAGNON
      - CHEF_EQUIPE
      - TECHNICIEN
      - EXPERT
      type: string
    NiveauQualite:
      enum:
      - PREMIUM
      - SUPERIEUR
      - STANDARD
      - ECONOMIQUE
      type: string
    NiveauResistance:
      enum:
      - EXCELLENT
      - BON
      - MOYEN
      - FAIBLE
      type: string
    Notification:
      required:
      - titre
      - message
      - type
      - user
      type: object
      properties:
        id:
          $ref: "#/components/schemas/UUID"
        titre:
          pattern: \S
          type: string
        message:
          pattern: \S
          type: string
        type:
          $ref: "#/components/schemas/TypeNotification"
        priorite:
          $ref: "#/components/schemas/PrioriteNotification"
        lue:
          type: boolean
        dateLecture:
          $ref: "#/components/schemas/LocalDateTime"
        lienAction:
          type: string
        donnees:
          type: string
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        actif:
          type: boolean
        user:
          $ref: "#/components/schemas/User"
        chantier:
          $ref: "#/components/schemas/Chantier"
        materiel:
          $ref: "#/components/schemas/Materiel"
        maintenance:
          $ref: "#/components/schemas/MaintenanceMateriel"
        creeePar:
          $ref: "#/components/schemas/User"
        typeDescription:
          type: string
        prioriteDescription:
          type: string
    OperateurRequest:
      required:
      - operateur
      type: object
      properties:
        operateur:
          type: string
    OptimiserItinerairesRequest:
      required:
      - date
      type: object
      properties:
        date:
          $ref: "#/components/schemas/LocalDate"
        transporteur:
          type: string
    OutillageMateriel:
      type: object
      properties:
        id:
          format: int64
          type: integer
        nomOutil:
          type: string
        codeOutil:
          type: string
        typeOutil:
          $ref: "#/components/schemas/TypeOutil"
        description:
          type: string
        usageSpecifique:
          type: string
        puissance:
          type: string
        dimensions:
          type: string
        poidsKg:
          type: number
        alimentation:
          type: string
        capacite:
          type: string
        niveauNecessite:
          $ref: "#/components/schemas/NiveauNecessite"
        frequenceUtilisation:
          type: string
        dureeUtilisationParUnite:
          format: int32
          type: integer
        outilAlternatif:
          type: string
        methodeManuellepossible:
          type: boolean
        impactSansOutil:
          type: string
        coutAchatEstime:
          type: number
        coutLocationJournalier:
          type: number
        disponibiliteLocale:
          type: boolean
        fournisseursRecommandes:
          type: string
        formationRequise:
          type: boolean
        epiNecessaires:
          type: string
        niveauDanger:
          type: string
        precautionsUsage:
          type: string
        maintenanceRequise:
          type: boolean
        frequenceMaintenance:
          type: string
        dureeVieEstimeeAnnees:
          format: int32
          type: integer
        materielBTP:
          $ref: "#/components/schemas/MaterielBTP"
        actif:
          type: boolean
        creePar:
          type: string
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        modifiePar:
          type: string
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        materiel:
          $ref: "#/components/schemas/MaterielBTP"
        descriptionComplete:
          type: string
    Ouverture:
      type: object
      properties:
        largeur:
          type: number
        hauteur:
          type: number
    ParametresCalculBetonArme:
      type: object
      properties:
        volume:
          type: number
        classeBeton:
          type: string
        classeExposition:
          type: string
        typeOuvrage:
          type: string
        epaisseur:
          type: number
        zoneClimatique:
          type: string
    ParametresCalculBriques:
      type: object
      properties:
        surface:
          type: number
        epaisseurMur:
          type: number
        codeBrique:
          type: string
        zoneClimatique:
          type: string
        typeAppareillage:
          type: string
        jointHorizontal:
          type: number
        jointVertical:
          type: number
        ouvertures:
          type: array
          items:
            $ref: "#/components/schemas/Ouverture"
    ParametresCalculMortier:
      type: object
      properties:
        volumeMaconnerie:
          type: number
        typeMortier:
          type: string
        zoneClimatique:
          type: string
    PaysZoneClimatique:
      type: object
      properties:
        id:
          format: int64
          type: integer
        codePays:
          type: string
        nomPays:
          type: string
        capitale:
          type: string
        superficieKm2:
          format: int64
          type: integer
        population:
          format: int64
          type: integer
        langueOfficielle:
          type: string
        monnaie:
          type: string
        fuseauHoraire:
          type: string
        pourcentageTerritoire:
          type: number
        regionsConcernees:
          type: string
        normesConstructionNationales:
          type: string
        reglementationsSpecifiques:
          type: string
        organismesControle:
          type: string
        zoneClimatique:
          $ref: "#/components/schemas/ZoneClimatique"
        actif:
          type: boolean
        creePar:
          type: string
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        modifiePar:
          type: string
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        nomComplet:
          type: string
    Phase:
      required:
      - chantier
      - nom
      - typePhase
      - dateDebutPrevue
      - dateFinPrevue
      - statut
      type: object
      properties:
        id:
          $ref: "#/components/schemas/UUID"
        chantier:
          $ref: "#/components/schemas/Chantier"
        phaseParent:
          $ref: "#/components/schemas/Phase"
        sousPhases:
          type: array
          items:
            $ref: "#/components/schemas/Phase"
        nom:
          pattern: \S
          type: string
        code:
          type: string
        description:
          type: string
        objectifs:
          type: string
        typePhase:
          $ref: "#/components/schemas/TypePhase"
        categorie:
          $ref: "#/components/schemas/CategoriePhase"
        ordreExecution:
          format: int32
          type: integer
        niveauHierarchique:
          format: int32
          type: integer
        dateDebutPrevue:
          $ref: "#/components/schemas/LocalDate"
        dateFinPrevue:
          $ref: "#/components/schemas/LocalDate"
        dateDebutReelle:
          $ref: "#/components/schemas/LocalDate"
        dateFinReelle:
          $ref: "#/components/schemas/LocalDate"
        dureePrevueJours:
          format: int32
          type: integer
        dureeReelleJours:
          format: int32
          type: integer
        statut:
          $ref: "#/components/schemas/StatutPhase"
        pourcentageAvancement:
          type: number
        jalonsCritiques:
          type: string
        budgetPrevisionnel:
          type: number
        coutReel:
          type: number
        coutMaterielPrevu:
          type: number
        coutMaterielReel:
          type: number
        coutMainOeuvrePrevu:
          type: number
        coutMainOeuvreReel:
          type: number
        priorite:
          $ref: "#/components/schemas/PrioritePhase"
        cheminCritique:
          type: boolean
        margeLibreJours:
          format: int32
          type: integer
        margeTotaleJours:
          format: int32
          type: integer
        responsablePhase:
          type: string
        equipeAssignee:
          type: string
        entrepriseSousTraitante:
          type: string
        conditionsMeteo:
          type: string
        prerequis:
          type: string
        livrables:
          type: string
        criteresAcceptation:
          type: string
        risquesIdentifies:
          type: string
        contraintesTechniques:
          type: string
        mesuresSecurite:
          type: string
        indicateursPerformance:
          type: string
        pointsControle:
          type: string
        derniereEvaluation:
          $ref: "#/components/schemas/LocalDate"
        prochaineEvaluation:
          $ref: "#/components/schemas/LocalDate"
        commentaires:
          type: string
        problemesRencontres:
          type: string
        actionsCorrectives:
          type: string
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        creePar:
          type: string
        modifiePar:
          type: string
        actif:
          type: boolean
        resume:
          type: string
    PhaseCreateRequest:
      type: object
      properties:
        nom:
          type: string
        description:
          type: string
        chantierId:
          type: string
        dateDebutPrevue:
          type: string
        dateFinPrevue:
          type: string
        ordreExecution:
          format: int32
          type: integer
        budgetPrevu:
          format: double
          type: number
        critique:
          type: boolean
        responsableId:
          type: string
        phaseParentId:
          type: string
    PhaseTemplate:
      required:
      - nom
      - ordreExecution
      - dureePrevueJours
      type: object
      properties:
        id:
          $ref: "#/components/schemas/UUID"
        nom:
          maxLength: 255
          pattern: \S
          type: string
        description:
          maxLength: 1000
          type: string
        typeChantier:
          $ref: "#/components/schemas/TypeChantierBTP"
        ordreExecution:
          format: int32
          minimum: 1
          type: integer
        dureePrevueJours:
          format: int32
          minimum: 1
          type: integer
        dureeEstimeeHeures:
          format: int32
          type: integer
        critique:
          type: boolean
        bloquante:
          type: boolean
        priorite:
          $ref: "#/components/schemas/PrioritePhase1"
        prerequisTemplates:
          uniqueItems: true
          type: array
          items:
            format: uuid
            pattern: "[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}"
            type: string
        materielsTypes:
          type: array
          items:
            type: string
        competencesRequises:
          type: array
          items:
            type: string
        controlesQualite:
          type: array
          items:
            type: string
        conditionsMeteoRequises:
          type: string
        risquesIdentifies:
          type: string
        mesuresSecurite:
          type: string
        livrablesAttendus:
          type: string
        specificationsTechniques:
          type: string
        reglementationsApplicables:
          type: string
        sousPhases:
          type: array
          items:
            $ref: "#/components/schemas/SousPhaseTemplate"
        actif:
          type: boolean
        version:
          format: int32
          type: integer
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        creePar:
          type: string
        modifiePar:
          type: string
        nombreSousPhases:
          format: int32
          type: integer
    PlanningEvent:
      required:
      - titre
      - dateDebut
      - dateFin
      - type
      type: object
      properties:
        id:
          $ref: "#/components/schemas/UUID"
        titre:
          pattern: \S
          type: string
        description:
          type: string
        dateDebut:
          $ref: "#/components/schemas/LocalDateTime"
        dateFin:
          $ref: "#/components/schemas/LocalDateTime"
        type:
          $ref: "#/components/schemas/TypePlanningEvent"
        statut:
          $ref: "#/components/schemas/StatutPlanningEvent"
        priorite:
          $ref: "#/components/schemas/PrioritePlanningEvent"
        notes:
          type: string
        couleur:
          type: string
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        actif:
          type: boolean
        chantier:
          $ref: "#/components/schemas/Chantier"
        equipe:
          $ref: "#/components/schemas/Equipe"
        employes:
          type: array
          items:
            $ref: "#/components/schemas/Employe"
        materiels:
          type: array
          items:
            $ref: "#/components/schemas/Materiel"
        rappels:
          type: array
          items:
            $ref: "#/components/schemas/RappelPlanningEvent"
        enCours:
          type: boolean
        termine:
          type: boolean
        enRetard:
          type: boolean
        dureeEnHeures:
          format: int64
          type: integer
    PlanningMateriel:
      required:
      - materiel
      - nomPlanning
      - dateDebut
      - dateFin
      - typePlanning
      - statutPlanning
      type: object
      properties:
        id:
          $ref: "#/components/schemas/UUID"
        materiel:
          $ref: "#/components/schemas/Materiel"
        nomPlanning:
          pattern: \S
          type: string
        descriptionPlanning:
          type: string
        dateDebut:
          $ref: "#/components/schemas/LocalDate"
        dateFin:
          $ref: "#/components/schemas/LocalDate"
        typePlanning:
          $ref: "#/components/schemas/TypePlanning"
        statutPlanning:
          $ref: "#/components/schemas/StatutPlanning"
        versionPlanning:
          format: int32
          type: integer
        planningParentId:
          $ref: "#/components/schemas/UUID"
        planificateur:
          type: string
        valideur:
          type: string
        dateValidation:
          $ref: "#/components/schemas/LocalDateTime"
        commentairesValidation:
          type: string
        conflitsDetectes:
          type: boolean
        nombreConflits:
          format: int32
          type: integer
        derniereVerificationConflits:
          $ref: "#/components/schemas/LocalDateTime"
        resolutionConflitsAuto:
          type: boolean
        tauxUtilisationPrevu:
          format: double
          type: number
        scoreOptimisation:
          format: double
          type: number
        optimiseAutomatiquement:
          type: boolean
        derniereOptimisation:
          $ref: "#/components/schemas/LocalDateTime"
        notificationsActivees:
          type: boolean
        alerteConflits:
          type: boolean
        alerteSurcharge:
          type: boolean
        seuilAlerteUtilisation:
          format: double
          type: number
        couleurPlanning:
          type: string
        vueParDefaut:
          $ref: "#/components/schemas/VuePlanning"
        granulariteAffichage:
          type: string
        optionsAffichage:
          type: string
        reglesPlanification:
          type: string
        reservations:
          type: array
          items:
            $ref: "#/components/schemas/ReservationMateriel"
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        creePar:
          type: string
        modifiePar:
          type: string
        actif:
          type: boolean
        dureePlanningJours:
          format: int64
          type: integer
        couleurAffichage:
          type: string
        iconeTypePlanning:
          type: string
        pourcentageAvancement:
          format: double
          type: number
        resume:
          type: string
    PositionGPSRequest:
      required:
      - latitude
      - longitude
      type: object
      properties:
        latitude:
          type: number
        longitude:
          type: number
        vitesseKmh:
          format: int32
          type: integer
    PrioriteBonCommande:
      enum:
      - BASSE
      - NORMALE
      - HAUTE
      - URGENTE
      - CRITIQUE
      type: string
    PrioriteNotification:
      enum:
      - BASSE
      - NORMALE
      - HAUTE
      - CRITIQUE
      type: string
    PrioritePhase:
      enum:
      - BASSE
      - NORMALE
      - HAUTE
      - CRITIQUE
      type: string
    PrioritePhase1:
      enum:
      - TRES_BASSE
      - BASSE
      - NORMALE
      - HAUTE
      - CRITIQUE
      type: string
    PrioritePlanningEvent:
      enum:
      - BASSE
      - NORMALE
      - HAUTE
      - CRITIQUE
      type: string
    PrioriteReservation:
      enum:
      - BASSE
      - NORMALE
      - HAUTE
      - URGENCE
      - URGENTE
      - CRITIQUE
      type: string
    ProprieteMateriel:
      enum:
      - INTERNE
      - LOUE
      - SOUS_TRAITE
      type: string
    RappelPlanningEvent:
      required:
      - planningEvent
      - delai
      - type
      type: object
      properties:
        id:
          $ref: "#/components/schemas/UUID"
        planningEvent:
          $ref: "#/components/schemas/PlanningEvent"
        delai:
          format: int32
          type: integer
        type:
          $ref: "#/components/schemas/TypeRappel"
        actif:
          type: boolean
        delaiFormate:
          type: string
    RefuserReservationRequest:
      required:
      - valideur
      - motifRefus
      type: object
      properties:
        valideur:
          type: string
        motifRefus:
          type: string
    RejectUserRequest:
      type: object
      properties:
        reason:
          type: string
    RejetDisponibiliteRequest:
      required:
      - raisonRejet
      type: object
      properties:
        raisonRejet:
          description: Raison du rejet de la demande
          type: string
    RepondreMessageForm:
      type: object
      properties:
        contenu:
          type: string
        expediteurId:
          $ref: "#/components/schemas/UUID"
        priorite:
          type: string
        documentIds:
          type: array
          items:
            format: uuid
            pattern: "[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}"
            type: string
    ReservationMateriel:
      required:
      - materiel
      - chantier
      - dateDebut
      - dateFin
      - quantite
      - statut
      type: object
      properties:
        id:
          $ref: "#/components/schemas/UUID"
        materiel:
          $ref: "#/components/schemas/Materiel"
        chantier:
          $ref: "#/components/schemas/Chantier"
        phase:
          $ref: "#/components/schemas/Phase"
        planningMateriel:
          $ref: "#/components/schemas/PlanningMateriel"
        dateDebut:
          $ref: "#/components/schemas/LocalDate"
        dateFin:
          $ref: "#/components/schemas/LocalDate"
        heureDebut:
          format: int32
          type: integer
        heureFin:
          format: int32
          type: integer
        quantite:
          minimum: 0.001
          type: number
        unite:
          type: string
        prixUnitairePrevisionnel:
          type: number
        prixTotalPrevisionnel:
          type: number
        prixUnitaireReel:
          type: number
        prixTotalReel:
          type: number
        statut:
          $ref: "#/components/schemas/StatutReservationMateriel"
        priorite:
          $ref: "#/components/schemas/PrioriteReservation"
        referenceReservation:
          type: string
        lieuLivraison:
          type: string
        instructionsLivraison:
          type: string
        responsableReception:
          type: string
        telephoneContact:
          type: string
        dateLivraisonPrevue:
          $ref: "#/components/schemas/LocalDate"
        dateLivraisonReelle:
          $ref: "#/components/schemas/LocalDate"
        dateRetourPrevue:
          $ref: "#/components/schemas/LocalDate"
        dateRetourReelle:
          $ref: "#/components/schemas/LocalDate"
        observationsLivraison:
          type: string
        observationsRetour:
          type: string
        etatMaterielLivraison:
          type: string
        etatMaterielRetour:
          type: string
        kilometrageDebut:
          format: int32
          type: integer
        kilometrageFin:
          format: int32
          type: integer
        demandeur:
          type: string
        valideur:
          type: string
        dateValidation:
          $ref: "#/components/schemas/LocalDateTime"
        motifRefus:
          type: string
        numeroFactureFournisseur:
          type: string
        dateFactureFournisseur:
          $ref: "#/components/schemas/LocalDate"
        factureTraitee:
          type: boolean
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        creePar:
          type: string
        modifiePar:
          type: string
        actif:
          type: boolean
        dureeReservationJours:
          format: int64
          type: integer
        ecartPrix:
          type: number
        resume:
          type: string
    RetarderLivraisonRequest:
      required:
      - nouvelleDatePrevue
      - motif
      - operateur
      type: object
      properties:
        nouvelleDatePrevue:
          $ref: "#/components/schemas/LocalDate"
        nouvelleHeurePrevue:
          $ref: "#/components/schemas/LocalTime"
        motif:
          type: string
        operateur:
          type: string
    RetournerMaterielRequest:
      type: object
      properties:
        dateRetour:
          $ref: "#/components/schemas/LocalDate"
        observations:
          type: string
        etatMateriel:
          type: string
        prixReel:
          type: number
    RevisionPlanningRequest:
      required:
      - motif
      type: object
      properties:
        motif:
          type: string
    SaisonClimatique:
      type: object
      properties:
        id:
          format: int64
          type: integer
        nom:
          type: string
        moisDebut:
          format: int32
          type: integer
        moisFin:
          format: int32
          type: integer
        temperatureMoyenne:
          type: number
        pluviometrieMoyenne:
          format: int32
          type: integer
        humiditeRelative:
          format: int32
          type: integer
        ventsDominants:
          type: string
        forceVentsMax:
          format: int32
          type: integer
        caracteristiques:
          type: array
          items:
            type: string
        travauxRecommandes:
          type: string
        travauxDeconseilles:
          type: string
        materiauxOptimaux:
          type: string
        zoneClimatique:
          $ref: "#/components/schemas/ZoneClimatique"
        actif:
          type: boolean
        creePar:
          type: string
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        modifiePar:
          type: string
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        dureeEnMois:
          format: int32
          type: integer
    SignalerArriveeRequest:
      required:
      - chauffeur
      type: object
      properties:
        chauffeur:
          type: string
        heureArrivee:
          $ref: "#/components/schemas/LocalTime"
        latitude:
          type: number
        longitude:
          type: number
    SignalerIncidentRequest:
      required:
      - typeIncident
      - description
      - declarant
      type: object
      properties:
        typeIncident:
          type: string
        description:
          type: string
        impact:
          type: string
        actionsCorrectives:
          type: string
        declarant:
          type: string
    SousCategorieStock:
      enum:
      - CIMENT_BETON
      - BRIQUES_PARPAINGS
      - ISOLATION
      - CARRELAGE_FAIENCE
      - PEINTURE_ENDUITS
      - BOIS_CHARPENTE
      - COUVERTURE_ETANCHEITE
      - CLOISONS_PLAQUES
      - SOLS_REVETEMENTS
      - OUTILS_MAIN
      - OUTILS_ELECTRIQUES
      - OUTILS_PNEUMATIQUES
      - ECHAFAUDAGES
      - COFFRAGES
      - LEVAGE_MANUTENTION
      - VIS_BOULONS
      - CHEVILLES_FIXATIONS
      - SERRURERIE
      - ACCESSOIRES_TOITURE
      - PROFILES_METALLIQUES
      - CASQUES_PROTECTIONS
      - VETEMENTS_TRAVAIL
      - CHAUSSURES_SECURITE
      - SIGNALISATION
      - PROTECTION_COLLECTIVE
      - ELECTRICITE
      - PLOMBERIE
      - CHAUFFAGE
      - VENTILATION
      - CLIMATISATION
      - DOMOTIQUE
      - COLLES_MASTICS
      - ABRASIFS
      - LUBRIFIANTS
      - PRODUITS_ENTRETIEN
      - EMBALLAGES
      - VEHICULES_UTILITAIRES
      - ENGINS_TERRASSEMENT
      - GRUES_LEVAGE
      - COMPACTEURS
      - GENERATEURS
      - PAPETERIE
      - INFORMATIQUE
      - MOBILIER_BUREAU
      - CLASSEMENT
      - PRODUITS_TRAITEMENT
      - SOLVANTS
      - ADDITIFS
      - PRODUITS_DANGEREUX
      - PIECES_VEHICULES
      - PIECES_ENGINS
      - PIECES_OUTILLAGE
      - PIECES_EQUIPEMENTS
      - INSTRUMENTS_MESURE
      - APPAREILS_CONTROLE
      - MATERIELS_TOPOGRAPHIE
      - MOBILIER_CHANTIER
      - MOBILIER_VESTIAIRE
      - MOBILIER_REFECTOIRE
      - AUTRE
      type: string
    SousPhaseTemplate:
      required:
      - nom
      - ordreExecution
      - dureePrevueJours
      type: object
      properties:
        id:
          $ref: "#/components/schemas/UUID"
        nom:
          maxLength: 255
          pattern: \S
          type: string
        description:
          maxLength: 1000
          type: string
        phaseParent:
          $ref: "#/components/schemas/PhaseTemplate"
        ordreExecution:
          format: int32
          minimum: 1
          type: integer
        dureePrevueJours:
          format: int32
          minimum: 1
          type: integer
        dureeEstimeeHeures:
          format: int32
          type: integer
        critique:
          type: boolean
        priorite:
          $ref: "#/components/schemas/PrioritePhase1"
        materielsTypes:
          type: array
          items:
            type: string
        competencesRequises:
          type: array
          items:
            type: string
        outilsNecessaires:
          type: array
          items:
            type: string
        instructionsExecution:
          type: string
        pointsControle:
          type: string
        criteresValidation:
          type: string
        precautionsSecurite:
          type: string
        conditionsExecution:
          type: string
        tempsPreparationMinutes:
          format: int32
          type: integer
        tempsFinitionMinutes:
          format: int32
          type: integer
        nombreOperateursRequis:
          format: int32
          type: integer
        niveauQualification:
          $ref: "#/components/schemas/NiveauQualification"
        taches:
          type: array
          items:
            $ref: "#/components/schemas/TacheTemplate"
        actif:
          type: boolean
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        creePar:
          type: string
        modifiePar:
          type: string
        dureeExecutionTotaleMinutes:
          format: int32
          type: integer
        nombreTaches:
          format: int32
          type: integer
    StatutAbonnement:
      enum:
      - ACTIF
      - EXPIRE
      - ANNULE
      - SUSPENDU
      - EN_ATTENTE_PAIEMENT
      - ESSAI
      type: string
    StatutBonCommande:
      enum:
      - BROUILLON
      - EN_ATTENTE_VALIDATION
      - VALIDEE
      - ENVOYEE
      - ACCUSEE_RECEPTION
      - EN_PREPARATION
      - EXPEDIEE
      - PARTIELLEMENT_LIVREE
      - LIVREE
      - FACTUREE
      - PAYEE
      - ANNULEE
      - REFUSEE
      - EN_LITIGE
      - CLOTUREE
      type: string
    StatutBudget:
      enum:
      - CONFORME
      - ALERTE
      - DEPASSEMENT
      - CRITIQUE
      type: string
    StatutChantier:
      enum:
      - PLANIFIE
      - EN_COURS
      - TERMINE
      - ANNULE
      - SUSPENDU
      type: string
    StatutDevis:
      enum:
      - BROUILLON
      - ENVOYE
      - ACCEPTE
      - REFUSE
      - EXPIRE
      type: string
    StatutEmploye:
      enum:
      - ACTIF
      - INACTIF
      - CONGE
      - ARRET_MALADIE
      - FORMATION
      - SUSPENDU
      type: string
    StatutEquipe:
      enum:
      - ACTIVE
      - INACTIVE
      - EN_FORMATION
      - DISPONIBLE
      - OCCUPEE
      type: string
    StatutFacture:
      enum:
      - BROUILLON
      - ENVOYEE
      - PAYEE
      - PARTIELLEMENT_PAYEE
      - ECHUE
      - ANNULEE
      type: string
    StatutLigneBonCommande:
      enum:
      - EN_ATTENTE
      - CONFIRMEE
      - EN_PREPARATION
      - EXPEDIEE
      - PARTIELLEMENT_LIVREE
      - LIVREE
      - FACTUREE
      - ANNULEE
      - REFUSEE
      - REMPLACEE
      - EN_LITIGE
      - CLOTUREE
      type: string
    StatutMaintenance:
      enum:
      - PLANIFIEE
      - EN_COURS
      - TERMINEE
      - REPORTEE
      - ANNULEE
      type: string
    StatutMateriel:
      enum:
      - DISPONIBLE
      - UTILISE
      - MAINTENANCE
      - HORS_SERVICE
      - RESERVE
      - EN_REPARATION
      type: string
    StatutPhase:
      enum:
      - PLANIFIEE
      - EN_ATTENTE
      - EN_COURS
      - SUSPENDUE
      - TERMINEE
      - ANNULEE
      type: string
    StatutPlanning:
      enum:
      - BROUILLON
      - EN_REVISION
      - VALIDE
      - ARCHIVE
      - SUSPENDU
      type: string
    StatutPlanningEvent:
      enum:
      - PLANIFIE
      - CONFIRME
      - EN_COURS
      - TERMINE
      - ANNULE
      - REPORTE
      type: string
    StatutReservationMateriel:
      enum:
      - PLANIFIEE
      - VALIDEE
      - EN_COURS
      - TERMINEE
      - REFUSEE
      - ANNULEE
      type: string
    StatutStock:
      enum:
      - ACTIF
      - INACTIF
      - OBSOLETE
      - SUPPRIME
      - EN_COMMANDE
      - EN_TRANSIT
      - EN_CONTROLE
      - QUARANTAINE
      - DEFECTUEUX
      - PERDU
      - RESERVE
      - EN_REPARATION
      type: string
    Stock:
      required:
      - reference
      - designation
      type: object
      properties:
        id:
          $ref: "#/components/schemas/UUID"
        reference:
          maxLength: 100
          pattern: \S
          type: string
        designation:
          maxLength: 255
          pattern: \S
          type: string
        description:
          type: string
        categorie:
          $ref: "#/components/schemas/CategorieStock"
        sousCategorie:
          $ref: "#/components/schemas/SousCategorieStock"
        uniteMesure:
          $ref: "#/components/schemas/UniteMesure"
        quantiteStock:
          minimum: 0
          type: number
        quantiteMinimum:
          minimum: 0
          type: number
        quantiteMaximum:
          minimum: 0
          type: number
        quantiteSecurite:
          minimum: 0
          type: number
        quantiteReservee:
          minimum: 0
          type: number
        quantiteEnCommande:
          minimum: 0
          type: number
        prixUnitaireHT:
          minimum: 0
          type: number
        coutMoyenPondere:
          minimum: 0
          type: number
        coutDerniereEntree:
          minimum: 0
          type: number
        tauxTVA:
          minimum: 0
          exclusiveMinimum: true
          type: number
        emplacementStockage:
          maxLength: 100
          type: string
        codeZone:
          maxLength: 50
          type: string
        codeAllee:
          maxLength: 50
          type: string
        codeEtagere:
          maxLength: 50
          type: string
        fournisseurPrincipal:
          $ref: "#/components/schemas/Fournisseur"
        chantier:
          $ref: "#/components/schemas/Chantier"
        marque:
          maxLength: 100
          type: string
        modele:
          maxLength: 100
          type: string
        referenceFournisseur:
          maxLength: 50
          type: string
        codeBarre:
          maxLength: 50
          type: string
        codeEAN:
          maxLength: 50
          type: string
        poidsUnitaire:
          type: number
        longueur:
          type: number
        largeur:
          type: number
        hauteur:
          type: number
        volume:
          type: number
        dateDerniereEntree:
          $ref: "#/components/schemas/LocalDateTime"
        dateDerniereSortie:
          $ref: "#/components/schemas/LocalDateTime"
        datePeremption:
          $ref: "#/components/schemas/LocalDateTime"
        dateDerniereInventaire:
          $ref: "#/components/schemas/LocalDateTime"
        statut:
          $ref: "#/components/schemas/StatutStock"
        gestionParLot:
          type: boolean
        traçabiliteRequise:
          type: boolean
        articlePerissable:
          type: boolean
        controleQualiteRequis:
          type: boolean
        articleDangereux:
          type: boolean
        classeDanger:
          maxLength: 100
          type: string
        commentaires:
          type: string
        notesStockage:
          type: string
        conditionsStockage:
          type: string
        temperatureStockageMin:
          format: int32
          type: integer
        temperatureStockageMax:
          format: int32
          type: integer
        humiditeMax:
          format: int32
          type: integer
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        creePar:
          type: string
        modifiePar:
          type: string
        quantiteDisponible:
          type: number
        enRupture:
          type: boolean
        sousQuantiteMinimum:
          type: boolean
        sousQuantiteSecurite:
          type: boolean
        perime:
          type: boolean
        valeurStock:
          type: number
        emplacementComplet:
          type: string
    SuspendrePhaseRequest:
      type: object
      properties:
        motif:
          type: string
    TacheTemplate:
      required:
      - nom
      - ordreExecution
      type: object
      properties:
        id:
          $ref: "#/components/schemas/UUID"
        nom:
          maxLength: 255
          pattern: \S
          type: string
        description:
          maxLength: 1000
          type: string
        sousPhaseParent:
          $ref: "#/components/schemas/SousPhaseTemplate"
        ordreExecution:
          format: int32
          minimum: 1
          type: integer
        dureeEstimeeMinutes:
          format: int32
          type: integer
        critique:
          type: boolean
        bloquante:
          type: boolean
        priorite:
          $ref: "#/components/schemas/PrioritePhase1"
        niveauQualification:
          $ref: "#/components/schemas/NiveauQualification1"
        nombreOperateursRequis:
          format: int32
          type: integer
        outilsRequis:
          type: array
          items:
            type: string
        materiauxRequis:
          type: array
          items:
            type: string
        instructionsDetaillees:
          type: string
        pointsControleQualite:
          type: string
        criteresValidation:
          type: string
        precautionsSecurite:
          type: string
        conditionsMeteo:
          $ref: "#/components/schemas/ConditionMeteo"
        actif:
          type: boolean
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        creePar:
          type: string
        modifiePar:
          type: string
        weatherDependent:
          type: boolean
        dureeEstimeeHeures:
          format: double
          type: number
    TendanceBudget:
      enum:
      - STABLE
      - AMELIORATION
      - DETERIORATION
      type: string
    TerminerMaintenanceRequest:
      type: object
      properties:
        dateRealisee:
          description: Date de réalisation effective
          type: string
          allOf:
          - $ref: "#/components/schemas/LocalDate"
        cout:
          description: Coût final de la maintenance
          type: number
          example: 175.25
        notes:
          description: Notes finales sur la maintenance
          type: string
    TestQualiteMateriel:
      type: object
      properties:
        id:
          format: int64
          type: integer
        nomTest:
          type: string
        codeTest:
          type: string
        typeTest:
          $ref: "#/components/schemas/TypeTest"
        description:
          type: string
        objectifTest:
          type: string
        normeReference:
          type: string
        methodeTest:
          type: string
        equipementNecessaire:
          type: string
        personnelQualifieRequis:
          type: boolean
        dureeTestMinutes:
          format: int32
          type: integer
        frequenceTest:
          $ref: "#/components/schemas/FrequenceTest"
        tailleEchantillon:
          format: int32
          type: integer
        methodeEchantillonnage:
          type: string
        nombreEprouettes:
          format: int32
          type: integer
        momentTest:
          $ref: "#/components/schemas/MomentTest"
        conditionsEnvironnementales:
          type: string
        temperatureTestCelsius:
          format: int32
          type: integer
        humiditeTestPourcentage:
          format: int32
          type: integer
        valeurMinAcceptee:
          type: number
        valeurMaxAcceptee:
          type: number
        valeurCible:
          type: number
        tolerance:
          type: number
        uniteMesure:
          type: string
        actionNonConformite:
          type: string
        possibiliteRetouche:
          type: boolean
        coutTestEstime:
          type: number
        niveauCriticite:
          $ref: "#/components/schemas/NiveauCriticite"
        obligatoireCertification:
          type: boolean
        impactSecurite:
          type: boolean
        documentResultatRequis:
          type: boolean
        conservationEchantillonJours:
          format: int32
          type: integer
        rapportDetailleRequis:
          type: boolean
        laboratoiresAgrees:
          type: string
        organismeControleRecommande:
          type: string
        peutEtreRealiseChantier:
          type: boolean
        materielBTP:
          $ref: "#/components/schemas/MaterielBTP"
        actif:
          type: boolean
        creePar:
          type: string
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        modifiePar:
          type: string
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        materiel:
          $ref: "#/components/schemas/MaterielBTP"
        descriptionComplete:
          type: string
    TypeAbonnement:
      enum:
      - GRATUIT
      - PREMIUM
      - ENTERPRISE
      type: string
    TypeAdaptation:
      enum:
      - FORMULATION
      - PROTECTION
      - MISE_EN_OEUVRE
      - DIMENSIONNEL
      - TEMPOREL
      - PREVENTIF
      - CURATIF
      - RENFORCEMENT
      - SUBSTITUTION
      type: string
    TypeBonCommande:
      enum:
      - ACHAT
      - LOCATION
      - SOUS_TRAITANCE
      - MAINTENANCE
      - TRAVAUX
      - PRESTATIONS
      - FOURNITURES
      - CARBURANT
      - TRANSPORT
      - ETUDES
      - CONTROLES
      - FORMATIONS
      - ASSURANCES
      - AUTRE
      type: string
    TypeChantier:
      required:
      - code
      - nom
      - categorie
      type: object
      properties:
        persistent:
          type: boolean
        id:
          $ref: "#/components/schemas/UUID"
        code:
          pattern: \S
          type: string
        nom:
          pattern: \S
          type: string
        description:
          type: string
        categorie:
          pattern: \S
          type: string
        dureeMoyenneJours:
          format: int32
          type: integer
        coutMoyenM2:
          type: number
        surfaceMinM2:
          format: int32
          type: integer
        surfaceMaxM2:
          format: int32
          type: integer
        actif:
          type: boolean
        ordreAffichage:
          format: int32
          type: integer
        icone:
          type: string
        couleur:
          type: string
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        creePar:
          type: string
        modifiePar:
          type: string
        residentiel:
          type: boolean
        commercial:
          type: boolean
        industriel:
          type: boolean
        infrastructure:
          type: boolean
    TypeChantierBTP:
      enum:
      - MAISON_INDIVIDUELLE
      - IMMEUBLE_COLLECTIF
      - RENOVATION_RESIDENTIELLE
      - EXTENSION_RESIDENTIELLE
      - BUREAU_COMMERCIAL
      - CENTRE_COMMERCIAL
      - ETABLISSEMENT_SCOLAIRE
      - ETABLISSEMENT_SANTE
      - ETABLISSEMENT_SPORTIF
      - ENTREPOT_LOGISTIQUE
      - VOIRIE_URBAINE
      - AUTOROUTE
      - PONT_VIADUC
      - TUNNEL
      - PARKING
      - AIRE_AMENAGEE
      - USINE_INDUSTRIELLE
      - CENTRALE_ENERGIE
      - STATION_EPURATION
      - INSTALLATION_CHIMIQUE
      - PISCINE
      - COURT_TENNIS
      - TERRAIN_SPORT
      - MONUMENT_HISTORIQUE
      - OUVRAGE_ART
      type: string
    TypeClient:
      enum:
      - PARTICULIER
      - PROFESSIONNEL
      type: string
    TypeCompetence:
      enum:
      - TECHNIQUE
      - MANUELLE
      - THEORIQUE
      - SECURITE
      - CONTROLE_QUALITE
      - COORDINATION
      - MAINTENANCE
      - FORMATION
      - INNOVATION
      type: string
    TypeContrainte:
      enum:
      - FONDATIONS
      - DRAINAGE
      - ISOLATION
      - VENTILATION
      - PROTECTION_UV
      - ANTI_TERMITES
      - CORROSION_MARINE
      - RESISTANCE_VENT
      - ETANCHEITE
      - STRUCTURE
      - TOITURE
      - REVETEMENT
      - OUVERTURES
      - EQUIPEMENTS
      - AUTRES
      type: string
    TypeDisponibilite:
      enum:
      - CONGE_PAYE
      - CONGE_SANS_SOLDE
      - ARRET_MALADIE
      - FORMATION
      - ABSENCE
      - HORAIRE_REDUIT
      type: string
    TypeDocument:
      enum:
      - PLAN
      - PERMIS_CONSTRUIRE
      - AUTORISATION
      - RAPPORT_CHANTIER
      - PHOTO_CHANTIER
      - PLAN_SECURITE
      - MANUEL_UTILISATION
      - CERTIFICAT_CONFORMITE
      - FACTURE_MATERIEL
      - MAINTENANCE_RAPPORT
      - CONTRAT
      - DEVIS
      - FACTURE
      - BON_COMMANDE
      - CERTIFICAT_ASSURANCE
      - CV
      - CONTRAT_TRAVAIL
      - FORMATION_CERTIFICAT
      - ATTESTATION_COMPETENCE
      - CORRESPONDANCE
      - COMPTE_RENDU
      - PROCEDURE
      - AUTRE
      type: string
    TypeFacture:
      enum:
      - FACTURE
      - AVOIR
      - ACOMPTE
      type: string
    TypeMaintenance:
      enum:
      - PREVENTIVE
      - CORRECTIVE
      - REVISION
      - CONTROLE_TECHNIQUE
      - NETTOYAGE
      type: string
    TypeMateriel:
      enum:
      - VEHICULE
      - OUTIL_ELECTRIQUE
      - OUTIL_MANUEL
      - ECHAFAUDAGE
      - BETONIERE
      - GRUE
      - COMPRESSEUR
      - GENERATEUR
      - ENGIN_CHANTIER
      - MATERIEL_MESURE
      - EQUIPEMENT_SECURITE
      - OUTILLAGE
      - MATERIAUX_CONSTRUCTION
      - AUTRE
      type: string
    TypeNotification:
      enum:
      - INFO
      - ALERTE
      - MAINTENANCE
      - CHANTIER
      - PLANNING
      - DOCUMENT
      - FACTURATION
      - SYSTEM
      - SECURITE
      - BACKUP
      - CONGES
      - FORMATION
      - ABSENCE
      - CLIENT
      - DEVIS
      - CONTRAT
      type: string
    TypeOutil:
      enum:
      - COUPE
      - PERCAGE
      - FIXATION
      - MESURE
      - MANUTENTION
      - MELANGE
      - APPLICATION
      - DEMOLITION
      - NIVELLEMENT
      - SECURITE
      - SPECIALISE
      type: string
    TypePhase:
      enum:
      - ETUDE
      - PREPARATION
      - TERRASSEMENT
      - FONDATIONS
      - GROS_OEUVRE
      - SECOND_OEUVRE
      - EQUIPEMENTS
      - FINITIONS
      - RECEPTION
      - MAINTENANCE
      type: string
    TypePlanning:
      enum:
      - PREVISIONNEL
      - OPERATIONNEL
      - MAINTENANCE
      - URGENCE
      - OPTIMISE
      type: string
    TypePlanningEvent:
      enum:
      - CHANTIER
      - REUNION
      - FORMATION
      - MAINTENANCE
      - CONGE
      - RENDEZ_VOUS_CLIENT
      - LIVRAISON
      - INSPECTION
      - AUTRE
      type: string
    TypeRappel:
      enum:
      - EMAIL
      - SMS
      - NOTIFICATION
      type: string
    TypeTest:
      enum:
      - PHYSIQUE
      - CHIMIQUE
      - DIMENSIONNEL
      - PERFORMANCE
      - DURABILITE
      - ENVIRONNEMENTAL
      - SECURITE
      - VISUEL
      - FONCTIONNEL
      type: string
    TypeTransport:
      enum:
      - CAMION_PLATEAU
      - CAMION_BENNE
      - SEMI_REMORQUE
      - GRUE_MOBILE
      - CONVOI_EXCEPTIONNEL
      - FOURGON
      - CAMION_CITERNE
      - PORTE_ENGINS
      type: string
    UUID:
      format: uuid
      pattern: "[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}"
      type: string
    UniteMesure:
      enum:
      - UNITE
      - PAIRE
      - LOT
      - JEU
      - KIT
      - ENSEMBLE
      - GRAMME
      - KILOGRAMME
      - TONNE
      - MILLIMETRE
      - CENTIMETRE
      - METRE
      - METRE_LINEAIRE
      - KILOMETRE
      - CENTIMETRE_CARRE
      - METRE_CARRE
      - HECTARE
      - CENTIMETRE_CUBE
      - DECIMETRE_CUBE
      - METRE_CUBE
      - LITRE
      - MILLILITRE
      - HEURE
      - JOUR
      - SEMAINE
      - MOIS
      - SAC
      - PALETTE
      - ROULEAU
      - PLAQUE
      - BARRE
      - TUBE
      - PROFILÉ
      - PANNEAU
      - BIDON
      - CARTOUCHE
      - METRE_CABLE
      - BOBINE
      - LITRE_PAR_MINUTE
      - METRE_CUBE_PAR_HEURE
      - POURCENTAGE
      - DEGRE
      - AMPERE
      - VOLT
      - WATT
      - PASCAL
      - BAR
      - AUTRE
      type: string
    UnitePrix:
      enum:
      - UNITE
      - METRE
      - METRE_CARRE
      - METRE_CUBE
      - TONNE
      - KILOGRAMME
      - LITRE
      - HEURE
      - JOUR
      - SEMAINE
      - MOIS
      - FORFAIT
      type: string
    UpdateComparaisonRequest:
      type: object
      properties:
        disponible:
          type: boolean
        quantiteDisponible:
          type: number
        dateDisponibilite:
          $ref: "#/components/schemas/LocalDate"
        delaiLivraisonJours:
          format: int32
          type: integer
        prixUnitaireHT:
          type: number
        fraisLivraison:
          type: number
        fraisInstallation:
          type: number
        fraisMaintenance:
          type: number
        cautionDemandee:
          type: number
        remiseAppliquee:
          type: number
        dureeValiditeOffre:
          format: int32
          type: integer
        delaiPaiement:
          format: int32
          type: integer
        garantieMois:
          format: int32
          type: integer
        maintenanceIncluse:
          type: boolean
        formationIncluse:
          type: boolean
        noteQualite:
          type: number
        noteFiabilite:
          type: number
        distanceKm:
          type: number
        conditionsParticulieres:
          type: string
        avantages:
          type: string
        inconvenients:
          type: string
        commentairesEvaluateur:
          type: string
        recommandations:
          type: string
        poidsCriteres:
          type: object
          additionalProperties:
            format: int32
            type: integer
    UpdateDisponibiliteRequest:
      type: object
      properties:
        dateDebut:
          description: Nouvelle date de début
          type: string
          allOf:
          - $ref: "#/components/schemas/LocalDateTime"
        dateFin:
          description: Nouvelle date de fin
          type: string
          allOf:
          - $ref: "#/components/schemas/LocalDateTime"
        motif:
          description: Nouveau motif
          type: string
    UpdateDocumentRequest:
      type: object
      properties:
        nom:
          description: Nouveau nom du document
          type: string
        description:
          description: Nouvelle description
          type: string
        tags:
          description: Nouveaux tags
          type: string
        estPublic:
          description: Visibilité publique
          type: boolean
    UpdateEquipeRequest:
      type: object
      properties:
        nom:
          type: string
        specialite:
          type: string
        description:
          type: string
        chefEquipeId:
          $ref: "#/components/schemas/UUID"
    UpdateEventRequest:
      type: object
      properties:
        titre:
          type: string
        description:
          type: string
        dateDebut:
          $ref: "#/components/schemas/LocalDateTime"
        dateFin:
          $ref: "#/components/schemas/LocalDateTime"
        equipeId:
          $ref: "#/components/schemas/UUID"
        employeIds:
          type: array
          items:
            format: uuid
            pattern: "[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}"
            type: string
        materielIds:
          type: array
          items:
            format: uuid
            pattern: "[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}"
            type: string
    UpdateFactureRequest:
      type: object
      properties:
        description:
          type: string
        montantHT:
          type: number
        dateEcheance:
          $ref: "#/components/schemas/LocalDate"
    UpdateLivraisonRequest:
      type: object
      properties:
        dateLivraisonPrevue:
          $ref: "#/components/schemas/LocalDate"
        heureLivraisonPrevue:
          $ref: "#/components/schemas/LocalTime"
        transporteur:
          type: string
        chauffeur:
          type: string
        telephoneChauffeur:
          type: string
        immatriculation:
          type: string
        contactReception:
          type: string
        telephoneContact:
          type: string
        instructionsSpeciales:
          type: string
        accesChantier:
          type: string
        modifiePar:
          type: string
    UpdateMaintenanceRequest:
      type: object
      properties:
        description:
          description: Nouvelle description
          type: string
        datePrevue:
          description: Nouvelle date prévue
          type: string
          allOf:
          - $ref: "#/components/schemas/LocalDate"
        technicien:
          description: Nouveau technicien
          type: string
        notes:
          description: Nouvelles notes
          type: string
        cout:
          description: Coût de la maintenance
          type: number
          example: 150.5
    UpdatePlanningRequest:
      type: object
      properties:
        nomPlanning:
          type: string
        descriptionPlanning:
          type: string
        dateDebut:
          $ref: "#/components/schemas/LocalDate"
        dateFin:
          $ref: "#/components/schemas/LocalDate"
        modifiePar:
          type: string
    UpdateReservationRequest:
      type: object
      properties:
        dateDebut:
          $ref: "#/components/schemas/LocalDate"
        dateFin:
          $ref: "#/components/schemas/LocalDate"
        quantite:
          type: number
        lieuLivraison:
          type: string
        instructionsLivraison:
          type: string
        priorite:
          $ref: "#/components/schemas/PrioriteReservation"
    UpdateRoleRequest:
      type: object
      properties:
        role:
          type: string
    UpdateStatusRequest:
      type: object
      properties:
        status:
          type: string
    UpdateStatutRequest:
      type: object
      properties:
        statut:
          type: string
    UpdateStatutRequest1:
      type: object
      properties:
        statut:
          type: string
    UpdateStatutRequest2:
      required:
      - statut
      type: object
      properties:
        statut:
          description: Nouveau statut de la maintenance
          enum:
          - PLANIFIEE
          - EN_COURS
          - TERMINEE
          - REPORTEE
          - ANNULEE
          type: string
    UpdateUserRequest:
      type: object
      properties:
        nom:
          type: string
        prenom:
          type: string
        email:
          type: string
    User:
      type: object
      properties:
        id:
          $ref: "#/components/schemas/UUID"
        email:
          type: string
        nom:
          type: string
        prenom:
          type: string
        password:
          type: string
        role:
          $ref: "#/components/schemas/UserRole"
        actif:
          type: boolean
        status:
          $ref: "#/components/schemas/UserStatus"
        telephone:
          type: string
        adresse:
          type: string
        codePostal:
          type: string
        ville:
          type: string
        entreprise:
          type: string
        siret:
          type: string
        secteurActivite:
          type: string
        effectif:
          format: int32
          type: integer
        commentaireAdmin:
          type: string
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        derniereConnexion:
          $ref: "#/components/schemas/LocalDateTime"
        resetPasswordToken:
          type: string
        resetPasswordExpiry:
          $ref: "#/components/schemas/LocalDateTime"
        passwordResetTokenValid:
          type: boolean
    UserRole:
      enum:
      - ADMIN
      - MANAGER
      - CHEF_CHANTIER
      - OUVRIER
      - COMPTABLE
      - GESTIONNAIRE_PROJET
      type: string
    UserStatus:
      enum:
      - PENDING
      - APPROVED
      - REJECTED
      - SUSPENDED
      - INACTIVE
      type: string
    ValidationRequest:
      type: object
      properties:
        role:
          type: string
        requiredPermissions:
          type: array
          items:
            type: string
    ValiderPlanningRequest:
      required:
      - valideur
      type: object
      properties:
        valideur:
          type: string
        commentaires:
          type: string
    ValiderReservationRequest:
      required:
      - valideur
      type: object
      properties:
        valideur:
          type: string
    VuePlanning:
      enum:
      - GANTT
      - CALENDRIER
      - LISTE
      - TIMELINE
      - KANBAN
      - RESSOURCES
      - CHARGE
      - RESEAU
      type: string
    ZoneClimatique:
      type: object
      properties:
        id:
          format: int64
          type: integer
        code:
          type: string
        nom:
          type: string
        description:
          type: string
        temperatureMin:
          type: number
        temperatureMax:
          type: number
        pluviometrieAnnuelle:
          format: int32
          type: integer
        humiditeMin:
          format: int32
          type: integer
        humiditeMax:
          format: int32
          type: integer
        ventsMaximaux:
          format: int32
          type: integer
        risqueCyclones:
          type: boolean
        risqueSeisme:
          type: boolean
        zoneSeismique:
          type: string
        profondeurFondationsMin:
          type: number
        drainageObligatoire:
          type: boolean
        isolationThermiqueObligatoire:
          type: boolean
        ventilationRenforcee:
          type: boolean
        protectionUVObligatoire:
          type: boolean
        traitementAntiTermites:
          type: boolean
        resistanceCorrosionMarine:
          type: boolean
        normeSismique:
          type: string
        normeCyclonique:
          type: string
        normeThermique:
          type: string
        normePluviale:
          type: string
        coefficientNeige:
          type: number
        coefficientVent:
          type: number
        coefficientSeisme:
          type: number
        penteToitureMin:
          type: number
        evacuationEPMin:
          format: int32
          type: integer
        saisons:
          type: array
          items:
            $ref: "#/components/schemas/SaisonClimatique"
        contraintes:
          type: array
          items:
            $ref: "#/components/schemas/ContrainteConstruction"
        pays:
          type: array
          items:
            $ref: "#/components/schemas/PaysZoneClimatique"
        materiauxAdaptes:
          type: array
          items:
            $ref: "#/components/schemas/MaterielBTP"
        dateCreation:
          $ref: "#/components/schemas/LocalDateTime"
        dateModification:
          $ref: "#/components/schemas/LocalDateTime"
        creePar:
          type: string
        modifiePar:
          type: string
        actif:
          type: boolean
        coefficientsStructure:
          $ref: "#/components/schemas/CoefficientsStructure"
        recommandationsConstruction:
          type: array
          items:
            type: string
  securitySchemes:
    SecurityScheme:
      type: http
      description: Authentication
      scheme: bearer
      bearerFormat: JWT
