{"openapi":"3.0.0","paths":{"/api/proforma-form.html":{"get":{"operationId":"StaticController_getProformaForm","parameters":[],"responses":{"200":{"description":""}},"tags":["Static"]}},"/api/debug-sentry":{"get":{"description":"Endpoint de test pour vérifier que Sentry capture correctement les erreurs","operationId":"AppController_getError","parameters":[],"responses":{"200":{"description":""}},"summary":"Test Sentry - Lance une erreur pour tester la capture","tags":["App"]}},"/api/debug-sentry-logs":{"get":{"description":"Endpoint de test pour vérifier que Sentry capture les logs (error, warn)","operationId":"AppController_testLogs","parameters":[],"responses":{"200":{"description":""}},"summary":"Test Sentry Logs - Teste la capture des logs","tags":["App"]}},"/api/auth/register":{"post":{"description":"Seuls les administrateurs peuvent créer des utilisateurs","operationId":"AuthController_register","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterDto"}}}},"responses":{"201":{"description":"Utilisateur créé avec succès"},"403":{"description":"Accès refusé - Réservé aux administrateurs"},"409":{"description":"Email déjà utilisé"}},"security":[{"bearer":[]}],"summary":"Créer un nouvel utilisateur","tags":["Auth"]}},"/api/auth/login":{"post":{"operationId":"AuthController_login","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginDto"}}}},"responses":{"200":{"description":"Connexion réussie"},"401":{"description":"Email ou mot de passe incorrect"}},"summary":"Connexion utilisateur","tags":["Auth"]}},"/api/auth/profile":{"get":{"operationId":"AuthController_getProfile","parameters":[],"responses":{"200":{"description":"Profil récupéré avec succès"},"401":{"description":"Non authentifié"}},"security":[{"bearer":[]}],"summary":"Récupérer le profil utilisateur connecté","tags":["Auth"]}},"/api/auth/refresh":{"post":{"operationId":"AuthController_refresh","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshTokenDto"}}}},"responses":{"200":{"description":"Token rafraîchi avec succès"},"401":{"description":"Refresh token invalide"}},"summary":"Rafraîchir le token d'accès","tags":["Auth"]}},"/api/auth/logout":{"post":{"operationId":"AuthController_logout","parameters":[],"responses":{"200":{"description":"Déconnexion réussie"}},"security":[{"bearer":[]}],"summary":"Déconnexion utilisateur","tags":["Auth"]}},"/api/users":{"post":{"description":"Réservé aux administrateurs","operationId":"UsersController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUserDto"}}}},"responses":{"201":{"description":"Utilisateur créé avec succès"},"403":{"description":"Accès refusé - Réservé aux administrateurs"},"409":{"description":"Email déjà utilisé"}},"security":[{"bearer":[]}],"summary":"Créer un nouvel utilisateur","tags":["Users"]},"get":{"operationId":"UsersController_findAll","parameters":[{"name":"page","required":false,"in":"query","description":"Numéro de page","schema":{"default":1,"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Nombre d'éléments par page","schema":{"default":10,"example":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Recherche par nom, prénom ou email","schema":{"example":"john","type":"string"}},{"name":"role","required":false,"in":"query","description":"Filtrer par rôle","schema":{"enum":["ADMIN","RESPONSABLE_ACHAT","RESPONSABLE_LABO","TECHNICIEN","RESPONSABLE_SERVICE","AGENT_RECEPTION","AGENT_QUALITE","COMPTABLE","CAISSIER","DAF","DG","CONTROLEUR_GESTION","CORRESPONDANT_ACHAT"],"type":"string"}},{"name":"laboratoryId","required":false,"in":"query","description":"Filtrer par laboratoire (ID)","schema":{"type":"string"}},{"name":"isActive","required":false,"in":"query","description":"Filtrer par statut actif/inactif","schema":{"example":true,"type":"boolean"}}],"responses":{"200":{"description":"Liste des utilisateurs récupérée avec succès"}},"security":[{"bearer":[]}],"summary":"Récupérer tous les utilisateurs avec filtres","tags":["Users"]}},"/api/users/{id}":{"get":{"operationId":"UsersController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Utilisateur récupéré avec succès"},"404":{"description":"Utilisateur introuvable"}},"security":[{"bearer":[]}],"summary":"Récupérer un utilisateur par ID","tags":["Users"]},"put":{"description":"Réservé aux administrateurs","operationId":"UsersController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserDto"}}}},"responses":{"200":{"description":"Utilisateur modifié avec succès"},"403":{"description":"Accès refusé - Réservé aux administrateurs"},"404":{"description":"Utilisateur introuvable"}},"security":[{"bearer":[]}],"summary":"Modifier un utilisateur","tags":["Users"]},"delete":{"description":"Réservé aux administrateurs","operationId":"UsersController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Utilisateur désactivé avec succès"},"403":{"description":"Accès refusé - Réservé aux administrateurs"},"404":{"description":"Utilisateur introuvable"}},"security":[{"bearer":[]}],"summary":"Désactiver un utilisateur (soft delete)","tags":["Users"]}},"/api/users/by-laboratory/{labId}":{"get":{"operationId":"UsersController_findByLaboratory","parameters":[{"name":"labId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Utilisateurs du laboratoire récupérés avec succès"},"404":{"description":"Laboratoire introuvable"}},"security":[{"bearer":[]}],"summary":"Récupérer les utilisateurs d'un laboratoire","tags":["Users"]}},"/api/users/{id}/change-password":{"put":{"description":"Un utilisateur ne peut changer que son propre mot de passe (sauf ADMIN)","operationId":"UsersController_changePassword","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePasswordDto"}}}},"responses":{"200":{"description":"Mot de passe modifié avec succès"},"401":{"description":"Ancien mot de passe incorrect"},"403":{"description":"Accès refusé"}},"security":[{"bearer":[]}],"summary":"Changer le mot de passe d'un utilisateur","tags":["Users"]}},"/api/categories":{"post":{"operationId":"CategoriesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCategoryDto"}}}},"responses":{"201":{"description":"Catégorie créée avec succès"},"409":{"description":"Code déjà utilisé"}},"security":[{"bearer":[]}],"summary":"Créer une nouvelle catégorie","tags":["Categories"]},"get":{"operationId":"CategoriesController_findAll","parameters":[{"name":"page","required":false,"in":"query","schema":{"default":1,"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"default":10,"example":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Recherche par nom","schema":{"type":"string"}},{"name":"isActive","required":false,"in":"query","schema":{"type":"boolean"}},{"name":"includeSubCategories","required":false,"in":"query","description":"Inclure les sous-catégories","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Liste des catégories"}},"security":[{"bearer":[]}],"summary":"Récupérer toutes les catégories","tags":["Categories"]}},"/api/categories/{id}":{"get":{"operationId":"CategoriesController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Catégorie récupérée"},"404":{"description":"Catégorie introuvable"}},"security":[{"bearer":[]}],"summary":"Récupérer une catégorie par ID","tags":["Categories"]},"put":{"operationId":"CategoriesController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCategoryDto"}}}},"responses":{"200":{"description":"Catégorie modifiée"}},"security":[{"bearer":[]}],"summary":"Modifier une catégorie","tags":["Categories"]},"delete":{"operationId":"CategoriesController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Catégorie supprimée"}},"security":[{"bearer":[]}],"summary":"Supprimer une catégorie","tags":["Categories"]}},"/api/categories/{id}/sub-categories":{"get":{"operationId":"CategoriesController_getSubCategories","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Sous-catégories récupérées"}},"security":[{"bearer":[]}],"summary":"Récupérer les sous-catégories d'une catégorie","tags":["Categories"]}},"/api/categories/{id}/products":{"get":{"operationId":"CategoriesController_getProducts","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Produits récupérés"}},"security":[{"bearer":[]}],"summary":"Récupérer les produits d'une catégorie","tags":["Categories"]}},"/api/sub-categories":{"post":{"operationId":"SubCategoriesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSubCategoryDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Créer une nouvelle sous-catégorie","tags":["Sub-Categories"]},"get":{"operationId":"SubCategoriesController_findAll","parameters":[{"name":"page","required":false,"in":"query","schema":{"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"example":10,"type":"number"}},{"name":"search","required":false,"in":"query","schema":{"type":"string"}},{"name":"categoryId","required":false,"in":"query","description":"Filtrer par catégorie","schema":{"type":"string"}},{"name":"isActive","required":false,"in":"query","schema":{"type":"boolean"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Récupérer toutes les sous-catégories","tags":["Sub-Categories"]}},"/api/sub-categories/by-category/{categoryId}":{"get":{"operationId":"SubCategoriesController_findByCategory","parameters":[{"name":"categoryId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Récupérer les sous-catégories d'une catégorie","tags":["Sub-Categories"]}},"/api/sub-categories/{id}":{"get":{"operationId":"SubCategoriesController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Récupérer une sous-catégorie par ID","tags":["Sub-Categories"]},"put":{"operationId":"SubCategoriesController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSubCategoryDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Modifier une sous-catégorie","tags":["Sub-Categories"]},"delete":{"operationId":"SubCategoriesController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Supprimer une sous-catégorie","tags":["Sub-Categories"]}},"/api/suppliers/template-excel":{"get":{"operationId":"SuppliersController_downloadTemplate","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Télécharger le template Excel pour l'import de fournisseurs","tags":["Suppliers"]}},"/api/suppliers":{"post":{"operationId":"SuppliersController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSupplierDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Créer un nouveau fournisseur","tags":["Suppliers"]},"get":{"operationId":"SuppliersController_findAll","parameters":[{"name":"page","required":false,"in":"query","schema":{"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"example":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Recherche par nom ou email","schema":{"type":"string"}},{"name":"isActive","required":false,"in":"query","schema":{"type":"boolean"}},{"name":"category","required":false,"in":"query","description":"Filtrer par catégorie","schema":{"type":"string"}},{"name":"serviceType","required":false,"in":"query","description":"Filtrer par type de service","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Récupérer tous les fournisseurs","tags":["Suppliers"]}},"/api/suppliers/{id}":{"get":{"operationId":"SuppliersController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Récupérer un fournisseur par ID","tags":["Suppliers"]},"put":{"operationId":"SuppliersController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSupplierDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Modifier un fournisseur","tags":["Suppliers"]},"delete":{"operationId":"SuppliersController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Désactiver un fournisseur","tags":["Suppliers"]}},"/api/suppliers/{id}/products":{"get":{"operationId":"SuppliersController_getProducts","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Récupérer les produits d'un fournisseur","tags":["Suppliers"]}},"/api/suppliers/{id}/orders":{"get":{"operationId":"SuppliersController_getOrders","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Récupérer les commandes d'un fournisseur","tags":["Suppliers"]}},"/api/suppliers/import-excel":{"post":{"operationId":"SuppliersController_importFromExcel","parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Fichier Excel (.xlsx) contenant les fournisseurs à importer"}}}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Importer des fournisseurs depuis un fichier Excel","tags":["Suppliers"]}},"/api/laboratories":{"post":{"operationId":"LaboratoriesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLaboratoryDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Créer un nouveau laboratoire (ADMIN uniquement)","tags":["Laboratories"]},"get":{"operationId":"LaboratoriesController_findAll","parameters":[{"name":"page","required":false,"in":"query","schema":{"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"example":10,"type":"number"}},{"name":"search","required":false,"in":"query","schema":{"type":"string"}},{"name":"type","required":false,"in":"query","schema":{"type":"string","enum":["MICROBIOLOGIE","PHYSICO_CHIMIE","BIOLOGIE","DEPOT","AUTRE"]}},{"name":"isActive","required":false,"in":"query","schema":{"type":"boolean"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Récupérer tous les laboratoires","tags":["Laboratories"]}},"/api/laboratories/{id}/stocks":{"get":{"operationId":"LaboratoriesController_getStocks","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Récupérer les stocks d'un laboratoire","tags":["Laboratories"]}},"/api/laboratories/{id}/users":{"get":{"operationId":"LaboratoriesController_getUsers","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Récupérer les utilisateurs d'un laboratoire","tags":["Laboratories"]}},"/api/laboratories/{id}/products":{"get":{"operationId":"LaboratoriesController_getLaboratoryProducts","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"search","required":true,"in":"query","schema":{"type":"string"}},{"name":"type","required":true,"in":"query","schema":{"type":"string"}},{"name":"page","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Récupérer les produits référencés par un laboratoire","tags":["Laboratories"]},"post":{"operationId":"LaboratoriesController_addProductToLaboratory","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Associer un produit existant à un laboratoire","tags":["Laboratories"]}},"/api/laboratories/{id}/products/{productId}":{"delete":{"operationId":"LaboratoriesController_removeProductFromLaboratory","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"productId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Retirer un produit du référentiel d'un laboratoire","tags":["Laboratories"]}},"/api/laboratories/{id}":{"get":{"operationId":"LaboratoriesController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Récupérer un laboratoire par ID","tags":["Laboratories"]},"put":{"operationId":"LaboratoriesController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLaboratoryDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Modifier un laboratoire","tags":["Laboratories"]},"delete":{"operationId":"LaboratoriesController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Désactiver un laboratoire","tags":["Laboratories"]}},"/api/equipments":{"post":{"operationId":"EquipmentsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateEquipmentDto"}}}},"responses":{"201":{"description":"Équipement créé avec succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EquipmentResponseDto"}}}},"400":{"description":"Données invalides"},"404":{"description":"Laboratoire non trouvé"},"409":{"description":"Numéro de série déjà existant"}},"security":[{"bearer":[]}],"summary":"Créer un nouvel équipement","tags":["Equipments"]},"get":{"operationId":"EquipmentsController_findAll","parameters":[{"name":"search","required":false,"in":"query","schema":{"example":"Spectro","type":"string"}},{"name":"type","required":false,"in":"query","schema":{"type":"string","enum":["ANALYTICAL","PREPARATION","SAFETY","STORAGE","MEASUREMENT","OTHER"]}},{"name":"status","required":false,"in":"query","schema":{"type":"string","enum":["OPERATIONAL","MAINTENANCE","OUT_OF_ORDER","RETIRED"]}},{"name":"laboratoryId","required":false,"in":"query","schema":{"example":"lab-id-123","type":"string"}},{"name":"brand","required":false,"in":"query","schema":{"example":"Thermo Fisher","type":"string"}},{"name":"isActive","required":false,"in":"query","schema":{"default":true,"type":"boolean"}},{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"sortBy","required":false,"in":"query","schema":{"default":"createdAt","example":"name","type":"string"}},{"name":"sortOrder","required":false,"in":"query","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Liste des équipements récupérée","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EquipmentResponseDto"}}}}}},"security":[{"bearer":[]}],"summary":"Récupérer tous les équipements avec filtres","tags":["Equipments"]}},"/api/equipments/statistics":{"get":{"operationId":"EquipmentsController_getStatistics","parameters":[],"responses":{"200":{"description":"Statistiques récupérées avec succès"}},"security":[{"bearer":[]}],"summary":"Récupérer les statistiques des équipements","tags":["Equipments"]}},"/api/equipments/maintenance-due":{"get":{"operationId":"EquipmentsController_getMaintenanceDue","parameters":[{"name":"days","required":false,"in":"query","description":"Nombre de jours de seuil (défaut: 7)","schema":{"type":"number"}}],"responses":{"200":{"description":"Équipements nécessitant maintenance récupérés","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EquipmentResponseDto"}}}}}},"security":[{"bearer":[]}],"summary":"Récupérer les équipements nécessitant une maintenance","tags":["Equipments"]}},"/api/equipments/laboratory/{laboratoryId}":{"get":{"operationId":"EquipmentsController_findByLaboratory","parameters":[{"name":"laboratoryId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Équipements du laboratoire récupérés","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EquipmentResponseDto"}}}}},"404":{"description":"Laboratoire non trouvé"}},"security":[{"bearer":[]}],"summary":"Récupérer les équipements par laboratoire","tags":["Equipments"]}},"/api/equipments/{id}":{"get":{"operationId":"EquipmentsController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Équipement récupéré avec succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EquipmentResponseDto"}}}},"404":{"description":"Équipement non trouvé"}},"security":[{"bearer":[]}],"summary":"Récupérer un équipement par son ID","tags":["Equipments"]},"patch":{"operationId":"EquipmentsController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateEquipmentDto"}}}},"responses":{"200":{"description":"Équipement mis à jour avec succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EquipmentResponseDto"}}}},"404":{"description":"Équipement non trouvé"},"409":{"description":"Numéro de série déjà existant"}},"security":[{"bearer":[]}],"summary":"Mettre à jour un équipement","tags":["Equipments"]},"delete":{"operationId":"EquipmentsController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Équipement désactivé avec succès"},"404":{"description":"Équipement non trouvé"}},"security":[{"bearer":[]}],"summary":"Désactiver un équipement (soft delete)","tags":["Equipments"]}},"/api/equipments/{id}/status":{"patch":{"operationId":"EquipmentsController_updateStatus","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateStatusDto"}}}},"responses":{"200":{"description":"Statut mis à jour avec succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EquipmentResponseDto"}}}},"404":{"description":"Équipement non trouvé"}},"security":[{"bearer":[]}],"summary":"Mettre à jour le statut d'un équipement","tags":["Equipments"]}},"/api/equipments/{id}/maintenance":{"patch":{"operationId":"EquipmentsController_updateMaintenance","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMaintenanceDto"}}}},"responses":{"200":{"description":"Dates de maintenance mises à jour","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EquipmentResponseDto"}}}},"404":{"description":"Équipement non trouvé"}},"security":[{"bearer":[]}],"summary":"Mettre à jour les dates de maintenance","tags":["Equipments"]}},"/api/equipments/{id}/hard":{"delete":{"operationId":"EquipmentsController_hardDelete","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Équipement supprimé définitivement"},"404":{"description":"Équipement non trouvé"}},"security":[{"bearer":[]}],"summary":"Supprimer définitivement un équipement","tags":["Equipments"]}},"/api/products":{"post":{"operationId":"ProductsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProductDto"}}}},"responses":{"201":{"description":"Produit créé avec succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductResponseDto"}}}},"400":{"description":"Données invalides"},"404":{"description":"Catégorie/Fournisseur non trouvé"},"409":{"description":"Référence déjà existante"}},"security":[{"bearer":[]}],"summary":"Créer un nouveau produit","tags":["Products"]},"get":{"operationId":"ProductsController_findAll","parameters":[{"name":"search","required":false,"in":"query","schema":{"example":"Acide","type":"string"}},{"name":"type","required":false,"in":"query","schema":{"type":"string","enum":["REACTIF","CONSOMMABLE","ACCESSOIRE","MATERIEL"]}},{"name":"unit","required":false,"in":"query","schema":{"type":"string","enum":["LITRE","ML","GRAMME","KG","BOITE","PIECE","FLACON","TUBE","PLAQUE"]}},{"name":"categoryId","required":false,"in":"query","schema":{"example":"category-id-123","type":"string"}},{"name":"subCategoryId","required":false,"in":"query","schema":{"example":"sub-category-id-456","type":"string"}},{"name":"supplierId","required":false,"in":"query","schema":{"example":"supplier-id-789","type":"string"}},{"name":"isActive","required":false,"in":"query","schema":{"default":true,"type":"boolean"}},{"name":"isExpired","required":false,"in":"query","description":"Filtrer les produits expirés","schema":{"type":"boolean"}},{"name":"lowStock","required":false,"in":"query","description":"Filtrer les produits avec stock bas","schema":{"type":"boolean"}},{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"sortBy","required":false,"in":"query","schema":{"default":"createdAt","example":"name","type":"string"}},{"name":"sortOrder","required":false,"in":"query","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Liste des produits récupérée","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProductResponseDto"}}}}}},"security":[{"bearer":[]}],"summary":"Récupérer tous les produits avec filtres","tags":["Products"]}},"/api/products/statistics":{"get":{"operationId":"ProductsController_getStatistics","parameters":[],"responses":{"200":{"description":"Statistiques récupérées avec succès"}},"security":[{"bearer":[]}],"summary":"Récupérer les statistiques des produits","tags":["Products"]}},"/api/products/low-stock":{"get":{"operationId":"ProductsController_getLowStockProducts","parameters":[],"responses":{"200":{"description":"Produits avec stock bas récupérés","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProductResponseDto"}}}}}},"security":[{"bearer":[]}],"summary":"Récupérer les produits avec stock bas","tags":["Products"]}},"/api/products/expiring":{"get":{"operationId":"ProductsController_getExpiringProducts","parameters":[{"name":"days","required":false,"in":"query","description":"Nombre de jours de seuil (défaut: 30)","schema":{"type":"number"}}],"responses":{"200":{"description":"Produits expirés ou bientôt expirés récupérés","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProductResponseDto"}}}}}},"security":[{"bearer":[]}],"summary":"Récupérer les produits expirés ou bientôt expirés","tags":["Products"]}},"/api/products/category/{categoryId}":{"get":{"operationId":"ProductsController_findByCategory","parameters":[{"name":"categoryId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Produits de la catégorie récupérés","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProductResponseDto"}}}}},"404":{"description":"Catégorie non trouvée"}},"security":[{"bearer":[]}],"summary":"Récupérer les produits par catégorie","tags":["Products"]}},"/api/products/supplier/{supplierId}":{"get":{"operationId":"ProductsController_findBySupplier","parameters":[{"name":"supplierId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Produits du fournisseur récupérés","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProductResponseDto"}}}}},"404":{"description":"Fournisseur non trouvé"}},"security":[{"bearer":[]}],"summary":"Récupérer les produits par fournisseur","tags":["Products"]}},"/api/products/reference/{reference}":{"get":{"operationId":"ProductsController_findByReference","parameters":[{"name":"reference","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Produit récupéré avec succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductResponseDto"}}}},"404":{"description":"Produit non trouvé"}},"security":[{"bearer":[]}],"summary":"Récupérer un produit par sa référence","tags":["Products"]}},"/api/products/{id}":{"get":{"operationId":"ProductsController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Produit récupéré avec succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductResponseDto"}}}},"404":{"description":"Produit non trouvé"}},"security":[{"bearer":[]}],"summary":"Récupérer un produit par son ID","tags":["Products"]},"patch":{"operationId":"ProductsController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProductDto"}}}},"responses":{"200":{"description":"Produit mis à jour avec succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductResponseDto"}}}},"404":{"description":"Produit non trouvé"},"409":{"description":"Référence déjà existante"}},"security":[{"bearer":[]}],"summary":"Mettre à jour un produit","tags":["Products"]},"delete":{"operationId":"ProductsController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Produit désactivé avec succès"},"404":{"description":"Produit non trouvé"}},"security":[{"bearer":[]}],"summary":"Désactiver un produit (soft delete)","tags":["Products"]}},"/api/products/{id}/hard":{"delete":{"operationId":"ProductsController_hardDelete","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Produit supprimé définitivement"},"400":{"description":"Produit a des stocks associés"},"404":{"description":"Produit non trouvé"}},"security":[{"bearer":[]}],"summary":"Supprimer définitivement un produit","tags":["Products"]}},"/api/products/excel/template":{"get":{"operationId":"ProductsController_downloadTemplate","parameters":[],"responses":{"200":{"description":"Template Excel généré avec succès","content":{"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{}}}},"security":[{"bearer":[]}],"summary":"Télécharger le template Excel pour l'import de produits","tags":["Products"]}},"/api/products/excel/import":{"post":{"operationId":"ProductsController_importFromExcel","parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Fichier Excel contenant les produits à importer"}}}}}},"responses":{"200":{"description":"Import terminé avec résultats détaillés","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"type":"object","properties":{"imported":{"type":"number","description":"Nombre de produits importés"},"failed":{"type":"number","description":"Nombre d'échecs"},"errors":{"type":"array","items":{"type":"object","properties":{"row":{"type":"number"},"error":{"type":"string"},"data":{"type":"object"}}}}}}}}}}},"400":{"description":"Fichier invalide ou données incorrectes"}},"security":[{"bearer":[]}],"summary":"Importer des produits depuis un fichier Excel","tags":["Products"]}},"/api/products/excel/export":{"get":{"operationId":"ProductsController_exportToExcel","parameters":[{"name":"search","required":false,"in":"query","schema":{"example":"Acide","type":"string"}},{"name":"type","required":false,"in":"query","schema":{"type":"string","enum":["REACTIF","CONSOMMABLE","ACCESSOIRE","MATERIEL"]}},{"name":"unit","required":false,"in":"query","schema":{"type":"string","enum":["LITRE","ML","GRAMME","KG","BOITE","PIECE","FLACON","TUBE","PLAQUE"]}},{"name":"categoryId","required":false,"in":"query","schema":{"example":"category-id-123","type":"string"}},{"name":"subCategoryId","required":false,"in":"query","schema":{"example":"sub-category-id-456","type":"string"}},{"name":"supplierId","required":false,"in":"query","schema":{"example":"supplier-id-789","type":"string"}},{"name":"isActive","required":false,"in":"query","schema":{"default":true,"type":"boolean"}},{"name":"isExpired","required":false,"in":"query","description":"Filtrer les produits expirés","schema":{"type":"boolean"}},{"name":"lowStock","required":false,"in":"query","description":"Filtrer les produits avec stock bas","schema":{"type":"boolean"}},{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"sortBy","required":false,"in":"query","schema":{"default":"createdAt","example":"name","type":"string"}},{"name":"sortOrder","required":false,"in":"query","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Export Excel généré avec succès","content":{"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{}}}},"security":[{"bearer":[]}],"summary":"Exporter tous les produits vers Excel","tags":["Products"]}},"/api/stocks/direct-add":{"post":{"operationId":"StocksController_directAddToStock","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Ajout direct au stock d'un laboratoire","tags":["Stocks"]}},"/api/stocks/laboratory/{laboratoryId}/pending-entries":{"get":{"operationId":"StocksController_getPendingEntries","parameters":[{"name":"laboratoryId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Entrées en attente d'accusé de réception pour un laboratoire","tags":["Stocks"]}},"/api/stocks/movements/{id}/acknowledge":{"patch":{"operationId":"StocksController_acknowledgeMovement","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Accuser réception d'une entrée de stock","tags":["Stocks"]}},"/api/stocks/laboratory/{laboratoryId}/acknowledge-all":{"patch":{"operationId":"StocksController_acknowledgeAllPendingEntries","parameters":[{"name":"laboratoryId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Accuser réception de toutes les entrées en attente","tags":["Stocks"]}},"/api/stocks/import-excel/template":{"get":{"operationId":"StocksController_downloadStockTemplate","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Télécharger le template Excel pour import de stock","tags":["Stocks"]}},"/api/stocks/import-excel/{laboratoryId}":{"post":{"operationId":"StocksController_importStockFromExcel","parameters":[{"name":"laboratoryId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"}}}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Importer des produits en stock depuis un fichier Excel","tags":["Stocks"]}},"/api/stocks":{"post":{"operationId":"StocksController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateStockDto"}}}},"responses":{"201":{"description":"Stock créé avec succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockResponseDto"}}}},"400":{"description":"Données invalides"},"404":{"description":"Produit/Laboratoire non trouvé"},"409":{"description":"Stock déjà existant"}},"security":[{"bearer":[]}],"summary":"Créer un nouveau stock","tags":["Stocks"]},"get":{"operationId":"StocksController_findAll","parameters":[{"name":"productId","required":false,"in":"query","schema":{"example":"product-id-123","type":"string"}},{"name":"laboratoryId","required":false,"in":"query","schema":{"example":"laboratory-id-456","type":"string"}},{"name":"lowStock","required":false,"in":"query","description":"Filtrer les stocks bas (quantité <= seuil minimum du produit)","schema":{"type":"boolean"}},{"name":"outOfStock","required":false,"in":"query","description":"Filtrer les stocks en rupture (quantité = 0)","schema":{"type":"boolean"}},{"name":"hasReservations","required":false,"in":"query","description":"Filtrer les stocks avec réservations","schema":{"type":"boolean"}},{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"sortBy","required":false,"in":"query","schema":{"default":"lastUpdated","example":"quantity","type":"string"}},{"name":"sortOrder","required":false,"in":"query","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Liste des stocks récupérée","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StockResponseDto"}}}}}},"security":[{"bearer":[]}],"summary":"Récupérer tous les stocks avec filtres","tags":["Stocks"]}},"/api/stocks/statistics":{"get":{"operationId":"StocksController_getStatistics","parameters":[],"responses":{"200":{"description":"Statistiques récupérées avec succès"}},"security":[{"bearer":[]}],"summary":"Récupérer les statistiques des stocks","tags":["Stocks"]}},"/api/stocks/stock-general/movements":{"get":{"description":"Affiche toutes les entrées (réceptions) et sorties (dispatches) du stock central","operationId":"StocksController_getStockGeneralMovements","parameters":[{"name":"page","required":false,"in":"query","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}},{"name":"type","required":false,"in":"query","description":"Filtrer par type de mouvement","schema":{"enum":["ENTREE","SORTIE"],"type":"string"}}],"responses":{"200":{"description":"Historique des mouvements récupéré"}},"security":[{"bearer":[]}],"summary":"Récupérer l'historique des mouvements du STOCK_GENERAL","tags":["Stocks"]}},"/api/stocks/stock-general/statistics":{"get":{"description":"Métriques avancées : par type, par catégorie, top produits, alertes critiques","operationId":"StocksController_getStockGeneralStatistics","parameters":[],"responses":{"200":{"description":"Statistiques détaillées récupérées"}},"security":[{"bearer":[]}],"summary":"Statistiques détaillées du STOCK_GENERAL","tags":["Stocks"]}},"/api/stocks/stock-general/alerts":{"get":{"description":"Liste uniquement les produits en stock faible ou en rupture avec niveau d'alerte","operationId":"StocksController_getStockGeneralAlerts","parameters":[],"responses":{"200":{"description":"Alertes récupérées"}},"security":[{"bearer":[]}],"summary":"Produits en alerte dans le STOCK_GENERAL","tags":["Stocks"]}},"/api/stocks/stock-general/search":{"get":{"description":"Filtrer par nom, référence, catégorie, type, statut","operationId":"StocksController_searchStockGeneral","parameters":[{"name":"search","required":false,"in":"query","description":"Recherche par nom ou référence","schema":{"type":"string"}},{"name":"type","required":false,"in":"query","description":"Filtrer par type de produit","schema":{"type":"string"}},{"name":"categoryId","required":false,"in":"query","description":"Filtrer par catégorie","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","description":"Filtrer par statut","schema":{"enum":["DISPONIBLE","FAIBLE","RUPTURE"],"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"Résultats de recherche"}},"security":[{"bearer":[]}],"summary":"Rechercher dans le STOCK_GENERAL","tags":["Stocks"]}},"/api/stocks/stock-general/inventory-report":{"get":{"description":"Génère un rapport complet de tous les produits (sans pagination) pour export Excel/PDF","operationId":"StocksController_getStockGeneralInventoryReport","parameters":[],"responses":{"200":{"description":"Rapport d'inventaire généré"}},"security":[{"bearer":[]}],"summary":"Rapport d'inventaire complet du STOCK_GENERAL","tags":["Stocks"]}},"/api/stocks/stock-general":{"get":{"description":"Permet au responsable achat de suivre le stock central après chaque mouvement (réception/dispatch)","operationId":"StocksController_getStockGeneral","parameters":[{"name":"page","required":false,"in":"query","description":"Numéro de page (défaut: 1)","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Nombre d'éléments par page (défaut: 50)","schema":{"type":"number"}}],"responses":{"200":{"description":"Stock général récupéré avec succès","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"message":{"type":"string","example":"Stock général récupéré avec succès"},"data":{"type":"object","properties":{"laboratory":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string","example":"STOCK_GENERAL"},"type":{"type":"string","example":"AUTRE"},"description":{"type":"string"}}},"stocks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"quantity":{"type":"number","example":150},"reservedQty":{"type":"number","example":0},"availableQty":{"type":"number","example":150},"lastUpdated":{"type":"string","format":"date-time"},"stockStatus":{"type":"string","enum":["DISPONIBLE","FAIBLE","RUPTURE"]},"isLowStock":{"type":"boolean"},"isOutOfStock":{"type":"boolean"},"product":{"type":"object"}}}},"statistics":{"type":"object","properties":{"totalProducts":{"type":"number","example":25},"totalQuantity":{"type":"number","example":5000},"totalReserved":{"type":"number","example":0},"totalAvailable":{"type":"number","example":5000},"productsInStock":{"type":"number","example":23},"productsOutOfStock":{"type":"number","example":2}}}}},"meta":{"type":"object","properties":{"page":{"type":"number","example":1},"limit":{"type":"number","example":50},"total":{"type":"number","example":25},"totalPages":{"type":"number","example":1}}}}}}}},"404":{"description":"STOCK_GENERAL non trouvé (aucune réception effectuée)"}},"security":[{"bearer":[]}],"summary":"Récupérer tous les produits du STOCK_GENERAL","tags":["Stocks"]}},"/api/stocks/low-stocks":{"get":{"operationId":"StocksController_getLowStocks","parameters":[],"responses":{"200":{"description":"Stocks bas récupérés","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StockResponseDto"}}}}}},"security":[{"bearer":[]}],"summary":"Récupérer les stocks bas","tags":["Stocks"]}},"/api/stocks/out-of-stocks":{"get":{"operationId":"StocksController_getOutOfStocks","parameters":[],"responses":{"200":{"description":"Stocks en rupture récupérés","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StockResponseDto"}}}}}},"security":[{"bearer":[]}],"summary":"Récupérer les stocks en rupture","tags":["Stocks"]}},"/api/stocks/product/{productId}/laboratory/{laboratoryId}":{"get":{"operationId":"StocksController_findByProductAndLab","parameters":[{"name":"productId","required":true,"in":"path","schema":{"type":"string"}},{"name":"laboratoryId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Stock récupéré avec succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockResponseDto"}}}},"404":{"description":"Stock non trouvé"}},"security":[{"bearer":[]}],"summary":"Récupérer un stock par produit et laboratoire","tags":["Stocks"]}},"/api/stocks/{id}":{"get":{"operationId":"StocksController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Stock récupéré avec succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockResponseDto"}}}},"404":{"description":"Stock non trouvé"}},"security":[{"bearer":[]}],"summary":"Récupérer un stock par son ID","tags":["Stocks"]},"patch":{"operationId":"StocksController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateStockDto"}}}},"responses":{"200":{"description":"Stock mis à jour avec succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockResponseDto"}}}},"404":{"description":"Stock non trouvé"}},"security":[{"bearer":[]}],"summary":"Mettre à jour un stock (définir quantité exacte)","tags":["Stocks"]},"delete":{"operationId":"StocksController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Stock supprimé avec succès"},"400":{"description":"Stock non vide"},"404":{"description":"Stock non trouvé"}},"security":[{"bearer":[]}],"summary":"Supprimer un stock (seulement si vide)","tags":["Stocks"]}},"/api/stocks/{id}/adjust":{"patch":{"description":"ADD: Ajouter une quantité, SUBTRACT: Retirer une quantité, SET: Définir la quantité exacte","operationId":"StocksController_adjust","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdjustStockDto"}}}},"responses":{"200":{"description":"Stock ajusté avec succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockResponseDto"}}}},"400":{"description":"Quantité invalide"},"404":{"description":"Stock non trouvé"}},"security":[{"bearer":[]}],"summary":"Ajuster un stock (ajouter, retirer ou définir)","tags":["Stocks"]}},"/api/stocks/{id}/reserve":{"patch":{"operationId":"StocksController_reserve","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReserveStockDto"}}}},"responses":{"200":{"description":"Stock réservé avec succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockResponseDto"}}}},"400":{"description":"Stock disponible insuffisant"},"404":{"description":"Stock non trouvé"}},"security":[{"bearer":[]}],"summary":"Réserver du stock","tags":["Stocks"]}},"/api/stocks/{id}/release-reservation":{"patch":{"operationId":"StocksController_releaseReservation","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Réservation libérée avec succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockResponseDto"}}}},"400":{"description":"Quantité réservée insuffisante"},"404":{"description":"Stock non trouvé"}},"security":[{"bearer":[]}],"summary":"Libérer une réservation de stock","tags":["Stocks"]}},"/api/stocks/my-laboratory":{"get":{"description":"Récupère tous les produits disponibles dans le laboratoire du technicien connecté","operationId":"StocksController_getMyLaboratoryStocks","parameters":[{"name":"page","required":false,"in":"query","description":"Numéro de page","schema":{"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Nombre d'éléments par page","schema":{"example":20,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Recherche par nom ou référence de produit","schema":{"type":"string"}},{"name":"availableOnly","required":false,"in":"query","description":"Afficher uniquement les produits disponibles (quantité > 0)","schema":{"example":true,"type":"boolean"}}],"responses":{"200":{"description":"Stocks du laboratoire récupérés avec succès"},"400":{"description":"Technicien non assigné à un laboratoire"}},"security":[{"bearer":[]}],"summary":"Stocks de mon laboratoire","tags":["Stocks"]}},"/api/orders/proformas":{"post":{"operationId":"OrdersController_createProforma","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProformaDto"}}}},"responses":{"201":{"description":"Proforma créée avec succès"}},"security":[{"bearer":[]}],"summary":"Créer une demande de proforma","tags":["Orders"]},"get":{"operationId":"OrdersController_findAllProformas","parameters":[{"name":"search","required":false,"in":"query","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string","enum":["DRAFT","SENT","RECEIVED","VALIDATED","REJECTED","CONVERTED"]}},{"name":"supplierId","required":false,"in":"query","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"default":10,"type":"number"}},{"name":"sortBy","required":false,"in":"query","schema":{"default":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","schema":{"default":"desc","type":"string"}}],"responses":{"200":{"description":"Liste des proformas"}},"security":[{"bearer":[]}],"summary":"Récupérer toutes les proformas","tags":["Orders"]}},"/api/orders/proformas/{id}":{"get":{"operationId":"OrdersController_findOneProforma","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Proforma récupérée"},"404":{"description":"Proforma non trouvée"}},"security":[{"bearer":[]}],"summary":"Récupérer une proforma par son ID","tags":["Orders"]},"patch":{"operationId":"OrdersController_updateProforma","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProformaDto"}}}},"responses":{"200":{"description":"Proforma mise à jour"}},"security":[{"bearer":[]}],"summary":"Mettre à jour une proforma avec les prix reçus","tags":["Orders"]},"delete":{"operationId":"OrdersController_deleteProforma","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Proforma supprimée"}},"security":[{"bearer":[]}],"summary":"Supprimer une proforma","tags":["Orders"]}},"/api/orders/proformas/{id}/send-form":{"patch":{"operationId":"OrdersController_sendProforma","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Formulaire envoyé au fournisseur"}},"security":[{"bearer":[]}],"summary":"Envoyer le formulaire de proforma au fournisseur par email (legacy)","tags":["Orders"]}},"/api/orders/proformas/{id}/send-to-all":{"patch":{"operationId":"OrdersController_sendProformaToAll","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Formulaire envoyé à tous les fournisseurs"}},"security":[{"bearer":[]}],"summary":"Envoyer le formulaire de proforma à tous les fournisseurs associés","tags":["Orders"]}},"/api/orders/proformas/{id}/validate":{"patch":{"operationId":"OrdersController_validateProforma","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateProformaDto"}}}},"responses":{"200":{"description":"Proforma validée"}},"security":[{"bearer":[]}],"summary":"Valider une proforma (avec possibilité d'ajuster les prix)","tags":["Orders"]}},"/api/orders/proformas/{id}/reject":{"patch":{"operationId":"OrdersController_rejectProforma","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectProformaDto"}}}},"responses":{"200":{"description":"Proforma rejetée"}},"security":[{"bearer":[]}],"summary":"Rejeter une proforma","tags":["Orders"]}},"/api/orders/proformas/{id}/reset-to-draft":{"patch":{"operationId":"OrdersController_resetProformaToDraft","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Proforma remise en brouillon"}},"security":[{"bearer":[]}],"summary":"Remettre une proforma rejetée en brouillon pour modification","tags":["Orders"]}},"/api/orders/proformas/{id}/select-supplier":{"patch":{"operationId":"OrdersController_selectSupplierForProforma","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Fournisseur sélectionné avec succès"}},"security":[{"bearer":[]}],"summary":"Sélectionner un fournisseur spécifique pour une proforma multi-supplier","tags":["Orders"]}},"/api/orders/proformas/{id}/supplier-responses":{"get":{"operationId":"OrdersController_getProformaSupplierResponses","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Réponses des fournisseurs récupérées"}},"security":[{"bearer":[]}],"summary":"Récupérer toutes les réponses des fournisseurs pour comparaison","tags":["Orders"]}},"/api/orders":{"post":{"operationId":"OrdersController_createOrder","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOrderDto"}}}},"responses":{"201":{"description":"Commande créée"}},"security":[{"bearer":[]}],"summary":"Créer une commande directement (sans proforma)","tags":["Orders"]},"get":{"operationId":"OrdersController_findAllOrders","parameters":[{"name":"search","required":false,"in":"query","schema":{"example":"CMD","type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string","enum":["DRAFT","WAITING_PROFORMA","PROFORMA_RECEIVED","PENDING_APPROVAL","APPROVED","ORDERED","PARTIALLY_RECEIVED","RECEIVED","CANCELLED"]}},{"name":"supplierId","required":false,"in":"query","schema":{"example":"supplier-id-123","type":"string"}},{"name":"fromProforma","required":false,"in":"query","schema":{"type":"boolean"}},{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"sortBy","required":false,"in":"query","schema":{"default":"createdAt","example":"orderDate","type":"string"}},{"name":"sortOrder","required":false,"in":"query","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Liste des commandes"}},"security":[{"bearer":[]}],"summary":"Récupérer toutes les commandes","tags":["Orders"]}},"/api/orders/from-proforma":{"post":{"operationId":"OrdersController_createOrderFromProforma","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOrderFromProformaDto"}}}},"responses":{"201":{"description":"Commande créée depuis proforma"}},"security":[{"bearer":[]}],"summary":"Créer une commande à partir d'une proforma","tags":["Orders"]}},"/api/orders/statistics":{"get":{"operationId":"OrdersController_getStatistics","parameters":[],"responses":{"200":{"description":"Statistiques récupérées"}},"security":[{"bearer":[]}],"summary":"Récupérer les statistiques","tags":["Orders"]}},"/api/orders/debug/check-dates":{"get":{"operationId":"OrdersController_debugCheckDates","parameters":[],"responses":{"200":{"description":"Dates de commandes vérifiées"}},"security":[{"bearer":[]}],"summary":"Debug - Vérifier les dates des commandes","tags":["Orders"]}},"/api/orders/suppliers/available":{"get":{"operationId":"OrdersController_getAvailableSuppliers","parameters":[],"responses":{"200":{"description":"Liste des fournisseurs disponibles"}},"security":[{"bearer":[]}],"summary":"Récupérer la liste des fournisseurs disponibles pour proformas","tags":["Orders"]}},"/api/orders/{id}":{"get":{"operationId":"OrdersController_findOneOrder","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Commande récupérée"},"404":{"description":"Commande non trouvée"}},"security":[{"bearer":[]}],"summary":"Récupérer une commande par son ID","tags":["Orders"]},"patch":{"operationId":"OrdersController_updateOrder","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOrderDto"}}}},"responses":{"200":{"description":"Commande mise à jour"}},"security":[{"bearer":[]}],"summary":"Mettre à jour une commande en brouillon","tags":["Orders"]}},"/api/orders/{id}/approve":{"patch":{"operationId":"OrdersController_approveOrder","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Commande approuvée"}},"security":[{"bearer":[]}],"summary":"Approuver une commande","tags":["Orders"]}},"/api/orders/{id}/send":{"patch":{"operationId":"OrdersController_sendOrder","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Bon pour accord envoyé par email"}},"security":[{"bearer":[]}],"summary":"Envoyer le bon pour accord au fournisseur par email","tags":["Orders"]}},"/api/orders/{id}/receive":{"patch":{"operationId":"OrdersController_receiveOrder","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReceiveOrderDto"}}}},"responses":{"200":{"description":"Commande réceptionnée"}},"security":[{"bearer":[]}],"summary":"Réceptionner une commande","tags":["Orders"]}},"/api/orders/received":{"get":{"operationId":"OrdersController_findReceivedOrders","parameters":[],"responses":{"200":{"description":"Liste des commandes reçues"}},"security":[{"bearer":[]}],"summary":"Liste des commandes reçues","tags":["Orders"]}},"/api/orders/{id}/cancel":{"patch":{"operationId":"OrdersController_cancelOrder","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Commande annulée"}},"security":[{"bearer":[]}],"summary":"Annuler une commande","tags":["Orders"]}},"/api/api/mail/test":{"get":{"operationId":"MailController_testConfiguration","parameters":[],"responses":{"200":{"description":"Test de configuration"}},"summary":"Tester la configuration email","tags":["Mail"]}},"/api/api/mail/test-send":{"post":{"operationId":"MailController_sendTestEmail","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestEmailDto"}}}},"responses":{"200":{"description":"Email de test envoyé"},"400":{"description":"Erreur lors de l'envoi"}},"summary":"Envoyer un email de test","tags":["Mail"]}},"/api/api/mail/test-proforma":{"post":{"operationId":"MailController_sendTestProforma","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestEmailDto"}}}},"responses":{"200":{"description":"Email de proforma de test envoyé"}},"summary":"Envoyer un email de proforma de test","tags":["Mail"]}},"/api/proforma-forms/test/page":{"get":{"operationId":"ProformaFormsController_testPage","parameters":[],"responses":{"200":{"description":""}},"summary":"Page de test du formulaire HTML","tags":["Proforma Forms"]}},"/api/proforma-forms/test/generate-token/{proformaId}":{"get":{"operationId":"ProformaFormsController_generateTestToken","parameters":[{"name":"proformaId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Générer un token de test pour une proforma","tags":["Proforma Forms"]}},"/api/proforma-forms/{token}":{"get":{"operationId":"ProformaFormsController_showForm","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}},{"name":"supplierId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Afficher le formulaire de proforma","tags":["Proforma Forms"]}},"/api/proforma-forms/{token}/submit":{"post":{"operationId":"ProformaFormsController_submitForm","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitProformaFormDto"}}}},"responses":{"200":{"description":"Formulaire soumis avec succès"},"404":{"description":"Formulaire introuvable ou expiré"}},"summary":"Soumettre le formulaire de proforma","tags":["Proforma Forms"]}},"/api/receptions":{"post":{"description":"Enregistre la réception partielle ou totale d'une commande","operationId":"ReceptionsController_createReception","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateReceptionDto"}}}},"responses":{"201":{"description":"Réception créée avec succès"},"400":{"description":"Données invalides ou quantités dépassées"},"404":{"description":"Commande non trouvée"}},"security":[{"bearer":[]}],"summary":"Créer une réception de commande","tags":["Réceptions de commandes"]},"get":{"description":"Liste paginée de toutes les réceptions de commandes","operationId":"ReceptionsController_getAllReceptions","parameters":[{"name":"page","required":false,"in":"query","description":"Numéro de page","schema":{"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Nombre d'éléments par page","schema":{"example":10,"type":"number"}}],"responses":{"200":{"description":"Liste des réceptions récupérée avec succès"}},"security":[{"bearer":[]}],"summary":"Récupérer toutes les réceptions","tags":["Réceptions de commandes"]}},"/api/receptions/order/{orderId}":{"get":{"description":"Liste toutes les réceptions effectuées pour une commande spécifique","operationId":"ReceptionsController_getReceptionsByOrder","parameters":[{"name":"orderId","required":true,"in":"path","description":"ID de la commande","schema":{"example":"cmdkib5b60009gyqat8847mgf","type":"string"}}],"responses":{"200":{"description":"Réceptions de la commande récupérées avec succès"},"404":{"description":"Commande non trouvée"}},"security":[{"bearer":[]}],"summary":"Récupérer les réceptions d'une commande","tags":["Réceptions de commandes"]}},"/api/receptions/{id}":{"get":{"description":"Détails complets d'une réception spécifique","operationId":"ReceptionsController_getReceptionById","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la réception","schema":{"type":"string"}}],"responses":{"200":{"description":"Réception récupérée avec succès"},"404":{"description":"Réception non trouvée"}},"security":[{"bearer":[]}],"summary":"Récupérer une réception par son ID","tags":["Réceptions de commandes"]}},"/api/dispatches":{"post":{"description":"Envoie des produits d'une commande reçue vers un laboratoire spécifique et notifie les responsables","operationId":"DispatchesController_createDispatch","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDispatchDto"}}}},"responses":{"201":{"description":"Dispatch créé avec succès et notifications envoyées"},"400":{"description":"Données invalides ou quantités dépassées"},"404":{"description":"Commande ou laboratoire non trouvé"}},"security":[{"bearer":[]}],"summary":"Dispatcher des produits vers un laboratoire","tags":["Dispatches de commandes"]},"get":{"description":"Liste paginée de tous les dispatches de commandes","operationId":"DispatchesController_getAllDispatches","parameters":[{"name":"page","required":false,"in":"query","description":"Numéro de page","schema":{"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Nombre d'éléments par page","schema":{"example":10,"type":"number"}}],"responses":{"200":{"description":"Liste des dispatches récupérée avec succès"}},"security":[{"bearer":[]}],"summary":"Récupérer tous les dispatches","tags":["Dispatches de commandes"]}},"/api/dispatches/statistics":{"get":{"description":"Statistiques globales sur les dispatches de commandes","operationId":"DispatchesController_getStatistics","parameters":[],"responses":{"200":{"description":"Statistiques récupérées avec succès"}},"security":[{"bearer":[]}],"summary":"Récupérer les statistiques de dispatch","tags":["Dispatches de commandes"]}},"/api/dispatches/order/{orderId}":{"get":{"description":"Liste tous les dispatches effectués pour une commande spécifique","operationId":"DispatchesController_getDispatchesByOrder","parameters":[{"name":"orderId","required":true,"in":"path","description":"ID de la commande","schema":{"example":"cmd123","type":"string"}}],"responses":{"200":{"description":"Dispatches de la commande récupérés avec succès"},"404":{"description":"Commande non trouvée"}},"security":[{"bearer":[]}],"summary":"Récupérer les dispatches d'une commande","tags":["Dispatches de commandes"]}},"/api/dispatches/laboratory/{laboratoryId}":{"get":{"description":"Liste tous les dispatches reçus par un laboratoire spécifique","operationId":"DispatchesController_getDispatchesByLaboratory","parameters":[{"name":"laboratoryId","required":true,"in":"path","description":"ID du laboratoire","schema":{"example":"lab123","type":"string"}},{"name":"page","required":false,"in":"query","description":"Numéro de page","schema":{"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Nombre d'éléments par page","schema":{"example":10,"type":"number"}}],"responses":{"200":{"description":"Dispatches du laboratoire récupérés avec succès"},"404":{"description":"Laboratoire non trouvé"}},"security":[{"bearer":[]}],"summary":"Récupérer les dispatches d'un laboratoire","tags":["Dispatches de commandes"]}},"/api/dispatches/{id}/receive":{"patch":{"description":"Confirme la réception d'un dispatch par le laboratoire destinataire","operationId":"DispatchesController_receiveDispatch","parameters":[{"name":"id","required":true,"in":"path","description":"ID du dispatch","schema":{"type":"string"}}],"responses":{"200":{"description":"Dispatch marqué comme reçu"},"400":{"description":"Dispatch déjà reçu ou statut invalide"},"404":{"description":"Dispatch non trouvé"}},"security":[{"bearer":[]}],"summary":"Marquer un dispatch comme reçu","tags":["Dispatches de commandes"]}},"/api/dispatches/{id}":{"get":{"description":"Détails complets d'un dispatch spécifique","operationId":"DispatchesController_getDispatchById","parameters":[{"name":"id","required":true,"in":"path","description":"ID du dispatch","schema":{"type":"string"}}],"responses":{"200":{"description":"Dispatch récupéré avec succès"},"404":{"description":"Dispatch non trouvé"}},"security":[{"bearer":[]}],"summary":"Récupérer un dispatch par son ID","tags":["Dispatches de commandes"]}},"/api/stock-exits":{"post":{"description":"Enregistre une sortie de stock pour un laboratoire. Met à jour automatiquement les stocks et crée les mouvements.","operationId":"StockExitsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateStockExitDto"}}}},"responses":{"201":{"description":"Sortie de stock créée avec succès"},"400":{"description":"Stock insuffisant ou données invalides"},"404":{"description":"Laboratoire ou produit non trouvé"}},"security":[{"bearer":[]}],"summary":"Créer une sortie de stock","tags":["Sorties de stock"]},"get":{"description":"Liste paginée avec filtres optionnels","operationId":"StockExitsController_findAll","parameters":[{"name":"page","required":false,"in":"query","description":"Numéro de page","schema":{"default":1,"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Nombre d'éléments par page","schema":{"default":10,"example":10,"type":"number"}},{"name":"laboratoryId","required":false,"in":"query","description":"ID du laboratoire","schema":{"example":"lab123","type":"string"}},{"name":"technicianId","required":false,"in":"query","description":"ID du technicien","schema":{"example":"user123","type":"string"}},{"name":"analysisType","required":false,"in":"query","description":"Type d'analyse","schema":{"type":"string","enum":["MICROBIOLOGIE_BACTERIENNE","MICROBIOLOGIE_VIRALE","PHYSICO_CHIMIE_METAUX","PHYSICO_CHIMIE_ORGANIQUES","BIOLOGIE_HEMATOLOGIE","BIOLOGIE_BIOCHIMIE","AUTRE"]}},{"name":"startDate","required":false,"in":"query","description":"Date de début (format ISO)","schema":{"example":"2025-01-01T00:00:00.000Z","type":"string"}},{"name":"endDate","required":false,"in":"query","description":"Date de fin (format ISO)","schema":{"example":"2025-01-31T23:59:59.999Z","type":"string"}},{"name":"search","required":false,"in":"query","description":"Recherche par numéro de sortie ou échantillon","schema":{"example":"EXIT-2025","type":"string"}}],"responses":{"200":{"description":"Liste des sorties récupérée avec succès"}},"security":[{"bearer":[]}],"summary":"Récupérer toutes les sorties de stock","tags":["Sorties de stock"]}},"/api/stock-exits/statistics":{"get":{"description":"Statistiques globales sur les sorties de stock","operationId":"StockExitsController_getStatistics","parameters":[{"name":"laboratoryId","required":false,"in":"query","description":"Filtrer par laboratoire","schema":{"type":"string"}},{"name":"startDate","required":false,"in":"query","description":"Date de début (ISO)","schema":{"type":"string"}},{"name":"endDate","required":false,"in":"query","description":"Date de fin (ISO)","schema":{"type":"string"}}],"responses":{"200":{"description":"Statistiques récupérées avec succès"}},"security":[{"bearer":[]}],"summary":"Récupérer les statistiques des sorties","tags":["Sorties de stock"]}},"/api/stock-exits/{id}":{"get":{"description":"Détails complets d'une sortie de stock","operationId":"StockExitsController_findOne","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la sortie","schema":{"type":"string"}}],"responses":{"200":{"description":"Sortie récupérée avec succès"},"404":{"description":"Sortie non trouvée"}},"security":[{"bearer":[]}],"summary":"Récupérer une sortie par son ID","tags":["Sorties de stock"]},"delete":{"description":"Annule une sortie de stock (moins de 24h uniquement). Remet les quantités en stock.","operationId":"StockExitsController_remove","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la sortie à annuler","schema":{"type":"string"}}],"responses":{"200":{"description":"Sortie annulée avec succès"},"400":{"description":"Impossible d'annuler une sortie de plus de 24h"},"404":{"description":"Sortie non trouvée"}},"security":[{"bearer":[]}],"summary":"Annuler une sortie de stock","tags":["Sorties de stock"]}},"/api/stock-exits/{id}/validate":{"post":{"description":"Permet au responsable de laboratoire de valider une sortie","operationId":"StockExitsController_validateExit","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la sortie à valider","schema":{"type":"string"}}],"responses":{"200":{"description":"Sortie validée avec succès"},"400":{"description":"Sortie déjà validée ou rejetée"}},"security":[{"bearer":[]}],"summary":"Valider une sortie de stock","tags":["Sorties de stock"]}},"/api/stock-exits/{id}/reject":{"post":{"description":"Permet au responsable de laboratoire de rejeter une sortie","operationId":"StockExitsController_rejectExit","parameters":[{"name":"id","required":true,"in":"path","description":"ID de la sortie à rejeter","schema":{"type":"string"}}],"responses":{"200":{"description":"Sortie rejetée avec succès"}},"security":[{"bearer":[]}],"summary":"Rejeter une sortie de stock","tags":["Sorties de stock"]}},"/api/stock-exits/pending/list":{"get":{"description":"Liste des sorties avec statut PENDING","operationId":"StockExitsController_getPendingExits","parameters":[{"name":"laboratoryId","required":false,"in":"query","description":"Filtrer par laboratoire","schema":{"type":"string"}}],"responses":{"200":{"description":"Liste des sorties en attente"}},"security":[{"bearer":[]}],"summary":"Récupérer les sorties en attente de validation","tags":["Sorties de stock"]}},"/api/stock-exits/user/my-exits":{"get":{"description":"Liste des sorties créées par l'utilisateur connecté","operationId":"StockExitsController_getMyExits","parameters":[{"name":"page","required":false,"in":"query","description":"Numéro de page","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Éléments par page","schema":{"type":"number"}}],"responses":{"200":{"description":"Liste de mes sorties"}},"security":[{"bearer":[]}],"summary":"Récupérer mes sorties de stock","tags":["Sorties de stock"]}},"/api/stock-exits/statistics/detailed":{"get":{"description":"Statistiques complètes : jour, semaine, mois, coût total, répartition","operationId":"StockExitsController_getDetailedStatistics","parameters":[{"name":"laboratoryId","required":false,"in":"query","description":"Filtrer par laboratoire","schema":{"type":"string"}}],"responses":{"200":{"description":"Statistiques détaillées"}},"security":[{"bearer":[]}],"summary":"Statistiques détaillées des sorties","tags":["Sorties de stock"]}},"/api/stock-exits/quick/{productId}":{"post":{"description":"Permet au technicien de faire une sortie rapide directement depuis un produit de son laboratoire. Vérifie automatiquement la disponibilité.","operationId":"StockExitsController_quickExit","parameters":[{"name":"productId","required":true,"in":"path","description":"ID du produit à sortir","schema":{"example":"prod123","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuickStockExitDto"}}}},"responses":{"201":{"description":"Sortie rapide créée avec succès"},"400":{"description":"Quantité insuffisante ou données invalides"},"404":{"description":"Produit non trouvé ou non disponible dans ce laboratoire"}},"security":[{"bearer":[]}],"summary":"Sortie rapide d'un produit","tags":["Sorties de stock"]}},"/api/stock-exits/technician/my-exits":{"get":{"description":"Récupère toutes les sorties du technicien connecté avec possibilité de filtrer par status (PENDING, VALIDATED, REJECTED).","operationId":"StockExitsController_getTechnicianExits","parameters":[{"name":"status","required":false,"in":"query","description":"Filtrer par status des sorties","schema":{"enum":["PENDING","VALIDATED","REJECTED"],"type":"string"}},{"name":"search","required":false,"in":"query","description":"Recherche par numéro de sortie ou d'échantillon","schema":{"example":"SAMPLE-2025","type":"string"}},{"name":"page","required":false,"in":"query","description":"Numéro de page","schema":{"minimum":1,"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Nombre d'éléments par page","schema":{"minimum":1,"example":10,"type":"number"}}],"responses":{"200":{"description":"Sorties du technicien récupérées avec succès"}},"security":[{"bearer":[]}],"summary":"Mes sorties de stock","tags":["Sorties de stock"]}},"/api/stock-exits/technician/statistics":{"get":{"description":"Statistiques personnelles du technicien : sorties du jour/semaine/mois, statuts, tendances.","operationId":"StockExitsController_getTechnicianStatistics","parameters":[],"responses":{"200":{"description":"Statistiques du technicien récupérées avec succès","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"type":"object","properties":{"technician":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"},"laboratory":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"}}}}},"periods":{"type":"object","properties":{"today":{"type":"object","properties":{"exits":{"type":"number"},"totalQuantity":{"type":"number"}}},"week":{"type":"object","properties":{"exits":{"type":"number"},"totalQuantity":{"type":"number"}}},"month":{"type":"object","properties":{"exits":{"type":"number"},"totalQuantity":{"type":"number"},"totalValue":{"type":"number"}}}}},"status":{"type":"object","properties":{"pending":{"type":"number"},"validated":{"type":"number"},"rejected":{"type":"number"},"total":{"type":"number"},"validationRate":{"type":"number"}}}}}}}}}}},"security":[{"bearer":[]}],"summary":"Statistiques du technicien","tags":["Sorties de stock"]}},"/api/stock-exits/technician/{technicianId}/statistics":{"get":{"description":"Permet aux responsables de consulter les statistiques d'un technicien particulier.","operationId":"StockExitsController_getSpecificTechnicianStatistics","parameters":[{"name":"technicianId","required":true,"in":"path","description":"ID du technicien","schema":{"example":"user123","type":"string"}}],"responses":{"200":{"description":"Statistiques du technicien récupérées avec succès"},"404":{"description":"Technicien non trouvé"}},"security":[{"bearer":[]}],"summary":"Statistiques d'un technicien spécifique","tags":["Sorties de stock"]}},"/api/stock-exits/technicians/overview":{"get":{"description":"Statistiques comparatives de tous les techniciens : activité, performance, sorties en attente.","operationId":"StockExitsController_getAllTechniciansStatistics","parameters":[{"name":"laboratoryId","required":false,"in":"query","description":"Filtrer par laboratoire","schema":{"example":"lab123","type":"string"}}],"responses":{"200":{"description":"Vue d'ensemble des statistiques récupérée avec succès","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"type":"object","properties":{"summary":{"type":"object","properties":{"totalTechnicians":{"type":"number"},"activeTechnicians":{"type":"number"},"totalExitsToday":{"type":"number"},"totalExitsWeek":{"type":"number"},"totalExitsMonth":{"type":"number"},"totalPending":{"type":"number"},"totalValidated":{"type":"number"},"globalValidationRate":{"type":"number"}}},"technicians":{"type":"array","items":{"type":"object","properties":{"technician":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"},"laboratory":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"}}}}},"stats":{"type":"object","properties":{"today":{"type":"number"},"week":{"type":"number"},"month":{"type":"number"},"pending":{"type":"number"},"validated":{"type":"number"},"total":{"type":"number"},"validationRate":{"type":"number"}}}}}}}}}}}}}},"security":[{"bearer":[]}],"summary":"Vue d'ensemble des statistiques de tous les techniciens","tags":["Sorties de stock"]}},"/api/stock-exits/samples/{sampleId}/code":{"post":{"description":"Permet de saisir manuellement le code d'un échantillon après sa création","operationId":"StockExitsController_updateSampleCode","parameters":[{"name":"sampleId","required":true,"in":"path","description":"ID de l'échantillon","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSampleCodeDto"}}}},"responses":{"200":{"description":"Code d'échantillon mis à jour avec succès"},"400":{"description":"Code déjà existant ou données invalides"},"404":{"description":"Échantillon non trouvé"}},"security":[{"bearer":[]}],"summary":"Mettre à jour le code d'un échantillon","tags":["Sorties de stock"]}},"/api/stock-exits/conversions/validate":{"post":{"operationId":"StockExitConversionController_validateExit","parameters":[],"responses":{"201":{"description":""}},"tags":["StockExitConversion"]}},"/api/stock-exits/conversions/validate-multiple":{"post":{"operationId":"StockExitConversionController_validateMultipleExits","parameters":[],"responses":{"201":{"description":""}},"tags":["StockExitConversion"]}},"/api/stock-exits/conversions/to-base-unit":{"post":{"operationId":"StockExitConversionController_convertToBaseUnit","parameters":[],"responses":{"201":{"description":""}},"tags":["StockExitConversion"]}},"/api/notifications":{"get":{"operationId":"NotificationsController_getNotifications","parameters":[{"name":"limit","required":false,"in":"query","schema":{"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"Notifications récupérées avec succès"}},"security":[{"bearer":[]}],"summary":"Récupérer les notifications de l'utilisateur connecté","tags":["Notifications"]}},"/api/notifications/unread":{"get":{"operationId":"NotificationsController_getUnreadNotifications","parameters":[],"responses":{"200":{"description":"Notifications non lues récupérées avec succès"}},"security":[{"bearer":[]}],"summary":"Récupérer les notifications non lues","tags":["Notifications"]}},"/api/notifications/stats":{"get":{"operationId":"NotificationsController_getConnectionStats","parameters":[],"responses":{"200":{"description":"Statistiques récupérées avec succès"}},"security":[{"bearer":[]}],"summary":"Obtenir les statistiques de connexion WebSocket","tags":["Notifications"]}},"/api/notifications/test":{"post":{"operationId":"NotificationsController_createTestNotification","parameters":[],"responses":{"201":{"description":"Notification de test créée avec succès"}},"security":[{"bearer":[]}],"summary":"Créer une notification de test (développement)","tags":["Notifications"]}},"/api/notifications/{id}/read":{"put":{"operationId":"NotificationsController_markAsRead","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Notification marquée comme lue"}},"security":[{"bearer":[]}],"summary":"Marquer une notification comme lue","tags":["Notifications"]}},"/api/notifications/read-all":{"put":{"operationId":"NotificationsController_markAllAsRead","parameters":[],"responses":{"200":{"description":"Toutes les notifications ont été marquées comme lues"}},"security":[{"bearer":[]}],"summary":"Marquer toutes les notifications comme lues","tags":["Notifications"]}},"/api/notifications/{id}":{"delete":{"operationId":"NotificationsController_deleteNotification","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Notification supprimée avec succès"}},"security":[{"bearer":[]}],"summary":"Supprimer une notification","tags":["Notifications"]}},"/api/units/families":{"get":{"operationId":"UnitsController_getAllFamilies","parameters":[],"responses":{"200":{"description":""}},"tags":["Units"]}},"/api/units/families/{familyId}":{"get":{"operationId":"UnitsController_getUnitsByFamily","parameters":[{"name":"familyId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Units"]}},"/api/units/check-compatibility":{"post":{"operationId":"UnitsController_checkCompatibility","parameters":[],"responses":{"201":{"description":""}},"tags":["Units"]}},"/api/units/convert":{"post":{"operationId":"UnitsController_convertQuantity","parameters":[],"responses":{"201":{"description":""}},"tags":["Units"]}},"/api/units/check-availability":{"post":{"operationId":"UnitsController_checkAvailability","parameters":[],"responses":{"201":{"description":""}},"tags":["Units"]}},"/api/units/{unit}":{"get":{"operationId":"UnitsController_getUnitInfo","parameters":[{"name":"unit","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Units"]}},"/api/restock-requests":{"post":{"operationId":"RestockRequestsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRestockRequestDto"}}}},"responses":{"201":{"description":"Demande créée avec succès"}},"security":[{"bearer":[]}],"summary":"Créer une demande de réapprovisionnement","tags":["Restock Requests"]},"get":{"operationId":"RestockRequestsController_findAll","parameters":[{"name":"status","required":true,"in":"query","schema":{"type":"string"}},{"name":"priority","required":true,"in":"query","schema":{"type":"string"}},{"name":"fromDate","required":true,"in":"query","schema":{"type":"string"}},{"name":"toDate","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Liste des demandes"}},"security":[{"bearer":[]}],"summary":"Lister toutes les demandes de réapprovisionnement","tags":["Restock Requests"]}},"/api/restock-requests/statistics":{"get":{"operationId":"RestockRequestsController_getStatistics","parameters":[],"responses":{"200":{"description":"Statistiques"}},"security":[{"bearer":[]}],"summary":"Obtenir les statistiques des demandes","tags":["Restock Requests"]}},"/api/restock-requests/{id}":{"get":{"operationId":"RestockRequestsController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Demande trouvée"},"404":{"description":"Demande non trouvée"}},"security":[{"bearer":[]}],"summary":"Obtenir une demande par ID","tags":["Restock Requests"]},"patch":{"operationId":"RestockRequestsController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRestockRequestDto"}}}},"responses":{"200":{"description":"Demande modifiée"}},"security":[{"bearer":[]}],"summary":"Modifier une demande","tags":["Restock Requests"]},"delete":{"operationId":"RestockRequestsController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Demande supprimée"}},"security":[{"bearer":[]}],"summary":"Supprimer une demande","tags":["Restock Requests"]}},"/api/restock-requests/{id}/submit":{"post":{"operationId":"RestockRequestsController_submit","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Demande soumise"}},"security":[{"bearer":[]}],"summary":"Soumettre une demande pour validation","tags":["Restock Requests"]}},"/api/restock-requests/{id}/validate":{"post":{"operationId":"RestockRequestsController_validate","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateRestockRequestDto"}}}},"responses":{"200":{"description":"Demande validée"}},"security":[{"bearer":[]}],"summary":"Valider une demande (Responsable Labo)","tags":["Restock Requests"]}},"/api/restock-requests/{id}/reject-by-lab-manager":{"post":{"operationId":"RestockRequestsController_rejectByLabManager","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectRestockRequestDto"}}}},"responses":{"200":{"description":"Demande rejetée"}},"security":[{"bearer":[]}],"summary":"Rejeter une demande (Responsable Labo)","tags":["Restock Requests"]}},"/api/restock-requests/{id}/approve":{"post":{"operationId":"RestockRequestsController_approve","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Demande approuvée"}},"security":[{"bearer":[]}],"summary":"Approuver une demande (Responsable Achat)","tags":["Restock Requests"]}},"/api/restock-requests/{id}/approved-quantities":{"patch":{"operationId":"RestockRequestsController_updateApprovedQuantities","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Quantités approuvées mises à jour"}},"security":[{"bearer":[]}],"summary":"Mettre à jour les quantités approuvées par article","tags":["Restock Requests"]}},"/api/restock-requests/{id}/reject-by-purchase-manager":{"post":{"operationId":"RestockRequestsController_rejectByPurchaseManager","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectRestockRequestDto"}}}},"responses":{"200":{"description":"Demande rejetée"}},"security":[{"bearer":[]}],"summary":"Rejeter une demande (Responsable Achat)","tags":["Restock Requests"]}},"/api/restock-requests/{id}/convert-to-order":{"post":{"operationId":"RestockRequestsController_convertToOrder","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Demande convertie en commande"}},"security":[{"bearer":[]}],"summary":"Convertir une demande en commande","tags":["Restock Requests"]}},"/api/restock-requests/bulk-convert":{"post":{"operationId":"RestockRequestsController_bulkConvertToOrders","parameters":[],"responses":{"200":{"description":"Demandes converties en commandes"}},"security":[{"bearer":[]}],"summary":"Convertir plusieurs demandes en commandes en une seule opération","tags":["Restock Requests"]}},"/api/restock-requests/technician/my-requests":{"get":{"description":"Récupère toutes les demandes de réapprovisionnement créées par le technicien connecté","operationId":"RestockRequestsController_getTechnicianRestockRequests","parameters":[{"name":"status","required":true,"in":"query","schema":{"type":"string"}},{"name":"priority","required":true,"in":"query","schema":{"type":"string"}},{"name":"fromDate","required":true,"in":"query","schema":{"type":"string"}},{"name":"toDate","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Liste des demandes du technicien avec statistiques","content":{"application/json":{"schema":{"type":"object","properties":{"requests":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"requestNumber":{"type":"string"},"status":{"type":"string"},"priority":{"type":"string"},"reason":{"type":"string"},"requestDate":{"type":"string","format":"date-time"},"itemsCount":{"type":"number"},"totalEstimatedValue":{"type":"number"}}}},"statistics":{"type":"object","properties":{"total":{"type":"number"},"draft":{"type":"number"},"pendingValidation":{"type":"number"},"validated":{"type":"number"},"approved":{"type":"number"},"rejected":{"type":"number"}}}}}}}}},"security":[{"bearer":[]}],"summary":"Mes demandes de réapprovisionnement (Technicien)","tags":["Restock Requests"]}},"/api/restock-requests/technician/stats":{"get":{"description":"Récupère les statistiques des demandes de réapprovisionnement pour le technicien connecté","operationId":"RestockRequestsController_getTechnicianRestockStats","parameters":[],"responses":{"200":{"description":"Statistiques personnelles","content":{"application/json":{"schema":{"type":"object","properties":{"overview":{"type":"object","properties":{"totalRequests":{"type":"number"},"draftRequests":{"type":"number"},"pendingRequests":{"type":"number"},"validatedRequests":{"type":"number"},"approvedRequests":{"type":"number"},"rejectedRequests":{"type":"number"}}},"periods":{"type":"object","properties":{"thisWeek":{"type":"number"},"thisMonth":{"type":"number"},"thisYear":{"type":"number"}}},"topProducts":{"type":"array","items":{"type":"object","properties":{"productId":{"type":"string"},"productName":{"type":"string"},"requestCount":{"type":"number"},"totalQuantityRequested":{"type":"number"}}}},"recentActivity":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"requestNumber":{"type":"string"},"status":{"type":"string"},"requestDate":{"type":"string","format":"date-time"},"itemsCount":{"type":"number"}}}}}}}}}},"security":[{"bearer":[]}],"summary":"Statistiques personnelles du technicien","tags":["Restock Requests"]}},"/api/restock-requests/technician/urgent-needs":{"get":{"description":"Récupère les produits en rupture ou en stock faible pour le laboratoire du technicien","operationId":"RestockRequestsController_getUrgentNeeds","parameters":[],"responses":{"200":{"description":"Liste des produits nécessitant un réapprovisionnement urgent"}},"security":[{"bearer":[]}],"summary":"Besoins urgents du technicien","tags":["Restock Requests"]}},"/api/restock-requests/technician/suggested-products":{"get":{"description":"Suggestions basées sur l'historique des demandes du technicien","operationId":"RestockRequestsController_getSuggestedProducts","parameters":[],"responses":{"200":{"description":"Liste des produits suggérés"}},"security":[{"bearer":[]}],"summary":"Produits suggérés pour réapprovisionnement","tags":["Restock Requests"]}},"/api/lab-transfers":{"post":{"operationId":"LabTransfersController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLabTransferDto"}}}},"responses":{"201":{"description":"Transfert créé avec succès"}},"security":[{"bearer":[]}],"summary":"Créer une demande de transfert inter-laboratoires","tags":["Lab Transfers"]},"get":{"operationId":"LabTransfersController_findAll","parameters":[{"name":"status","required":true,"in":"query","schema":{"type":"string"}},{"name":"priority","required":true,"in":"query","schema":{"type":"string"}},{"name":"direction","required":true,"in":"query","schema":{"type":"string"}},{"name":"fromDate","required":true,"in":"query","schema":{"type":"string"}},{"name":"toDate","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Liste des transferts"}},"security":[{"bearer":[]}],"summary":"Lister tous les transferts inter-laboratoires","tags":["Lab Transfers"]}},"/api/lab-transfers/direct":{"post":{"operationId":"LabTransfersController_directTransfer","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLabTransferDto"}}}},"responses":{"201":{"description":"Transfert effectué immédiatement"}},"security":[{"bearer":[]}],"summary":"Transfert direct immédiat (sans workflow d'approbation)","tags":["Lab Transfers"]}},"/api/lab-transfers/statistics":{"get":{"operationId":"LabTransfersController_getStatistics","parameters":[],"responses":{"200":{"description":"Statistiques"}},"security":[{"bearer":[]}],"summary":"Obtenir les statistiques des transferts","tags":["Lab Transfers"]}},"/api/lab-transfers/{id}":{"get":{"operationId":"LabTransfersController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Transfert trouvé"},"404":{"description":"Transfert non trouvé"}},"security":[{"bearer":[]}],"summary":"Obtenir un transfert par ID","tags":["Lab Transfers"]},"patch":{"operationId":"LabTransfersController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLabTransferDto"}}}},"responses":{"200":{"description":"Transfert modifié"}},"security":[{"bearer":[]}],"summary":"Modifier un transfert","tags":["Lab Transfers"]},"delete":{"operationId":"LabTransfersController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Transfert supprimé"}},"security":[{"bearer":[]}],"summary":"Supprimer un transfert","tags":["Lab Transfers"]}},"/api/lab-transfers/{id}/respond":{"post":{"operationId":"LabTransfersController_respond","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RespondLabTransferDto"}}}},"responses":{"200":{"description":"Réponse enregistrée"}},"security":[{"bearer":[]}],"summary":"Répondre à une demande de transfert (accepter ou refuser)","tags":["Lab Transfers"]}},"/api/lab-transfers/{id}/complete":{"post":{"operationId":"LabTransfersController_complete","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Transfert complété"}},"security":[{"bearer":[]}],"summary":"Compléter un transfert (effectuer le mouvement de stock)","tags":["Lab Transfers"]}},"/api/lab-transfers/{id}/cancel":{"post":{"operationId":"LabTransfersController_cancel","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Transfert annulé"}},"security":[{"bearer":[]}],"summary":"Annuler un transfert","tags":["Lab Transfers"]}},"/api/lab-transfers/technician/my-requests":{"get":{"description":"Récupère toutes les demandes de transfert créées par le technicien connecté","operationId":"LabTransfersController_getTechnicianTransfers","parameters":[{"name":"status","required":true,"in":"query","schema":{"type":"string"}},{"name":"fromDate","required":true,"in":"query","schema":{"type":"string"}},{"name":"toDate","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Liste des demandes du technicien avec statistiques","content":{"application/json":{"schema":{"type":"object","properties":{"transfers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"transferNumber":{"type":"string"},"status":{"type":"string"},"priority":{"type":"string"},"reason":{"type":"string"},"requestDate":{"type":"string","format":"date-time"},"fromLaboratory":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}}},"toLaboratory":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}}},"itemsCount":{"type":"number"}}}},"statistics":{"type":"object","properties":{"total":{"type":"number"},"pending":{"type":"number"},"approved":{"type":"number"},"rejected":{"type":"number"},"completed":{"type":"number"}}}}}}}}},"security":[{"bearer":[]}],"summary":"Mes demandes de transfert (Technicien)","tags":["Lab Transfers"]}},"/api/lab-transfers/technician/stats":{"get":{"description":"Récupère les statistiques des transferts pour le technicien connecté","operationId":"LabTransfersController_getTechnicianStats","parameters":[],"responses":{"200":{"description":"Statistiques personnelles","content":{"application/json":{"schema":{"type":"object","properties":{"overview":{"type":"object","properties":{"totalRequests":{"type":"number"},"pendingRequests":{"type":"number"},"approvedRequests":{"type":"number"},"rejectedRequests":{"type":"number"},"completedRequests":{"type":"number"}}},"periods":{"type":"object","properties":{"thisWeek":{"type":"number"},"thisMonth":{"type":"number"},"thisYear":{"type":"number"}}},"topDestinations":{"type":"array","items":{"type":"object","properties":{"laboratoryId":{"type":"string"},"laboratoryName":{"type":"string"},"requestCount":{"type":"number"}}}},"recentActivity":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"transferNumber":{"type":"string"},"status":{"type":"string"},"requestDate":{"type":"string","format":"date-time"},"toLaboratory":{"type":"object","properties":{"name":{"type":"string"}}}}}}}}}}}},"security":[{"bearer":[]}],"summary":"Statistiques personnelles du technicien","tags":["Lab Transfers"]}},"/api/lab-transfers/technician/available-laboratories":{"get":{"description":"Liste des laboratoires vers lesquels le technicien peut faire une demande de transfert","operationId":"LabTransfersController_getAvailableLaboratories","parameters":[],"responses":{"200":{"description":"Liste des laboratoires disponibles"}},"security":[{"bearer":[]}],"summary":"Laboratoires disponibles pour transfert","tags":["Lab Transfers"]}},"/api/lab-transfers/notifications":{"get":{"description":"Récupère toutes les alertes liées aux transferts pour l'utilisateur connecté","operationId":"LabTransfersController_getTransferNotifications","parameters":[],"responses":{"200":{"description":"Liste des notifications de transfert"}},"security":[{"bearer":[]}],"summary":"Récupérer les notifications de transfert","tags":["Lab Transfers"]}},"/api/lab-transfers/notifications/{alertId}/read":{"patch":{"description":"Marque une alerte de transfert comme lue","operationId":"LabTransfersController_markNotificationAsRead","parameters":[{"name":"alertId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Notification marquée comme lue"}},"security":[{"bearer":[]}],"summary":"Marquer une notification comme lue","tags":["Lab Transfers"]}},"/api/alerts":{"get":{"operationId":"AlertsController_findAll","parameters":[{"name":"type","required":false,"in":"query","description":"Type d'alerte","schema":{"type":"string","enum":["STOCK_LOW","STOCK_CRITICAL","STOCK_OUT","PRODUCT_EXPIRING_SOON","PRODUCT_EXPIRING_URGENT","PRODUCT_EXPIRED","ORDER_PENDING_APPROVAL","ORDER_DELAYED","ORDER_RECEIVED","TRANSFER_PENDING","TRANSFER_APPROVED","TRANSFER_REJECTED","EQUIPMENT_MAINTENANCE_DUE","EQUIPMENT_MAINTENANCE_OVERDUE","EQUIPMENT_OUT_OF_ORDER","PRICE_DEVIATION","SUPPLIER_INACTIVE"]}},{"name":"priority","required":false,"in":"query","description":"Priorité de l'alerte","schema":{"type":"string","enum":["INFO","LOW","MEDIUM","HIGH","CRITICAL"]}},{"name":"isRead","required":false,"in":"query","description":"Filtrer par statut de lecture","schema":{"type":"boolean"}},{"name":"labId","required":false,"in":"query","description":"ID du laboratoire","schema":{"type":"string"}},{"name":"productId","required":false,"in":"query","description":"ID du produit","schema":{"type":"string"}},{"name":"fromDate","required":false,"in":"query","description":"Date de début","schema":{"type":"string"}},{"name":"toDate","required":false,"in":"query","description":"Date de fin","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page","schema":{"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Nombre d'éléments par page","schema":{"default":20,"type":"number"}}],"responses":{"200":{"description":"Liste des alertes"}},"security":[{"bearer":[]}],"summary":"Récupérer toutes les alertes avec filtres","tags":["Alerts"]}},"/api/alerts/statistics":{"get":{"operationId":"AlertsController_getStatistics","parameters":[],"responses":{"200":{"description":"Statistiques des alertes"}},"security":[{"bearer":[]}],"summary":"Obtenir les statistiques des alertes","tags":["Alerts"]}},"/api/alerts/configuration":{"get":{"operationId":"AlertsController_getConfiguration","parameters":[],"responses":{"200":{"description":"Configuration des alertes"}},"security":[{"bearer":[]}],"summary":"Obtenir la configuration des alertes","tags":["Alerts"]},"patch":{"operationId":"AlertsController_updateConfiguration","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAlertConfigDto"}}}},"responses":{"200":{"description":"Configuration mise à jour"}},"security":[{"bearer":[]}],"summary":"Mettre à jour la configuration des alertes","tags":["Alerts"]}},"/api/alerts/mark-as-read":{"post":{"operationId":"AlertsController_markAsRead","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkAlertsReadDto"}}}},"responses":{"200":{"description":"Alertes marquées comme lues"}},"security":[{"bearer":[]}],"summary":"Marquer des alertes comme lues","tags":["Alerts"]}},"/api/alerts/mark-all-as-read":{"post":{"operationId":"AlertsController_markAllAsRead","parameters":[],"responses":{"200":{"description":"Toutes les alertes marquées comme lues"}},"security":[{"bearer":[]}],"summary":"Marquer toutes les alertes comme lues","tags":["Alerts"]}},"/api/alerts/check-stock":{"post":{"operationId":"AlertsController_checkStockAlerts","parameters":[],"responses":{"200":{"description":"Vérification des stocks effectuée"}},"security":[{"bearer":[]}],"summary":"Vérifier manuellement les alertes de stock","tags":["Alerts"]}},"/api/alerts/check-expiration":{"post":{"operationId":"AlertsController_checkExpirationAlerts","parameters":[],"responses":{"200":{"description":"Vérification des expirations effectuée"}},"security":[{"bearer":[]}],"summary":"Vérifier manuellement les alertes d'expiration","tags":["Alerts"]}},"/api/alerts/check-equipment":{"post":{"operationId":"AlertsController_checkEquipmentAlerts","parameters":[],"responses":{"200":{"description":"Vérification des équipements effectuée"}},"security":[{"bearer":[]}],"summary":"Vérifier manuellement les alertes d'équipement","tags":["Alerts"]}},"/api/alerts/check-all":{"post":{"operationId":"AlertsController_checkAllAlerts","parameters":[],"responses":{"200":{"description":"Vérification complète effectuée"}},"security":[{"bearer":[]}],"summary":"Vérifier toutes les alertes (stock, expiration, équipement)","tags":["Alerts"]}},"/api/alerts/cleanup":{"post":{"operationId":"AlertsController_cleanupOldAlerts","parameters":[],"responses":{"200":{"description":"Nettoyage effectué"}},"security":[{"bearer":[]}],"summary":"Nettoyer les anciennes alertes lues","tags":["Alerts"]}},"/api/alerts/{id}":{"get":{"operationId":"AlertsController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Alerte trouvée"},"404":{"description":"Alerte non trouvée"}},"security":[{"bearer":[]}],"summary":"Obtenir une alerte par ID","tags":["Alerts"]},"delete":{"operationId":"AlertsController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Alerte supprimée"}},"security":[{"bearer":[]}],"summary":"Supprimer une alerte","tags":["Alerts"]}},"/api/stock-movements":{"post":{"operationId":"StockMovementsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateStockMovementDto"}}}},"responses":{"201":{"description":"Mouvement créé avec succès"},"400":{"description":"Données invalides ou stock insuffisant"}},"security":[{"bearer":[]}],"summary":"Créer un mouvement de stock manuel","tags":["Stock Movements"]},"get":{"operationId":"StockMovementsController_findAll","parameters":[{"name":"type","required":false,"in":"query","description":"Type de mouvement","schema":{"type":"string","enum":["ENTREE","SORTIE","TRANSFERT"]}},{"name":"productId","required":false,"in":"query","description":"ID du produit","schema":{"type":"string"}},{"name":"userId","required":false,"in":"query","description":"ID de l'utilisateur","schema":{"type":"string"}},{"name":"reference","required":false,"in":"query","description":"Référence (numéro de commande, transfert, etc.)","schema":{"type":"string"}},{"name":"fromDate","required":false,"in":"query","description":"Date de début","schema":{"type":"string"}},{"name":"toDate","required":false,"in":"query","description":"Date de fin","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page","schema":{"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Nombre d'éléments par page","schema":{"default":50,"type":"number"}},{"name":"sortBy","required":false,"in":"query","description":"Champ de tri","schema":{"default":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Ordre de tri","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Liste des mouvements de stock"}},"security":[{"bearer":[]}],"summary":"Récupérer tous les mouvements de stock avec filtres","tags":["Stock Movements"]}},"/api/stock-movements/statistics":{"get":{"operationId":"StockMovementsController_getStatistics","parameters":[{"name":"fromDate","required":true,"in":"query","schema":{"type":"string"}},{"name":"toDate","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Statistiques des mouvements"}},"security":[{"bearer":[]}],"summary":"Obtenir les statistiques des mouvements de stock","tags":["Stock Movements"]}},"/api/stock-movements/export":{"get":{"operationId":"StockMovementsController_export","parameters":[{"name":"type","required":false,"in":"query","description":"Type de mouvement","schema":{"type":"string","enum":["ENTREE","SORTIE","TRANSFERT"]}},{"name":"productId","required":false,"in":"query","description":"ID du produit","schema":{"type":"string"}},{"name":"userId","required":false,"in":"query","description":"ID de l'utilisateur","schema":{"type":"string"}},{"name":"reference","required":false,"in":"query","description":"Référence (numéro de commande, transfert, etc.)","schema":{"type":"string"}},{"name":"fromDate","required":false,"in":"query","description":"Date de début","schema":{"type":"string"}},{"name":"toDate","required":false,"in":"query","description":"Date de fin","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page","schema":{"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Nombre d'éléments par page","schema":{"default":50,"type":"number"}},{"name":"sortBy","required":false,"in":"query","description":"Champ de tri","schema":{"default":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Ordre de tri","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Données exportées"}},"security":[{"bearer":[]}],"summary":"Exporter les mouvements de stock pour rapport","tags":["Stock Movements"]}},"/api/stock-movements/product/{productId}":{"get":{"operationId":"StockMovementsController_getProductHistory","parameters":[{"name":"productId","required":true,"in":"path","schema":{"type":"string"}},{"name":"type","required":false,"in":"query","description":"Type de mouvement","schema":{"type":"string","enum":["ENTREE","SORTIE","TRANSFERT"]}},{"name":"productId","required":false,"in":"query","description":"ID du produit","schema":{"type":"string"}},{"name":"userId","required":false,"in":"query","description":"ID de l'utilisateur","schema":{"type":"string"}},{"name":"reference","required":false,"in":"query","description":"Référence (numéro de commande, transfert, etc.)","schema":{"type":"string"}},{"name":"fromDate","required":false,"in":"query","description":"Date de début","schema":{"type":"string"}},{"name":"toDate","required":false,"in":"query","description":"Date de fin","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page","schema":{"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Nombre d'éléments par page","schema":{"default":50,"type":"number"}},{"name":"sortBy","required":false,"in":"query","description":"Champ de tri","schema":{"default":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Ordre de tri","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Historique du produit"},"404":{"description":"Produit non trouvé"}},"security":[{"bearer":[]}],"summary":"Obtenir l'historique des mouvements d'un produit","tags":["Stock Movements"]}},"/api/stock-movements/{id}":{"get":{"operationId":"StockMovementsController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Mouvement trouvé"},"404":{"description":"Mouvement non trouvé"}},"security":[{"bearer":[]}],"summary":"Obtenir un mouvement de stock par ID","tags":["Stock Movements"]},"delete":{"operationId":"StockMovementsController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Mouvement supprimé"},"403":{"description":"Accès refusé"}},"security":[{"bearer":[]}],"summary":"Supprimer un mouvement de stock (ADMIN uniquement)","tags":["Stock Movements"]}},"/api/audit-logs":{"get":{"operationId":"AuditLogsController_findAll","parameters":[{"name":"action","required":false,"in":"query","description":"Action effectuée","schema":{"example":"CREATE","type":"string"}},{"name":"entity","required":false,"in":"query","description":"Type d'entité","schema":{"example":"Product","type":"string"}},{"name":"entityId","required":false,"in":"query","description":"ID de l'entité","schema":{"type":"string"}},{"name":"userId","required":false,"in":"query","description":"ID de l'utilisateur","schema":{"type":"string"}},{"name":"ipAddress","required":false,"in":"query","description":"Adresse IP","schema":{"type":"string"}},{"name":"fromDate","required":false,"in":"query","description":"Date de début","schema":{"type":"string"}},{"name":"toDate","required":false,"in":"query","description":"Date de fin","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page","schema":{"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Nombre d'éléments par page","schema":{"default":50,"type":"number"}}],"responses":{"200":{"description":"Liste des logs"}},"security":[{"bearer":[]}],"summary":"Récupérer tous les logs d'audit avec filtres","tags":["Audit Logs"]}},"/api/audit-logs/statistics":{"get":{"operationId":"AuditLogsController_getStatistics","parameters":[{"name":"fromDate","required":true,"in":"query","schema":{"type":"string"}},{"name":"toDate","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Statistiques des logs"}},"security":[{"bearer":[]}],"summary":"Obtenir les statistiques des logs","tags":["Audit Logs"]}},"/api/audit-logs/export":{"get":{"operationId":"AuditLogsController_export","parameters":[{"name":"action","required":false,"in":"query","description":"Action effectuée","schema":{"example":"CREATE","type":"string"}},{"name":"entity","required":false,"in":"query","description":"Type d'entité","schema":{"example":"Product","type":"string"}},{"name":"entityId","required":false,"in":"query","description":"ID de l'entité","schema":{"type":"string"}},{"name":"userId","required":false,"in":"query","description":"ID de l'utilisateur","schema":{"type":"string"}},{"name":"ipAddress","required":false,"in":"query","description":"Adresse IP","schema":{"type":"string"}},{"name":"fromDate","required":false,"in":"query","description":"Date de début","schema":{"type":"string"}},{"name":"toDate","required":false,"in":"query","description":"Date de fin","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page","schema":{"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Nombre d'éléments par page","schema":{"default":50,"type":"number"}}],"responses":{"200":{"description":"Logs exportés"}},"security":[{"bearer":[]}],"summary":"Exporter les logs pour rapport","tags":["Audit Logs"]}},"/api/audit-logs/entity/{entity}/{entityId}":{"get":{"operationId":"AuditLogsController_getEntityHistory","parameters":[{"name":"entity","required":true,"in":"path","schema":{"type":"string"}},{"name":"entityId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Historique de l'entité"}},"security":[{"bearer":[]}],"summary":"Obtenir l'historique d'une entité","tags":["Audit Logs"]}},"/api/audit-logs/cleanup":{"post":{"operationId":"AuditLogsController_cleanup","parameters":[{"name":"daysToKeep","required":true,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"Logs nettoyés"}},"security":[{"bearer":[]}],"summary":"Nettoyer les anciens logs","tags":["Audit Logs"]}},"/api/audit-logs/{id}":{"get":{"operationId":"AuditLogsController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Log trouvé"},"404":{"description":"Log non trouvé"}},"security":[{"bearer":[]}],"summary":"Obtenir un log par ID","tags":["Audit Logs"]}},"/api/barcode/reception/{code}/image":{"get":{"description":"Génère et retourne l'image du code-barres au format PNG ou SVG pour une réception donnée","operationId":"BarcodeController_getReceptionBarcodeImage","parameters":[{"name":"code","required":true,"in":"path","description":"Code de réception (ex: REC-2025-00001)","schema":{"example":"REC-2025-00001","type":"string"}},{"name":"format","required":false,"in":"query","description":"Format de l'image (png ou svg)","schema":{"enum":["png","svg"],"type":"string"}},{"name":"width","required":false,"in":"query","description":"Largeur des barres (par défaut: 2)","schema":{"example":2,"type":"number"}},{"name":"height","required":false,"in":"query","description":"Hauteur du code-barres en pixels (par défaut: 100)","schema":{"example":100,"type":"number"}},{"name":"displayValue","required":false,"in":"query","description":"Afficher le texte sous le code-barres (par défaut: true)","schema":{"example":true,"type":"boolean"}}],"responses":{"200":{"description":"Image du code-barres générée avec succès","content":{"image/png":{},"image/svg+xml":{}}},"404":{"description":"Réception non trouvée"}},"security":[{"bearer":[]}],"summary":"Générer l'image du code-barres d'une réception","tags":["Codes-Barres"]}},"/api/barcode/reception/{code}/info":{"get":{"description":"Retourne les détails complets d'une réception en utilisant son code-barres","operationId":"BarcodeController_getReceptionInfo","parameters":[{"name":"code","required":true,"in":"path","description":"Code de réception","schema":{"example":"REC-2025-00001","type":"string"}}],"responses":{"200":{"description":"Informations de la réception","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"receptionCode":{"type":"string","example":"REC-2025-00001"},"receptionDate":{"type":"string","format":"date-time"},"notes":{"type":"string"},"order":{"type":"object","properties":{"orderNumber":{"type":"string","example":"CMD-2025-00042"},"supplier":{"type":"object","properties":{"name":{"type":"string"}}}}},"items":{"type":"array","items":{"type":"object","properties":{"receivedQty":{"type":"number"},"condition":{"type":"string","enum":["GOOD","DAMAGED","EXPIRED","INCOMPLETE"]},"notes":{"type":"string"},"orderItem":{"type":"object","properties":{"product":{"type":"object","properties":{"name":{"type":"string"},"reference":{"type":"string"}}}}}}}}}}}}},"404":{"description":"Réception non trouvée"}},"security":[{"bearer":[]}],"summary":"Obtenir les informations d'une réception par son code","tags":["Codes-Barres"]}},"/api/barcode/reception/{code}/download":{"get":{"description":"Force le téléchargement de l'image du code-barres au lieu de l'afficher","operationId":"BarcodeController_downloadReceptionBarcode","parameters":[{"name":"code","required":true,"in":"path","description":"Code de réception","schema":{"example":"REC-2025-00001","type":"string"}},{"name":"format","required":false,"in":"query","description":"Format de l'image","schema":{"enum":["png","svg"],"type":"string"}}],"responses":{"200":{"description":"Fichier téléchargé avec succès","content":{"image/png":{},"image/svg+xml":{}}},"404":{"description":"Réception non trouvée"}},"security":[{"bearer":[]}],"summary":"Télécharger l'image du code-barres","tags":["Codes-Barres"]}},"/api/barcode/dispatch/{code}/image":{"get":{"description":"Génère et retourne l'image du code-barres au format PNG ou SVG pour un dispatch donné","operationId":"BarcodeController_getDispatchBarcodeImage","parameters":[{"name":"code","required":true,"in":"path","description":"Code de dispatch (ex: DISP-2025-00001)","schema":{"example":"DISP-2025-00001","type":"string"}},{"name":"format","required":false,"in":"query","description":"Format de l'image (png ou svg)","schema":{"enum":["png","svg"],"type":"string"}},{"name":"width","required":false,"in":"query","description":"Largeur des barres (par défaut: 2)","schema":{"example":2,"type":"number"}},{"name":"height","required":false,"in":"query","description":"Hauteur du code-barres en pixels (par défaut: 100)","schema":{"example":100,"type":"number"}},{"name":"displayValue","required":false,"in":"query","description":"Afficher le texte sous le code-barres (par défaut: true)","schema":{"example":true,"type":"boolean"}}],"responses":{"200":{"description":"Image du code-barres générée avec succès","content":{"image/png":{},"image/svg+xml":{}}},"404":{"description":"Dispatch non trouvé"}},"security":[{"bearer":[]}],"summary":"Générer l'image du code-barres d'un dispatch","tags":["Codes-Barres"]}},"/api/barcode/dispatch/{code}/info":{"get":{"description":"Retourne les détails complets d'un dispatch en utilisant son code-barres","operationId":"BarcodeController_getDispatchInfo","parameters":[{"name":"code","required":true,"in":"path","description":"Code de dispatch","schema":{"example":"DISP-2025-00001","type":"string"}}],"responses":{"200":{"description":"Informations du dispatch","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"dispatchCode":{"type":"string","example":"DISP-2025-00001"},"dispatchDate":{"type":"string","format":"date-time"},"quantity":{"type":"number"},"status":{"type":"string","enum":["PREPARED","IN_TRANSIT","DELIVERED","RECEIVED","REJECTED","CANCELLED"]},"condition":{"type":"string","enum":["GOOD","DAMAGED","EXPIRED","INCOMPLETE"]},"notes":{"type":"string"},"transportConditions":{"type":"string"},"supplierLotNumber":{"type":"string"},"expirationDate":{"type":"string","format":"date-time"},"order":{"type":"object","properties":{"orderNumber":{"type":"string","example":"CMD-2025-00042"},"supplier":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"},"phone":{"type":"string"}}}}},"laboratory":{"type":"object","properties":{"name":{"type":"string"},"type":{"type":"string","enum":["ANALYSIS","RESEARCH","CONTROL","CALIBRATION"]},"isActive":{"type":"boolean"}}},"product":{"type":"object","properties":{"name":{"type":"string"},"reference":{"type":"string"},"category":{"type":"string"},"unit":{"type":"string"}}},"reception":{"type":"object","properties":{"receptionCode":{"type":"string","example":"REC-2025-00001"},"receptionDate":{"type":"string","format":"date-time"}}}}}}}},"404":{"description":"Dispatch non trouvé"}},"security":[{"bearer":[]}],"summary":"Obtenir les informations d'un dispatch par son code","tags":["Codes-Barres"]}},"/api/barcode/dispatch/{code}/download":{"get":{"description":"Force le téléchargement de l'image du code-barres au lieu de l'afficher","operationId":"BarcodeController_downloadDispatchBarcode","parameters":[{"name":"code","required":true,"in":"path","description":"Code de dispatch","schema":{"example":"DISP-2025-00001","type":"string"}},{"name":"format","required":false,"in":"query","description":"Format de l'image","schema":{"enum":["png","svg"],"type":"string"}}],"responses":{"200":{"description":"Fichier téléchargé avec succès","content":{"image/png":{},"image/svg+xml":{}}},"404":{"description":"Dispatch non trouvé"}},"security":[{"bearer":[]}],"summary":"Télécharger l'image du code-barres d'un dispatch","tags":["Codes-Barres"]}},"/api/statistics/purchase-manager":{"get":{"description":"Retourne toutes les statistiques pour le tableau de bord du responsable achat","operationId":"StatisticsController_getPurchaseManagerStatistics","parameters":[],"responses":{"200":{"description":"Statistiques récupérées avec succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseManagerStatsDto"}}}}},"security":[{"bearer":[]}],"summary":"Statistiques du responsable achat","tags":["Statistiques"]}},"/api/statistics/admin":{"get":{"description":"Retourne toutes les statistiques pour le tableau de bord administrateur","operationId":"StatisticsController_getAdminStatistics","parameters":[],"responses":{"200":{"description":"Statistiques récupérées avec succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminStatsDto"}}}}},"security":[{"bearer":[]}],"summary":"Statistiques administrateur","tags":["Statistiques"]}},"/api/statistics/lab-manager":{"get":{"description":"Retourne toutes les statistiques pour le tableau de bord du responsable laboratoire","operationId":"StatisticsController_getLabManagerStatistics","parameters":[],"responses":{"200":{"description":"Statistiques récupérées avec succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LabManagerStatsDto"}}}}},"security":[{"bearer":[]}],"summary":"Statistiques du responsable laboratoire","tags":["Statistiques"]}},"/api/statistics/technician":{"get":{"description":"Retourne toutes les statistiques personnalisées pour un technicien de laboratoire, incluant ses sorties de stock, ses demandes, et sa performance","operationId":"StatisticsController_getTechnicianStatistics","parameters":[],"responses":{"200":{"description":"Statistiques technicien récupérées avec succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TechnicianStatsDto"}}}}},"security":[{"bearer":[]}],"summary":"Statistiques du technicien","tags":["Statistiques"]}},"/api/statistics/monthly-report":{"get":{"description":"Génère un rapport mensuel complet avec toutes les activités","operationId":"StatisticsController_generateMonthlyReport","parameters":[{"name":"month","required":true,"in":"query","description":"Mois (1-12)","schema":{"example":11,"type":"number"}},{"name":"year","required":true,"in":"query","description":"Année","schema":{"example":2025,"type":"number"}}],"responses":{"200":{"description":"Rapport mensuel généré avec succès"}},"security":[{"bearer":[]}],"summary":"Rapport mensuel","tags":["Statistiques"]}},"/api/statistics/purchase-manager/pdf":{"get":{"operationId":"StatisticsController_exportPurchaseManagerStatisticsPDF","parameters":[],"responses":{"200":{"description":"PDF généré avec succès","content":{"application/pdf":{}}}},"security":[{"bearer":[]}],"summary":"Exporter les statistiques du responsable achat en PDF","tags":["Statistiques"]}},"/api/statistics/admin/pdf":{"get":{"operationId":"StatisticsController_exportAdminStatisticsPDF","parameters":[],"responses":{"200":{"description":"PDF généré avec succès","content":{"application/pdf":{}}}},"security":[{"bearer":[]}],"summary":"Exporter les statistiques administrateur en PDF","tags":["Statistiques"]}},"/api/statistics/lab-manager/pdf":{"get":{"operationId":"StatisticsController_exportLabManagerStatisticsPDF","parameters":[],"responses":{"200":{"description":"PDF généré avec succès","content":{"application/pdf":{}}}},"security":[{"bearer":[]}],"summary":"Exporter les statistiques du responsable laboratoire en PDF","tags":["Statistiques"]}},"/api/statistics/monthly-report/pdf":{"get":{"operationId":"StatisticsController_exportMonthlyReportPDF","parameters":[{"name":"month","required":true,"in":"query","schema":{"type":"number"}},{"name":"year","required":true,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"PDF généré avec succès","content":{"application/pdf":{}}}},"security":[{"bearer":[]}],"summary":"Exporter le rapport mensuel en PDF","tags":["Statistiques"]}},"/api/statistics/purchase-manager/excel":{"get":{"description":"Génère un fichier Excel complet avec toutes les statistiques organisées par feuilles","operationId":"StatisticsController_exportPurchaseManagerStatisticsExcel","parameters":[],"responses":{"200":{"description":"Excel généré avec succès","content":{"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{}}}},"security":[{"bearer":[]}],"summary":"Exporter les statistiques du responsable achat en Excel","tags":["Statistiques"]}},"/api/statistics/purchase-manager/excel/complete":{"get":{"description":"Génère un fichier Excel ultra-détaillé avec 8 feuilles différentes : Tableau de bord, Commandes, Fournisseurs, Budget, Catégories, Alertes, Demandes et Performance","operationId":"StatisticsController_exportPurchaseManagerCompleteExcel","parameters":[],"responses":{"200":{"description":"Excel complet généré avec succès - 8 feuilles de données","content":{"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{}}}},"security":[{"bearer":[]}],"summary":"Exporter TOUTES les statistiques du responsable achat en Excel (Version Complète)","tags":["Statistiques"]}},"/api/statistics/admin/excel":{"get":{"operationId":"StatisticsController_exportAdminStatisticsExcel","parameters":[],"responses":{"200":{"description":"Excel généré avec succès","content":{"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{}}}},"security":[{"bearer":[]}],"summary":"Exporter les statistiques administrateur en Excel","tags":["Statistiques"]}},"/api/statistics/lab-manager/excel":{"get":{"operationId":"StatisticsController_exportLabManagerStatisticsExcel","parameters":[],"responses":{"200":{"description":"Excel généré avec succès","content":{"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{}}}},"security":[{"bearer":[]}],"summary":"Exporter les statistiques du responsable laboratoire en Excel","tags":["Statistiques"]}},"/api/statistics/monthly-report/excel":{"get":{"operationId":"StatisticsController_exportMonthlyReportExcel","parameters":[{"name":"month","required":true,"in":"query","schema":{"type":"number"}},{"name":"year","required":true,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"Excel généré avec succès","content":{"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{}}}},"security":[{"bearer":[]}],"summary":"Exporter le rapport mensuel en Excel","tags":["Statistiques"]}},"/api/statistics/purchase-manager/excel/documentation":{"get":{"description":"Retourne la documentation détaillée de toutes les feuilles du rapport Excel","operationId":"StatisticsController_getPurchaseManagerExcelDocumentation","parameters":[],"responses":{"200":{"description":"Documentation récupérée avec succès"}},"security":[{"bearer":[]}],"summary":"Documentation du rapport Excel complet","tags":["Statistiques"]}},"/api/jobs":{"get":{"operationId":"JobsController_getAllJobs","parameters":[],"responses":{"200":{"description":"Liste des jobs récupérée avec succès"}},"security":[{"bearer":[]}],"summary":"Obtenir la liste de tous les jobs planifiés","tags":["Jobs"]}},"/api/jobs/{jobName}/executions":{"get":{"operationId":"JobsController_getJobExecutions","parameters":[{"name":"jobName","required":true,"in":"path","description":"Nom du job","schema":{"example":"check-stock-levels","type":"string"}},{"name":"limit","required":false,"in":"query","description":"Nombre d'exécutions à récupérer (défaut: 20)","schema":{"type":"number"}}],"responses":{"200":{"description":"Historique d'exécution récupéré avec succès"}},"security":[{"bearer":[]}],"summary":"Obtenir l'historique d'exécution d'un job","tags":["Jobs"]}},"/api/jobs/{jobName}/trigger":{"post":{"operationId":"JobsController_triggerJob","parameters":[{"name":"jobName","required":true,"in":"path","description":"Nom du job à déclencher","schema":{"example":"check-stock-levels","type":"string"}}],"responses":{"200":{"description":"Job déclenché avec succès"},"404":{"description":"Job non trouvé"}},"security":[{"bearer":[]}],"summary":"Déclencher manuellement l'exécution d'un job","tags":["Jobs"]}},"/api/jobs/{jobName}/toggle":{"patch":{"operationId":"JobsController_toggleJob","parameters":[{"name":"jobName","required":true,"in":"path","description":"Nom du job","schema":{"example":"check-stock-levels","type":"string"}}],"responses":{"200":{"description":"Statut du job mis à jour avec succès"}},"security":[{"bearer":[]}],"summary":"Activer ou désactiver un job","tags":["Jobs"]}},"/api/jobs/available":{"get":{"operationId":"JobsController_getAvailableJobs","parameters":[],"responses":{"200":{"description":"Liste des jobs disponibles"}},"security":[{"bearer":[]}],"summary":"Obtenir la liste des jobs disponibles","tags":["Jobs"]}},"/api/jobs/test/email":{"post":{"operationId":"JobsController_testEmail","parameters":[],"responses":{"200":{"description":"Test d'email exécuté avec succès"}},"security":[{"bearer":[]}],"summary":"Tester l'envoi d'emails et d'alertes","tags":["Jobs"]}},"/api/maintenance/requests":{"post":{"operationId":"MaintenanceController_createMaintenanceRequest","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMaintenanceRequestDto"}}}},"responses":{"201":{"description":""}},"tags":["Maintenance"]},"get":{"operationId":"MaintenanceController_findAllMaintenanceRequests","parameters":[],"responses":{"200":{"description":""}},"tags":["Maintenance"]}},"/api/maintenance/requests/{id}":{"get":{"operationId":"MaintenanceController_findOneMaintenanceRequest","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Maintenance"]},"patch":{"operationId":"MaintenanceController_updateMaintenanceRequest","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMaintenanceRequestDto"}}}},"responses":{"200":{"description":""}},"tags":["Maintenance"]},"delete":{"operationId":"MaintenanceController_removeMaintenanceRequest","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Maintenance"]}},"/api/maintenance/requests/statistics":{"get":{"operationId":"MaintenanceController_getMaintenanceStatistics","parameters":[{"name":"laboratoryId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Maintenance"]}},"/api/maintenance/schedules":{"post":{"operationId":"MaintenanceController_createMaintenanceSchedule","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMaintenanceScheduleDto"}}}},"responses":{"201":{"description":""}},"tags":["Maintenance"]},"get":{"operationId":"MaintenanceController_findAllMaintenanceSchedules","parameters":[{"name":"laboratoryId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Maintenance"]}},"/api/maintenance/schedules/{id}":{"get":{"operationId":"MaintenanceController_findOneMaintenanceSchedule","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Maintenance"]}},"/api/maintenance/schedules/{id}/deactivate":{"patch":{"operationId":"MaintenanceController_deactivateMaintenanceSchedule","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Maintenance"]}},"/api/samples":{"post":{"description":"Crée un nouvel échantillon avec ses paramètres","operationId":"SamplesController_create","parameters":[{"name":"laboratoryId","required":true,"in":"query","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSampleDto"}}}},"responses":{"201":{"description":"Échantillon créé avec succès"},"400":{"description":"Données invalides"}},"security":[{"bearer":[]}],"summary":"Créer un échantillon","tags":["Échantillons"]},"get":{"description":"Récupère la liste des échantillons avec détails complets","operationId":"SamplesController_findAll","parameters":[{"name":"laboratoryId","required":false,"in":"query","description":"ID du laboratoire pour filtrer","schema":{"example":"lab-123","type":"string"}},{"name":"technicianId","required":false,"in":"query","description":"ID du technicien pour filtrer","schema":{"example":"tech-456","type":"string"}},{"name":"code","required":false,"in":"query","description":"Code de l'échantillon (recherche partielle)","schema":{"example":"ECH-2024","type":"string"}},{"name":"nature","required":false,"in":"query","description":"Nature de l'échantillon (recherche partielle)","schema":{"example":"Eau","type":"string"}},{"name":"parameter","required":false,"in":"query","description":"Nom du paramètre (recherche partielle)","schema":{"example":"pH","type":"string"}},{"name":"startDate","required":false,"in":"query","description":"Date de début (format ISO)","schema":{"example":"2024-11-01T00:00:00Z","type":"string"}},{"name":"endDate","required":false,"in":"query","description":"Date de fin (format ISO)","schema":{"example":"2024-11-30T23:59:59Z","type":"string"}},{"name":"page","required":false,"in":"query","description":"Numéro de page","schema":{"minimum":1,"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Nombre d'éléments par page","schema":{"minimum":1,"example":20,"type":"number"}},{"name":"sortBy","required":false,"in":"query","description":"Champ de tri","schema":{"example":"createdAt","type":"string","enum":["createdAt","code","nature","totalQuantity"]}},{"name":"sortOrder","required":false,"in":"query","description":"Ordre de tri","schema":{"example":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lister les échantillons avec détails","tags":["Échantillons"]}},"/api/samples/technician/{technicianId}":{"get":{"description":"Récupère tous les échantillons traités par un technicien avec statistiques complètes","operationId":"SamplesController_getTechnicianSamples","parameters":[{"name":"technicianId","required":true,"in":"path","description":"ID du technicien","schema":{"type":"string"}},{"name":"laboratoryId","required":false,"in":"query","description":"Filtrer par laboratoire","schema":{"type":"string"}},{"name":"startDate","required":false,"in":"query","description":"Date de début (ISO format)","schema":{"type":"string"}},{"name":"endDate","required":false,"in":"query","description":"Date de fin (ISO format)","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Éléments par page","schema":{"example":20}},{"name":"page","required":false,"in":"query","description":"Numéro de page","schema":{"example":1}}],"responses":{"200":{"description":"Échantillons et statistiques du technicien récupérés","content":{"application/json":{"schema":{"type":"object","properties":{"technician":{"type":"object","properties":{"id":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"role":{"type":"string"}}},"statistics":{"type":"object","properties":{"totalSamples":{"type":"number"},"totalExits":{"type":"number"},"totalParametersProcessed":{"type":"number"},"activityPeriods":{"type":"object","properties":{"thisWeek":{"type":"number"},"thisMonth":{"type":"number"},"thisYear":{"type":"number"}}},"topParameters":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"usageCount":{"type":"number"},"totalQuantity":{"type":"number"}}}},"laboratoryDistribution":{"type":"array","items":{"type":"object","properties":{"laboratoryId":{"type":"string"},"laboratoryName":{"type":"string"},"sampleCount":{"type":"number"},"exitCount":{"type":"number"}}}}}},"samples":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"code":{"type":"string"},"nature":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"laboratory":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"}}},"parameters":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"quantity":{"type":"number"}}}},"stockExits":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"exitNumber":{"type":"string"},"exitDate":{"type":"string","format":"date-time"},"status":{"type":"string"}}}}}}},"pagination":{"type":"object","properties":{"page":{"type":"number"},"limit":{"type":"number"},"total":{"type":"number"},"pages":{"type":"number"}}}}}}}}}}},"security":[{"bearer":[]}],"summary":"Échantillons d'un technicien avec statistiques","tags":["Échantillons"]}},"/api/samples/details":{"get":{"description":"Récupère la liste paginée des échantillons avec paramètres, produits utilisés, techniciens, etc.","operationId":"SamplesController_findAllWithDetails","parameters":[{"name":"laboratoryId","required":false,"in":"query","description":"ID du laboratoire pour filtrer","schema":{"example":"lab-123","type":"string"}},{"name":"technicianId","required":false,"in":"query","description":"ID du technicien pour filtrer","schema":{"example":"tech-456","type":"string"}},{"name":"code","required":false,"in":"query","description":"Code de l'échantillon (recherche partielle)","schema":{"example":"ECH-2024","type":"string"}},{"name":"nature","required":false,"in":"query","description":"Nature de l'échantillon (recherche partielle)","schema":{"example":"Eau","type":"string"}},{"name":"parameter","required":false,"in":"query","description":"Nom du paramètre (recherche partielle)","schema":{"example":"pH","type":"string"}},{"name":"startDate","required":false,"in":"query","description":"Date de début (format ISO)","schema":{"example":"2024-11-01T00:00:00Z","type":"string"}},{"name":"endDate","required":false,"in":"query","description":"Date de fin (format ISO)","schema":{"example":"2024-11-30T23:59:59Z","type":"string"}},{"name":"page","required":false,"in":"query","description":"Numéro de page","schema":{"minimum":1,"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Nombre d'éléments par page","schema":{"minimum":1,"example":20,"type":"number"}},{"name":"sortBy","required":false,"in":"query","description":"Champ de tri","schema":{"example":"createdAt","type":"string","enum":["createdAt","code","nature","totalQuantity"]}},{"name":"sortOrder","required":false,"in":"query","description":"Ordre de tri","schema":{"example":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Liste des échantillons récupérée avec succès","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"code":{"type":"string"},"nature":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"totalParameterQuantity":{"type":"number"},"exitCount":{"type":"number"},"lastExitDate":{"type":"string","format":"date-time"},"laboratory":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"}}},"parameters":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"quantity":{"type":"number"}}}},"productUsage":{"type":"array","items":{"type":"object","properties":{"product":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"reference":{"type":"string"},"unit":{"type":"string"}}},"totalQuantity":{"type":"number"},"exitCount":{"type":"number"}}}},"technicians":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"role":{"type":"string"},"exitCount":{"type":"number"}}}}}}},"pagination":{"type":"object","properties":{"page":{"type":"number"},"limit":{"type":"number"},"total":{"type":"number"},"pages":{"type":"number"}}}}}}}}},"security":[{"bearer":[]}],"summary":"Lister les échantillons avec détails complets","tags":["Échantillons"]}},"/api/samples/statistics":{"get":{"description":"Récupère les statistiques générales des échantillons","operationId":"SamplesController_getStatistics","parameters":[{"name":"laboratoryId","required":false,"in":"query","description":"ID du laboratoire pour filtrer les statistiques","schema":{"type":"string"}}],"responses":{"200":{"description":"Statistiques récupérées avec succès","content":{"application/json":{"schema":{"type":"object","properties":{"totals":{"type":"object","properties":{"totalSamples":{"type":"number"},"samplesWithCode":{"type":"number"},"samplesWithoutCode":{"type":"number"},"pendingCodePercentage":{"type":"number"}}},"periods":{"type":"object","properties":{"thisWeek":{"type":"number"},"thisMonth":{"type":"number"},"thisYear":{"type":"number"}}},"topParameters":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"count":{"type":"number"},"totalQuantity":{"type":"number"},"averageQuantity":{"type":"number"}}}}}}}}}},"security":[{"bearer":[]}],"summary":"Statistiques des échantillons","tags":["Échantillons"]}},"/api/samples/statistics/time-series":{"get":{"description":"Récupère les statistiques des échantillons par période","operationId":"SamplesController_getTimeSeriesStats","parameters":[{"name":"laboratoryId","required":false,"in":"query","description":"ID du laboratoire pour filtrer","schema":{"type":"string"}},{"name":"period","required":false,"in":"query","description":"Période de regroupement","schema":{"enum":["day","week","month"],"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Nombre de périodes à récupérer","schema":{"example":30,"type":"string"}}],"responses":{"200":{"description":"Statistiques temporelles récupérées avec succès"}},"security":[{"bearer":[]}],"summary":"Statistiques temporelles des échantillons","tags":["Échantillons"]}},"/api/samples/{id}":{"get":{"description":"Récupère les détails d'un échantillon par son ID","operationId":"SamplesController_findOne","parameters":[{"name":"id","required":true,"in":"path","description":"ID de l'échantillon","schema":{"type":"string"}}],"responses":{"200":{"description":"Échantillon trouvé"},"404":{"description":"Échantillon non trouvé"}},"security":[{"bearer":[]}],"summary":"Récupérer un échantillon","tags":["Échantillons"]},"delete":{"description":"Supprime un échantillon (uniquement si pas de sorties liées)","operationId":"SamplesController_remove","parameters":[{"name":"id","required":true,"in":"path","description":"ID de l'échantillon","schema":{"type":"string"}}],"responses":{"204":{"description":"Échantillon supprimé avec succès"},"400":{"description":"Impossible de supprimer (sorties liées)"},"404":{"description":"Échantillon non trouvé"}},"security":[{"bearer":[]}],"summary":"Supprimer un échantillon","tags":["Échantillons"]}},"/api/samples/{id}/code":{"patch":{"description":"Assigne ou modifie le code d'un échantillon","operationId":"SamplesController_updateCode","parameters":[{"name":"id","required":true,"in":"path","description":"ID de l'échantillon","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSampleCodeDto"}}}},"responses":{"200":{"description":"Code mis à jour avec succès"},"400":{"description":"Code déjà existant ou format invalide"},"404":{"description":"Échantillon non trouvé"}},"security":[{"bearer":[]}],"summary":"Mettre à jour le code d'un échantillon","tags":["Échantillons"]}},"/api/samples/dashboard/technician":{"get":{"description":"Récupère les statistiques pour le dashboard du technicien","operationId":"SamplesController_getTechnicianDashboard","parameters":[{"name":"technicianId","required":false,"in":"query","description":"ID du technicien pour filtrer ses activités","schema":{"type":"string"}},{"name":"laboratoryId","required":false,"in":"query","description":"ID du laboratoire pour filtrer","schema":{"type":"string"}}],"responses":{"200":{"description":"Statistiques dashboard récupérées","content":{"application/json":{"schema":{"type":"object","properties":{"samplesOverview":{"type":"object","properties":{"totalSamples":{"type":"number"},"samplesThisWeek":{"type":"number"},"samplesThisMonth":{"type":"number"}}},"technicianActivity":{"type":"object","properties":{"totalExits":{"type":"number"},"exitsThisWeek":{"type":"number"},"exitsThisMonth":{"type":"number"}}},"topParameters":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"usageCount":{"type":"number"},"totalQuantity":{"type":"number"},"averageQuantity":{"type":"number"}}}},"topProducts":{"type":"array","items":{"type":"object","properties":{"product":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"reference":{"type":"string"},"unit":{"type":"string"}}},"usageCount":{"type":"number"},"totalQuantity":{"type":"number"}}}}}}}}}},"security":[{"bearer":[]}],"summary":"Statistiques dashboard technicien","tags":["Échantillons"]}},"/api/samples/activities/recent":{"get":{"description":"Récupère les dernières activités sur les échantillons","operationId":"SamplesController_getRecentActivities","parameters":[{"name":"technicianId","required":false,"in":"query","description":"ID du technicien pour filtrer ses activités","schema":{"type":"string"}},{"name":"laboratoryId","required":false,"in":"query","description":"ID du laboratoire pour filtrer","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Nombre maximum d'activités à retourner","schema":{"example":10,"type":"string"}}],"responses":{"200":{"description":"Activités récentes récupérées"}},"security":[{"bearer":[]}],"summary":"Activités récentes","tags":["Échantillons"]}},"/api/sample-parameters":{"get":{"description":"Récupère la liste de tous les paramètres utilisés avec leurs statistiques","operationId":"SampleParametersController_getUniqueParameters","parameters":[],"responses":{"200":{"description":"Liste des paramètres récupérée avec succès","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"usageCount":{"type":"number"},"totalQuantity":{"type":"number"},"averageQuantity":{"type":"number"}}}}}}}},"security":[{"bearer":[]}],"summary":"Lister tous les paramètres uniques","tags":["Paramètres d'échantillons"]}},"/api/sample-parameters/laboratory/{laboratoryId}":{"get":{"description":"Récupère les paramètres utilisés dans un laboratoire spécifique","operationId":"SampleParametersController_getParametersByLaboratory","parameters":[{"name":"laboratoryId","required":true,"in":"path","description":"ID du laboratoire","schema":{"type":"string"}}],"responses":{"200":{"description":"Paramètres du laboratoire récupérés"}},"security":[{"bearer":[]}],"summary":"Paramètres par laboratoire","tags":["Paramètres d'échantillons"]}},"/api/sample-parameters/technician/{technicianId}/samples":{"get":{"description":"Récupère tous les échantillons traités par un technicien avec leurs paramètres et statistiques","operationId":"SampleParametersController_getTechnicianSamplesAndStats","parameters":[{"name":"technicianId","required":true,"in":"path","description":"ID du technicien","schema":{"type":"string"}},{"name":"laboratoryId","required":false,"in":"query","description":"Filtrer par laboratoire spécifique","schema":{"type":"string"}},{"name":"startDate","required":false,"in":"query","description":"Date de début (ISO format)","schema":{"example":"2024-01-01T00:00:00Z","type":"string"}},{"name":"endDate","required":false,"in":"query","description":"Date de fin (ISO format)","schema":{"example":"2024-12-31T23:59:59Z","type":"string"}},{"name":"limit","required":false,"in":"query","description":"Nombre d'éléments par page","schema":{"example":20}},{"name":"page","required":false,"in":"query","description":"Numéro de page","schema":{"example":1}}],"responses":{"200":{"description":"Échantillons et statistiques du technicien récupérés","content":{"application/json":{"schema":{"type":"object","properties":{"technician":{"type":"object","properties":{"id":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"role":{"type":"string"}}},"statistics":{"type":"object","properties":{"totalSamples":{"type":"number"},"totalExits":{"type":"number"},"totalParameters":{"type":"number"},"periodActivity":{"type":"object","properties":{"thisWeek":{"type":"number"},"thisMonth":{"type":"number"},"thisYear":{"type":"number"}}},"topParameters":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"usageCount":{"type":"number"},"totalQuantity":{"type":"number"}}}},"laboratoryDistribution":{"type":"array","items":{"type":"object","properties":{"laboratoryId":{"type":"string"},"laboratoryName":{"type":"string"},"sampleCount":{"type":"number"},"exitCount":{"type":"number"}}}}}},"samples":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"code":{"type":"string"},"nature":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"laboratory":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"}}},"parameters":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"quantity":{"type":"number"}}}},"stockExits":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"exitNumber":{"type":"string"},"exitDate":{"type":"string","format":"date-time"},"status":{"type":"string"}}}}}}},"pagination":{"type":"object","properties":{"page":{"type":"number"},"limit":{"type":"number"},"total":{"type":"number"},"pages":{"type":"number"}}}}}}}}}}},"security":[{"bearer":[]}],"summary":"Échantillons et paramètres d'un technicien","tags":["Paramètres d'échantillons"]}},"/api/sample-parameters/top":{"get":{"description":"Récupère les paramètres les plus fréquemment utilisés (suggestions)","operationId":"SampleParametersController_getTopParameters","parameters":[{"name":"limit","required":false,"in":"query","description":"Nombre maximum de paramètres à retourner","schema":{"example":20,"type":"string"}}],"responses":{"200":{"description":"Top paramètres récupérés"}},"security":[{"bearer":[]}],"summary":"Paramètres les plus utilisés","tags":["Paramètres d'échantillons"]}},"/api/sample-parameters/search":{"get":{"description":"Recherche des paramètres par nom (autocomplétion)","operationId":"SampleParametersController_searchParameters","parameters":[{"name":"q","required":true,"in":"query","description":"Terme de recherche","schema":{"example":"pH","type":"string"}},{"name":"limit","required":false,"in":"query","description":"Nombre maximum de résultats","schema":{"example":10,"type":"string"}}],"responses":{"200":{"description":"Résultats de recherche"}},"security":[{"bearer":[]}],"summary":"Rechercher des paramètres","tags":["Paramètres d'échantillons"]}},"/api/sample-parameters/details/{parameterName}":{"get":{"description":"Récupère les statistiques détaillées d'un paramètre spécifique","operationId":"SampleParametersController_getParameterDetails","parameters":[{"name":"parameterName","required":true,"in":"path","description":"Nom du paramètre","schema":{"example":"pH","type":"string"}}],"responses":{"200":{"description":"Détails du paramètre récupérés","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"totalUsage":{"type":"number"},"totalQuantity":{"type":"number"},"averageQuantity":{"type":"number"},"minQuantity":{"type":"number"},"maxQuantity":{"type":"number"},"recentUsage":{"type":"number"},"laboratoryDistribution":{"type":"array","items":{"type":"object","properties":{"laboratoryId":{"type":"string"},"laboratoryName":{"type":"string"},"count":{"type":"number"}}}}}}}}}},"security":[{"bearer":[]}],"summary":"Détails d'un paramètre","tags":["Paramètres d'échantillons"]}},"/api/analysis-config":{"post":{"description":"Permet de définir plusieurs produits et leurs quantités nécessaires pour un type d'analyse spécifique","operationId":"AnalysisConfigController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAnalysisConfigDto"}}}},"responses":{"201":{"description":"Configuration créée avec succès"},"409":{"description":"Une configuration existe déjà pour cette combinaison"}},"summary":"Créer une configuration de paramètre d'analyse avec plusieurs produits","tags":["Analysis Configuration"]},"get":{"description":"Récupère la liste des configurations avec filtres optionnels","operationId":"AnalysisConfigController_findAll","parameters":[{"name":"analysisType","required":false,"in":"query","description":"Filtrer par type d'analyse","schema":{"type":"string","enum":["MICROBIOLOGIE_BACTERIENNE","MICROBIOLOGIE_VIRALE","PHYSICO_CHIMIE_METAUX","PHYSICO_CHIMIE_ORGANIQUES","BIOLOGIE_HEMATOLOGIE","BIOLOGIE_BIOCHIMIE","AUTRE"]}},{"name":"matrix","required":false,"in":"query","description":"Filtrer par type de matrice","schema":{"example":"Eau","type":"string"}},{"name":"parameterName","required":false,"in":"query","description":"Filtrer par nom de paramètre","schema":{"example":"pH","type":"string"}},{"name":"productId","required":false,"in":"query","description":"Filtrer par ID du produit","schema":{"example":"clx1a2b3c4d5e6f7g8h9i0","type":"string"}},{"name":"isActive","required":false,"in":"query","description":"Filtrer par statut actif/inactif","schema":{"example":true,"type":"boolean"}}],"responses":{"200":{"description":"Configurations récupérées avec succès"}},"summary":"Récupérer toutes les configurations","tags":["Analysis Configuration"]}},"/api/analysis-config/import":{"post":{"description":"Permet d'importer en masse des configurations avec plusieurs produits par analyse. Format attendu:\n- Colonnes: analysisType, matrix, parameterName, productId, quantityPerSample, unit, packaging, packagingQuantity, packagingUnit, unitPrice, packagingPrice, notes, productNotes\n- Plusieurs lignes avec même analysisType/matrix/parameterName = plusieurs produits pour la même config","operationId":"AnalysisConfigController_importFromFile","parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"string","format":"binary","description":"Fichier Excel (.xlsx) ou CSV (.csv)"}}}}}},"responses":{"201":{"description":"Import réussi","content":{"application/json":{"schema":{"type":"object","properties":{"totalRows":{"type":"number","example":10},"successful":{"type":"number","example":8},"failed":{"type":"number","example":2},"errors":{"type":"array","items":{"type":"object","properties":{"row":{"type":"number"},"error":{"type":"string"},"data":{"type":"object"}}}},"created":{"type":"array","items":{"type":"object"}}}}}}},"400":{"description":"Fichier invalide ou données incorrectes"}},"summary":"Importer des configurations depuis un fichier Excel ou CSV","tags":["Analysis Configuration"]}},"/api/analysis-config/statistics":{"get":{"description":"Fournit des statistiques sur les configurations (total, par type d'analyse, etc.)","operationId":"AnalysisConfigController_getStatistics","parameters":[],"responses":{"200":{"description":"Statistiques récupérées avec succès"}},"summary":"Obtenir les statistiques des configurations","tags":["Analysis Configuration"]}},"/api/analysis-config/calculate-cost/{analysisType}/matrix/{matrix}":{"get":{"description":"Calcule le coût total pour un type d'analyse et matrice, basé sur tous les produits configurés","operationId":"AnalysisConfigController_calculateCost","parameters":[{"name":"analysisType","required":true,"in":"path","schema":{"type":"string"}},{"name":"matrix","required":true,"in":"path","schema":{"type":"string"}},{"name":"numberOfSamples","required":false,"in":"query","description":"Nombre d'échantillons (par défaut: 1)","schema":{"type":"number"}}],"responses":{"200":{"description":"Coût calculé avec succès"}},"summary":"Calculer le coût d'une analyse","tags":["Analysis Configuration"]}},"/api/analysis-config/by-analysis/{analysisType}/matrix/{matrix}":{"get":{"description":"Utile lors de la création d'une sortie de stock pour pré-remplir les produits nécessaires","operationId":"AnalysisConfigController_findByAnalysisAndMatrix","parameters":[{"name":"analysisType","required":true,"in":"path","schema":{"type":"string"}},{"name":"matrix","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Configurations récupérées avec succès"}},"summary":"Récupérer les configurations pour une analyse et matrice","tags":["Analysis Configuration"]}},"/api/analysis-config/{id}":{"get":{"operationId":"AnalysisConfigController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Configuration récupérée avec succès"},"404":{"description":"Configuration introuvable"}},"summary":"Récupérer une configuration par son ID","tags":["Analysis Configuration"]},"patch":{"operationId":"AnalysisConfigController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAnalysisConfigDto"}}}},"responses":{"200":{"description":"Configuration mise à jour avec succès"},"404":{"description":"Configuration introuvable"}},"summary":"Mettre à jour une configuration","tags":["Analysis Configuration"]},"delete":{"operationId":"AnalysisConfigController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":"Configuration supprimée avec succès"},"404":{"description":"Configuration introuvable"}},"summary":"Supprimer une configuration","tags":["Analysis Configuration"]}},"/api/health":{"get":{"operationId":"HealthController_getHealth","parameters":[],"responses":{"200":{"description":"API en bonne santé","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"ok"},"timestamp":{"type":"string","example":"2025-01-01T00:00:00.000Z"},"uptime":{"type":"number","example":123.456},"environment":{"type":"string","example":"production"},"version":{"type":"string","example":"1.0.0"}}}}}}},"summary":"Vérification de la santé de l'API","tags":["Health"]}},"/api/health/ready":{"get":{"operationId":"HealthController_getReadiness","parameters":[],"responses":{"200":{"description":"API prête à recevoir des requêtes"}},"summary":"Vérification de la disponibilité de l'API","tags":["Health"]}},"/api/stock/reception/add-to-laboratory":{"post":{"operationId":"StockReceptionController_addStockToLaboratory","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Ajouter du stock au laboratoire","tags":["Stock - Réception"]}},"/api/stock/reception/transfer-between-laboratories":{"post":{"operationId":"StockReceptionController_transferStock","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Transférer du stock entre laboratoires","tags":["Stock - Réception"]}},"/api/stock/exit/remove-from-laboratory":{"post":{"operationId":"StockExitController_removeStockFromLaboratory","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Retirer du stock du laboratoire","tags":["Stock - Sortie"]}},"/api/gstock-access/labs":{"get":{"operationId":"GstockAccessController_getLabs","parameters":[],"responses":{"200":{"description":""}},"tags":["GstockAccess"]}},"/api/gstock-access/link-api-key":{"post":{"operationId":"GstockAccessController_linkApiKey","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkApiKeyDto"}}}},"responses":{"200":{"description":""}},"tags":["GstockAccess"]}},"/api/gstock-access/all-parameters":{"get":{"operationId":"GstockAccessController_getAllParameters","parameters":[],"responses":{"200":{"description":""}},"tags":["GstockAccess"]}},"/api/gstock-access/parameters/{laboratoryId}":{"get":{"operationId":"GstockAccessController_getParameters","parameters":[],"responses":{"200":{"description":""}},"tags":["GstockAccess"]}},"/api/gstock-access/sample-parameters-by-code-labo/{codeLabo}/{laboratoryId}":{"get":{"operationId":"GstockAccessController_getSampleParameters","parameters":[{"name":"codeLabo","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["GstockAccess"]}},"/api/gstock-access/parameters-by-demande-reference/{demandeReference}/{laboratoryId}":{"get":{"operationId":"GstockAccessController_getParametersByDemande","parameters":[{"name":"demandeReference","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["GstockAccess"]}},"/api/laboratory-types":{"post":{"operationId":"LaboratoryTypesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLaboratoryTypeDto"}}}},"responses":{"201":{"description":""}},"tags":["LaboratoryTypes"]},"get":{"operationId":"LaboratoryTypesController_findAll","parameters":[],"responses":{"200":{"description":""}},"tags":["LaboratoryTypes"]}},"/api/laboratory-types/active":{"get":{"operationId":"LaboratoryTypesController_findActive","parameters":[],"responses":{"200":{"description":""}},"tags":["LaboratoryTypes"]}},"/api/laboratory-types/{id}":{"get":{"operationId":"LaboratoryTypesController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["LaboratoryTypes"]},"patch":{"operationId":"LaboratoryTypesController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLaboratoryTypeDto"}}}},"responses":{"200":{"description":""}},"tags":["LaboratoryTypes"]},"delete":{"operationId":"LaboratoryTypesController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["LaboratoryTypes"]}},"/api/unit-definitions":{"get":{"operationId":"UnitDefinitionsController_findAll","parameters":[{"name":"dimension","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["UnitDefinitions"]}},"/api/unit-definitions/by-dimension/{dimension}":{"get":{"operationId":"UnitDefinitionsController_findByDimension","parameters":[{"name":"dimension","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["UnitDefinitions"]}},"/api/unit-definitions/product/{productId}/configs":{"get":{"operationId":"UnitDefinitionsController_getProductConfigs","parameters":[{"name":"productId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["UnitDefinitions"]},"post":{"operationId":"UnitDefinitionsController_upsertProductConfigs","parameters":[{"name":"productId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["UnitDefinitions"]}},"/api/departments":{"post":{"operationId":"DepartmentsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDepartmentDto"}}}},"responses":{"201":{"description":"Département créé"}},"security":[{"bearer":[]}],"summary":"Créer un département","tags":["Départements"]},"get":{"operationId":"DepartmentsController_findAll","parameters":[{"name":"search","required":false,"in":"query","schema":{"type":"string"}},{"name":"type","required":false,"in":"query","schema":{"type":"string","enum":["RECEPTION_ECHANTILLONS","QUALITE","COMPTABILITE","CAISSE","DAF","DIRECTION_GENERALE","AUTRE"]}},{"name":"isActive","required":false,"in":"query","schema":{"type":"boolean"}},{"name":"page","required":false,"in":"query","schema":{"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"default":20,"type":"number"}}],"responses":{"200":{"description":"Liste des départements"}},"security":[{"bearer":[]}],"summary":"Lister tous les départements","tags":["Départements"]}},"/api/departments/stats":{"get":{"operationId":"DepartmentsController_getStats","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Statistiques des départements","tags":["Départements"]}},"/api/departments/{id}":{"get":{"operationId":"DepartmentsController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Département trouvé"},"404":{"description":"Département introuvable"}},"security":[{"bearer":[]}],"summary":"Récupérer un département par ID","tags":["Départements"]},"put":{"operationId":"DepartmentsController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDepartmentDto"}}}},"responses":{"200":{"description":"Département modifié"}},"security":[{"bearer":[]}],"summary":"Modifier un département","tags":["Départements"]},"delete":{"operationId":"DepartmentsController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Département désactivé"}},"security":[{"bearer":[]}],"summary":"Désactiver un département","tags":["Départements"]}},"/api/departments/{id}/users":{"get":{"operationId":"DepartmentsController_getUsers","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lister les utilisateurs d'un département","tags":["Départements"]}},"/api/departments/{id}/available-users":{"get":{"operationId":"DepartmentsController_getAvailableUsers","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lister les utilisateurs disponibles à assigner à ce département","tags":["Départements"]}},"/api/departments/{id}/users/{userId}":{"post":{"operationId":"DepartmentsController_assignUser","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Assigner un utilisateur à un département","tags":["Départements"]},"delete":{"operationId":"DepartmentsController_removeUser","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Retirer un utilisateur d'un département","tags":["Départements"]}},"/api/purchase-requests":{"post":{"operationId":"PurchaseRequestsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePurchaseRequestDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Créer une demande générale (achat, maintenance, travaux...)","tags":["Demandes Générales (PurchaseRequest)"]},"get":{"operationId":"PurchaseRequestsController_findAll","parameters":[{"name":"status","required":true,"in":"query","schema":{"type":"string"}},{"name":"category","required":true,"in":"query","schema":{"type":"string"}},{"name":"departmentId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lister les demandes générales","tags":["Demandes Générales (PurchaseRequest)"]}},"/api/purchase-requests/statistics":{"get":{"operationId":"PurchaseRequestsController_getStatistics","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Statistiques des demandes","tags":["Demandes Générales (PurchaseRequest)"]}},"/api/purchase-requests/{id}":{"get":{"operationId":"PurchaseRequestsController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Récupérer une demande par ID","tags":["Demandes Générales (PurchaseRequest)"]},"put":{"operationId":"PurchaseRequestsController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePurchaseRequestDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Modifier une demande (brouillon uniquement)","tags":["Demandes Générales (PurchaseRequest)"]},"delete":{"operationId":"PurchaseRequestsController_cancel","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Annuler une demande","tags":["Demandes Générales (PurchaseRequest)"]}},"/api/purchase-requests/{id}/submit":{"post":{"operationId":"PurchaseRequestsController_submit","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Soumettre une demande au Responsable Achat","tags":["Demandes Générales (PurchaseRequest)"]}},"/api/purchase-requests/{id}/approve":{"post":{"operationId":"PurchaseRequestsController_approve","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Approuver une demande (Responsable Achat)","tags":["Demandes Générales (PurchaseRequest)"]}},"/api/purchase-requests/{id}/reject":{"post":{"operationId":"PurchaseRequestsController_reject","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectPurchaseRequestDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Rejeter une demande (Responsable Achat)","tags":["Demandes Générales (PurchaseRequest)"]}}},"info":{"title":"Laboratory Management API","description":"API pour la gestion de laboratoire","version":"1.0","contact":{}},"tags":[{"name":"Auth","description":"Authentification et autorisation"},{"name":"Users","description":"Gestion des utilisateurs"},{"name":"Categories","description":"Gestion des catégories"},{"name":"Products","description":"Gestion des produits"},{"name":"Stocks","description":"Gestion des stocks"},{"name":"Orders","description":"Gestion des commandes"},{"name":"Notifications","description":"Notifications en temps réel"},{"name":"Jobs","description":"Jobs automatisés et tâches planifiées"}],"servers":[],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"JWT","type":"http"}},"schemas":{"RegisterDto":{"type":"object","properties":{"email":{"type":"string","example":"john.doe@laboratory.com","description":"Email de l'utilisateur"},"password":{"type":"string","example":"Password123!","description":"Mot de passe (min 8 caractères, 1 majuscule, 1 chiffre, 1 caractère spécial)"},"firstName":{"type":"string","example":"John","description":"Prénom"},"lastName":{"type":"string","example":"Doe","description":"Nom de famille"},"role":{"type":"string","enum":["ADMIN","RESPONSABLE_ACHAT","RESPONSABLE_LABO","TECHNICIEN","RESPONSABLE_SERVICE","AGENT_RECEPTION","AGENT_QUALITE","COMPTABLE","CAISSIER","DAF","DG","CONTROLEUR_GESTION","CORRESPONDANT_ACHAT"],"example":"TECHNICIEN","description":"Rôle de l'utilisateur"},"laboratoryId":{"type":"string","description":"ID du laboratoire (optionnel)"},"phone":{"type":"string","example":"+225 07 XX XX XX XX","description":"Numéro de téléphone (optionnel)"}},"required":["email","password","firstName","lastName","role"]},"LoginDto":{"type":"object","properties":{"email":{"type":"string","example":"john.doe@laboratory.com","description":"Email de l'utilisateur"},"password":{"type":"string","example":"Password123!","description":"Mot de passe"}},"required":["email","password"]},"RefreshTokenDto":{"type":"object","properties":{"refreshToken":{"type":"string","description":"Refresh token","example":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."}},"required":["refreshToken"]},"CreateUserDto":{"type":"object","properties":{"email":{"type":"string","example":"john.doe@laboratory.com","description":"Email de l'utilisateur"},"password":{"type":"string","example":"Password123!","description":"Mot de passe (min 8 caractères, 1 majuscule, 1 chiffre, 1 caractère spécial)"},"firstName":{"type":"string","example":"John","description":"Prénom"},"lastName":{"type":"string","example":"Doe","description":"Nom de famille"},"role":{"type":"string","enum":["ADMIN","RESPONSABLE_ACHAT","RESPONSABLE_LABO","TECHNICIEN","RESPONSABLE_SERVICE","AGENT_RECEPTION","AGENT_QUALITE","COMPTABLE","CAISSIER","DAF","DG","CONTROLEUR_GESTION","CORRESPONDANT_ACHAT"],"example":"TECHNICIEN","description":"Rôle de l'utilisateur"},"laboratoryId":{"type":"string","description":"ID du laboratoire (optionnel)"},"phone":{"type":"string","example":"+225 07 XX XX XX XX","description":"Numéro de téléphone (optionnel)"}},"required":["email","password","firstName","lastName","role"]},"UpdateUserDto":{"type":"object","properties":{"firstName":{"type":"string","example":"John","description":"Prénom"},"lastName":{"type":"string","example":"Doe","description":"Nom de famille"},"role":{"type":"string","enum":["ADMIN","RESPONSABLE_ACHAT","RESPONSABLE_LABO","TECHNICIEN","RESPONSABLE_SERVICE","AGENT_RECEPTION","AGENT_QUALITE","COMPTABLE","CAISSIER","DAF","DG","CONTROLEUR_GESTION","CORRESPONDANT_ACHAT"],"example":"TECHNICIEN","description":"Rôle de l'utilisateur"},"laboratoryId":{"type":"string","description":"ID du laboratoire (optionnel)"},"phone":{"type":"string","example":"+225 07 XX XX XX XX","description":"Numéro de téléphone (optionnel)"},"isActive":{"type":"boolean","description":"Statut actif/inactif de l'utilisateur"}}},"ChangePasswordDto":{"type":"object","properties":{"oldPassword":{"type":"string","example":"OldPassword123!","description":"Ancien mot de passe"},"newPassword":{"type":"string","example":"NewPassword123!","description":"Nouveau mot de passe (min 8 caractères, 1 majuscule, 1 chiffre, 1 caractère spécial)"}},"required":["oldPassword","newPassword"]},"CreateCategoryDto":{"type":"object","properties":{"name":{"type":"string","example":"Réactifs Chimiques","description":"Nom de la catégorie"},"description":{"type":"string","example":"Catégorie regroupant tous les réactifs chimiques","description":"Description de la catégorie"},"code":{"type":"string","example":"CAT-REAC-001","description":"Code unique de la catégorie"}},"required":["name"]},"UpdateCategoryDto":{"type":"object","properties":{"name":{"type":"string","example":"Réactifs Chimiques","description":"Nom de la catégorie"},"description":{"type":"string","example":"Catégorie regroupant tous les réactifs chimiques","description":"Description de la catégorie"},"code":{"type":"string","example":"CAT-REAC-001","description":"Code unique de la catégorie"},"isActive":{"type":"boolean","description":"Statut actif/inactif"}}},"CreateSubCategoryDto":{"type":"object","properties":{"name":{"type":"string","example":"Acides","description":"Nom de la sous-catégorie"},"categoryId":{"type":"string","example":"ID de la catégorie parente"},"description":{"type":"string","example":"Sous-catégorie des acides chimiques"},"code":{"type":"string","example":"SUBCAT-ACID-001"}},"required":["name","categoryId"]},"UpdateSubCategoryDto":{"type":"object","properties":{"name":{"type":"string","example":"Acides","description":"Nom de la sous-catégorie"},"description":{"type":"string","example":"Sous-catégorie des acides chimiques"},"code":{"type":"string","example":"SUBCAT-ACID-001"},"isActive":{"type":"boolean"}}},"CreateSupplierDto":{"type":"object","properties":{"name":{"type":"string","example":"Sigma-Aldrich","description":"Nom du fournisseur"},"contact":{"type":"string","example":"M. Dupont"},"email":{"type":"string","example":"contact@sigma.com"},"phone":{"type":"string","example":"+225 27 XX XX XX XX"},"address":{"type":"string","example":"Abidjan, Cocody"},"category":{"type":"string","example":"Réactifs & Petit Matériel"},"serviceType":{"type":"string","example":"Vente de produits de laboratoire"},"productType":{"type":"string","example":"Réactifs, milieux de culture, petit matériel"},"serviceFourni":{"type":"string","example":"produits ; réactifs; milieux de culture et petit matériel"}},"required":["name"]},"UpdateSupplierDto":{"type":"object","properties":{"name":{"type":"string","example":"Sigma-Aldrich","description":"Nom du fournisseur"},"contact":{"type":"string","example":"M. Dupont"},"email":{"type":"string","example":"contact@sigma.com"},"phone":{"type":"string","example":"+225 27 XX XX XX XX"},"address":{"type":"string","example":"Abidjan, Cocody"},"category":{"type":"string","example":"Réactifs & Petit Matériel"},"serviceType":{"type":"string","example":"Vente de produits de laboratoire"},"productType":{"type":"string","example":"Réactifs, milieux de culture, petit matériel"},"serviceFourni":{"type":"string","example":"produits ; réactifs; milieux de culture et petit matériel"},"isActive":{"type":"boolean"}}},"CreateLaboratoryDto":{"type":"object","properties":{"name":{"type":"string","example":"Laboratoire Central","description":"Nom du laboratoire"},"type":{"type":"string","enum":["MICROBIOLOGIE","PHYSICO_CHIMIE","BIOLOGIE","DEPOT","AUTRE"],"example":"MICROBIOLOGIE"},"description":{"type":"string","example":"Laboratoire d'analyses microbiologiques"}},"required":["name","type"]},"UpdateLaboratoryDto":{"type":"object","properties":{"name":{"type":"string","example":"Laboratoire Central","description":"Nom du laboratoire"},"type":{"type":"string","enum":["MICROBIOLOGIE","PHYSICO_CHIMIE","BIOLOGIE","DEPOT","AUTRE"],"example":"MICROBIOLOGIE"},"description":{"type":"string","example":"Laboratoire d'analyses microbiologiques"},"isActive":{"type":"boolean"}}},"CreateEquipmentDto":{"type":"object","properties":{"name":{"type":"string","example":"Spectrophotomètre UV-Vis"},"reference":{"type":"string","example":"REF-SPEC-001"},"serialNumber":{"type":"string","example":"SN-2024-001"},"type":{"type":"string","enum":["ANALYTICAL","PREPARATION","SAFETY","STORAGE","MEASUREMENT","OTHER"],"example":"ANALYTICAL"},"status":{"type":"string","enum":["OPERATIONAL","MAINTENANCE","OUT_OF_ORDER","RETIRED"],"example":"OPERATIONAL"},"brand":{"type":"string","example":"Thermo Fisher Scientific"},"model":{"type":"string","example":"Evolution 201"},"purchaseDate":{"type":"string","example":"2024-01-15T00:00:00Z"},"warrantyEnd":{"type":"string","example":"2026-01-15T00:00:00Z"},"lastMaintenance":{"type":"string","example":"2024-10-01T00:00:00Z"},"nextMaintenance":{"type":"string","example":"2025-01-01T00:00:00Z"},"description":{"type":"string","example":"Spectrophotomètre pour analyses chimiques"},"location":{"type":"string","example":"Salle 101 - Paillasse 3"},"laboratoryId":{"type":"string","example":"lab-id-123"},"isActive":{"type":"boolean","example":true}},"required":["name","type","laboratoryId"]},"LaboratoryBasicDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"}},"required":["id","name","type"]},"EquipmentResponseDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"reference":{"type":"string"},"serialNumber":{"type":"string"},"type":{"type":"string","enum":["ANALYTICAL","PREPARATION","SAFETY","STORAGE","MEASUREMENT","OTHER"]},"status":{"type":"string","enum":["OPERATIONAL","MAINTENANCE","OUT_OF_ORDER","RETIRED"]},"brand":{"type":"string"},"model":{"type":"string"},"purchaseDate":{"format":"date-time","type":"string"},"warrantyEnd":{"format":"date-time","type":"string"},"lastMaintenance":{"format":"date-time","type":"string"},"nextMaintenance":{"format":"date-time","type":"string"},"description":{"type":"string"},"location":{"type":"string"},"isActive":{"type":"boolean"},"createdAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"},"laboratory":{"$ref":"#/components/schemas/LaboratoryBasicDto"},"daysUntilMaintenance":{"type":"number","description":"Nombre de jours avant la prochaine maintenance"},"maintenanceOverdue":{"type":"boolean","description":"Indique si la maintenance est en retard"}},"required":["id","name","type","status","isActive","createdAt","updatedAt","laboratory"]},"UpdateEquipmentDto":{"type":"object","properties":{"name":{"type":"string","example":"Spectrophotomètre UV-Vis"},"reference":{"type":"string","example":"REF-SPEC-001"},"serialNumber":{"type":"string","example":"SN-2024-001"},"type":{"type":"string","enum":["ANALYTICAL","PREPARATION","SAFETY","STORAGE","MEASUREMENT","OTHER"],"example":"ANALYTICAL"},"status":{"type":"string","enum":["OPERATIONAL","MAINTENANCE","OUT_OF_ORDER","RETIRED"],"example":"OPERATIONAL"},"brand":{"type":"string","example":"Thermo Fisher Scientific"},"model":{"type":"string","example":"Evolution 201"},"purchaseDate":{"type":"string","example":"2024-01-15T00:00:00Z"},"warrantyEnd":{"type":"string","example":"2026-01-15T00:00:00Z"},"lastMaintenance":{"type":"string","example":"2024-10-01T00:00:00Z"},"nextMaintenance":{"type":"string","example":"2025-01-01T00:00:00Z"},"description":{"type":"string","example":"Spectrophotomètre pour analyses chimiques"},"location":{"type":"string","example":"Salle 101 - Paillasse 3"},"laboratoryId":{"type":"string","example":"lab-id-123"},"isActive":{"type":"boolean","example":true}}},"UpdateStatusDto":{"type":"object","properties":{"status":{"type":"string","enum":["OPERATIONAL","MAINTENANCE","OUT_OF_ORDER","RETIRED"],"example":"MAINTENANCE"},"reason":{"type":"string","example":"Mise en maintenance pour problème de calibration"}},"required":["status"]},"UpdateMaintenanceDto":{"type":"object","properties":{"lastMaintenance":{"type":"string","example":"2024-10-21T00:00:00Z"},"nextMaintenance":{"type":"string","example":"2025-01-21T00:00:00Z"},"notes":{"type":"string","example":"Calibration effectuée, remplacement des filtres"}},"required":["lastMaintenance","nextMaintenance"]},"CreateProductDto":{"type":"object","properties":{"name":{"type":"string","example":"Acide Sulfurique 95%"},"reference":{"type":"string","example":"REF-H2SO4-95-001","uniqueItems":true},"description":{"type":"string"},"type":{"type":"string","enum":["REACTIF","CONSOMMABLE","ACCESSOIRE","MATERIEL"],"example":"REACTIF"},"unit":{"type":"string"},"mainUnit":{"type":"string","example":"L"},"realUnit":{"type":"string","example":"ML"},"conversionFactor":{"type":"number","example":1000,"default":1},"unitPrice":{"type":"number","example":45.5},"minimumStock":{"type":"number","example":10,"default":0},"expirationDate":{"type":"string","example":"2025-12-31T00:00:00Z"},"storageCondition":{"type":"string"},"categoryId":{"type":"string","example":"category-id-123"},"subCategoryId":{"type":"string","example":"sub-category-id-456"},"supplierId":{"type":"string","example":"supplier-id-789"},"isActive":{"type":"boolean","example":true,"default":true},"origin":{"type":"string"},"brand":{"type":"string"},"physicalState":{"type":"string"},"provenance":{"type":"string"},"laboratoryId":{"type":"string","example":"laboratory-id-123"},"initialQuantity":{"type":"number","example":100}},"required":["name","reference","type","minimumStock","isActive"]},"CategoryBasicDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"code":{"type":"string"}},"required":["id","name"]},"SubCategoryBasicDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"code":{"type":"string"}},"required":["id","name"]},"SupplierBasicDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"contact":{"type":"string"}},"required":["id","name"]},"StockInfoDto":{"type":"object","properties":{"laboratoryId":{"type":"string"},"laboratoryName":{"type":"string"},"quantity":{"type":"number"},"reservedQty":{"type":"number"},"availableQty":{"type":"number"}},"required":["laboratoryId","laboratoryName","quantity","reservedQty","availableQty"]},"ProductResponseDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"reference":{"type":"string"},"description":{"type":"string"},"type":{"type":"string","enum":["REACTIF","CONSOMMABLE","ACCESSOIRE","MATERIEL"]},"unit":{"type":"string","enum":["LITRE","ML","GRAMME","KG","BOITE","PIECE","FLACON","TUBE","PLAQUE"]},"unitPrice":{"type":"number"},"minimumStock":{"type":"number"},"isActive":{"type":"boolean"},"expirationDate":{"format":"date-time","type":"string"},"storageCondition":{"type":"string"},"origin":{"type":"string","description":"Pays d'origine du produit"},"brand":{"type":"string","description":"Marque du produit"},"physicalState":{"type":"string","description":"État physique du produit"},"provenance":{"type":"string","description":"Provenance ou lieu d'acquisition du produit"},"isExpired":{"type":"boolean"},"createdAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"},"category":{"$ref":"#/components/schemas/CategoryBasicDto"},"subCategory":{"$ref":"#/components/schemas/SubCategoryBasicDto"},"supplier":{"$ref":"#/components/schemas/SupplierBasicDto"},"stocks":{"type":"array","items":{"$ref":"#/components/schemas/StockInfoDto"}},"totalStock":{"type":"number"},"totalAvailableStock":{"type":"number"},"isLowStock":{"type":"boolean"},"daysUntilExpiration":{"type":"number"}},"required":["id","name","reference","type","unit","minimumStock","isActive","isExpired","createdAt","updatedAt"]},"UpdateProductDto":{"type":"object","properties":{"name":{"type":"string","example":"Acide Sulfurique 95%"},"reference":{"type":"string","example":"REF-H2SO4-95-001","uniqueItems":true},"description":{"type":"string"},"type":{"type":"string","enum":["REACTIF","CONSOMMABLE","ACCESSOIRE","MATERIEL"],"example":"REACTIF"},"unit":{"type":"string"},"mainUnit":{"type":"string","example":"L"},"realUnit":{"type":"string","example":"ML"},"conversionFactor":{"type":"number","example":1000,"default":1},"unitPrice":{"type":"number","example":45.5},"minimumStock":{"type":"number","example":10,"default":0},"expirationDate":{"type":"string","example":"2025-12-31T00:00:00Z"},"storageCondition":{"type":"string"},"categoryId":{"type":"string","example":"category-id-123"},"subCategoryId":{"type":"string","example":"sub-category-id-456"},"supplierId":{"type":"string","example":"supplier-id-789"},"isActive":{"type":"boolean","example":true,"default":true},"origin":{"type":"string"},"brand":{"type":"string"},"physicalState":{"type":"string"},"provenance":{"type":"string"},"laboratoryId":{"type":"string","example":"laboratory-id-123"},"initialQuantity":{"type":"number","example":100}}},"CreateStockDto":{"type":"object","properties":{"productId":{"type":"string","example":"product-id-123"},"laboratoryId":{"type":"string","example":"laboratory-id-456"},"quantity":{"type":"number","example":50,"minimum":0}},"required":["productId","laboratoryId","quantity"]},"ProductBasicDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"reference":{"type":"string"},"type":{"type":"string"},"unit":{"type":"string"},"minimumStock":{"type":"number"}},"required":["id","name","reference","type","unit","minimumStock"]},"StockResponseDto":{"type":"object","properties":{"id":{"type":"string"},"quantity":{"type":"number"},"reservedQty":{"type":"number"},"availableQty":{"type":"number","description":"Quantité disponible (quantity - reservedQty)"},"lastUpdated":{"format":"date-time","type":"string"},"product":{"$ref":"#/components/schemas/ProductBasicDto"},"laboratory":{"$ref":"#/components/schemas/LaboratoryBasicDto"},"isLowStock":{"type":"boolean","description":"Indique si le stock est bas"},"isOutOfStock":{"type":"boolean","description":"Indique si le stock est en rupture"},"stockPercentage":{"type":"number","description":"Pourcentage du stock minimum"}},"required":["id","quantity","reservedQty","availableQty","lastUpdated","product","laboratory","isLowStock","isOutOfStock"]},"UpdateStockDto":{"type":"object","properties":{"quantity":{"type":"number","example":75,"minimum":0}},"required":["quantity"]},"AdjustStockDto":{"type":"object","properties":{"type":{"type":"string","enum":["ADD","SUBTRACT","SET"],"example":"ADD","description":"ADD: Ajouter, SUBTRACT: Retirer, SET: Définir valeur exacte"},"quantity":{"type":"number","example":10},"reason":{"type":"string","example":"Ajustement inventaire mensuel"}},"required":["type","quantity"]},"ReserveStockDto":{"type":"object","properties":{"quantity":{"type":"number","example":5,"minimum":1},"reference":{"type":"string","example":"Réservation pour commande #CMD-2024-001"}},"required":["quantity"]},"ProformaItemDto":{"type":"object","properties":{"productId":{"type":"string","example":"product-id-123"},"requestedQty":{"type":"number","example":10,"minimum":1},"estimatedPrice":{"type":"number","example":45.5},"notes":{"type":"string","example":"Urgent - Besoin pour analyses"}},"required":["productId","requestedQty"]},"CreateProformaDto":{"type":"object","properties":{"supplierIds":{"example":["supplier-id-456","supplier-id-789"],"description":"Liste des IDs des fournisseurs à qui envoyer la proforma","type":"array","items":{"type":"string"}},"items":{"description":"Liste des produits à demander","type":"array","items":{"$ref":"#/components/schemas/ProformaItemDto"}},"expirationDate":{"type":"string","example":"2024-11-30T00:00:00Z","description":"Date d'expiration de la proforma"},"internalReference":{"type":"string","example":"REF-INT-2024-001"},"notes":{"type":"string","example":"Demande urgente pour projet XYZ"}},"required":["supplierIds","items"]},"UpdateProformaItemPriceDto":{"type":"object","properties":{"itemId":{"type":"string","example":"proforma-item-id-123"},"proformaPrice":{"type":"number","example":48.75},"availableQty":{"type":"number","example":15,"description":"Quantité disponible chez le fournisseur (si différente de la quantité demandée)"}},"required":["itemId","proformaPrice"]},"UpdateProformaDto":{"type":"object","properties":{"supplierReference":{"type":"string","example":"PROF-SUPPLIER-2024-001","description":"Référence fournisseur de la proforma"},"supplierId":{"type":"string","example":"supplier-id-123","description":"ID du fournisseur (système multi-fournisseurs)"},"deliveryDelay":{"type":"number","example":10,"description":"Délai de livraison en jours"},"itemPrices":{"description":"Prix et quantités disponibles des items de la proforma reçue","type":"array","items":{"$ref":"#/components/schemas/UpdateProformaItemPriceDto"}},"acceptsPartialQuantities":{"type":"boolean","example":false,"description":"Indique si le fournisseur peut livrer partiellement les quantités demandées"},"proformaDocument":{"type":"string","example":"proforma_doc.pdf","description":"Chemin du document proforma"},"expirationDate":{"type":"string","example":"2024-12-31T00:00:00Z"},"notes":{"type":"string"}}},"AdjustedPriceDto":{"type":"object","properties":{"itemId":{"type":"string","description":"ID de l'item à ajuster"},"adjustedPrice":{"type":"number","description":"Prix ajusté par le responsable"}}},"ValidateProformaDto":{"type":"object","properties":{"adjustedPrices":{"description":"Liste des prix ajustés par le responsable","type":"array","items":{"$ref":"#/components/schemas/AdjustedPriceDto"}}}},"RejectProformaDto":{"type":"object","properties":{"reason":{"type":"string","description":"Raison du rejet de la proforma","example":"Les prix sont trop élevés par rapport au budget"}},"required":["reason"]},"OrderItemDto":{"type":"object","properties":{"productId":{"type":"string","example":"product-id-123"},"quantity":{"type":"number","example":10,"minimum":1},"unitPrice":{"type":"number","example":45.5},"notes":{"type":"string","example":"Notes spécifiques"}},"required":["productId","quantity"]},"CreateOrderDto":{"type":"object","properties":{"supplierId":{"type":"string","example":"supplier-id-456"},"items":{"description":"Liste des produits à commander","type":"array","items":{"$ref":"#/components/schemas/OrderItemDto"}},"expectedDate":{"type":"string","example":"2024-11-30T00:00:00Z","description":"Date de livraison souhaitée"},"quotationReference":{"type":"string","example":"QUOT-2024-001","description":"Référence de la proforma/cotation"},"notes":{"type":"string"}},"required":["supplierId","items"]},"ProformaItemAdjustmentDto":{"type":"object","properties":{"itemId":{"type":"string","example":"item-id-123"},"finalQuantity":{"type":"number","example":8,"description":"Quantité finale à commander (peut être différente de la quantité disponible du fournisseur)"},"adjustmentReason":{"type":"string","example":"Réduction de quantité car stock suffisant"}},"required":["itemId","finalQuantity"]},"CreateOrderFromProformaDto":{"type":"object","properties":{"proformaId":{"type":"string","example":"proforma-id-123","description":"ID de la proforma à convertir en commande"},"expectedDate":{"type":"string","example":"2024-11-30T00:00:00Z"},"notes":{"type":"string"},"quantityAdjustments":{"description":"Ajustements de quantités pour certains items","type":"array","items":{"$ref":"#/components/schemas/ProformaItemAdjustmentDto"}},"partialQuantityStrategy":{"type":"string","example":"AUTO","description":"Stratégie pour les quantités partielles: AUTO (utiliser quantité fournisseur), MANUAL (ajustements manuels), SPLIT (créer commandes séparées)"}},"required":["proformaId"]},"UpdateOrderDto":{"type":"object","properties":{"supplierId":{"type":"string","example":"supplier-id-456"},"items":{"description":"Liste des produits à commander","type":"array","items":{"$ref":"#/components/schemas/OrderItemDto"}},"expectedDate":{"type":"string","example":"2024-11-30T00:00:00Z","description":"Date de livraison souhaitée"},"quotationReference":{"type":"string","example":"QUOT-2024-001","description":"Référence de la proforma/cotation"},"notes":{"type":"string"}}},"ReceiveItemDto":{"type":"object","properties":{"itemId":{"type":"string","example":"order-item-id-123"},"quantity":{"type":"number","example":10,"minimum":1},"laboratoryId":{"type":"string","example":"laboratory-id-456"},"condition":{"type":"string","enum":["GOOD","DAMAGED","EXPIRED","INCOMPLETE","CONFORME","NON_CONFORME"],"example":"GOOD","description":"Condition de l'item reçu"},"notes":{"type":"string","example":"Emballage légèrement endommagé","description":"Notes sur la réception de cet item"}},"required":["itemId","quantity","laboratoryId"]},"ReceiveOrderDto":{"type":"object","properties":{"items":{"description":"Items reçus avec leurs quantités","type":"array","items":{"$ref":"#/components/schemas/ReceiveItemDto"}},"deliveryNote":{"type":"string","example":"BL-2024-001","description":"Référence du bon de livraison"},"invoiceReference":{"type":"string","example":"INV-2024-001","description":"Référence de la facture"},"notes":{"type":"string"}},"required":["items"]},"TestEmailDto":{"type":"object","properties":{"email":{"type":"string","description":"Email du destinataire","example":"test@example.com"}},"required":["email"]},"SubmitProformaFormDto":{"type":"object","properties":{}},"CreateReceptionItemDto":{"type":"object","properties":{"orderItemId":{"type":"string","description":"ID de l'article de commande","example":"cmdkib5b6000bgyqafxnya1lt"},"receivedQty":{"type":"number","description":"Quantité reçue","example":6,"minimum":1},"condition":{"type":"string","description":"Condition de l'article reçu","enum":["GOOD","DAMAGED","EXPIRED","INCOMPLETE","CONFORME","NON_CONFORME"],"example":"GOOD"},"notes":{"type":"string","description":"Notes sur cet article","example":"Premier article - parfait état"}},"required":["orderItemId","receivedQty","condition"]},"CreateReceptionDto":{"type":"object","properties":{"orderId":{"type":"string","description":"ID de la commande","example":"cmdkib5b60009gyqat8847mgf"},"receptionDate":{"type":"string","description":"Date de réception","example":"2025-01-27T10:00:00.000Z"},"notes":{"type":"string","description":"Notes générales sur la réception","example":"Réception partielle de plusieurs articles"},"items":{"description":"Liste des articles reçus","type":"array","items":{"$ref":"#/components/schemas/CreateReceptionItemDto"}}},"required":["orderId","receptionDate","items"]},"CreateDispatchItemDto":{"type":"object","properties":{"productId":{"type":"string","description":"ID du produit à dispatcher","example":"prod123"},"quantity":{"type":"number","description":"Quantité à dispatcher","example":10,"minimum":1},"condition":{"type":"string","enum":["GOOD","DAMAGED","EXPIRED","INCOMPLETE","CONFORME","NON_CONFORME"],"example":"GOOD","description":"État du produit (ISO 17025 §7.4.3)"},"supplierLotNumber":{"type":"string","example":"LOT-2025-001","description":"Numéro de lot fournisseur (ISO 17025 §7.4.1)"},"expirationDate":{"type":"string","example":"2026-12-31","description":"Date d'expiration"},"destinationLocation":{"type":"string","example":"Armoire A, Étagère 2","description":"Emplacement de destination dans le laboratoire"},"storageConditions":{"type":"string","example":"Conserver à 2-8°C, à l'abri de la lumière","description":"Conditions de stockage requises (ISO 17025 §7.4.3)"},"notes":{"type":"string","description":"Notes sur cet article","example":"Urgent - pour analyse"}},"required":["productId","quantity"]},"CreateDispatchDto":{"type":"object","properties":{"orderId":{"type":"string","description":"ID de la commande source","example":"cmd123"},"laboratoryId":{"type":"string","description":"ID du laboratoire destinataire","example":"lab123"},"dispatchDate":{"type":"string","description":"Date de dispatch","example":"2025-01-27T10:00:00.000Z"},"transportConditions":{"type":"string","description":"Conditions de transport (ISO 17025 §7.4.3)","example":"Température ambiante (15-25°C)"},"notes":{"type":"string","description":"Notes générales sur le dispatch","example":"Livraison urgente pour le laboratoire de microbiologie"},"items":{"description":"Liste des produits à dispatcher","type":"array","items":{"$ref":"#/components/schemas/CreateDispatchItemDto"}}},"required":["orderId","laboratoryId","items"]},"CreateSampleParameterDto":{"type":"object","properties":{"name":{"type":"string","description":"Nom du paramètre","example":"pH"},"quantity":{"type":"number","description":"Quantité de produit nécessaire pour ce paramètre","example":5,"minimum":1}},"required":["name","quantity"]},"CreateSampleDto":{"type":"object","properties":{"code":{"type":"string","description":"Code de l'échantillon (saisi par l'opérateur)","example":"ECH-2024-0001"},"nature":{"type":"string","description":"Nature de l'échantillon","example":"Eau potable"},"parameters":{"description":"Paramètres de l'échantillon avec leurs quantités","type":"array","items":{"$ref":"#/components/schemas/CreateSampleParameterDto"}}},"required":["code","nature","parameters"]},"CreateStockExitItemDto":{"type":"object","properties":{"productId":{"type":"string","description":"ID du produit","example":"prod123"},"quantity":{"type":"number","description":"Quantité saisie (peut être décimale, ex: 0.5 L)","example":0.5,"minimum":0.001},"unit":{"type":"string","description":"Unité de la quantité saisie (si différente de mainUnit du produit)","example":"LITRE"},"notes":{"type":"string","description":"Notes sur cet article"}},"required":["productId","quantity"]},"CreateStockExitDto":{"type":"object","properties":{"laboratoryId":{"type":"string","description":"ID du laboratoire","example":"lab123"},"sampleNumber":{"type":"string","description":"Numéro d'échantillon (optionnel)","example":"SAMPLE-2025-001"},"analysisType":{"type":"string","description":"Type d'analyse (optionnel)","enum":["MICROBIOLOGIE_BACTERIENNE","MICROBIOLOGIE_VIRALE","PHYSICO_CHIMIE_METAUX","PHYSICO_CHIMIE_ORGANIQUES","BIOLOGIE_HEMATOLOGIE","BIOLOGIE_BIOCHIMIE","AUTRE"],"example":"MICROBIOLOGIE_BACTERIENNE"},"sample":{"description":"Échantillon avec ses paramètres (optionnel)","allOf":[{"$ref":"#/components/schemas/CreateSampleDto"}]},"exitDate":{"type":"string","description":"Date de sortie","example":"2025-01-27T10:00:00.000Z"},"notes":{"type":"string","description":"Notes générales","example":"Analyse urgente pour client X"},"items":{"description":"Liste des produits à sortir","type":"array","items":{"$ref":"#/components/schemas/CreateStockExitItemDto"}}},"required":["laboratoryId","items"]},"QuickStockExitDto":{"type":"object","properties":{"quantity":{"type":"number","description":"Quantité à sortir (optionnel si échantillon fourni - sera calculée automatiquement)","example":5,"minimum":1},"sampleNumber":{"type":"string","description":"Numéro d'échantillon (optionnel)","example":"SAMPLE-2025-001"},"analysisType":{"type":"string","description":"Type d'analyse (optionnel)","enum":["MICROBIOLOGIE_BACTERIENNE","MICROBIOLOGIE_VIRALE","PHYSICO_CHIMIE_METAUX","PHYSICO_CHIMIE_ORGANIQUES","BIOLOGIE_HEMATOLOGIE","BIOLOGIE_BIOCHIMIE","AUTRE"],"example":"MICROBIOLOGIE_BACTERIENNE"},"sample":{"description":"Échantillon avec ses paramètres (optionnel)","allOf":[{"$ref":"#/components/schemas/CreateSampleDto"}]},"notes":{"type":"string","description":"Notes additionnelles","example":"Analyse de routine"}}},"UpdateSampleCodeDto":{"type":"object","properties":{"code":{"type":"string","description":"Code de l'échantillon (format recommandé: ECH-YYYY-NNNN)","example":"ECH-2024-0001"}},"required":["code"]},"CreateRestockItemDto":{"type":"object","properties":{"productId":{"type":"string","description":"ID du produit"},"requestedQty":{"type":"number","description":"Quantité demandée","minimum":1},"notes":{"type":"string","description":"Notes sur l'item"}},"required":["productId","requestedQty"]},"CreateRestockRequestDto":{"type":"object","properties":{"reason":{"type":"string","description":"Raison de la demande"},"notes":{"type":"string","description":"Notes additionnelles"},"priority":{"type":"string","description":"Priorité de la demande","enum":["LOW","NORMAL","HIGH","URGENT"],"default":"NORMAL"},"items":{"description":"Liste des produits à réapprovisionner","type":"array","items":{"$ref":"#/components/schemas/CreateRestockItemDto"}}},"required":["items"]},"UpdateRestockRequestDto":{"type":"object","properties":{"reason":{"type":"string","description":"Raison de la demande"},"notes":{"type":"string","description":"Notes additionnelles"},"priority":{"type":"string","description":"Priorité de la demande","enum":["LOW","NORMAL","HIGH","URGENT"],"default":"NORMAL"},"items":{"description":"Liste des produits à réapprovisionner","type":"array","items":{"$ref":"#/components/schemas/CreateRestockItemDto"}}}},"ValidateRestockItemDto":{"type":"object","properties":{"itemId":{"type":"string","description":"ID de l'item"},"approvedQty":{"type":"number","description":"Quantité approuvée par le responsable labo","minimum":0},"notes":{"type":"string","description":"Notes sur l'item"}},"required":["itemId"]},"ValidateRestockRequestDto":{"type":"object","properties":{"notes":{"type":"string","description":"Notes de validation"},"items":{"description":"Items avec quantités approuvées","type":"array","items":{"$ref":"#/components/schemas/ValidateRestockItemDto"}}}},"RejectRestockRequestDto":{"type":"object","properties":{"rejectionReason":{"type":"string","description":"Raison du rejet"}},"required":["rejectionReason"]},"CreateLabTransferItemDto":{"type":"object","properties":{"productId":{"type":"string","description":"ID du produit"},"requestedQty":{"type":"number","description":"Quantité demandée","minimum":1},"notes":{"type":"string","description":"Notes sur l'item"}},"required":["productId","requestedQty"]},"CreateLabTransferDto":{"type":"object","properties":{"fromLaboratoryId":{"type":"string","description":"ID du laboratoire source (requis pour RESPONSABLE_ACHAT)"},"toLaboratoryId":{"type":"string","description":"ID du laboratoire destinataire"},"reason":{"type":"string","description":"Raison du transfert"},"notes":{"type":"string","description":"Notes additionnelles"},"priority":{"type":"string","description":"Priorité de la demande","enum":["LOW","NORMAL","HIGH","URGENT"],"default":"NORMAL"},"items":{"description":"Liste des produits à transférer","type":"array","items":{"$ref":"#/components/schemas/CreateLabTransferItemDto"}}},"required":["toLaboratoryId","items"]},"UpdateLabTransferDto":{"type":"object","properties":{"fromLaboratoryId":{"type":"string","description":"ID du laboratoire source (requis pour RESPONSABLE_ACHAT)"},"toLaboratoryId":{"type":"string","description":"ID du laboratoire destinataire"},"reason":{"type":"string","description":"Raison du transfert"},"notes":{"type":"string","description":"Notes additionnelles"},"priority":{"type":"string","description":"Priorité de la demande","enum":["LOW","NORMAL","HIGH","URGENT"],"default":"NORMAL"},"items":{"description":"Liste des produits à transférer","type":"array","items":{"$ref":"#/components/schemas/CreateLabTransferItemDto"}}}},"RespondLabTransferItemDto":{"type":"object","properties":{"itemId":{"type":"string","description":"ID de l'item"},"approvedQty":{"type":"number","description":"Quantité approuvée","minimum":0},"notes":{"type":"string","description":"Notes sur l'item"}},"required":["itemId"]},"RespondLabTransferDto":{"type":"object","properties":{"approved":{"type":"boolean","description":"Accepter ou refuser la demande"},"rejectionReason":{"type":"string","description":"Raison du refus (obligatoire si refusé)"},"responseNotes":{"type":"string","description":"Notes de réponse"},"items":{"description":"Items avec quantités approuvées (si accepté)","type":"array","items":{"$ref":"#/components/schemas/RespondLabTransferItemDto"}}},"required":["approved"]},"UpdateAlertConfigDto":{"type":"object","properties":{"lowStockThreshold":{"type":"number","description":"Seuil de stock bas","minimum":0},"criticalStockThreshold":{"type":"number","description":"Seuil de stock critique","minimum":0},"expirationWarningDays":{"type":"number","description":"Jours d'avertissement avant expiration","minimum":1},"expirationUrgentDays":{"type":"number","description":"Jours d'urgence avant expiration","minimum":1},"orderDelayThresholdDays":{"type":"number","description":"Seuil de retard de commande (jours)","minimum":1},"maintenanceWarningDays":{"type":"number","description":"Jours d'avertissement avant maintenance","minimum":1},"alertRetentionDays":{"type":"number","description":"Jours de rétention des alertes","minimum":1},"enableStockAlerts":{"type":"boolean","description":"Activer les alertes de stock"},"enableExpirationAlerts":{"type":"boolean","description":"Activer les alertes d'expiration"},"enableOrderAlerts":{"type":"boolean","description":"Activer les alertes de commande"},"enableEquipmentAlerts":{"type":"boolean","description":"Activer les alertes d'équipement"}}},"MarkAlertsReadDto":{"type":"object","properties":{"alertIds":{"description":"Liste des IDs d'alertes à marquer comme lues","type":"array","items":{"type":"string"}}}},"CreateStockMovementDto":{"type":"object","properties":{"type":{"type":"string","description":"Type de mouvement","enum":["ENTREE","SORTIE","TRANSFERT"]},"quantity":{"type":"number","description":"Quantité du mouvement","minimum":1},"productId":{"type":"string","description":"ID du produit"},"reason":{"type":"string","description":"Raison du mouvement"},"reference":{"type":"string","description":"Référence (numéro de commande, transfert, etc.)"}},"required":["type","quantity","productId"]},"PurchaseManagerStatsDto":{"type":"object","properties":{}},"AdminStatsDto":{"type":"object","properties":{}},"LabManagerStatsDto":{"type":"object","properties":{}},"TechnicianStatsDto":{"type":"object","properties":{}},"CreateMaintenanceRequestDto":{"type":"object","properties":{}},"UpdateMaintenanceRequestDto":{"type":"object","properties":{}},"CreateMaintenanceScheduleDto":{"type":"object","properties":{}},"AnalysisConfigProductDto":{"type":"object","properties":{"productId":{"type":"string","description":"ID du produit utilisé","example":"clx1a2b3c4d5e6f7g8h9i0"},"quantityPerSample":{"type":"number","description":"Quantité utilisée par échantillon","example":1},"unit":{"type":"string","description":"Unité de la quantité","enum":["LITRE","ML","GRAMME","KG","BOITE","PIECE","FLACON","TUBE","PLAQUE"],"example":"PIECE"},"packaging":{"type":"string","description":"Description du conditionnement (ex: Boîte de 100 tests)","example":"Boîte de 100 tests"},"packagingQuantity":{"type":"number","description":"Quantité dans le conditionnement","example":100},"packagingUnit":{"type":"string","description":"Unité du conditionnement","enum":["LITRE","ML","GRAMME","KG","BOITE","PIECE","FLACON","TUBE","PLAQUE"],"example":"PIECE"},"unitPrice":{"type":"number","description":"Prix unitaire du produit","example":0.15},"packagingPrice":{"type":"number","description":"Prix du conditionnement complet","example":15},"notes":{"type":"string","description":"Notes spécifiques pour ce produit","example":"Conserver au frais"}},"required":["productId","quantityPerSample","unit"]},"CreateAnalysisConfigDto":{"type":"object","properties":{"analysisType":{"type":"string","description":"Type d'analyse","enum":["MICROBIOLOGIE_BACTERIENNE","MICROBIOLOGIE_VIRALE","PHYSICO_CHIMIE_METAUX","PHYSICO_CHIMIE_ORGANIQUES","BIOLOGIE_HEMATOLOGIE","BIOLOGIE_BIOCHIMIE","AUTRE"],"example":"MICROBIOLOGIE_BACTERIENNE"},"matrix":{"type":"string","description":"Type de matrice (Eau, Sol, Air, Aliment, Sang, Urine, etc.)","example":"Aliment"},"parameterName":{"type":"string","description":"Nom du paramètre d'analyse (pH, Salmonelle, E. coli, etc.)","example":"Salmonelle"},"products":{"description":"Liste des produits utilisés pour cette analyse","example":[{"productId":"clx1a2b3c4d5e6f7g8h9i0","quantityPerSample":1,"unit":"PIECE","packaging":"Boîte de 100 tests","packagingQuantity":100,"packagingUnit":"PIECE","packagingPrice":15}],"type":"array","items":{"$ref":"#/components/schemas/AnalysisConfigProductDto"}},"notes":{"type":"string","description":"Notes ou instructions spécifiques","example":"Configuration pour matrice alimentaire"},"isActive":{"type":"boolean","description":"Configuration active ou non","example":true,"default":true}},"required":["analysisType","matrix","parameterName","products"]},"UpdateAnalysisConfigDto":{"type":"object","properties":{"analysisType":{"type":"string","description":"Type d'analyse","enum":["MICROBIOLOGIE_BACTERIENNE","MICROBIOLOGIE_VIRALE","PHYSICO_CHIMIE_METAUX","PHYSICO_CHIMIE_ORGANIQUES","BIOLOGIE_HEMATOLOGIE","BIOLOGIE_BIOCHIMIE","AUTRE"],"example":"MICROBIOLOGIE_BACTERIENNE"},"matrix":{"type":"string","description":"Type de matrice (Eau, Sol, Air, Aliment, Sang, Urine, etc.)","example":"Aliment"},"parameterName":{"type":"string","description":"Nom du paramètre d'analyse (pH, Salmonelle, E. coli, etc.)","example":"Salmonelle"},"products":{"description":"Liste des produits utilisés pour cette analyse","example":[{"productId":"clx1a2b3c4d5e6f7g8h9i0","quantityPerSample":1,"unit":"PIECE","packaging":"Boîte de 100 tests","packagingQuantity":100,"packagingUnit":"PIECE","packagingPrice":15}],"type":"array","items":{"$ref":"#/components/schemas/AnalysisConfigProductDto"}},"notes":{"type":"string","description":"Notes ou instructions spécifiques","example":"Configuration pour matrice alimentaire"},"isActive":{"type":"boolean","description":"Configuration active ou non","example":true,"default":true}}},"LinkApiKeyDto":{"type":"object","properties":{}},"CreateLaboratoryTypeDto":{"type":"object","properties":{}},"UpdateLaboratoryTypeDto":{"type":"object","properties":{}},"CreateDepartmentDto":{"type":"object","properties":{"name":{"type":"string","example":"Direction Administrative et Financière"},"code":{"type":"string","example":"DAF"},"type":{"type":"string","enum":["RECEPTION_ECHANTILLONS","QUALITE","COMPTABILITE","CAISSE","DAF","DIRECTION_GENERALE","AUTRE"],"example":"DAF"},"description":{"type":"string","example":"Département en charge des finances et de l'administration"},"isActive":{"type":"boolean","default":true}},"required":["name","code","type"]},"UpdateDepartmentDto":{"type":"object","properties":{"name":{"type":"string","example":"Direction Administrative et Financière"},"code":{"type":"string","example":"DAF"},"type":{"type":"string","enum":["RECEPTION_ECHANTILLONS","QUALITE","COMPTABILITE","CAISSE","DAF","DIRECTION_GENERALE","AUTRE"],"example":"DAF"},"description":{"type":"string","example":"Département en charge des finances et de l'administration"},"isActive":{"type":"boolean","default":true}}},"CreatePurchaseRequestDto":{"type":"object","properties":{"title":{"type":"string","example":"Réparation climatiseur salle de réunion"},"description":{"type":"string","example":"Le climatiseur de la salle 3 est en panne depuis 2 semaines."},"category":{"type":"string","enum":["ACHAT_PRODUITS","MAINTENANCE","TRAVAUX","PRESTATION","FOURNITURES_BUREAU","INFORMATIQUE","AUTRE"],"default":"AUTRE"},"priority":{"type":"string","enum":["LOW","NORMAL","HIGH","URGENT"],"default":"NORMAL"},"estimatedAmount":{"type":"number","example":150000}},"required":["title","category"]},"UpdatePurchaseRequestDto":{"type":"object","properties":{"title":{"type":"string","example":"Réparation climatiseur salle de réunion"},"description":{"type":"string","example":"Le climatiseur de la salle 3 est en panne depuis 2 semaines."},"category":{"type":"string","enum":["ACHAT_PRODUITS","MAINTENANCE","TRAVAUX","PRESTATION","FOURNITURES_BUREAU","INFORMATIQUE","AUTRE"],"default":"AUTRE"},"priority":{"type":"string","enum":["LOW","NORMAL","HIGH","URGENT"],"default":"NORMAL"},"estimatedAmount":{"type":"number","example":150000}}},"RejectPurchaseRequestDto":{"type":"object","properties":{"rejectionReason":{"type":"string","example":"Budget insuffisant pour ce trimestre"}},"required":["rejectionReason"]}}}}