{"openapi": "3.0.3", "info": {"title": "Mon Chai — API publique", "version": "1.0.0", "description": "Lecture seule des stocks et des factures d'UNE exploitation, avec une clé personnelle créée dans Administration › Connecteur IA & clés d'API.\n\nAuthentification : en-tête `Authorization: Bearer mc_live_…` uniquement (jamais dans l'adresse). Appelez l'API depuis un serveur ou un script : pas de CORS, une clé ne doit jamais être servie à un navigateur.\n\nPortées :\n- `stocks:lecture` : Stocks (bouteilles, formats, cuvées, vrac)\n- `factures:lecture` : Factures et chiffre d'affaires (factures de vente et d'achat, impayés, chiffre d'affaires)\n\nLes montants sont des chaînes décimales exactes. Les textes renvoyés (noms, descriptions) sont des données saisies par l'exploitation."}, "servers": [{"url": "https://tester.monchai.fr/api/v1"}], "security": [{"cle": []}], "paths": {"/moi": {"get": {"operationId": "moi", "summary": "Exploitation, utilisateur, rôle et portées de la clé. À appeler en premier.", "tags": ["moi"], "parameters": [], "responses": {"200": {"description": "Succès.", "headers": {"X-RateLimit-Limit": {"description": "Requêtes permises par fenêtre pour cette clé.", "schema": {"type": "integer"}}, "X-RateLimit-Remaining": {"description": "Requêtes restantes dans la fenêtre.", "schema": {"type": "integer"}}, "X-RateLimit-Reset": {"description": "Secondes avant la nouvelle fenêtre.", "schema": {"type": "integer"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Moi"}}}}, "401": {"description": "Clé absente, mal formée, inconnue, révoquée, expirée, ou accès retiré.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "403": {"description": "Portée de la clé insuffisante, droit retiré, ou module fermé pour l'exploitation.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "405": {"description": "Méthode autre que GET (l'API v1 est en lecture seule).", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "429": {"description": "Trop de requêtes : attendez `Retry-After` secondes.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}, "headers": {"Retry-After": {"schema": {"type": "integer"}, "description": "Secondes à attendre."}}}}}}, "/stocks": {"get": {"operationId": "stocks", "summary": "Résumé des stocks : vrac en litres, bouteilles au total, par format et par cuvée.", "tags": ["stocks"], "parameters": [], "responses": {"200": {"description": "Succès.", "headers": {"X-RateLimit-Limit": {"description": "Requêtes permises par fenêtre pour cette clé.", "schema": {"type": "integer"}}, "X-RateLimit-Remaining": {"description": "Requêtes restantes dans la fenêtre.", "schema": {"type": "integer"}}, "X-RateLimit-Reset": {"description": "Secondes avant la nouvelle fenêtre.", "schema": {"type": "integer"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/StockResume"}}}}, "401": {"description": "Clé absente, mal formée, inconnue, révoquée, expirée, ou accès retiré.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "403": {"description": "Portée de la clé insuffisante, droit retiré, ou module fermé pour l'exploitation.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "405": {"description": "Méthode autre que GET (l'API v1 est en lecture seule).", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "429": {"description": "Trop de requêtes : attendez `Retry-After` secondes.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}, "headers": {"Retry-After": {"schema": {"type": "integer"}, "description": "Secondes à attendre."}}}}, "description": "Portée exigée : `stocks:lecture`."}}, "/stocks/vrac": {"get": {"operationId": "stocks_vrac", "summary": "Vin en vrac (cuves, lots techniques) en litres, par lot.", "tags": ["stocks"], "parameters": [], "responses": {"200": {"description": "Succès.", "headers": {"X-RateLimit-Limit": {"description": "Requêtes permises par fenêtre pour cette clé.", "schema": {"type": "integer"}}, "X-RateLimit-Remaining": {"description": "Requêtes restantes dans la fenêtre.", "schema": {"type": "integer"}}, "X-RateLimit-Reset": {"description": "Secondes avant la nouvelle fenêtre.", "schema": {"type": "integer"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/StockVrac"}}}}, "401": {"description": "Clé absente, mal formée, inconnue, révoquée, expirée, ou accès retiré.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "403": {"description": "Portée de la clé insuffisante, droit retiré, ou module fermé pour l'exploitation.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "405": {"description": "Méthode autre que GET (l'API v1 est en lecture seule).", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "429": {"description": "Trop de requêtes : attendez `Retry-After` secondes.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}, "headers": {"Retry-After": {"schema": {"type": "integer"}, "description": "Secondes à attendre."}}}}, "description": "Portée exigée : `stocks:lecture`."}}, "/stocks/cuvees/{cuvee}": {"get": {"operationId": "stocks_cuvee", "summary": "Stock d'une cuvée par son nom (exact, sinon « contient ») : bouteilles par format et lots commerciaux.", "tags": ["stocks"], "parameters": [{"name": "cuvee", "in": "path", "required": true, "description": "Nom de la cuvée (encodé dans l'adresse).", "schema": {"type": "string"}}], "responses": {"200": {"description": "Succès.", "headers": {"X-RateLimit-Limit": {"description": "Requêtes permises par fenêtre pour cette clé.", "schema": {"type": "integer"}}, "X-RateLimit-Remaining": {"description": "Requêtes restantes dans la fenêtre.", "schema": {"type": "integer"}}, "X-RateLimit-Reset": {"description": "Secondes avant la nouvelle fenêtre.", "schema": {"type": "integer"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/StockCuvee"}}}}, "400": {"description": "Paramètre invalide, inconnu, ambigu, ou clé glissée dans l'adresse.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "401": {"description": "Clé absente, mal formée, inconnue, révoquée, expirée, ou accès retiré.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "403": {"description": "Portée de la clé insuffisante, droit retiré, ou module fermé pour l'exploitation.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "404": {"description": "Cuvée ou facture introuvable.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "405": {"description": "Méthode autre que GET (l'API v1 est en lecture seule).", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "429": {"description": "Trop de requêtes : attendez `Retry-After` secondes.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}, "headers": {"Retry-After": {"schema": {"type": "integer"}, "description": "Secondes à attendre."}}}}, "description": "Portée exigée : `stocks:lecture`."}}, "/stocks/formats/{format_ml}": {"get": {"operationId": "stocks_format", "summary": "Lots commerciaux d'un format en millilitres (750 bouteille, 1500 magnum, 375 demi).", "tags": ["stocks"], "parameters": [{"name": "format_ml", "in": "path", "required": true, "description": "Format en millilitres, entre 50 et 30000.", "schema": {"type": "integer", "minimum": 50, "maximum": 30000}}], "responses": {"200": {"description": "Succès.", "headers": {"X-RateLimit-Limit": {"description": "Requêtes permises par fenêtre pour cette clé.", "schema": {"type": "integer"}}, "X-RateLimit-Remaining": {"description": "Requêtes restantes dans la fenêtre.", "schema": {"type": "integer"}}, "X-RateLimit-Reset": {"description": "Secondes avant la nouvelle fenêtre.", "schema": {"type": "integer"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/StockFormat"}}}}, "400": {"description": "Paramètre invalide, inconnu, ambigu, ou clé glissée dans l'adresse.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "401": {"description": "Clé absente, mal formée, inconnue, révoquée, expirée, ou accès retiré.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "403": {"description": "Portée de la clé insuffisante, droit retiré, ou module fermé pour l'exploitation.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "405": {"description": "Méthode autre que GET (l'API v1 est en lecture seule).", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "429": {"description": "Trop de requêtes : attendez `Retry-After` secondes.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}, "headers": {"Retry-After": {"schema": {"type": "integer"}, "description": "Secondes à attendre."}}}}, "description": "Portée exigée : `stocks:lecture`."}}, "/factures": {"get": {"operationId": "factures", "summary": "Factures (ventes par défaut, achats avec sens=purchase), filtrables par statut, période et client ; triées par date d'émission décroissante ; au plus 50.", "tags": ["factures"], "parameters": [{"name": "statut", "in": "query", "required": false, "description": "Statut de la facture.", "schema": {"type": "string", "enum": ["draft", "sent", "validated", "executed", "issued", "paid", "cancelled"]}}, {"name": "du", "in": "query", "required": false, "description": "Début de période (date d'émission), AAAA-MM-JJ.", "schema": {"type": "string", "format": "date"}}, {"name": "au", "in": "query", "required": false, "description": "Fin de période (date d'émission), AAAA-MM-JJ.", "schema": {"type": "string", "format": "date"}}, {"name": "client", "in": "query", "required": false, "description": "Partie du nom du client (100 caractères au plus).", "schema": {"type": "string"}}, {"name": "sens", "in": "query", "required": false, "description": "sale (ventes) ou purchase (achats).", "schema": {"type": "string", "enum": ["sale", "purchase"], "default": "sale"}}, {"name": "limite", "in": "query", "required": false, "description": "Nombre de factures rendues (1 à 50).", "schema": {"type": "integer", "default": 20, "minimum": 1, "maximum": 50}}], "responses": {"200": {"description": "Succès.", "headers": {"X-RateLimit-Limit": {"description": "Requêtes permises par fenêtre pour cette clé.", "schema": {"type": "integer"}}, "X-RateLimit-Remaining": {"description": "Requêtes restantes dans la fenêtre.", "schema": {"type": "integer"}}, "X-RateLimit-Reset": {"description": "Secondes avant la nouvelle fenêtre.", "schema": {"type": "integer"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/FacturesListe"}}}}, "400": {"description": "Paramètre invalide, inconnu, ambigu, ou clé glissée dans l'adresse.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "401": {"description": "Clé absente, mal formée, inconnue, révoquée, expirée, ou accès retiré.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "403": {"description": "Portée de la clé insuffisante, droit retiré, ou module fermé pour l'exploitation.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "405": {"description": "Méthode autre que GET (l'API v1 est en lecture seule).", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "429": {"description": "Trop de requêtes : attendez `Retry-After` secondes.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}, "headers": {"Retry-After": {"schema": {"type": "integer"}, "description": "Secondes à attendre."}}}}, "description": "Portée exigée : `factures:lecture`."}}, "/factures/impayees": {"get": {"operationId": "factures_impayees", "summary": "Factures de vente émises non soldées (avoirs déduits), total dû et échues.", "tags": ["factures"], "parameters": [{"name": "au", "in": "query", "required": false, "description": "Fin de période (date d'émission), AAAA-MM-JJ.", "schema": {"type": "string", "format": "date"}}], "responses": {"200": {"description": "Succès.", "headers": {"X-RateLimit-Limit": {"description": "Requêtes permises par fenêtre pour cette clé.", "schema": {"type": "integer"}}, "X-RateLimit-Remaining": {"description": "Requêtes restantes dans la fenêtre.", "schema": {"type": "integer"}}, "X-RateLimit-Reset": {"description": "Secondes avant la nouvelle fenêtre.", "schema": {"type": "integer"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/FacturesImpayees"}}}}, "400": {"description": "Paramètre invalide, inconnu, ambigu, ou clé glissée dans l'adresse.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "401": {"description": "Clé absente, mal formée, inconnue, révoquée, expirée, ou accès retiré.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "403": {"description": "Portée de la clé insuffisante, droit retiré, ou module fermé pour l'exploitation.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "405": {"description": "Méthode autre que GET (l'API v1 est en lecture seule).", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "429": {"description": "Trop de requêtes : attendez `Retry-After` secondes.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}, "headers": {"Retry-After": {"schema": {"type": "integer"}, "description": "Secondes à attendre."}}}}, "description": "Portée exigée : `factures:lecture`."}}, "/factures/{numero}": {"get": {"operationId": "facture", "summary": "Détail d'une facture ou d'un avoir par son numéro : en-tête, lignes, règlements.", "tags": ["factures"], "parameters": [{"name": "numero", "in": "path", "required": true, "description": "Numéro (ou référence) de la facture ou de l'avoir.", "schema": {"type": "string"}}], "responses": {"200": {"description": "Succès.", "headers": {"X-RateLimit-Limit": {"description": "Requêtes permises par fenêtre pour cette clé.", "schema": {"type": "integer"}}, "X-RateLimit-Remaining": {"description": "Requêtes restantes dans la fenêtre.", "schema": {"type": "integer"}}, "X-RateLimit-Reset": {"description": "Secondes avant la nouvelle fenêtre.", "schema": {"type": "integer"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/FactureDetail"}}}}, "400": {"description": "Paramètre invalide, inconnu, ambigu, ou clé glissée dans l'adresse.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "401": {"description": "Clé absente, mal formée, inconnue, révoquée, expirée, ou accès retiré.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "403": {"description": "Portée de la clé insuffisante, droit retiré, ou module fermé pour l'exploitation.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "404": {"description": "Cuvée ou facture introuvable.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "405": {"description": "Méthode autre que GET (l'API v1 est en lecture seule).", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "429": {"description": "Trop de requêtes : attendez `Retry-After` secondes.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}, "headers": {"Retry-After": {"schema": {"type": "integer"}, "description": "Secondes à attendre."}}}}, "description": "Portée exigée : `factures:lecture`."}}, "/chiffre-affaires": {"get": {"operationId": "chiffre_affaires", "summary": "Chiffre d'affaires sur une période : factures et avoirs de vente émis ou payés, net HT et TTC.", "tags": ["chiffre-affaires"], "parameters": [{"name": "du", "in": "query", "required": false, "description": "Début de période (date d'émission), AAAA-MM-JJ.", "schema": {"type": "string", "format": "date"}}, {"name": "au", "in": "query", "required": false, "description": "Fin de période (date d'émission), AAAA-MM-JJ.", "schema": {"type": "string", "format": "date"}}], "responses": {"200": {"description": "Succès.", "headers": {"X-RateLimit-Limit": {"description": "Requêtes permises par fenêtre pour cette clé.", "schema": {"type": "integer"}}, "X-RateLimit-Remaining": {"description": "Requêtes restantes dans la fenêtre.", "schema": {"type": "integer"}}, "X-RateLimit-Reset": {"description": "Secondes avant la nouvelle fenêtre.", "schema": {"type": "integer"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ChiffreAffaires"}}}}, "400": {"description": "Paramètre invalide, inconnu, ambigu, ou clé glissée dans l'adresse.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "401": {"description": "Clé absente, mal formée, inconnue, révoquée, expirée, ou accès retiré.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "403": {"description": "Portée de la clé insuffisante, droit retiré, ou module fermé pour l'exploitation.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "405": {"description": "Méthode autre que GET (l'API v1 est en lecture seule).", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}}, "429": {"description": "Trop de requêtes : attendez `Retry-After` secondes.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Erreur"}}}, "headers": {"Retry-After": {"schema": {"type": "integer"}, "description": "Secondes à attendre."}}}}, "description": "Portée exigée : `factures:lecture`."}}}, "components": {"securitySchemes": {"cle": {"type": "http", "scheme": "bearer", "bearerFormat": "mc_live_<préfixe>_<secret>", "description": "Clé d'API personnelle, montrée une seule fois à la création."}}, "schemas": {"Montant": {"type": "string", "pattern": "^-?\\d+(\\.\\d+)?$", "example": "1200.5", "description": "Nombre décimal exact, en chaîne (jamais un flottant)."}, "Quantite": {"oneOf": [{"type": "integer"}, {"$ref": "#/components/schemas/Montant"}], "description": "Entier, ou décimal en chaîne."}, "Erreur": {"type": "object", "properties": {"erreur": {"type": "object", "properties": {"code": {"type": "string", "description": "Code stable, à tester dans votre programme."}, "message": {"type": "string", "description": "Phrase en français, avec le geste à faire."}, "details": {"type": "object", "description": "Selon le code : paramètres acceptés, candidats…"}}, "required": ["code", "message"]}}, "required": ["erreur"]}, "LigneStock": {"type": "object", "properties": {"libelle": {"type": "string"}, "detail": {"type": "string"}, "quantite": {"$ref": "#/components/schemas/Quantite"}, "unite": {"type": "string"}, "reservee": {"$ref": "#/components/schemas/Quantite"}, "disponible": {"$ref": "#/components/schemas/Quantite"}, "site": {"type": "string"}, "etat_ligne": {"type": "string"}, "complements": {"type": "object"}}}, "FamilleStock": {"type": "object", "properties": {"famille": {"type": "string"}, "libelle": {"type": "string"}, "total": {"$ref": "#/components/schemas/Quantite"}, "total_reserve": {"$ref": "#/components/schemas/Quantite"}, "total_disponible": {"$ref": "#/components/schemas/Quantite"}, "unite": {"type": "string"}, "totaux_par_unite": {"type": "array", "items": {"type": "object", "properties": {"unite": {"type": "string"}, "total": {"$ref": "#/components/schemas/Quantite"}, "reservee": {"$ref": "#/components/schemas/Quantite"}, "disponible": {"$ref": "#/components/schemas/Quantite"}}}}, "fraicheur": {"type": "string"}, "source": {"type": "string"}, "note": {"type": "string"}, "alertes": {"type": "array", "items": {"type": "string"}}, "nombre_lignes": {"type": "integer"}, "tronque": {"type": "boolean"}, "lignes": {"type": "array", "items": {"$ref": "#/components/schemas/LigneStock"}}}}, "Facture": {"type": "object", "properties": {"numero": {"type": "string"}, "type": {"type": "string"}, "sens": {"type": "string", "enum": ["sale", "purchase"]}, "statut": {"type": "string"}, "client": {"type": "string"}, "date_emission": {"type": "string", "format": "date", "nullable": true}, "date_echeance": {"type": "string", "format": "date", "nullable": true}, "enregistree_le": {"type": "string", "format": "date-time"}, "total_ht": {"$ref": "#/components/schemas/Montant"}, "total_tva": {"$ref": "#/components/schemas/Montant"}, "total_ttc": {"$ref": "#/components/schemas/Montant"}, "montant_paye": {"$ref": "#/components/schemas/Montant"}, "reste_du": {"$ref": "#/components/schemas/Montant"}, "echue": {"type": "boolean"}, "devise": {"type": "string"}, "mode_vente": {"type": "string"}}}, "Moi": {"type": "object", "properties": {"etat": {"type": "string", "enum": ["ok", "empty"], "description": "`ok` : des données ; `empty` : rien à montrer (ce n'est pas une erreur)."}, "exploitation": {"type": "string"}, "utilisateur": {"type": "string"}, "role": {"type": "string"}, "portee": {"type": "array", "items": {"type": "string", "enum": ["stocks:lecture", "factures:lecture"]}}, "lecture_seule": {"type": "boolean"}, "modules": {"type": "object", "properties": {"stocks": {"type": "boolean"}, "facturation": {"type": "boolean"}}}, "transport": {"type": "string", "enum": ["api"]}, "cle": {"type": "object", "properties": {"nom": {"type": "string"}, "prefixe": {"type": "string"}, "portees": {"type": "array", "items": {"type": "string"}}, "expire_le": {"type": "string", "format": "date-time"}}}}}, "StockResume": {"type": "object", "properties": {"etat": {"type": "string", "enum": ["ok", "empty"], "description": "`ok` : des données ; `empty` : rien à montrer (ce n'est pas une erreur)."}, "vrac_litres": {"$ref": "#/components/schemas/Quantite"}, "nombre_lots_vrac": {"type": "integer"}, "bouteilles_total": {"$ref": "#/components/schemas/Quantite"}, "bouteilles_lots_commerciaux": {"$ref": "#/components/schemas/Quantite"}, "bouteilles_inventaire": {"$ref": "#/components/schemas/Quantite"}, "nombre_lots_commerciaux": {"type": "integer"}, "par_format": {"type": "array", "items": {"type": "object", "properties": {"format_ml": {"type": "integer"}, "bouteilles": {"$ref": "#/components/schemas/Quantite"}}}}, "par_cuvee": {"type": "array", "items": {"type": "object", "properties": {"cuvee": {"type": "string"}, "bouteilles": {"$ref": "#/components/schemas/Quantite"}}}}, "note": {"type": "string"}}}, "StockCuvee": {"type": "object", "properties": {"etat": {"type": "string", "enum": ["ok", "empty"], "description": "`ok` : des données ; `empty` : rien à montrer (ce n'est pas une erreur)."}, "cuvee": {"type": "string"}, "bouteilles_total": {"$ref": "#/components/schemas/Quantite"}, "par_format": {"type": "array", "items": {"type": "object", "properties": {"format_ml": {"type": "integer"}, "bouteilles": {"$ref": "#/components/schemas/Quantite"}}}}, "millesimes": {"type": "array", "items": {"type": "object", "properties": {"millesime": {"type": "integer", "nullable": true}, "libelle": {"type": "string"}, "par_format": {"type": "array", "items": {"type": "object", "properties": {"format_ml": {"type": "integer"}, "bouteilles": {"$ref": "#/components/schemas/Quantite"}}}}, "produits_finis": {"$ref": "#/components/schemas/FamilleStock"}, "lots_commerciaux": {"$ref": "#/components/schemas/FamilleStock"}}}}, "note": {"type": "string"}}}, "StockFormat": {"type": "object", "properties": {"etat": {"type": "string", "enum": ["ok", "empty"], "description": "`ok` : des données ; `empty` : rien à montrer (ce n'est pas une erreur)."}, "format_ml": {"type": "integer"}, "lots_commerciaux": {"$ref": "#/components/schemas/FamilleStock"}, "message": {"type": "string"}}}, "StockVrac": {"type": "object", "properties": {"etat": {"type": "string", "enum": ["ok", "empty"], "description": "`ok` : des données ; `empty` : rien à montrer (ce n'est pas une erreur)."}, "total_litres": {"$ref": "#/components/schemas/Quantite"}, "vrac": {"$ref": "#/components/schemas/FamilleStock"}}}, "FacturesListe": {"type": "object", "properties": {"etat": {"type": "string", "enum": ["ok", "empty"], "description": "`ok` : des données ; `empty` : rien à montrer (ce n'est pas une erreur)."}, "nombre_total": {"type": "integer"}, "nombre_renvoye": {"type": "integer"}, "tronque": {"type": "boolean"}, "factures": {"type": "array", "items": {"$ref": "#/components/schemas/Facture"}}}}, "FacturesImpayees": {"type": "object", "properties": {"etat": {"type": "string", "enum": ["ok", "empty"], "description": "`ok` : des données ; `empty` : rien à montrer (ce n'est pas une erreur)."}, "nombre": {"type": "integer"}, "montant_du_total": {"$ref": "#/components/schemas/Montant"}, "nombre_echues": {"type": "integer"}, "tronque": {"type": "boolean"}, "factures": {"type": "array", "items": {"$ref": "#/components/schemas/Facture"}}}}, "FactureDetail": {"type": "object", "properties": {"etat": {"type": "string", "enum": ["ok", "empty"], "description": "`ok` : des données ; `empty` : rien à montrer (ce n'est pas une erreur)."}, "facture": {"$ref": "#/components/schemas/Facture"}, "reference": {"type": "string"}, "lignes": {"type": "array", "items": {"type": "object", "properties": {"description": {"type": "string"}, "quantite": {"$ref": "#/components/schemas/Quantite"}, "prix_unitaire_ht": {"$ref": "#/components/schemas/Montant"}, "remise_pct": {"$ref": "#/components/schemas/Montant"}, "taux_tva": {"$ref": "#/components/schemas/Montant"}, "montant_ht": {"$ref": "#/components/schemas/Montant"}, "montant_ttc": {"$ref": "#/components/schemas/Montant"}, "lot": {"type": "string"}}}}, "reglements": {"type": "array", "items": {"type": "object", "properties": {"date": {"type": "string", "format": "date", "nullable": true}, "montant": {"$ref": "#/components/schemas/Montant"}, "moyen": {"type": "string"}, "reference": {"type": "string"}}}}}}, "ChiffreAffaires": {"type": "object", "properties": {"etat": {"type": "string", "enum": ["ok", "empty"], "description": "`ok` : des données ; `empty` : rien à montrer (ce n'est pas une erreur)."}, "periode": {"type": "object", "properties": {"du": {"type": "string", "format": "date", "nullable": true}, "au": {"type": "string", "format": "date", "nullable": true}}}, "factures": {"type": "object", "properties": {"nombre": {"type": "integer"}, "total_ht": {"$ref": "#/components/schemas/Montant"}, "total_ttc": {"$ref": "#/components/schemas/Montant"}}}, "avoirs": {"type": "object", "properties": {"nombre": {"type": "integer"}, "total_ht": {"$ref": "#/components/schemas/Montant"}, "total_ttc": {"$ref": "#/components/schemas/Montant"}}}, "chiffre_affaires_net_ht": {"$ref": "#/components/schemas/Montant"}, "chiffre_affaires_net_ttc": {"$ref": "#/components/schemas/Montant"}, "note": {"type": "string"}}}}}}