{
    "openapi": "3.0.0",
    "info": {
        "title": "FORD FUEL",
        "description": "GESTION DES STATION PETROLIERE",
        "contact": {
            "email": "fordhightech89@gmail.com"
        },
        "version": "1.0.0"
    },
    "servers": [
        {
            "url": "https://cotal-group-energy.sarl/api_stations/public",
            "description": "Environnement de développement"
        }
    ],
    "paths": {
        "/api/auth/login": {
            "post": {
                "tags": [
                    "Authentification"
                ],
                "summary": "Connexion utilisateur",
                "description": "Authentifie un utilisateur par e-mail + mot de passe (admin/superviseur/technicien/lecteur) OU par code d'accès à 4-6 chiffres (pompiste uniquement).",
                "operationId": "dd51a484b7fa0f97c7680fdbde14cf5f",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "email": {
                                        "description": "Requis pour login standard",
                                        "type": "string",
                                        "format": "email",
                                        "example": "admin@stationos.bj"
                                    },
                                    "password": {
                                        "description": "Requis pour login standard",
                                        "type": "string",
                                        "example": "password"
                                    },
                                    "code_acces": {
                                        "description": "Code 4-6 chiffres pour pompiste (sans email)",
                                        "type": "string",
                                        "example": "1234"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Connexion réussie — token + profil utilisateur"
                    },
                    "401": {
                        "description": "Identifiants invalides"
                    },
                    "403": {
                        "description": "Compte désactivé"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                }
            }
        },
        "/api/auth/logout": {
            "post": {
                "tags": [
                    "Authentification"
                ],
                "summary": "Déconnexion",
                "operationId": "df9bdc6c7a6d9f20b983526b2ec0f698",
                "responses": {
                    "200": {
                        "description": "Déconnexion réussie"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/auth/me": {
            "get": {
                "tags": [
                    "Authentification"
                ],
                "summary": "Profil de l'utilisateur connecté",
                "operationId": "b5de204f5e452ef51327c691aa99e77c",
                "responses": {
                    "200": {
                        "description": "Profil utilisateur"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/auth/password": {
            "patch": {
                "tags": [
                    "Authentification"
                ],
                "summary": "Changer son propre mot de passe",
                "operationId": "15bfa443d944576d03c4dffdf82b76a4",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "password",
                                    "password_confirmation"
                                ],
                                "properties": {
                                    "password": {
                                        "type": "string"
                                    },
                                    "password_confirmation": {
                                        "type": "string"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Mot de passe mis à jour"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/clients": {
            "get": {
                "tags": [
                    "Clients"
                ],
                "summary": "Liste des clients",
                "description": "Retourne les clients paginés. Filtrable par type, point de vente et recherche textuelle (nom, téléphone, code).",
                "operationId": "413c12320d4121431e38339f45ecaa7c",
                "parameters": [
                    {
                        "name": "type",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "particulier",
                                "entreprise",
                                "administration"
                            ]
                        }
                    },
                    {
                        "name": "pdv_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "q",
                        "in": "query",
                        "description": "Recherche par nom, code ou téléphone",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "actif",
                        "in": "query",
                        "schema": {
                            "type": "boolean"
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "default": 20
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Liste paginée des clients"
                    },
                    "401": {
                        "description": "Authentification requise"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Clients"
                ],
                "summary": "Créer un client",
                "description": "Réservé aux rôles admin, superviseur et caissier.",
                "operationId": "f909473745c1a1d469e0c5a5b54682b8",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "type",
                                    "nom"
                                ],
                                "properties": {
                                    "type": {
                                        "type": "string",
                                        "enum": [
                                            "particulier",
                                            "entreprise",
                                            "administration"
                                        ],
                                        "example": "entreprise"
                                    },
                                    "nom": {
                                        "type": "string",
                                        "example": "Trucks SA"
                                    },
                                    "prenom": {
                                        "type": "string",
                                        "example": null,
                                        "nullable": true
                                    },
                                    "telephone": {
                                        "type": "string",
                                        "example": "+229 95 11 22 33"
                                    },
                                    "email": {
                                        "type": "string",
                                        "example": "compta@trucks.bj"
                                    },
                                    "adresse": {
                                        "type": "string",
                                        "example": "Zone industrielle Cotonou"
                                    },
                                    "num_contribuable": {
                                        "type": "string",
                                        "example": "IFU-12345678"
                                    },
                                    "credit_autorise": {
                                        "type": "boolean",
                                        "example": true
                                    },
                                    "plafond_credit": {
                                        "type": "number",
                                        "example": 2000000
                                    },
                                    "point_de_vente_id": {
                                        "type": "integer",
                                        "example": 1
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Client créé"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/clients/{id}": {
            "get": {
                "tags": [
                    "Clients"
                ],
                "summary": "Détail d'un client",
                "operationId": "feff36e8c89b21277ad216c29ca9ca4b",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Client avec historique des mouvements"
                    },
                    "404": {
                        "description": "Client introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "delete": {
                "tags": [
                    "Clients"
                ],
                "summary": "Supprimer un client",
                "operationId": "5b6d3bdaf49885db3b7b4b23aed2156b",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Client supprimé"
                    },
                    "409": {
                        "description": "Client lié à des ventes — suppression impossible"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "patch": {
                "tags": [
                    "Clients"
                ],
                "summary": "Mettre à jour un client",
                "description": "Réservé aux rôles admin et superviseur.",
                "operationId": "57a4f93815d29f166543efe9b101d633",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "nom": {
                                        "type": "string"
                                    },
                                    "prenom": {
                                        "type": "string"
                                    },
                                    "telephone": {
                                        "type": "string"
                                    },
                                    "email": {
                                        "type": "string"
                                    },
                                    "credit_autorise": {
                                        "type": "boolean"
                                    },
                                    "plafond_credit": {
                                        "type": "number"
                                    },
                                    "actif": {
                                        "type": "boolean"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Client mis à jour"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Client introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/clients/{id}/crediter": {
            "post": {
                "tags": [
                    "Clients"
                ],
                "summary": "Créditer le compte d'un client (encaisser un paiement)",
                "description": "Réduit le solde crédit du client (= il rembourse sa dette). Réservé aux rôles admin et superviseur.",
                "operationId": "c2783a5647b09d8f9d15d51e5912f1bc",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "montant"
                                ],
                                "properties": {
                                    "montant": {
                                        "type": "number",
                                        "example": 150000
                                    },
                                    "reference": {
                                        "type": "string",
                                        "example": "VIR-2026-001"
                                    },
                                    "note": {
                                        "type": "string",
                                        "example": "Virement bancaire reçu"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Compte crédité"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Client introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/clients/{id}/solde": {
            "get": {
                "tags": [
                    "Clients"
                ],
                "summary": "Solde et disponible d'un client",
                "operationId": "ec9212e02652faa87510225a344331fb",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Solde actuel + disponible + plafond"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/clients/{id}/mouvements": {
            "get": {
                "tags": [
                    "Clients"
                ],
                "summary": "Historique des mouvements crédit/débit d'un client",
                "operationId": "0f140c7e72f92aa69636e26d7cef4ee6",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "default": 20
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Liste paginée des mouvements"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/clients/{id}/debiter": {
            "post": {
                "tags": [
                    "Clients"
                ],
                "summary": "Débiter le compte d'un client (achats à crédit)",
                "operationId": "c5dff3a18e00b4afe044a919a54adabf",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "montant"
                                ],
                                "properties": {
                                    "montant": {
                                        "type": "number"
                                    },
                                    "reference": {
                                        "type": "string"
                                    },
                                    "note": {
                                        "type": "string"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Compte débité"
                    },
                    "422": {
                        "description": "Plafond dépassé ou client sans crédit"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/commandes-fournisseurs": {
            "get": {
                "tags": [
                    "Approvisionnement"
                ],
                "summary": "Liste des commandes fournisseurs",
                "description": "Retourne les commandes paginées. Filtrable par statut, point de vente et fournisseur.",
                "operationId": "a7b10dbc3afd7ba72cb5ba199de59e39",
                "parameters": [
                    {
                        "name": "statut",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "attente",
                                "confirme",
                                "transit",
                                "livre",
                                "annule"
                            ]
                        }
                    },
                    {
                        "name": "pdv_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "fournisseur_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "default": 15
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Liste paginée des commandes"
                    },
                    "401": {
                        "description": "Authentification requise"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Approvisionnement"
                ],
                "summary": "Créer une commande fournisseur",
                "description": "Réservé aux rôles admin et superviseur.",
                "operationId": "a12005d4d3b2387fca9a901a6deab9e6",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "fournisseur_id",
                                    "point_de_vente_id",
                                    "cuve_id",
                                    "produit_id",
                                    "volume_commande",
                                    "prix_unitaire",
                                    "date_commande",
                                    "date_livraison_prevue"
                                ],
                                "properties": {
                                    "fournisseur_id": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "point_de_vente_id": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "cuve_id": {
                                        "type": "string",
                                        "example": "C-01"
                                    },
                                    "produit_id": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "volume_commande": {
                                        "type": "number",
                                        "example": 8000
                                    },
                                    "prix_unitaire": {
                                        "type": "number",
                                        "example": 580
                                    },
                                    "date_commande": {
                                        "type": "string",
                                        "format": "date",
                                        "example": "2026-06-24"
                                    },
                                    "date_livraison_prevue": {
                                        "type": "string",
                                        "format": "date",
                                        "example": "2026-06-28"
                                    },
                                    "nom_chauffeur": {
                                        "type": "string",
                                        "example": "Kofi A.",
                                        "nullable": true
                                    },
                                    "notes": {
                                        "type": "string",
                                        "example": "Avant 10h",
                                        "nullable": true
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Commande créée"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/commandes-fournisseurs/{id}": {
            "get": {
                "tags": [
                    "Approvisionnement"
                ],
                "summary": "Détail d'une commande fournisseur",
                "operationId": "a9ba138f1ebc1a5d4bfb3b9272750898",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Commande trouvée"
                    },
                    "404": {
                        "description": "Commande introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "patch": {
                "tags": [
                    "Approvisionnement"
                ],
                "summary": "Mettre à jour une commande fournisseur",
                "description": "Mise à jour des informations logistiques (chauffeur, camion, bon, notes). Réservé aux rôles admin et superviseur.",
                "operationId": "589f678b9837e03e25e1057e4c810f9f",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "nom_chauffeur": {
                                        "type": "string"
                                    },
                                    "num_camion": {
                                        "type": "string"
                                    },
                                    "bon_livraison": {
                                        "type": "string"
                                    },
                                    "date_livraison_prevue": {
                                        "type": "string",
                                        "format": "date"
                                    },
                                    "notes": {
                                        "type": "string"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Commande mise à jour"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Commande introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/commandes-fournisseurs/{id}/statut": {
            "patch": {
                "tags": [
                    "Approvisionnement"
                ],
                "summary": "Changer le statut d'une commande",
                "description": "Si statut = 'livre', le volume livré est automatiquement ajouté au niveau de la cuve. Réservé aux rôles admin et superviseur.",
                "operationId": "5b5d03c127106fd643c469224029b7ec",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "statut"
                                ],
                                "properties": {
                                    "statut": {
                                        "type": "string",
                                        "enum": [
                                            "attente",
                                            "confirme",
                                            "transit",
                                            "livre",
                                            "annule"
                                        ],
                                        "example": "livre"
                                    },
                                    "volume_livre": {
                                        "type": "number",
                                        "example": 7950
                                    },
                                    "date_livraison_reelle": {
                                        "type": "string",
                                        "format": "date",
                                        "example": "2026-06-28"
                                    },
                                    "nom_chauffeur": {
                                        "type": "string",
                                        "example": "Kofi A."
                                    },
                                    "num_camion": {
                                        "type": "string",
                                        "example": "BJ-1234-AB"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Statut mis à jour — cuve incrémentée si livré"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Commande introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/fournisseurs": {
            "get": {
                "tags": [
                    "Approvisionnement"
                ],
                "summary": "Liste des fournisseurs",
                "description": "Retourne les fournisseurs avec leurs produits et statistiques commandes. Utilisé dans l'onglet Fournisseurs de l'écran Approvisionnement.",
                "operationId": "29cbbeed1abd471e56e687df2b4581de",
                "responses": {
                    "200": {
                        "description": "Liste des fournisseurs"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Approvisionnement"
                ],
                "summary": "Créer un fournisseur",
                "operationId": "0c420e585097c6a0a1c4d7393ff19ee3",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "nom"
                                ],
                                "properties": {
                                    "nom": {
                                        "type": "string",
                                        "example": "SONACOP"
                                    },
                                    "contact": {
                                        "type": "string"
                                    },
                                    "telephone": {
                                        "type": "string"
                                    },
                                    "email": {
                                        "type": "string"
                                    },
                                    "adresse": {
                                        "type": "string"
                                    },
                                    "delai_moyen": {
                                        "type": "string",
                                        "example": "J+2"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Fournisseur créé"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/fournisseurs/{id}": {
            "patch": {
                "tags": [
                    "Approvisionnement"
                ],
                "summary": "Modifier un fournisseur",
                "operationId": "713044e6a235638555dac6f89a19cb14",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Fournisseur modifié"
                    },
                    "404": {
                        "description": "Introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/cuves": {
            "get": {
                "tags": [
                    "Cuves"
                ],
                "summary": "Liste des cuves",
                "description": "Retourne toutes les cuves avec leur niveau de remplissage calculé et leur statut (normal/bas/critique/maintenance/suspendu). Filtrable par point de vente.",
                "operationId": "c1dde8949916a19363cda16bc2c7e55a",
                "parameters": [
                    {
                        "name": "pdv_id",
                        "in": "query",
                        "description": "Filtrer par point de vente",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "etat",
                        "in": "query",
                        "description": "Filtrer par état (actif, maintenance, suspendu)",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Liste des cuves"
                    },
                    "401": {
                        "description": "Authentification requise"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Cuves"
                ],
                "summary": "Créer une cuve",
                "description": "Réservé aux rôles admin et superviseur.",
                "operationId": "37ffd07c646f6487f0f7062e21f5f809",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "id",
                                    "point_de_vente_id",
                                    "produit_id",
                                    "capacite"
                                ],
                                "properties": {
                                    "id": {
                                        "type": "string",
                                        "example": "C-05"
                                    },
                                    "point_de_vente_id": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "produit_id": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "capacite": {
                                        "type": "number",
                                        "example": 10000
                                    },
                                    "niveau_actuel": {
                                        "type": "number",
                                        "example": 0
                                    },
                                    "seuil_alerte": {
                                        "type": "number",
                                        "example": 2000
                                    },
                                    "seuil_mini": {
                                        "type": "number",
                                        "example": 3000
                                    },
                                    "etat": {
                                        "type": "string",
                                        "example": "actif"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Cuve créée"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/cuves/{id}": {
            "get": {
                "tags": [
                    "Cuves"
                ],
                "summary": "Détail d'une cuve",
                "operationId": "676958e6ebf34d0e3f12459cfb6d5415",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "example": "C-01"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Cuve trouvée"
                    },
                    "404": {
                        "description": "Cuve introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "patch": {
                "tags": [
                    "Cuves"
                ],
                "summary": "Mettre à jour une cuve",
                "description": "Met à jour les seuils, la capacité et le niveau actuel d'une cuve.",
                "operationId": "8be5b74a3b870a4dfbc537e3a1f6c1cb",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "seuil_alerte": {
                                        "type": "number"
                                    },
                                    "seuil_mini": {
                                        "type": "number"
                                    },
                                    "niveau_actuel": {
                                        "type": "number"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Cuve mise à jour"
                    },
                    "404": {
                        "description": "Cuve introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/cuves/{id}/etat": {
            "patch": {
                "tags": [
                    "Cuves"
                ],
                "summary": "Changer l'état d'une cuve",
                "description": "Permet de passer une cuve en maintenance, suspendu ou actif. Réservé aux rôles admin, superviseur et technicien.",
                "operationId": "c79e7cb1a3faae64952379b4ce6ad80a",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "example": "C-01"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "etat"
                                ],
                                "properties": {
                                    "etat": {
                                        "type": "string",
                                        "enum": [
                                            "actif",
                                            "maintenance",
                                            "suspendu"
                                        ],
                                        "example": "maintenance"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "État mis à jour"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Cuve introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/cuves/{id}/jauges": {
            "get": {
                "tags": [
                    "Cuves"
                ],
                "summary": "Historique des jaugeages d'une cuve",
                "operationId": "1d61ea91c82e3890c413385b6274fbd5",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "default": 20
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Historique des jaugeages"
                    },
                    "404": {
                        "description": "Cuve introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Cuves"
                ],
                "summary": "Enregistrer un jaugeage",
                "description": "Enregistre un relevé de niveau sur une cuve et met à jour automatiquement le niveau actuel. Réservé aux rôles admin, superviseur et technicien.",
                "operationId": "dd08f0163c97eeb8c10098b06fa6b508",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "example": "C-01"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "date_jauge",
                                    "niveau",
                                    "volume"
                                ],
                                "properties": {
                                    "date_jauge": {
                                        "type": "string",
                                        "format": "datetime",
                                        "example": "2026-06-27 14:00:00"
                                    },
                                    "niveau": {
                                        "description": "Hauteur en cm",
                                        "type": "number",
                                        "example": 142.5
                                    },
                                    "volume": {
                                        "description": "Volume en litres",
                                        "type": "number",
                                        "example": 7200
                                    },
                                    "temperature": {
                                        "type": "number",
                                        "example": 28.4
                                    },
                                    "eau": {
                                        "type": "number",
                                        "example": 0
                                    },
                                    "densite": {
                                        "type": "number",
                                        "example": 0.742
                                    },
                                    "observation": {
                                        "type": "string",
                                        "example": "RAS"
                                    },
                                    "source": {
                                        "type": "string",
                                        "enum": [
                                            "MANUEL",
                                            "AUTOMATIQUE"
                                        ],
                                        "example": "MANUEL"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Jaugeage enregistré"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Cuve introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/emcef/diagnostic": {
            "get": {
                "tags": [
                    "e-MCF"
                ],
                "summary": "Diagnostic de la configuration e-MCF DGI",
                "operationId": "ae4a25d10fdd791d5f443beb47f8217d",
                "responses": {
                    "200": {
                        "description": "Résultat du diagnostic"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/emcef/statut": {
            "get": {
                "tags": [
                    "e-MCF"
                ],
                "summary": "Statut de l API e-MCF DGI",
                "operationId": "50f649cbdc8a6d66cd00db312f664651",
                "responses": {
                    "200": {
                        "description": "Statut API DGI"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/emcef/normaliser/{id}": {
            "post": {
                "tags": [
                    "e-MCF"
                ],
                "summary": "Normaliser une vente existante via e-MCF",
                "operationId": "770ccafc6e01b3d4e05734b65f1f08df",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Résultat de la normalisation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/emcef/avoir/{id}": {
            "post": {
                "tags": [
                    "e-MCF"
                ],
                "summary": "Émettre une facture d'avoir (FA) pour une vente annulée",
                "description": "Génère une Facture d'Avoir (FA) e-MCF pour annuler une vente déjà normalisée. À appeler après confirmation de l'annulation.",
                "operationId": "98f7ceb8218e88d5a3402f3ee27bd0fa",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "description": "ID de la vente à annuler",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Facture d'avoir émise avec succès"
                    },
                    "404": {
                        "description": "Vente introuvable"
                    },
                    "422": {
                        "description": "Vente non normalisée ou déjà annulée"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/etalonnages": {
            "post": {
                "tags": [
                    "Étalonnages"
                ],
                "summary": "Enregistrer un étalonnage",
                "description": "Calcule automatiquement l'écart et la conformité (tolérance ±2%). Met à jour l'état du pistolet en conséquence. Réservé aux rôles admin, superviseur et technicien.",
                "operationId": "bba96c48a4e8ee31e347fb172a68d99f",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "pistolet_id",
                                    "date_etal",
                                    "debit_avant",
                                    "debit_apres"
                                ],
                                "properties": {
                                    "pistolet_id": {
                                        "type": "string",
                                        "example": "PT-04A"
                                    },
                                    "date_etal": {
                                        "type": "string",
                                        "format": "date",
                                        "example": "2026-06-27"
                                    },
                                    "debit_avant": {
                                        "description": "Débit mesuré avant correction (L/min)",
                                        "type": "number",
                                        "example": 38.1
                                    },
                                    "debit_apres": {
                                        "description": "Débit mesuré après correction (L/min)",
                                        "type": "number",
                                        "example": 40
                                    },
                                    "technicien": {
                                        "type": "string",
                                        "example": "Tech. Akpo",
                                        "nullable": true
                                    },
                                    "observation": {
                                        "type": "string",
                                        "example": "Joint remplacé",
                                        "nullable": true
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Étalonnage enregistré — conforme ou non conforme indiqué dans le message"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Pistolet introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/pistolets/{id}/etalonnages": {
            "get": {
                "tags": [
                    "Étalonnages"
                ],
                "summary": "Historique des étalonnages d'un pistolet",
                "operationId": "7c2bda0159ff3db0104454cc470c6afd",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "example": "PT-01A"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Historique des étalonnages"
                    },
                    "404": {
                        "description": "Pistolet introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/journal": {
            "get": {
                "tags": [
                    "Journal"
                ],
                "summary": "Journal des opérations",
                "description": "Traçabilité complète de toutes les opérations (ventes, jaugeages, livraisons, maintenances, clôtures). Filtrable par type, produit, opérateur et plage de dates.",
                "operationId": "84fb0b0df3f97a427e1da802bfc0d116",
                "parameters": [
                    {
                        "name": "type_operation",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "vente",
                                "livraison",
                                "jaugeage",
                                "maintenance",
                                "cloture",
                                "annulation",
                                "ajustement"
                            ]
                        }
                    },
                    {
                        "name": "produit_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "utilisateur_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "pdv_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "date_debut",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "date_fin",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "q",
                        "in": "query",
                        "description": "Recherche par référence ou ID entité",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "default": 20
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Journal paginé"
                    },
                    "401": {
                        "description": "Authentification requise"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/journal/{id}": {
            "get": {
                "tags": [
                    "Journal"
                ],
                "summary": "Détail d'une opération",
                "operationId": "9e7c0dbb205a59094a59910969069400",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Opération trouvée"
                    },
                    "404": {
                        "description": "Opération introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/journal/kpis": {
            "get": {
                "tags": [
                    "Journal"
                ],
                "summary": "KPIs du journal pour la période",
                "operationId": "7be0e3fb65e50ec4e20a419749128f5a",
                "parameters": [
                    {
                        "name": "date_debut",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "date_fin",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "KPIs"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/journal/export": {
            "get": {
                "tags": [
                    "Journal"
                ],
                "summary": "Export CSV du journal",
                "operationId": "10b5332b44d03bfb075a1e86d2d59bc5",
                "parameters": [
                    {
                        "name": "date_debut",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "date_fin",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "type_operation",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Fichier CSV"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/parametres": {
            "get": {
                "tags": [
                    "Paramètres"
                ],
                "summary": "Liste des paramètres système",
                "description": "Retourne tous les paramètres sous forme de dictionnaire clé/valeur. Filtrable par groupe. Accessible à tout utilisateur connecté.",
                "operationId": "95174d5cb91fd5d8534fab75a7314319",
                "parameters": [
                    {
                        "name": "groupe",
                        "in": "query",
                        "description": "Groupe de paramètres : general, devise, fiscalite, cuves, securite, apparence",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Paramètres indexés par clé"
                    },
                    "401": {
                        "description": "Authentification requise"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "put": {
                "tags": [
                    "Paramètres"
                ],
                "summary": "Mettre à jour plusieurs paramètres en une seule requête",
                "description": "Mise à jour en lot. Réservé aux administrateurs.",
                "operationId": "eecb82eb6cf7466d1747dfc5832d3744",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "parametres"
                                ],
                                "properties": {
                                    "parametres": {
                                        "type": "array",
                                        "items": {
                                            "properties": {
                                                "cle": {
                                                    "type": "string",
                                                    "example": "tva_pct"
                                                },
                                                "valeur": {
                                                    "type": "string",
                                                    "example": "18"
                                                }
                                            },
                                            "type": "object"
                                        }
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Paramètres mis à jour"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/parametres/{cle}": {
            "get": {
                "tags": [
                    "Paramètres"
                ],
                "summary": "Lire un paramètre par sa clé",
                "operationId": "b5df1deba3175c7a58225050a0e037fb",
                "parameters": [
                    {
                        "name": "cle",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "example": "tva_pct"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Paramètre trouvé"
                    },
                    "404": {
                        "description": "Clé introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "put": {
                "tags": [
                    "Paramètres"
                ],
                "summary": "Mettre à jour un paramètre par sa clé",
                "description": "Réservé aux administrateurs.",
                "operationId": "2b8196811878110b1e0ad6e2554f17ed",
                "parameters": [
                    {
                        "name": "cle",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "example": "tva_pct"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "valeur"
                                ],
                                "properties": {
                                    "valeur": {
                                        "type": "string",
                                        "example": "20"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Paramètre mis à jour"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Clé introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/pistolets": {
            "get": {
                "tags": [
                    "Pistolets"
                ],
                "summary": "Liste des pistolets",
                "description": "Retourne tous les pistolets avec leur écart d'étalonnage calculé. Filtrable par état.",
                "operationId": "361a62288dab23889d8156a541b2ea31",
                "parameters": [
                    {
                        "name": "etat",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "operationnel",
                                "etalonnage",
                                "defaillant",
                                "inactif"
                            ]
                        }
                    },
                    {
                        "name": "pompe_id",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Liste des pistolets"
                    },
                    "401": {
                        "description": "Authentification requise"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Pistolets"
                ],
                "summary": "Créer un pistolet",
                "description": "Réservé aux rôles admin, superviseur et technicien.",
                "operationId": "d992f642869addd46a1c62c845a5c54c",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "id",
                                    "pompe_id",
                                    "debit_nominal"
                                ],
                                "properties": {
                                    "id": {
                                        "type": "string",
                                        "example": "PT-07A"
                                    },
                                    "pompe_id": {
                                        "type": "string",
                                        "example": "P-07"
                                    },
                                    "debit_nominal": {
                                        "type": "number",
                                        "example": 40
                                    },
                                    "frequence_etal": {
                                        "type": "string",
                                        "enum": [
                                            "mensuel",
                                            "trimestriel",
                                            "semestriel",
                                            "annuel"
                                        ],
                                        "example": "trimestriel"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Pistolet créé"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/pistolets/{id}": {
            "get": {
                "tags": [
                    "Pistolets"
                ],
                "summary": "Détail d'un pistolet",
                "operationId": "c9b83cf30246fe88c0aea9ef94169b59",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "example": "PT-01A"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Pistolet trouvé"
                    },
                    "404": {
                        "description": "Pistolet introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "patch": {
                "tags": [
                    "Pistolets"
                ],
                "summary": "Modifier un pistolet",
                "operationId": "05085301b345ee64c54de74c2d0bab0e",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "debit_nominal": {
                                        "type": "number"
                                    },
                                    "frequence_etal": {
                                        "type": "string"
                                    },
                                    "etat": {
                                        "type": "string"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Pistolet mis à jour"
                    },
                    "404": {
                        "description": "Pistolet introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/pistolets/{id}/etat": {
            "patch": {
                "tags": [
                    "Pistolets"
                ],
                "summary": "Changer l'état d'un pistolet",
                "operationId": "9eb41026e7709e9f76a5e764707c6a34",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "example": "PT-01A"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "etat"
                                ],
                                "properties": {
                                    "etat": {
                                        "type": "string",
                                        "enum": [
                                            "operationnel",
                                            "etalonnage",
                                            "defaillant",
                                            "inactif"
                                        ],
                                        "example": "etalonnage"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "État mis à jour"
                    },
                    "404": {
                        "description": "Pistolet introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/pompes": {
            "get": {
                "tags": [
                    "Pompes"
                ],
                "summary": "Liste des pompes",
                "description": "Retourne toutes les pompes avec leur produit associé. Filtrable par point de vente et par état.",
                "operationId": "c01e0f12953b4fe65ec52614ede1eb1a",
                "parameters": [
                    {
                        "name": "pdv_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "etat",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "operationnel",
                                "maintenance",
                                "suspendu",
                                "hors_service"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Liste des pompes"
                    },
                    "401": {
                        "description": "Authentification requise"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Pompes"
                ],
                "summary": "Créer une pompe",
                "description": "Réservé aux rôles admin et superviseur.",
                "operationId": "2bb4970a672de99310c5977647d81e50",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "id",
                                    "point_de_vente_id",
                                    "cuve_id",
                                    "produit_id"
                                ],
                                "properties": {
                                    "id": {
                                        "type": "string",
                                        "example": "P-07"
                                    },
                                    "point_de_vente_id": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "cuve_id": {
                                        "type": "string",
                                        "example": "C-01"
                                    },
                                    "produit_id": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "numero_serie": {
                                        "type": "string",
                                        "example": "SN-2026-P07"
                                    },
                                    "marque": {
                                        "type": "string",
                                        "example": "Gilbarco"
                                    },
                                    "date_installation": {
                                        "type": "string",
                                        "format": "date",
                                        "example": "2026-01-15"
                                    },
                                    "compteur_initial": {
                                        "type": "number",
                                        "example": 0
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Pompe créée"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/pompes/{id}": {
            "get": {
                "tags": [
                    "Pompes"
                ],
                "summary": "Détail d'une pompe",
                "operationId": "9f48c8e1ebad771714bb7e81c0b706b2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "example": "P-01"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Pompe trouvée"
                    },
                    "404": {
                        "description": "Pompe introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "patch": {
                "tags": [
                    "Pompes"
                ],
                "summary": "Modifier une pompe",
                "description": "Mise à jour des infos de la pompe (cuve, marque, numéro série…). Réservé aux rôles admin et superviseur.",
                "operationId": "ea81f2c9ee5de72ce7844a52ffa1fbd1",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "cuve_id": {
                                        "type": "string"
                                    },
                                    "marque": {
                                        "type": "string"
                                    },
                                    "numero_serie": {
                                        "type": "string"
                                    },
                                    "date_installation": {
                                        "type": "string",
                                        "format": "date"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Pompe mise à jour"
                    },
                    "404": {
                        "description": "Pompe introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/pompes/{id}/etat": {
            "patch": {
                "tags": [
                    "Pompes"
                ],
                "summary": "Changer l'état d'une pompe",
                "description": "Réservé aux rôles admin, superviseur et technicien.",
                "operationId": "0e0285b4233ac81f1831864ca8459c42",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "example": "P-01"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "etat"
                                ],
                                "properties": {
                                    "etat": {
                                        "type": "string",
                                        "enum": [
                                            "operationnel",
                                            "maintenance",
                                            "suspendu",
                                            "hors_service"
                                        ],
                                        "example": "maintenance"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "État mis à jour"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Pompe introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/produits": {
            "get": {
                "tags": [
                    "Produits"
                ],
                "summary": "Liste des produits",
                "description": "Retourne tous les produits du catalogue. Filtrable par catégorie, actif et recherche textuelle.",
                "operationId": "c7e27af70c1d33e37f767417e0880e68",
                "parameters": [
                    {
                        "name": "categorie_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "actif",
                        "in": "query",
                        "schema": {
                            "type": "boolean"
                        }
                    },
                    {
                        "name": "q",
                        "in": "query",
                        "description": "Recherche par nom ou code",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Liste des produits avec Prix A, Prix B et Prix TTC"
                    },
                    "401": {
                        "description": "Authentification requise"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Produits"
                ],
                "summary": "Créer un produit",
                "description": "Crée un nouveau produit. prix_a = Part exonérée DGI groupe A, prix_b = Part taxée TVA groupe B.",
                "operationId": "1dcf5bbc5058dd5e52384c289a96ba68",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "nom",
                                    "code",
                                    "unite",
                                    "prix_a",
                                    "prix_b",
                                    "taux_tva"
                                ],
                                "properties": {
                                    "nom": {
                                        "type": "string"
                                    },
                                    "code": {
                                        "type": "string"
                                    },
                                    "categorie_id": {
                                        "type": "integer"
                                    },
                                    "couleur_hex": {
                                        "type": "string",
                                        "example": "#F97316"
                                    },
                                    "unite": {
                                        "type": "string",
                                        "enum": [
                                            "litre",
                                            "unité",
                                            "kg"
                                        ]
                                    },
                                    "prix_a": {
                                        "description": "Prix A",
                                        "type": "number"
                                    },
                                    "prix_b": {
                                        "description": "Prix B",
                                        "type": "number"
                                    },
                                    "taux_tva": {
                                        "type": "number",
                                        "example": 18
                                    },
                                    "seuil_alerte": {
                                        "type": "number"
                                    },
                                    "actif": {
                                        "type": "boolean"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Produit créé"
                    },
                    "422": {
                        "description": "Erreurs de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/produits/{id}": {
            "get": {
                "tags": [
                    "Produits"
                ],
                "summary": "Détail d'un produit",
                "operationId": "bd48b3dd26740d05293134d4155f41c1",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Détail du produit"
                    },
                    "404": {
                        "description": "Produit introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "delete": {
                "tags": [
                    "Produits"
                ],
                "summary": "Supprimer un produit",
                "description": "Supprime un produit s'il n'est pas référencé dans des ventes ou cuves actives.",
                "operationId": "8766477c306a0545db7a9060ff0c6ca1",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Produit supprimé"
                    },
                    "409": {
                        "description": "Produit utilisé — suppression impossible"
                    },
                    "404": {
                        "description": "Produit introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/produits/{id}/prix": {
            "patch": {
                "tags": [
                    "Produits"
                ],
                "summary": "Modifier les prix d'un produit",
                "description": "Met à jour Prix A (prix_a) et Prix B (prix_b). Prix TTC = A + B calculé côté client.",
                "operationId": "de1b959050fefc29e5622fb1769d8988",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "prix_a",
                                    "prix_b"
                                ],
                                "properties": {
                                    "prix_a": {
                                        "description": "Prix A",
                                        "type": "number"
                                    },
                                    "prix_b": {
                                        "description": "Prix B",
                                        "type": "number"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Prix mis à jour"
                    },
                    "404": {
                        "description": "Produit introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/produits/{id}/toggle-actif": {
            "patch": {
                "tags": [
                    "Produits"
                ],
                "summary": "Activer / désactiver un produit",
                "operationId": "2d4ded9ce436593a857026501837c343",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Statut togglé"
                    },
                    "404": {
                        "description": "Produit introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/rapports/dashboard": {
            "get": {
                "tags": [
                    "Rapports"
                ],
                "summary": "KPIs du tableau de bord",
                "description": "Retourne les indicateurs clés (CA, transactions, alertes stock, commandes en transit) pour une période donnée.",
                "operationId": "823f77c407ca61ac28c5a6834462cf66",
                "parameters": [
                    {
                        "name": "date_debut",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date",
                            "example": "2026-06-01"
                        }
                    },
                    {
                        "name": "date_fin",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date",
                            "example": "2026-06-30"
                        }
                    },
                    {
                        "name": "pdv_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "KPIs calculés"
                    },
                    "401": {
                        "description": "Authentification requise"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/rapports/ventes/par-produit": {
            "get": {
                "tags": [
                    "Rapports"
                ],
                "summary": "Ventes agrégées par produit",
                "description": "Volume vendu, CA TTC et nombre de transactions par produit et catégorie sur la période.",
                "operationId": "e0186127f79ff47a6bcd23b9d7f4c77b",
                "parameters": [
                    {
                        "name": "date_debut",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "date_fin",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "pdv_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Agrégats par produit triés par CA décroissant"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/rapports/ventes/par-pompe": {
            "get": {
                "tags": [
                    "Rapports"
                ],
                "summary": "Ventes agrégées par pompe",
                "description": "Volume distribué et CA TTC par pompe sur la période.",
                "operationId": "e7746cdd41556ad57534452744379895",
                "parameters": [
                    {
                        "name": "date_debut",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "date_fin",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "pdv_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Agrégats par pompe"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/rapports/ventes/par-operateur": {
            "get": {
                "tags": [
                    "Rapports"
                ],
                "summary": "Ventes agrégées par opérateur",
                "description": "Nombre de transactions et CA TTC par caissier/opérateur sur la période.",
                "operationId": "08d61a9aa332a60b332dbf53803d3cde",
                "parameters": [
                    {
                        "name": "date_debut",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "date_fin",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "pdv_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Agrégats par opérateur triés par CA décroissant"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/rapports/stocks": {
            "get": {
                "tags": [
                    "Rapports"
                ],
                "summary": "État des stocks de toutes les cuves",
                "description": "Niveau actuel, pourcentage de remplissage et statut (normal/bas/critique/maintenance) de chaque cuve.",
                "operationId": "b481587d045db2b2a45e3811d699b7cb",
                "parameters": [
                    {
                        "name": "pdv_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "État des stocks"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/rapports/export/csv": {
            "get": {
                "tags": [
                    "Rapports"
                ],
                "summary": "Exporter les ventes en CSV",
                "description": "Génère un fichier CSV téléchargeable des lignes de vente avec produit, quantité, montant, opérateur et client.",
                "operationId": "ba9e9a9ead00b2f702773453b088ae33",
                "parameters": [
                    {
                        "name": "date_debut",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "date_fin",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "pdv_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Fichier CSV",
                        "content": {
                            "text/csv": {}
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/rapports/export/excel": {
            "get": {
                "tags": [
                    "Rapports"
                ],
                "summary": "Export Excel des ventes (format CSV compatible Excel)",
                "operationId": "20162458ea2aa0c30bcc8e7fd9f2eb46",
                "parameters": [
                    {
                        "name": "date_debut",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "date_fin",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Fichier Excel CSV"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/rapports/export/pdf": {
            "get": {
                "tags": [
                    "Rapports"
                ],
                "summary": "Export PDF des ventes",
                "operationId": "5c26201d0ddf7ef3a8db65ac4e067be8",
                "parameters": [
                    {
                        "name": "date_debut",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "date_fin",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Fichier PDF"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/stations": {
            "get": {
                "tags": [
                    "Stations"
                ],
                "summary": "Liste des stations-service",
                "description": "Retourne toutes les stations avec leurs points de vente. Accessible à tout utilisateur connecté.",
                "operationId": "169c0910e38928ff56efb1027ff472fe",
                "responses": {
                    "200": {
                        "description": "Liste des stations"
                    },
                    "401": {
                        "description": "Authentification requise"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Stations"
                ],
                "summary": "Créer une station",
                "description": "Réservé aux administrateurs.",
                "operationId": "6cecf862996dda377a5e3412fd5cf087",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "code",
                                    "nom"
                                ],
                                "properties": {
                                    "code": {
                                        "type": "string",
                                        "example": "STC-003"
                                    },
                                    "nom": {
                                        "type": "string",
                                        "example": "Station Porto-Novo"
                                    },
                                    "adresse": {
                                        "type": "string",
                                        "example": "Rue du Commerce, Porto-Novo"
                                    },
                                    "telephone": {
                                        "type": "string",
                                        "example": "+229 97 00 00 03"
                                    },
                                    "email": {
                                        "type": "string",
                                        "example": "pn@stationos.bj"
                                    },
                                    "gerant": {
                                        "type": "string",
                                        "example": "M. Koffi"
                                    },
                                    "num_agrement": {
                                        "type": "string",
                                        "example": "AGR-BJ-2024-0099"
                                    },
                                    "heure_ouverture": {
                                        "type": "string",
                                        "example": "06:00"
                                    },
                                    "heure_fermeture": {
                                        "type": "string",
                                        "example": "23:00"
                                    },
                                    "ouvert_24h": {
                                        "type": "boolean",
                                        "example": false
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Station créée"
                    },
                    "401": {
                        "description": "Authentification requise"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/stations/{id}": {
            "get": {
                "tags": [
                    "Stations"
                ],
                "summary": "Détail d'une station",
                "operationId": "992416787dc94974d4b62bee565a3127",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Station trouvée"
                    },
                    "404": {
                        "description": "Station introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "patch": {
                "tags": [
                    "Stations"
                ],
                "summary": "Mettre à jour une station",
                "description": "Réservé aux administrateurs.",
                "operationId": "42bc9372ad5d5ba6c5b5686eb2ca4fff",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "nom": {
                                        "type": "string"
                                    },
                                    "adresse": {
                                        "type": "string"
                                    },
                                    "telephone": {
                                        "type": "string"
                                    },
                                    "email": {
                                        "type": "string"
                                    },
                                    "gerant": {
                                        "type": "string"
                                    },
                                    "heure_ouverture": {
                                        "type": "string"
                                    },
                                    "heure_fermeture": {
                                        "type": "string"
                                    },
                                    "ouvert_24h": {
                                        "type": "boolean"
                                    },
                                    "actif": {
                                        "type": "boolean"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Station mise à jour"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Station introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/utilisateurs": {
            "get": {
                "tags": [
                    "Utilisateurs"
                ],
                "summary": "Liste des utilisateurs",
                "description": "Réservé aux rôles admin et superviseur.",
                "operationId": "6e23f57bbb8711de48e707b59792258a",
                "parameters": [
                    {
                        "name": "pdv_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "role_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "actif",
                        "in": "query",
                        "schema": {
                            "type": "boolean"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Liste des utilisateurs"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Utilisateurs"
                ],
                "summary": "Créer un utilisateur",
                "description": "Réservé aux administrateurs. Le flag doit_changer_mdp est activé à true par défaut.",
                "operationId": "2f9bff660d3ec2acb423971a29aec9f5",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "prenom",
                                    "nom",
                                    "email",
                                    "password",
                                    "role_id"
                                ],
                                "properties": {
                                    "prenom": {
                                        "type": "string",
                                        "example": "Awa"
                                    },
                                    "nom": {
                                        "type": "string",
                                        "example": "Koné"
                                    },
                                    "email": {
                                        "type": "string",
                                        "example": "awa.k@stationos.bj"
                                    },
                                    "password": {
                                        "type": "string",
                                        "example": "Password123!"
                                    },
                                    "role_id": {
                                        "type": "integer",
                                        "example": 3
                                    },
                                    "point_de_vente_id": {
                                        "type": "integer",
                                        "example": 1,
                                        "nullable": true
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Utilisateur créé"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/utilisateurs/{id}": {
            "get": {
                "tags": [
                    "Utilisateurs"
                ],
                "summary": "Détail d'un utilisateur",
                "description": "Retourne le profil avec les permissions du rôle associé.",
                "operationId": "ddaf85fef536a4e67b058c82124effbb",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Utilisateur trouvé"
                    },
                    "404": {
                        "description": "Utilisateur introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "delete": {
                "tags": [
                    "Utilisateurs"
                ],
                "summary": "Supprimer un utilisateur",
                "description": "Réservé aux administrateurs. Impossible si l'utilisateur a des ventes enregistrées.",
                "operationId": "7f2e091a07c9b4ad7874d65acdb12ace",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Utilisateur supprimé"
                    },
                    "409": {
                        "description": "Impossible — ventes liées"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "patch": {
                "tags": [
                    "Utilisateurs"
                ],
                "summary": "Mettre à jour un utilisateur",
                "description": "Réservé aux administrateurs.",
                "operationId": "2e2dd0beb01cd0748a502e348f8c65f4",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "prenom": {
                                        "type": "string"
                                    },
                                    "nom": {
                                        "type": "string"
                                    },
                                    "email": {
                                        "type": "string"
                                    },
                                    "role_id": {
                                        "type": "integer"
                                    },
                                    "point_de_vente_id": {
                                        "type": "integer",
                                        "nullable": true
                                    },
                                    "actif": {
                                        "type": "boolean"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Utilisateur mis à jour"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Utilisateur introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/utilisateurs/{id}/toggle-actif": {
            "patch": {
                "tags": [
                    "Utilisateurs"
                ],
                "summary": "Activer ou désactiver un compte",
                "description": "Bascule l'état actif/inactif du compte. Réservé aux administrateurs.",
                "operationId": "f6a83cf53fec57428007825964ab55ce",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "État modifié"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Utilisateur introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/utilisateurs/{id}/password": {
            "patch": {
                "tags": [
                    "Utilisateurs"
                ],
                "summary": "Réinitialiser le mot de passe d'un utilisateur",
                "description": "Réservé aux administrateurs. Force le changement de mot de passe au prochain login.",
                "operationId": "21058416296dc4b9e18bffb7c5ce823c",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "password"
                                ],
                                "properties": {
                                    "password": {
                                        "type": "string",
                                        "example": "NouveauMdp123!"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Mot de passe réinitialisé"
                    },
                    "403": {
                        "description": "Rôle insuffisant"
                    },
                    "404": {
                        "description": "Utilisateur introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/utilisateurs/{id}/code-acces": {
            "patch": {
                "tags": [
                    "Utilisateurs"
                ],
                "summary": "Définir ou réinitialiser le code d'accès d'un pompiste",
                "description": "Réservé aux administrateurs. Le code doit contenir 4 à 6 chiffres.",
                "operationId": "5c488ede647941f14a3ad9a40106f2fa",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "code_acces"
                                ],
                                "properties": {
                                    "code_acces": {
                                        "type": "string",
                                        "example": "1234"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Code d'accès défini"
                    },
                    "422": {
                        "description": "Utilisateur non pompiste ou code invalide"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/ventes": {
            "get": {
                "tags": [
                    "Ventes"
                ],
                "summary": "Liste des ventes",
                "description": "Retourne les ventes paginées. Filtrable par date, point de vente, client et mode de paiement.",
                "operationId": "15335824206369bd3767f5df662ceccf",
                "parameters": [
                    {
                        "name": "date_debut",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "date_fin",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "pdv_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "client_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "mode_paiement",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "annulee",
                        "in": "query",
                        "schema": {
                            "type": "boolean"
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "default": 20
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Liste paginée des ventes"
                    },
                    "401": {
                        "description": "Authentification requise"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Ventes"
                ],
                "summary": "Créer une vente (en-tête + lignes de détail)",
                "description": "Crée une vente complète avec une ou plusieurs lignes de produits. Gère automatiquement : déduction du stock (cuves et magasin), calcul du montant total, monnaie rendue, et débit du compte client si paiement à crédit. Réservé aux rôles admin, superviseur et caissier.",
                "operationId": "675fb691e81c71c49aabafa3027ce9ee",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "point_de_vente_id",
                                    "mode_paiement",
                                    "montant_recu",
                                    "lignes"
                                ],
                                "properties": {
                                    "point_de_vente_id": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "client_id": {
                                        "type": "integer",
                                        "example": 1,
                                        "nullable": true
                                    },
                                    "client_nom": {
                                        "type": "string",
                                        "example": "Client comptant",
                                        "nullable": true
                                    },
                                    "mode_paiement": {
                                        "type": "string",
                                        "enum": [
                                            "especes",
                                            "compte_client",
                                            "mobile_money",
                                            "carte",
                                            "bon_essence"
                                        ],
                                        "example": "especes"
                                    },
                                    "montant_recu": {
                                        "description": "Montant total payé par le client (TTC = prix_a + prix_b)",
                                        "type": "number",
                                        "example": 5000
                                    },
                                    "bon_numero": {
                                        "description": "Numéro UUID du bon d'essence si mode=bon_essence",
                                        "type": "string",
                                        "example": "BON-2026-0001",
                                        "nullable": true
                                    },
                                    "lignes": {
                                        "description": "Lignes de vente. prix_unitaire = prix_a + prix_b (TTC). Le serveur récupère automatiquement prix_a et prix_b depuis la table produits.",
                                        "type": "array",
                                        "items": {
                                            "properties": {
                                                "produit_id": {
                                                    "description": "ID du produit vendu",
                                                    "type": "integer",
                                                    "example": 12
                                                },
                                                "pompe_id": {
                                                    "description": "Obligatoire pour les carburants",
                                                    "type": "string",
                                                    "example": "P-01",
                                                    "nullable": true
                                                },
                                                "pistolet_id": {
                                                    "description": "Pistolet scanné",
                                                    "type": "string",
                                                    "example": "PT-01",
                                                    "nullable": true
                                                },
                                                "cuve_id": {
                                                    "description": "Cuve débitée",
                                                    "type": "string",
                                                    "example": "C-01",
                                                    "nullable": true
                                                },
                                                "quantite": {
                                                    "description": "Quantité vendue (litres ou unités)",
                                                    "type": "number",
                                                    "example": 6.9
                                                },
                                                "unite": {
                                                    "type": "string",
                                                    "enum": [
                                                        "litre",
                                                        "kg",
                                                        "piece",
                                                        "bidon",
                                                        "flacon"
                                                    ],
                                                    "example": "litre"
                                                },
                                                "prix_unitaire": {
                                                    "description": "Prix TTC/unité = prix_a + prix_b (ex: 60+665=725 pour essence)",
                                                    "type": "number",
                                                    "example": 725
                                                },
                                                "remise_pct": {
                                                    "description": "Remise en pourcentage (0 si pas de remise)",
                                                    "type": "number",
                                                    "example": 0
                                                },
                                                "taux_tva": {
                                                    "description": "Taux TVA applicable (18% standard Bénin)",
                                                    "type": "number",
                                                    "example": 18
                                                }
                                            },
                                            "type": "object"
                                        }
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Vente enregistrée"
                    },
                    "403": {
                        "description": "Rôle insuffisant ou plafond crédit dépassé"
                    },
                    "404": {
                        "description": "Client introuvable"
                    },
                    "422": {
                        "description": "Erreur de validation"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/ventes/{id}": {
            "get": {
                "tags": [
                    "Ventes"
                ],
                "summary": "Détail d'une vente avec ses lignes",
                "operationId": "7d3a40f67ad3a35f1b43089d3b078957",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Vente avec lignes de détail"
                    },
                    "404": {
                        "description": "Vente introuvable"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/ventes/{id}/confirmer-annulation": {
            "post": {
                "tags": [
                    "Ventes"
                ],
                "summary": "Confirmer ou rejeter une demande d'annulation (Admin/Superviseur)",
                "operationId": "a4dffa2ab5610d5a8a5bf2d94b46649f",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "action"
                                ],
                                "properties": {
                                    "action": {
                                        "type": "string",
                                        "enum": [
                                            "confirmer",
                                            "rejeter"
                                        ]
                                    },
                                    "motif_rejet": {
                                        "type": "string",
                                        "example": "Erreur de saisie"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Annulation traitée"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        }
    },
    "components": {
        "securitySchemes": {
            "bearerAuth": {
                "type": "http",
                "scheme": "bearer",
                "description": "Token opaque retourné par /api/auth/login, à envoyer dans l'en-tête Authorization: Bearer {token}. Vérifié côté serveur contre la table access_tokens (empreinte SHA-256, pas de JWT)."
            }
        }
    },
    "tags": [
        {
            "name": "Produits",
            "description": "Gestion du catalogue produits et des prix (Prix A, Prix B, Prix TTC)"
        },
        {
            "name": "Authentification",
            "description": "Authentification"
        },
        {
            "name": "Clients",
            "description": "Clients"
        },
        {
            "name": "Approvisionnement",
            "description": "Approvisionnement"
        },
        {
            "name": "Cuves",
            "description": "Cuves"
        },
        {
            "name": "e-MCF",
            "description": "e-MCF"
        },
        {
            "name": "Étalonnages",
            "description": "Étalonnages"
        },
        {
            "name": "Journal",
            "description": "Journal"
        },
        {
            "name": "Paramètres",
            "description": "Paramètres"
        },
        {
            "name": "Pistolets",
            "description": "Pistolets"
        },
        {
            "name": "Pompes",
            "description": "Pompes"
        },
        {
            "name": "Rapports",
            "description": "Rapports"
        },
        {
            "name": "Stations",
            "description": "Stations"
        },
        {
            "name": "Utilisateurs",
            "description": "Utilisateurs"
        },
        {
            "name": "Ventes",
            "description": "Ventes"
        }
    ],
    "security": [
        {
            "bearerAuth": []
        }
    ]
}