{"openapi":"3.1.0","info":{"title":"BRM Hub","version":"1.0.0"},"paths":{"/api/shipping/{bdc_id}/available":{"get":{"tags":["shipping-letmeship"],"summary":"Available Services","description":"Options transporteurs disponibles pour ce BDC (poids/dimensions saisis).","operationId":"available_services_api_shipping__bdc_id__available_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"bdc_id","in":"path","required":true,"schema":{"type":"integer","title":"Bdc Id"}},{"name":"weight","in":"query","required":true,"schema":{"type":"number","exclusiveMinimum":0.0,"title":"Weight"}},{"name":"length","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Length"}},{"name":"width","in":"query","required":false,"schema":{"type":"integer","default":15,"title":"Width"}},{"name":"height","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Height"}},{"name":"quantity","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Quantity"}},{"name":"goods_value","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Goods Value"}},{"name":"insurance","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Insurance"}},{"name":"ddp","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Ddp"}},{"name":"saturday_delivery","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Saturday Delivery"}},{"name":"holiday_delivery","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Holiday Delivery"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/shipping/{bdc_id}/defaults":{"get":{"tags":["shipping-letmeship"],"summary":"Shipping Defaults","description":"Valeurs par défaut pour la vue de contrôle d'expédition (pré-remplissage).","operationId":"shipping_defaults_api_shipping__bdc_id__defaults_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"bdc_id","in":"path","required":true,"schema":{"type":"integer","title":"Bdc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/shipping/{bdc_id}/recipient":{"put":{"tags":["shipping-letmeship"],"summary":"Update Recipient","description":"Met à jour le destinataire d'expédition du BDC (changement de dernière minute) :\nadresse + nom/société. Persisté sur la commande → tarifs LetMeShip/Colissimo, étiquette\net bon de livraison l'utilisent automatiquement. Le nom/société surchargent ceux du\nclient uniquement pour l'expédition. Refusé si déjà expédié.","operationId":"update_recipient_api_shipping__bdc_id__recipient_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"bdc_id","in":"path","required":true,"schema":{"type":"integer","title":"Bdc Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecipientUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/shipping/{bdc_id}/create":{"post":{"tags":["shipping-letmeship"],"summary":"Create Shipment","description":"Crée l'envoi LetMeShip + récupère l'étiquette + génère le bon de livraison.","operationId":"create_shipment_api_shipping__bdc_id__create_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"bdc_id","in":"path","required":true,"schema":{"type":"integer","title":"Bdc Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateShipmentRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/shipping/{bdc_id}/label":{"get":{"tags":["shipping-letmeship"],"summary":"Download Label","operationId":"download_label_api_shipping__bdc_id__label_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"bdc_id","in":"path","required":true,"schema":{"type":"integer","title":"Bdc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/shipping/{bdc_id}/summary":{"get":{"tags":["shipping-letmeship"],"summary":"Download Summary","description":"Document récapitulatif interne LetMeShip (SUMMARY) — suivi/classement. Streamé.","operationId":"download_summary_api_shipping__bdc_id__summary_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"bdc_id","in":"path","required":true,"schema":{"type":"integer","title":"Bdc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/shipping/{bdc_id}/delivery-note":{"get":{"tags":["shipping-letmeship"],"summary":"Download Delivery Note","operationId":"download_delivery_note_api_shipping__bdc_id__delivery_note_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"bdc_id","in":"path","required":true,"schema":{"type":"integer","title":"Bdc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/shipping/{bdc_id}/tracking":{"get":{"tags":["shipping-letmeship"],"summary":"Tracking","operationId":"tracking_api_shipping__bdc_id__tracking_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"bdc_id","in":"path","required":true,"schema":{"type":"integer","title":"Bdc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/shipping/{bdc_id}/notify-tracking":{"post":{"tags":["shipping-letmeship"],"summary":"Notify Tracking","description":"(Re)envoie l'email BRM au client avec le lien de suivi. Utile quand le n° de\nsuivi est attribué APRÈS la création de l'envoi. Rafraîchit le tracking depuis\nLetMeShip si absent en base.","operationId":"notify_tracking_api_shipping__bdc_id__notify_tracking_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"bdc_id","in":"path","required":true,"schema":{"type":"integer","title":"Bdc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/shipping/{bdc_id}":{"delete":{"tags":["shipping-letmeship"],"summary":"Cancel Shipment","description":"Annule l'envoi LetMeShip (cleanup phase test).","operationId":"cancel_shipment_api_shipping__bdc_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"bdc_id","in":"path","required":true,"schema":{"type":"integer","title":"Bdc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/shipping/{bdc_id}/colissimo/defaults":{"get":{"tags":["shipping-letmeship"],"summary":"Colissimo Defaults","description":"Pré-remplissage de la vue d'expédition Colissimo (poids, code produit, valeur).","operationId":"colissimo_defaults_api_shipping__bdc_id__colissimo_defaults_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"bdc_id","in":"path","required":true,"schema":{"type":"integer","title":"Bdc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/shipping/{bdc_id}/colissimo/check":{"post":{"tags":["shipping-letmeship"],"summary":"Colissimo Check","description":"Validation Colissimo (checkGenerateLabel) — NON facturé. Vérifie auth + payload.","operationId":"colissimo_check_api_shipping__bdc_id__colissimo_check_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"bdc_id","in":"path","required":true,"schema":{"type":"integer","title":"Bdc Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ColissimoRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/shipping/{bdc_id}/colissimo/create":{"post":{"tags":["shipping-letmeship"],"summary":"Colissimo Create","description":"Affranchit le colis Colissimo (generateLabel, FACTURÉ) + étiquette + bon de livraison.","operationId":"colissimo_create_api_shipping__bdc_id__colissimo_create_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"bdc_id","in":"path","required":true,"schema":{"type":"integer","title":"Bdc Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ColissimoRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sav-shipping/{sav_id}/defaults":{"get":{"tags":["sav-shipping"],"summary":"Sav Ship Defaults","operationId":"sav_ship_defaults_api_sav_shipping__sav_id__defaults_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sav_id","in":"path","required":true,"schema":{"type":"integer","title":"Sav Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sav-shipping/{sav_id}/available":{"get":{"tags":["sav-shipping"],"summary":"Sav Ship Available","operationId":"sav_ship_available_api_sav_shipping__sav_id__available_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sav_id","in":"path","required":true,"schema":{"type":"integer","title":"Sav Id"}},{"name":"weight","in":"query","required":true,"schema":{"type":"number","exclusiveMinimum":0.0,"title":"Weight"}},{"name":"length","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Length"}},{"name":"width","in":"query","required":false,"schema":{"type":"integer","default":15,"title":"Width"}},{"name":"height","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Height"}},{"name":"quantity","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Quantity"}},{"name":"goods_value","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Goods Value"}},{"name":"insurance","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Insurance"}},{"name":"ddp","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Ddp"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sav-shipping/{sav_id}/create":{"post":{"tags":["sav-shipping"],"summary":"Sav Ship Create","description":"Crée l'envoi LetMeShip retour client + étiquette + suivi. Passe le SAV en 'shipped'.","operationId":"sav_ship_create_api_sav_shipping__sav_id__create_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sav_id","in":"path","required":true,"schema":{"type":"integer","title":"Sav Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateShipmentRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sav-shipping/{sav_id}/label":{"get":{"tags":["sav-shipping"],"summary":"Sav Ship Label","operationId":"sav_ship_label_api_sav_shipping__sav_id__label_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sav_id","in":"path","required":true,"schema":{"type":"integer","title":"Sav Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sav-shipping/{sav_id}/tracking":{"get":{"tags":["sav-shipping"],"summary":"Sav Ship Tracking","operationId":"sav_ship_tracking_api_sav_shipping__sav_id__tracking_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sav_id","in":"path","required":true,"schema":{"type":"integer","title":"Sav Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sav-shipping/{sav_id}/colissimo/check":{"post":{"tags":["sav-shipping"],"summary":"Sav Colissimo Check","operationId":"sav_colissimo_check_api_sav_shipping__sav_id__colissimo_check_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sav_id","in":"path","required":true,"schema":{"type":"integer","title":"Sav Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ColissimoRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sav-shipping/{sav_id}/colissimo/create":{"post":{"tags":["sav-shipping"],"summary":"Sav Colissimo Create","description":"Crée l'étiquette Colissimo retour client. Passe le SAV en 'shipped'.","operationId":"sav_colissimo_create_api_sav_shipping__sav_id__colissimo_create_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sav_id","in":"path","required":true,"schema":{"type":"integer","title":"Sav Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ColissimoRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/shipments":{"get":{"tags":["shipments"],"summary":"List Shipments","operationId":"list_shipments_api_shipments_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"source","in":"query","required":false,"schema":{"type":"string","default":"","title":"Source"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":300,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/shipments/colissimo/importer-factures":{"post":{"tags":["shipments"],"summary":"Importer Factures Colissimo","description":"Lit les factures Colissimo archivées et en extrait le coût de chaque colis.\n\nCes factures sont des scans : la lecture passe par le modèle, page par page.\nC'est long et ça consomme, donc on ne relit jamais deux fois la même facture\nsauf demande expresse (`toutes: true`).","operationId":"importer_factures_colissimo_api_shipments_colissimo_importer_factures_post","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/shipments/colissimo/couts":{"get":{"tags":["shipments"],"summary":"Couts Colissimo","description":"Ce que Colissimo nous coûte, mois par mois, tel que facturé.","operationId":"couts_colissimo_api_shipments_colissimo_couts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/shipments/stats":{"get":{"tags":["shipments"],"summary":"Shipments Stats","operationId":"shipments_stats_api_shipments_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/shipments/manual/available":{"post":{"tags":["shipments"],"summary":"Manual Available","operationId":"manual_available_api_shipments_manual_available_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManualAvailableRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/shipments/manual":{"post":{"tags":["shipments"],"summary":"Manual Create","operationId":"manual_create_api_shipments_manual_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManualCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/shipments/manual/colissimo/check":{"post":{"tags":["shipments"],"summary":"Manual Colissimo Check","description":"Validation Colissimo d'un envoi manuel (checkGenerateLabel) — NON facturé.","operationId":"manual_colissimo_check_api_shipments_manual_colissimo_check_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ColissimoManualRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/shipments/manual/colissimo":{"post":{"tags":["shipments"],"summary":"Manual Colissimo Create","description":"Affranchit un envoi manuel Colissimo (generateLabel, FACTURÉ) + enregistre.","operationId":"manual_colissimo_create_api_shipments_manual_colissimo_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ColissimoManualRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/shipments/{ship_id}":{"get":{"tags":["shipments"],"summary":"Shipment Detail","operationId":"shipment_detail_api_shipments__ship_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ship_id","in":"path","required":true,"schema":{"type":"integer","title":"Ship Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/shipments/{ship_id}/refresh":{"post":{"tags":["shipments"],"summary":"Refresh Shipment","operationId":"refresh_shipment_api_shipments__ship_id__refresh_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ship_id","in":"path","required":true,"schema":{"type":"integer","title":"Ship Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/shipments/refresh-all":{"post":{"tags":["shipments"],"summary":"Refresh All","operationId":"refresh_all_api_shipments_refresh_all_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/shipments/{ship_id}/label":{"get":{"tags":["shipments"],"summary":"Shipment Label","operationId":"shipment_label_api_shipments__ship_id__label_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ship_id","in":"path","required":true,"schema":{"type":"integer","title":"Ship Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/shipments/{ship_id}/summary":{"get":{"tags":["shipments"],"summary":"Shipment Summary","description":"Document récapitulatif interne LetMeShip (type SUMMARY) — pour le suivi/classement.\nRécupéré à la volée et streamé (pas de stockage disque).","operationId":"shipment_summary_api_shipments__ship_id__summary_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ship_id","in":"path","required":true,"schema":{"type":"integer","title":"Ship Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/shipments/{ship_id}/delivery-note":{"get":{"tags":["shipments"],"summary":"Shipment Bl","operationId":"shipment_bl_api_shipments__ship_id__delivery_note_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ship_id","in":"path","required":true,"schema":{"type":"integer","title":"Ship Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/status":{"get":{"tags":["public"],"summary":"Public Status","operationId":"public_status_api_public_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/public/catalogue":{"get":{"tags":["public"],"summary":"Public Catalogue","description":"Full BRM watch catalogue. English by default, ?lang=fr for French.","operationId":"public_catalogue_api_public_catalogue_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"Language: en (default), fr","default":"en","title":"Lang"},"description":"Language: en (default), fr"},{"name":"collection","in":"query","required":false,"schema":{"type":"string","description":"Filter by collection (e.g. V6, DDF12, GP)","default":"","title":"Collection"},"description":"Filter by collection (e.g. V6, DDF12, GP)"},{"name":"search","in":"query","required":false,"schema":{"type":"string","description":"Search in name, reference, description","default":"","title":"Search"},"description":"Search in name, reference, description"},{"name":"min_price","in":"query","required":false,"schema":{"type":"number","description":"Minimum price TTC (EUR)","default":0,"title":"Min Price"},"description":"Minimum price TTC (EUR)"},{"name":"max_price","in":"query","required":false,"schema":{"type":"number","description":"Maximum price TTC (EUR, 0 = no limit)","default":0,"title":"Max Price"},"description":"Maximum price TTC (EUR, 0 = no limit)"},{"name":"in_stock","in":"query","required":false,"schema":{"type":"boolean","description":"Only products in stock","default":false,"title":"In Stock"},"description":"Only products in stock"},{"name":"sort","in":"query","required":false,"schema":{"type":"string","description":"Sort: name, price_asc, price_desc, collection","default":"name","title":"Sort"},"description":"Sort: name, price_asc, price_desc, collection"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","description":"Max results (max 100)","default":50,"title":"Limit"},"description":"Max results (max 100)"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","description":"Offset for pagination","default":0,"title":"Offset"},"description":"Offset for pagination"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/catalogue/{reference}":{"get":{"tags":["public"],"summary":"Public Product Detail","description":"Full product detail with all specifications, images and description.","operationId":"public_product_detail_api_public_catalogue__reference__get","parameters":[{"name":"reference","in":"path","required":true,"schema":{"type":"string","title":"Reference"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"en","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/collections":{"get":{"tags":["public"],"summary":"Public Collections","description":"List all BRM collections with descriptions and price ranges.","operationId":"public_collections_api_public_collections_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"en","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/configurator/options/{collection}":{"get":{"tags":["public"],"summary":"Public Configurator Options","description":"Options réelles du configurateur pour une collection ou un modèle.","operationId":"public_configurator_options_api_public_configurator_options__collection__get","parameters":[{"name":"collection","in":"path","required":true,"schema":{"type":"string","title":"Collection"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"en","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/configurator/price":{"post":{"tags":["public"],"summary":"Public Configurator Price","description":"Prix d'une configuration, calculé par le vrai moteur du configurateur.","operationId":"public_configurator_price_api_public_configurator_price_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/verify/{serial}":{"get":{"tags":["public"],"summary":"Public Verify Serial","description":"Verify BRM serial number: authenticity + theft status. No customer data exposed.","operationId":"public_verify_serial_api_public_verify__serial__get","parameters":[{"name":"serial","in":"path","required":true,"schema":{"type":"string","title":"Serial"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"en","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/sync-translations":{"post":{"tags":["public"],"summary":"Sync Translations","description":"Sync product translations from PrestaShop for a given language.\nAdmin auth required via Bearer token.\n\nL'autorisation passe par `require_admin` : le rôle est relu en base (et le compte\ndoit être actif), jamais pris dans le claim du jeton. L'ancien contrôle inline\nappelait `auth_service.verify_token`, qui n'existe pas — l'ImportError était avalé\npar un `except Exception` et l'endpoint répondait 401 en permanence.","operationId":"sync_translations_api_public_sync_translations_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"target_lang","in":"query","required":false,"schema":{"type":"string","description":"Language to sync: en, ja, it","default":"en","title":"Target Lang"},"description":"Language to sync: en, ja, it"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/product-image/{ps_id}":{"get":{"tags":["public"],"summary":"Public Product Image","description":"Proxy image produit PrestaShop (évite le hotlink blocking).","operationId":"public_product_image_api_public_product_image__ps_id__get","parameters":[{"name":"ps_id","in":"path","required":true,"schema":{"type":"integer","title":"Ps Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/product/{slug}":{"get":{"tags":["public"],"summary":"Public Product Page","description":"Page produit publique par référence ou ps_id.","operationId":"public_product_page_api_public_product__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/boutiques":{"get":{"tags":["public"],"summary":"Public Boutiques","description":"Public store locator: list of active retailers with location data.\nUsed by /boutiques map page on the hub frontend.","operationId":"public_boutiques_api_public_boutiques_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/public/rocket-lead":{"post":{"tags":["public"],"summary":"Rocket Lead","description":"Capture lead depuis la landing Rocket IA.\n\nStocke en base + notifie F.H. via Slack DM + email.\nPublic, pas d'auth, rate-limited via la limite globale (slowapi).","operationId":"rocket_lead_api_public_rocket_lead_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RocketLead"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/mesure":{"post":{"tags":["public"],"summary":"Mesure","description":"Relaie UN événement de mesure à Meta. Public, sans authentification.\n\nRend toujours 200 : une mesure qui échoue ne doit jamais faire échouer une\npage, ni révéler à un curieux si le jeton est bon.","operationId":"mesure_api_public_mesure_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MesureEvenement"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/connexion/demande":{"post":{"tags":["site"],"summary":"Demander Code","description":"Envoie un code à six chiffres.\n\nLa réponse est la même que l'adresse existe ou non : dire « ce compte\nn'existe pas » transformerait ce point d'entrée en annuaire de clients.\n\n⚠️ **Aucune fiche client n'est créée ici.** Elle l'était — dès la première\nfrappe, avant même que le code soit validé : une adresse mal tapée, un\nonglet fermé, et une personne qui n'a jamais rien demandé se retrouvait\nenregistrée. On ne crée un enregistrement nominatif qu'une fois l'adresse\nprouvée, c'est-à-dire à la validation du code. Le code, lui, n'a besoin\nd'aucune fiche pour exister.","operationId":"demander_code_api_site_connexion_demande_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemandeCode"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/connexion/valider":{"post":{"tags":["site"],"summary":"Valider Code","description":"Le code est bon : la fiche client naît ici, et pas avant.\n\nC'est le premier moment où l'on sait que l'adresse appartient à la personne\nqui la saisit — donc le premier moment où l'on a le droit de créer un\nenregistrement à son nom.\n\nLe consentement est FACULTATIF à cette étape, délibérément : se connecter\npour retrouver ses favoris n'est pas un contrat, et exiger d'accepter les\nCGV pour consulter son propre compte serait un consentement extorqué, donc\nnul. Les CGV sont exigées là où elles ont un sens : au moment de commander.\nS'il est envoyé, il est enregistré, daté et versionné.","operationId":"valider_code_api_site_connexion_valider_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationCode"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/deconnexion":{"post":{"tags":["site"],"summary":"Deconnexion","operationId":"deconnexion_api_site_deconnexion_post","parameters":[{"name":"x-site-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Site-Jeton"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/moi":{"get":{"tags":["site"],"summary":"Moi","operationId":"moi_api_site_moi_get","parameters":[{"name":"x-site-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Site-Jeton"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["site"],"summary":"Maj Profil","operationId":"maj_profil_api_site_moi_put","parameters":[{"name":"x-site-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Site-Jeton"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__site_boutique__Profil"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/favoris":{"post":{"tags":["site"],"summary":"Ajouter Favori","operationId":"ajouter_favori_api_site_favoris_post","parameters":[{"name":"x-site-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Site-Jeton"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Favori"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/favoris/{ps_id}":{"delete":{"tags":["site"],"summary":"Retirer Favori","operationId":"retirer_favori_api_site_favoris__ps_id__delete","parameters":[{"name":"ps_id","in":"path","required":true,"schema":{"type":"integer","title":"Ps Id"}},{"name":"x-site-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Site-Jeton"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/configurations":{"post":{"tags":["site"],"summary":"Enregistrer Config","operationId":"enregistrer_config_api_site_configurations_post","parameters":[{"name":"x-site-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Site-Jeton"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__site_boutique__Configuration"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/configurations/{cid}":{"delete":{"tags":["site"],"summary":"Supprimer Config","operationId":"supprimer_config_api_site_configurations__cid__delete","parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"integer","title":"Cid"}},{"name":"x-site-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Site-Jeton"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/commandes":{"post":{"tags":["site"],"summary":"Deposer Commande","description":"Enregistre une commande — et rien d'autre.\n\nPas de paiement, pas de facture, pas d'écriture dans Odoo : la commande\narrive dans le Hub avec le statut « nouvelle » et attend qu'un humain la\nreprenne. Un client non connecté peut commander (l'email suffit), et sa\ncommande se rattachera à son compte dès qu'il se connectera avec la même\nadresse.\n\n**Pourquoi cet endpoint peut être ouvert sans jeton.** Il n'expose aucune\ndonnée : il écrit, il ne lit pas. Il ne permet ni de savoir si une adresse\nest connue (la réponse est la même dans tous les cas), ni de lire la\ncommande d'un autre (`GET` n'existe pas ici — seul le Hub authentifié et le\nclient porteur de son jeton peuvent relire). Il n'encaisse rien, donc rien\nne se déclenche financièrement. Ce qu'il crée, c'est une intention que le\nHub devra reprendre à la main.\n\nCe qu'il faut protéger, ce n'est donc pas l'accès mais l'ABUS : d'où le\nplafond de dix commandes par minute, le refus d'un panier vide, le refus\nd'un article indisponible, et surtout le rechiffrage complet côté serveur —\nun montant venu du navigateur n'est plus qu'une donnée à vérifier.","operationId":"deposer_commande_api_site_commandes_post","parameters":[{"name":"x-site-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Site-Jeton"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__site_boutique__Commande"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/commandes/{reference}":{"get":{"tags":["site"],"summary":"Ma Commande","description":"Le détail d'une commande — celle du porteur du jeton, et personne d'autre.\n\nLa propriété est dans la clause WHERE, pas dans un contrôle après lecture :\nune commande qui n'est pas la sienne n'est jamais chargée, même le jour où\nquelqu'un ajoutera un chemin de sortie au milieu de cette fonction.\n\nEt la réponse est un **404**, pas un 403, quand la commande appartient à un\nautre : « vous n'avez pas le droit de voir W2026-0007 » apprend qu'elle\nexiste, et permet de balayer la numérotation pour compter les commandes de\nla maison. Un numéro qui n'est pas le vôtre n'existe pas, pour vous.\n\nCe qui sort est une liste blanche (`sb.CHAMPS_COMMANDE_CLIENT` pour une\ncommande du site, `sb._CHAMPS_BON` pour un bon du Hub) : `ip`,\n`ecart_prix`, `internal_notes`, l'attribution commerciale et les prix de\ncontrôle restent au Hub — ils racontent notre vérification, pas l'achat\ndu client.\n\nPour un bon du Hub, le détail porte désormais TOUT ce que la maison sait\nen dire : les lignes et leurs options, les montants et la TVA, l'adresse,\nl'avancement étape par étape, le colis (transporteur, numéro, lien de\nsuivi) et les factures RELUES dans Odoo — jamais la copie locale de leur\nnuméro, qui ment dès qu'une facture est remise en brouillon ou qu'un bon\nen porte plusieurs (François, 21/09/2026).","operationId":"ma_commande_api_site_commandes__reference__get","parameters":[{"name":"reference","in":"path","required":true,"schema":{"type":"string","title":"Reference"}},{"name":"x-site-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Site-Jeton"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/commandes/{reference}/facture":{"get":{"tags":["site"],"summary":"Ma Facture","description":"Le PDF de SA facture, servi par nous — jamais un lien vers Odoo.\n\nTrois raisons de ne pas renvoyer le client chez Odoo : Odoo n'est pas\nouvert au public, un lien direct serait un identifiant devinable, et une\nfacture n'a pas à vivre ailleurs que derrière une session prouvée. On\nrelit donc le PDF et on le rend en flux.\n\nLe contrôle de propriété est entier dans `sb.facture_telechargeable` :\nle bon doit porter l'adresse du porteur du jeton, l'identifiant demandé\ndoit appartenir à CE bon, et Odoo doit dire `posted` maintenant — pas au\nmoment où le Hub en avait recopié le numéro. Une facture remise en\nbrouillon ou annulée cesse donc d'être téléchargeable à la seconde, sans\nqu'on ait rien à synchroniser.\n\nEt c'est un 404 dans tous les cas de refus — pas à vous, pas encore\némise, Odoo muet : trois réponses différentes suffiraient à apprendre\nqu'une facture existe pour une commande qu'on ne possède pas.","operationId":"ma_facture_api_site_commandes__reference__facture_get","parameters":[{"name":"reference","in":"path","required":true,"schema":{"type":"string","title":"Reference"}},{"name":"id","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Id"}},{"name":"x-site-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Site-Jeton"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/commandes/suivi":{"post":{"tags":["site"],"summary":"Suivre Commande","description":"Le suivi SANS COMPTE : un numéro, une adresse email, et les deux ensemble.\n\nC'est le seul point d'entrée de ce fichier qui rende une information sur une\ncommande sans session. Trois précautions le tiennent, et elles se répondent :\n\n1. **Le rapprochement se fait dans la requête**, sur les deux critères à la\n   fois. Chercher la commande puis comparer l'email en Python répondrait\n   différemment selon que le numéro existe ou non, et ce sont ces deux\n   réponses-là qui permettent de compter les commandes d'une maison.\n\n2. **La réponse est courte** : l'état, la date, le total, le mode de\n   livraison, les articles avec leur prix et leur photo, et où en est le\n   règlement. Ni adresse, ni téléphone, ni gravure, ni décompte de TVA. Un\n   numéro de commande se devine et une adresse email se connaît ; les deux\n   réunis ne valent pas une session.\n\n3. **Cinq essais par minute.** Confortable pour un client qui recopie mal\n   son numéro, étroit pour qui voudrait balayer W2026-0001 à W2026-9999.\n\nUne commande anonymisée (compte effacé) n'a plus d'email : elle ne ressort\njamais ici, et c'est le comportement voulu.","operationId":"suivre_commande_api_site_commandes_suivi_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Suivi"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/panier/email":{"post":{"tags":["site"],"summary":"Panier Par Email","description":"Le panier envoyé à l'adresse du visiteur, et ses deux accords facultatifs.\n\nPublic par nature (le visiteur n'a pas de compte) : limité en débit, et\nl'envoi lui-même est plafonné par jeton et par adresse (`site_paniers`).\nLes deux cases sont inscrites au registre des consentements, cochées OU\nNON : c'est le refus qui prouve qu'on n'a pas relancé quelqu'un qui ne\nle voulait pas.","operationId":"panier_par_email_api_site_panier_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PanierEmail"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/panier/en-cours":{"post":{"tags":["site"],"summary":"Panier En Cours","description":"L'état du panier à chaque étape — voir `services/site_paniers`.\n\nClient CONNECTÉ : son panier porte l'email de son compte dès le premier\narticle, comme PrestaShop le faisait (François, 28/09/2026) — sans quoi\nun client connecté qui s'arrête au panier n'était jamais relancé.","operationId":"panier_en_cours_api_site_panier_en_cours_post","parameters":[{"name":"x-site-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Site-Jeton"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PanierEnCours"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/panier/{token}":{"get":{"tags":["site"],"summary":"Panier Reprise","description":"Le lien de l'email de relance : le panier tel qu'il a été laissé.","operationId":"panier_reprise_api_site_panier__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/admin/paniers":{"get":{"tags":["site"],"summary":"Paniers Hub","description":"Tous les paniers du site, anonymes compris (lecture seule).","operationId":"paniers_hub_api_site_admin_paniers_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"jours","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Jours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/admin/paniers/entonnoir":{"get":{"tags":["site"],"summary":"Paniers Entonnoir","operationId":"paniers_entonnoir_api_site_admin_paniers_entonnoir_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"jours","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Jours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/commandes/{reference}/fractionne":{"post":{"tags":["site"],"summary":"Ouvrir Fractionne","description":"Le paiement en plusieurs fois, ouvert DEPUIS le site.\n\nMême principe que l'intention express : la commande a déjà son bon et son\nlien de paiement ; on ouvre l'organisme sur CE lien, pour que le règlement\nse rapproche comme n'importe quel autre. Ce qui change, et c'est tout\nl'objet : le client revient sur le TUNNEL, pas sur la page de paiement du\nHub. Il a commandé sur le site, il finit sur le site.\n\nLe partage n'est pas décidé ici : Alma sous 2 000 € (dix pays), Pledg\nau-delà (France) — `site_paiement` en est la seule source, et chaque\nservice refuse ce qui n'est pas de son ressort.","operationId":"ouvrir_fractionne_api_site_commandes__reference__fractionne_post","parameters":[{"name":"reference","in":"path","required":true,"schema":{"type":"string","title":"Reference"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fractionne"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/alma/ipn":{"get":{"tags":["site"],"summary":"Alma Ipn","description":"Notification d'Alma : un paiement a changé d'état (`?pid=payment_…`).\n\nPublique par nature — c'est Alma qui appelle. Elle ne croit rien sur\nparole : l'état est RELU chez Alma avec notre clé avant d'écrire quoi que\nce soit (`confirmer_alma` → `confirm_pledg_paid`). Un appel forgé ne peut\ndonc marquer payé qu'un paiement qu'Alma dit payé.","operationId":"alma_ipn_api_site_alma_ipn_get","parameters":[{"name":"pid","in":"query","required":false,"schema":{"type":"string","default":"","title":"Pid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["site"],"summary":"Alma Ipn","description":"Notification d'Alma : un paiement a changé d'état (`?pid=payment_…`).\n\nPublique par nature — c'est Alma qui appelle. Elle ne croit rien sur\nparole : l'état est RELU chez Alma avec notre clé avant d'écrire quoi que\nce soit (`confirmer_alma` → `confirm_pledg_paid`). Un appel forgé ne peut\ndonc marquer payé qu'un paiement qu'Alma dit payé.","operationId":"alma_ipn_api_site_alma_ipn_get","parameters":[{"name":"pid","in":"query","required":false,"schema":{"type":"string","default":"","title":"Pid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/commandes/{reference}/reglement":{"get":{"tags":["site"],"summary":"Etat Reglement","description":"Où en est le règlement de cette commande — la vérité du prestataire.\n\nOn ne dit pas « payée » parce que le client est revenu d'un détour : un\nretour de navigateur n'est pas un encaissement. On relit l'état chez qui\nencaisse, et l'on répond ce qu'on sait.","operationId":"etat_reglement_api_site_commandes__reference__reglement_get","parameters":[{"name":"reference","in":"path","required":true,"schema":{"type":"string","title":"Reference"}},{"name":"email","in":"query","required":true,"schema":{"type":"string","title":"Email"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/commandes/{reference}/paiement":{"post":{"tags":["site"],"summary":"Intention Paiement","description":"La carte, saisie dans le tunnel : l'intention de paiement de la commande.\n\nVoir `_intention_de_commande` pour ce qui est tenu ici, et pourquoi.","operationId":"intention_paiement_api_site_commandes__reference__paiement_post","parameters":[{"name":"reference","in":"path","required":true,"schema":{"type":"string","title":"Reference"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Express"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/commandes/{reference}/express":{"post":{"tags":["site"],"summary":"Intention Express","description":"Apple Pay / Google Pay depuis le panier.\n\nMême intention, même garde-fous : la route ne diffère que par son nom, que\ndes pages déjà en ligne appellent. Toute la mécanique est dans\n`_intention_de_commande`.","operationId":"intention_express_api_site_commandes__reference__express_post","parameters":[{"name":"reference","in":"path","required":true,"schema":{"type":"string","title":"Reference"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Express"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/paypal/config":{"get":{"tags":["site"],"summary":"Paypal Config","description":"Ce que le panier doit savoir pour afficher le bouton : rien de secret.\n\nEn sandbox, `actif` reste vrai mais `essai` le dit : le panier ne montre\nalors le bouton que sur un test explicite (`?paypal=test`), et le serveur\nrefuse de toute façon un client qui n'est pas testeur déclaré.","operationId":"paypal_config_api_site_paypal_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/site/commandes/{reference}/paypal":{"post":{"tags":["site"],"summary":"Paypal Ordre","description":"Ouvre l'ordre PayPal du règlement d'une commande DÉJÀ enregistrée.","operationId":"paypal_ordre_api_site_commandes__reference__paypal_post","parameters":[{"name":"reference","in":"path","required":true,"schema":{"type":"string","title":"Reference"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Express"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/commandes/{reference}/paypal/capture":{"post":{"tags":["site"],"summary":"Paypal Capture","description":"Le client a approuvé chez PayPal : on capture, on vérifie, on encaisse.","operationId":"paypal_capture_api_site_commandes__reference__paypal_capture_post","parameters":[{"name":"reference","in":"path","required":true,"schema":{"type":"string","title":"Reference"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayPalCapture"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/paypal/webhook":{"post":{"tags":["site"],"summary":"Paypal Webhook","description":"Notifications PayPal, signature vérifiée auprès de PayPal avant tout.\n\nSynchrone à dessein : la vérification appelle PayPal, et un appel bloquant\ndans une route `async` gèlerait le serveur le temps de la réponse.","operationId":"paypal_webhook_api_site_paypal_webhook_post","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Evenement"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/admin/commandes":{"get":{"tags":["site"],"summary":"Commandes Hub","operationId":"commandes_hub_api_site_admin_commandes_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"statut","in":"query","required":false,"schema":{"type":"string","default":"","title":"Statut"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/admin/commandes/{cid}":{"get":{"tags":["site"],"summary":"Commande Hub","operationId":"commande_hub_api_site_admin_commandes__cid__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"integer","title":"Cid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/admin/commandes/{cid}/statut":{"put":{"tags":["site"],"summary":"Changer Statut","description":"Le statut se change à la main, jamais tout seul.","operationId":"changer_statut_api_site_admin_commandes__cid__statut_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"integer","title":"Cid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Statut"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/admin/clients":{"get":{"tags":["site"],"summary":"Clients Hub","operationId":"clients_hub_api_site_admin_clients_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/admin/configurations":{"get":{"tags":["site"],"summary":"Configurations Hub","description":"Les montres composées au configurateur : enregistrées, au panier, commandées.","operationId":"configurations_hub_api_site_admin_configurations_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"jours","in":"query","required":false,"schema":{"type":"integer","default":90,"title":"Jours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/admin/configurations/image":{"get":{"tags":["site"],"summary":"Configuration Image","description":"L'image composée d'une configuration (`ids` = identifiants d'options, séparés par des virgules).","operationId":"configuration_image_api_site_admin_configurations_image_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slug","in":"query","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"ids","in":"query","required":false,"schema":{"type":"string","default":"","title":"Ids"}},{"name":"vue","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Vue"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/devis":{"post":{"tags":["site"],"summary":"Chiffrer Panier","description":"Le chiffrage d'un panier : prix vérifiés, TVA, TPH, devise, remise, paliers.\n\n**C'est l'endpoint que le récapitulatif du tunnel doit appeler à chaque\nchangement** — ajout d'un article, changement de pays, case « société »\ncochée, numéro de TVA saisi, code de réduction tapé. Sans lui, le\nrécapitulatif ment : il affichait « Total TTC » identique pour la France,\nles États-Unis et une société allemande avec un numéro intracommunautaire.\n\n`POST /commandes` appelle exactement la même fonction : le client ne peut\ndonc pas voir un montant et en payer un autre.","operationId":"chiffrer_panier_api_site_devis_post","parameters":[{"name":"x-site-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Site-Jeton"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__site_boutique__Devis"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/devises":{"get":{"tags":["site"],"summary":"Bareme Devises","description":"Le barème servi au site : devises actives, taux, symboles, format.\n\n`pays` renseigné, la réponse dit AUSSI dans quelle devise cette destination\nsera facturée — le sélecteur peut alors prévenir honnêtement (« livraison\naux États-Unis : facturation en dollars ») au lieu de laisser la surprise\npour la page de paiement.","operationId":"bareme_devises_api_site_devises_get","parameters":[{"name":"pays","in":"query","required":false,"schema":{"type":"string","default":"","title":"Pays"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/admin/devises":{"get":{"tags":["site"],"summary":"Admin Devises","description":"Le barème complet, actives et inactives, avec l'écart au taux PrestaShop.\n\n⚠️ `ecart_ps_pct` n'est PAS une erreur à corriger. Les taux du site sont\nTARIFAIRES : USD 1,37 quand le marché est à 1,16, soit +18 % voulus. La\ncolonne existe pour que l'écart se voie, pas pour qu'on le referme.","operationId":"admin_devises_api_site_admin_devises_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["site"],"summary":"Admin Creer Devise","operationId":"admin_creer_devise_api_site_admin_devises_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NouvelleDevise"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/site/admin/devises/multiplicateur":{"post":{"tags":["site"],"summary":"Devise Multiplicateur","description":"Fixe le multiplicateur uniforme et le répercute sur tous les taux.","operationId":"devise_multiplicateur_api_site_admin_devises_multiplicateur_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Multiplicateur"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/site/admin/devises/importer":{"post":{"tags":["site"],"summary":"Devises Importer","description":"Importe toutes les devises actives de PrestaShop (taux tarifaires préservés).","operationId":"devises_importer_api_site_admin_devises_importer_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/site/admin/devises/relire-prestashop":{"post":{"tags":["site"],"summary":"Admin Relire Ps","description":"Relit les taux de la boutique POUR COMPARAISON. N'écrase rien.\n\nElle remplit `taux_prestashop` et renvoie les écarts supérieurs à 1 %. Elle\nne recopie jamais un cours de marché sur un taux tarifaire : ce serait\nbaisser les prix américains de 15 % sans que personne l'ait décidé.","operationId":"admin_relire_ps_api_site_admin_devises_relire_prestashop_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/site/admin/devises/{code}":{"patch":{"tags":["site"],"summary":"Devise Modifier","operationId":"devise_modifier_api_site_admin_devises__code__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviseMaj"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["site"],"summary":"Admin Maj Devise","description":"Change une devise. Chaque écart est journalisé : qui, quand, avant, après.","operationId":"admin_maj_devise_api_site_admin_devises__code__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MajDevise"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/admin/devises/pays":{"put":{"tags":["site"],"summary":"Admin Pays Devise","description":"Range un pays sur une devise de facturation, ou l'en retire.\n\nRappel de la règle que cette table sert : c'est le pays de LIVRAISON qui\ndécide de la devise facturée, jamais le sélecteur du visiteur.","operationId":"admin_pays_devise_api_site_admin_devises_pays_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaysDevise"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/site/pays":{"get":{"tags":["site"],"summary":"Reference Pays","description":"Le référentiel du sélecteur : chaque pays, son drapeau, sa devise, sa langue.\n\nUne seule source pour l'affichage ET la facturation : la devise renvoyée ici\nest celle dans laquelle le pays sera VRAIMENT facturé (`devise_de_facturation`,\nqui retombe sur l'euro si la devise n'est pas encaissable), et le régime\n(« ht » hors UE, « ttc » en UE) est celui qu'appliquera le chiffrage. Le\ncombo ne peut donc pas promettre autre chose que ce que paiera le client.\n\nLe drapeau n'est pas un asset : on renvoie le code ISO2, le site en fait\nl'emoji drapeau (deux indicateurs régionaux) — rien à héberger, rien à\ncharger, et ça marche pour 250 pays.","operationId":"reference_pays_api_site_pays_get","parameters":[{"name":"langue","in":"query","required":false,"schema":{"type":"string","default":"fr","title":"Langue"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/disponibilite":{"get":{"tags":["site"],"summary":"Disponibilite","description":"L'état réel de plusieurs produits, d'un coup : vendable ou non, et pourquoi.\n\nÀ appeler au chargement d'une page de collection et à l'ouverture du panier.\nLes huit pièces uniques à quantité zéro — Tourbillon 115 000 €, Birotor\n44 000 €, Trirotor 39 000 € — doivent se voir AVANT la page de paiement :\napprendre qu'une montre est vendue après avoir saisi son adresse est la\npire façon de l'apprendre.","operationId":"disponibilite_api_site_disponibilite_get","parameters":[{"name":"ps_ids","in":"query","required":false,"schema":{"type":"string","default":"","title":"Ps Ids"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/paiement/plans":{"get":{"tags":["site"],"summary":"Plans Paiement","description":"Ce que le tunnel proposera réellement pour ce montant, vers ce pays.\n\nLecture seule, sans session : la fiche produit, le simulateur de la page\n« moyens de paiement » et tout bloc qui annonce un paiement l'appellent au\nlieu de recopier un palier ou une liste de pays. Pledg en 3×, 4×, 6×, 10×\net 12× jusqu'à 10 000 €, Sofinco à taux zéro jusqu'à 36 mois — en FRANCE\nseulement ; ailleurs, la carte (Apple Pay et Google Pay compris), le\nvirement, et l'acompte pour une montre dès 3 000 €.\n\n`pays` : le pays affiché ou de livraison (ISO à deux lettres). Inconnu ou\nabsent, le fractionné est FERMÉ (`strict`) : le doute ne promet rien.\n`montre` : le panier contient-il une montre (ouvre l'acompte) ; absent, seul\nle montant décide.","operationId":"plans_paiement_api_site_paiement_plans_get","parameters":[{"name":"total","in":"query","required":false,"schema":{"type":"number","default":0,"title":"Total"}},{"name":"pays","in":"query","required":false,"schema":{"type":"string","default":"","title":"Pays"}},{"name":"montre","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Montre"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/promos/verifier":{"post":{"tags":["site"],"summary":"Verifier Promo","description":"« Ce code vaut combien sur mon panier ? »\n\nLa remise est calculée ICI, sur les prix du catalogue, jamais d'après ce que\ndit le navigateur. Rien n'est consommé : on peut essayer plusieurs codes.\n\nLe débit est limité à vingt essais par minute — c'est confortable pour un\nclient qui tape mal son code, et c'est étroit pour qui voudrait deviner les\ncodes en cours. Un code inconnu et un code désactivé répondent d'ailleurs la\nmême chose, pour la même raison.","operationId":"verifier_promo_api_site_promos_verifier_post","parameters":[{"name":"x-site-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Site-Jeton"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifPromo"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/rgpd":{"get":{"tags":["site"],"summary":"Textes Rgpd","description":"Le texte et la version des consentements à afficher. PUBLIC, en lecture.\n\nLe front ne doit PAS écrire ces phrases dans sa page : elles doivent être\nidentiques à celles que le registre conserve, sinon la preuve ne vaut rien\n— on saurait que le client a coché, mais plus quoi.","operationId":"textes_rgpd_api_site_rgpd_get","parameters":[{"name":"langue","in":"query","required":false,"schema":{"type":"string","default":"fr","title":"Langue"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/consentement":{"post":{"tags":["site"],"summary":"Consentement Visiteur","description":"Enregistre un choix de consentement — **y compris sans compte**.\n\nC'est le manque que le bandeau cookies rencontrait : le registre s'indexait\nsur l'email, donc la personne qui refuse la mesure d'audience avant même\nd'avoir un compte — c'est-à-dire la quasi-totalité des visiteurs — ne\nlaissait aucune trace. Or c'est exactement ce refus-là qu'il faut pouvoir\nprouver.\n\n**Ce qui identifie un visiteur ici est un jeton opaque**, tiré au hasard par\nle serveur et rangé par le site dans le navigateur. Il ne désigne qu'un\nappareil, il ne se déduit de rien, et il ne se recoupe avec rien. Ce n'est\npas une empreinte de navigateur : on ne mesure ni l'écran, ni les polices,\nni quoi que ce soit d'autre.\n\n**Et l'adresse IP n'est jamais conservée en clair** : elle est tronquée de\nson dernier octet avant écriture, comme partout ailleurs dans le Hub. Elle\nsitue le consentement sans désigner l'abonné, ce qui est le maximum que la\npreuve réclame et le maximum que le règlement tolère.\n\nSi une session est ouverte, le geste est AUSSI rattaché à la fiche client :\nle même choix vaut alors pour la personne et pour son navigateur.\n\nPoint d'entrée public par nature — un bandeau s'affiche avant toute\nconnexion — donc limité en débit.","operationId":"consentement_visiteur_api_site_consentement_post","parameters":[{"name":"x-site-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Site-Jeton"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentementVisiteur"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["site"],"summary":"Etat Consentement","description":"Ce que ce navigateur a déjà choisi — pour savoir s'il faut rouvrir le bandeau.\n\nOn ne rend que le dernier état de chaque genre : le registre garde tout\nl'historique, mais le bandeau n'a qu'une question à poser. Un jeton inconnu\nrend une liste vide, sans le dire — il n'y a rien à apprendre d'un jeton\nqu'on a tiré soi-même au hasard.","operationId":"etat_consentement_api_site_consentement_get","parameters":[{"name":"visiteur","in":"query","required":false,"schema":{"type":"string","default":"","title":"Visiteur"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/moi/donnees":{"get":{"tags":["site"],"summary":"Mes Donnees","description":"Tout ce que le Hub détient sur ce client, en une réponse lisible.\n\nLe droit d'accès du règlement, rendu en JSON structuré : le front peut\nl'afficher tel quel ou le proposer en téléchargement. Il ne sort que les\ndonnées du porteur du jeton — un client ne lit jamais le dossier d'un autre.","operationId":"mes_donnees_api_site_moi_donnees_get","parameters":[{"name":"x-site-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Site-Jeton"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/moi/suppression":{"post":{"tags":["site"],"summary":"Supprimer Mon Compte","description":"Efface réellement le compte. Irréversible.\n\nLe bouton « Effacer mes informations » du prototype ne vidait que le\nnavigateur : le compte, les favoris, les configurations et les commandes\nrestaient en base, pendant que le texte affiché juste au-dessus affirmait le\ncontraire. Cet endpoint fait ce qui était promis.\n\nCe qui survit est énuméré dans la réponse : les commandes déjà passées,\nANONYMISÉES — plus de nom, plus d'adresse, plus d'email — parce qu'une pièce\ncomptable se conserve dix ans. Le dire au client fait partie du travail :\nune suppression partielle qu'on n'explique pas ressemble à une suppression\nratée.","operationId":"supprimer_mon_compte_api_site_moi_suppression_post","parameters":[{"name":"x-site-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Site-Jeton"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemandeSuppression"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/moi/consentement":{"put":{"tags":["site"],"summary":"Maj Consentement","description":"Le client change d'avis — dans un sens comme dans l'autre.\n\nUn retrait s'écrit comme une ligne de PLUS dans le registre, jamais comme la\nmodification de la ligne d'origine : savoir qu'un consentement a été donné\npuis retiré, et quand, fait partie du consentement.","operationId":"maj_consentement_api_site_moi_consentement_put","parameters":[{"name":"x-site-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Site-Jeton"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MajConsentement"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/admin/devises/journal":{"get":{"tags":["site"],"summary":"Admin Journal Devises","operationId":"admin_journal_devises_api_site_admin_devises_journal_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limite","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/admin/promos":{"get":{"tags":["site"],"summary":"Admin Promos","operationId":"admin_promos_api_site_admin_promos_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"actifs","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Actifs"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["site"],"summary":"Admin Creer Promo","description":"Crée un code à la volée. Aucun n'existe au départ, c'est voulu.","operationId":"admin_creer_promo_api_site_admin_promos_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NouveauCode"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/admin/promos/{code}":{"put":{"tags":["site"],"summary":"Admin Maj Promo","description":"Modifie ou désactive un code. `usages` n'est pas modifiable : remettre un\ncompteur à zéro effacerait la trace de ce qui a déjà été consommé.","operationId":"admin_maj_promo_api_site_admin_promos__code__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["site"],"summary":"Admin Lire Promo","description":"Un code et son compteur, tel qu'il est en base.","operationId":"admin_lire_promo_api_site_admin_promos__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/admin/promos/{code}/desactiver":{"post":{"tags":["site"],"summary":"Admin Desactiver Promo","description":"Éteint un code. On ne le SUPPRIME pas — et il n'y a pas de route pour le\nfaire : un code effacé emporterait ses usages avec lui (`ON DELETE CASCADE`)\net donc la trace de ce qu'une campagne a coûté.","operationId":"admin_desactiver_promo_api_site_admin_promos__code__desactiver_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/admin/promos/{code}/usages":{"get":{"tags":["site"],"summary":"Admin Usages Promo","description":"Qui a utilisé ce code, sur quelle commande, et ce qu'il a coûté.","operationId":"admin_usages_promo_api_site_admin_promos__code__usages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/admin/catalogue/regles":{"get":{"tags":["site"],"summary":"Admin Regles","description":"Les exceptions à « on suit la boutique à la lettre ».\n\nDeux au départ : Corvette Racing fermé (catégorie 89), et les deux M Club\nFrance gardés en ligne alors que la boutique les masque.","operationId":"admin_regles_api_site_admin_catalogue_regles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["site"],"summary":"Admin Poser Regle","operationId":"admin_poser_regle_api_site_admin_catalogue_regles_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegleCatalogue"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/site/admin/catalogue/regles/{portee}/{cible}":{"delete":{"tags":["site"],"summary":"Admin Retirer Regle","description":"Le produit ou la catégorie repasse sous le régime de la boutique.\n\nOn désactive au lieu de supprimer : savoir qu'une catégorie a été fermée\npuis rouverte vaut mieux que ne plus rien savoir.","operationId":"admin_retirer_regle_api_site_admin_catalogue_regles__portee___cible__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"portee","in":"path","required":true,"schema":{"type":"string","title":"Portee"}},{"name":"cible","in":"path","required":true,"schema":{"type":"integer","title":"Cible"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/contact":{"post":{"tags":["site"],"summary":"Contact","description":"Le message du formulaire de contact, routé vers la bonne boîte.\n\nAvec `canal = \"conseiller\"`, c'est la demande « Écrire à un conseiller » des\nfiches : même porte, même piège, même limite de débit, puis le circuit de\n`services/site_conseiller` (enregistrement, email à François, Slack, accusé).","operationId":"contact_api_site_contact_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/admin/paiement/reglages":{"get":{"tags":["site"],"summary":"Reglages Paiement","description":"Les moyens de paiement du site tels que le tunnel les applique.","operationId":"reglages_paiement_api_site_admin_paiement_reglages_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["site"],"summary":"Maj Reglages Paiement","description":"Change les réglages de l'acompte + financement (admin seulement).","operationId":"maj_reglages_paiement_api_site_admin_paiement_reglages_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReglagesAcompteFinancement"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/site/admin/acompte-financement":{"get":{"tags":["site"],"summary":"Acomptes Financement","description":"Les commandes « acompte + financement », avec l'état du temps 2.","operationId":"acomptes_financement_api_site_admin_acompte_financement_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/site/admin/acompte-financement/bon/{order_id}":{"get":{"tags":["site"],"summary":"Acompte Financement Du Bon","description":"L'état du parcours pour un bon (`{}` s'il n'en relève pas).","operationId":"acompte_financement_du_bon_api_site_admin_acompte_financement_bon__order_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/admin/acompte-financement/bon/{order_id}/lancer":{"post":{"tags":["site"],"summary":"Lancer Financement Solde","description":"Ouvre le dossier Sofinco du solde et l'envoie au client (après l'acompte).","operationId":"lancer_financement_solde_api_site_admin_acompte_financement_bon__order_id__lancer_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/guide-bracelets/referentiel":{"get":{"tags":["site-guide-bracelets"],"summary":"Referentiel","operationId":"referentiel_api_site_guide_bracelets_referentiel_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/site/guide-bracelets/session":{"post":{"tags":["site-guide-bracelets"],"summary":"Nouvelle Session","description":"Ouvre une session photo. L'email et l'accord sur l'usage de la photo\nsont demandés AVANT : l'atelier doit pouvoir répondre si l'IA ne sait pas.","operationId":"nouvelle_session_api_site_guide_bracelets_session_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NouvelleSession"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/guide-bracelets/session/{jeton}":{"get":{"tags":["site-guide-bracelets"],"summary":"Etat","operationId":"etat_api_site_guide_bracelets_session__jeton__get","parameters":[{"name":"jeton","in":"path","required":true,"schema":{"type":"string","title":"Jeton"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/guide-bracelets/session/{jeton}/avis":{"post":{"tags":["site-guide-bracelets"],"summary":"Avis","operationId":"avis_api_site_guide_bracelets_session__jeton__avis_post","parameters":[{"name":"jeton","in":"path","required":true,"schema":{"type":"string","title":"Jeton"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Avis"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/guide-bracelets/depot/{jeton}":{"get":{"tags":["site-guide-bracelets"],"summary":"Depot Etat","operationId":"depot_etat_api_site_guide_bracelets_depot__jeton__get","parameters":[{"name":"jeton","in":"path","required":true,"schema":{"type":"string","title":"Jeton"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["site-guide-bracelets"],"summary":"Depot","operationId":"depot_api_site_guide_bracelets_depot__jeton__post","parameters":[{"name":"jeton","in":"path","required":true,"schema":{"type":"string","title":"Jeton"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_depot_api_site_guide_bracelets_depot__jeton__post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/guide-bracelets/demande":{"post":{"tags":["site-guide-bracelets"],"summary":"Demande Atelier","description":"Le client a choisi un modèle dont l'écart est « à confirmer » : l'atelier répond.","operationId":"demande_atelier_api_site_guide_bracelets_demande_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemandeAtelier"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/guide-bracelets/admin/referentiel":{"get":{"tags":["site-guide-bracelets"],"summary":"Admin Referentiel","operationId":"admin_referentiel_api_site_guide_bracelets_admin_referentiel_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/site/guide-bracelets/admin/referentiel/{code}":{"put":{"tags":["site-guide-bracelets"],"summary":"Admin Trancher","operationId":"admin_trancher_api_site_guide_bracelets_admin_referentiel__code__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModeleMaj"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/guide-bracelets/admin/demandes":{"get":{"tags":["site-guide-bracelets"],"summary":"Admin Demandes","operationId":"admin_demandes_api_site_guide_bracelets_admin_demandes_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limite","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/guide-bracelets/admin/photo/{demande_id}":{"get":{"tags":["site-guide-bracelets"],"summary":"Admin Photo","operationId":"admin_photo_api_site_guide_bracelets_admin_photo__demande_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"demande_id","in":"path","required":true,"schema":{"type":"integer","title":"Demande Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/publication/etat":{"get":{"tags":["site-publication"],"summary":"Etat","description":"Tout ce dont l'écran a besoin pour s'afficher et pour se rafraîchir.\n\nAppelé en boucle pendant qu'une publication tourne : il reste volontairement\nléger (les sorties d'outils ne sont pas relues ici, sauf pour la publication\nen cours — c'est justement ce qu'on veut voir défiler).","operationId":"etat_api_site_publication_etat_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/site/publication/journal":{"get":{"tags":["site-publication"],"summary":"Journal","description":"Les publications passées : qui, quand, quoi, combien de temps, issue.","operationId":"journal_api_site_publication_journal_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":30,"title":"Limite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/publication/{publication_id}":{"get":{"tags":["site-publication"],"summary":"Detail","description":"Une publication et la sortie complète de chacune de ses étapes.","operationId":"detail_api_site_publication__publication_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"publication_id","in":"path","required":true,"schema":{"type":"integer","title":"Publication Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/publication/lancer":{"post":{"tags":["site-publication"],"summary":"Lancer","description":"Ouvre une publication et répond immédiatement (202).\n\nLa chaîne dure plusieurs minutes : elle part dans un fil de fond, l'écran\nsuit par `/etat`. Un refus (verrou tenu, environnement incomplet) est un\n409 explicite — jamais une publication à moitié partie.","operationId":"lancer_api_site_publication_lancer_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__site_publication__DemandePublication"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/site/publication/retour-arriere":{"post":{"tags":["site-publication"],"summary":"Retour Arriere","description":"Rebranche une construction précédente — immédiat et atomique.\n\nLe nom reçu est confronté à une expression régulière puis à ce qui existe\nvraiment sur le disque, et la construction visée doit passer les mêmes\ncontrôles d'intégrité que `deployer.sh` avant d'être remise en ligne.","operationId":"retour_arriere_api_site_publication_retour_arriere_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemandeRetour"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/journal/rubriques":{"get":{"tags":["journal"],"summary":"Rubriques","operationId":"rubriques_api_journal_rubriques_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/journal/articles":{"get":{"tags":["journal"],"summary":"Articles","operationId":"articles_api_journal_articles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["journal"],"summary":"Creer","operationId":"creer_api_journal_articles_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Article"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/journal/articles/{article_id}":{"get":{"tags":["journal"],"summary":"Article","operationId":"article_api_journal_articles__article_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"article_id","in":"path","required":true,"schema":{"type":"integer","title":"Article Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["journal"],"summary":"Modifier","operationId":"modifier_api_journal_articles__article_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"article_id","in":"path","required":true,"schema":{"type":"integer","title":"Article Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Article"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["journal"],"summary":"Supprimer","operationId":"supprimer_api_journal_articles__article_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"article_id","in":"path","required":true,"schema":{"type":"integer","title":"Article Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/journal/images":{"post":{"tags":["journal"],"summary":"Image","operationId":"image_api_journal_images_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_image_api_journal_images_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/journal/articles/{article_id}/traduire":{"post":{"tags":["journal"],"summary":"Traduire","operationId":"traduire_api_journal_articles__article_id__traduire_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"article_id","in":"path","required":true,"schema":{"type":"integer","title":"Article Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemandeTraduction"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/journal/articles/{article_id}/traductions/{lang}":{"put":{"tags":["journal"],"summary":"Retoucher","operationId":"retoucher_api_journal_articles__article_id__traductions__lang__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"article_id","in":"path","required":true,"schema":{"type":"integer","title":"Article Id"}},{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__journal__Traduction"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/journal/articles/{article_id}/publier":{"post":{"tags":["journal"],"summary":"Publier","operationId":"publier_api_journal_articles__article_id__publier_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"article_id","in":"path","required":true,"schema":{"type":"integer","title":"Article Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__journal__DemandePublication"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/journal/articles/{article_id}/lien-apercu":{"post":{"tags":["journal"],"summary":"Creer Lien Apercu","operationId":"creer_lien_apercu_api_journal_articles__article_id__lien_apercu_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"article_id","in":"path","required":true,"schema":{"type":"integer","title":"Article Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemandeLien"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["journal"],"summary":"Fermer Lien Apercu","operationId":"fermer_lien_apercu_api_journal_articles__article_id__lien_apercu_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"article_id","in":"path","required":true,"schema":{"type":"integer","title":"Article Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/journal/apercu/{jeton}":{"get":{"tags":["journal"],"summary":"Apercu Public","description":"PUBLIC (sans compte) : le brouillon montré au partenaire par son jeton\nsecret. Rien d'autre que le contenu de l'article ; 404 si le lien est\ndésactivé ou remplacé.","operationId":"apercu_public_api_journal_apercu__jeton__get","parameters":[{"name":"jeton","in":"path","required":true,"schema":{"type":"string","title":"Jeton"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site-relance-comptes/etat":{"get":{"tags":["site"],"summary":"Etat","description":"Le réglage, le compte-rendu de ce qui partirait, et le journal.","operationId":"etat_api_site_relance_comptes_etat_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/site-relance-comptes/reglage":{"put":{"tags":["site"],"summary":"Poser Reglage","description":"Pose la date de mise en production, et ce qui en dépend.\n\nListe blanche de champs : un PUT ne doit jamais pouvoir toucher `arme`,\n`essai_le` ou les dates d'envoi — ce sont des faits, pas des réglages.","operationId":"poser_reglage_api_site_relance_comptes_reglage_put","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Corps"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/site-relance-comptes/apercu":{"get":{"tags":["site"],"summary":"Apercu","description":"La lettre telle qu'elle partira, à l'écran, sans rien envoyer.","operationId":"apercu_api_site_relance_comptes_apercu_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"langue","in":"query","required":false,"schema":{"type":"string","default":"fr","title":"Langue"}},{"name":"langue_site","in":"query","required":false,"schema":{"type":"string","default":"","title":"Langue Site"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site-relance-comptes/essai":{"post":{"tags":["site"],"summary":"Essai","description":"Envoie la lettre d'essai — à f.hermand@brm-manufacture.com, point.\n\nLe destinataire n'est pas dans le corps de la requête et ne le sera pas :\nc'est ce qui garantit qu'un essai ne peut pas partir chez un client.","operationId":"essai_api_site_relance_comptes_essai_post","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Corps","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/site-relance-comptes/repetition":{"post":{"tags":["site"],"summary":"Repetition","description":"La répétition générale : tout le parcours, registres compris, rien d'envoyé.\n\nElle dit ce que l'envoi réel ferait vraiment — y compris combien d'adresses\nSarbacane écarterait. Elle ne trace rien : l'envoi réel repart de zéro.","operationId":"repetition_api_site_relance_comptes_repetition_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/site-relance-comptes/armer":{"post":{"tags":["site"],"summary":"Armer","description":"Arme l'envoi : le geste explicite, avec le mot à taper et l'effectif à confirmer.\n\nL'effectif est redemandé parce qu'il est la seule chose qui peut avoir\nchangé sans qu'on s'en aperçoive entre le compte-rendu lu et le clic : un\nimport, une désinscription, un client qui s'est connecté entre-temps.","operationId":"armer_api_site_relance_comptes_armer_post","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Corps"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/site-relance-comptes/desarmer":{"post":{"tags":["site"],"summary":"Desarmer","operationId":"desarmer_api_site_relance_comptes_desarmer_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/site-relance-comptes/envoyer":{"post":{"tags":["site"],"summary":"Envoyer","description":"Lance l'envoi réel, tout de suite — pour le cas où le cron ne suffit pas.\n\nMille cinq cents lettres étalées sur deux heures ne tiennent pas dans une\nrequête HTTP : le travail part dans un fil, avec SA session. Le verrou\nconsultatif du service fait le reste — deux clics ne lancent pas deux envois.","operationId":"envoyer_api_site_relance_comptes_envoyer_post","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Corps"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/site-relance-comptes/journal":{"get":{"tags":["site"],"summary":"Journal","operationId":"journal_api_site_relance_comptes_journal_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limite"}},{"name":"etat","in":"query","required":false,"schema":{"type":"string","default":"","title":"Etat"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translatio/compte/code":{"post":{"tags":["translatio"],"summary":"Envoyer Code","operationId":"envoyer_code_api_translatio_compte_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Code"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translatio/compte/connexion":{"post":{"tags":["translatio"],"summary":"Connexion","operationId":"connexion_api_translatio_compte_connexion_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Connexion"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translatio/compte/deconnexion":{"post":{"tags":["translatio"],"summary":"Deconnexion","operationId":"deconnexion_api_translatio_compte_deconnexion_post","parameters":[{"name":"x-translatio-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Translatio-Jeton"}},{"name":"x-manuce-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Manuce-Jeton"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translatio/moi":{"get":{"tags":["translatio"],"summary":"Moi","operationId":"moi_api_translatio_moi_get","parameters":[{"name":"x-translatio-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Translatio-Jeton"}},{"name":"x-manuce-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Manuce-Jeton"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["translatio"],"summary":"Maj Moi","operationId":"maj_moi_api_translatio_moi_put","parameters":[{"name":"x-translatio-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Translatio-Jeton"}},{"name":"x-manuce-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Manuce-Jeton"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__translatio__Profil"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translatio/documents":{"post":{"tags":["translatio"],"summary":"Deposer","operationId":"deposer_api_translatio_documents_post","parameters":[{"name":"x-translatio-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Translatio-Jeton"}},{"name":"x-manuce-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Manuce-Jeton"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_deposer_api_translatio_documents_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translatio/documents/{jeton}/devis":{"post":{"tags":["translatio"],"summary":"Chiffrer","operationId":"chiffrer_api_translatio_documents__jeton__devis_post","parameters":[{"name":"jeton","in":"path","required":true,"schema":{"type":"string","title":"Jeton"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__translatio__Devis"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translatio/documents/{jeton}/devis/email":{"post":{"tags":["translatio"],"summary":"Envoyer Devis","description":"Le devis par email, pour le faire valider en interne et revenir le payer plus tard (lien de reprise).","operationId":"envoyer_devis_api_translatio_documents__jeton__devis_email_post","parameters":[{"name":"jeton","in":"path","required":true,"schema":{"type":"string","title":"Jeton"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevisEmail"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translatio/documents/{jeton}/identite":{"post":{"tags":["translatio"],"summary":"Enregistrer Identite","description":"Les coordonnées à faire figurer sur le devis, gardées sur le document.\n\nElles n'étaient enregistrées que par l'envoi du devis par email : télécharger le\nPDF sortait donc un devis au bloc client vide, alors que le client venait de les\nsaisir juste au-dessus.","operationId":"enregistrer_identite_api_translatio_documents__jeton__identite_post","parameters":[{"name":"jeton","in":"path","required":true,"schema":{"type":"string","title":"Jeton"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IdentiteDevis"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translatio/documents/{jeton}/devis.pdf":{"get":{"tags":["translatio"],"summary":"Telecharger Devis","operationId":"telecharger_devis_api_translatio_documents__jeton__devis_pdf_get","parameters":[{"name":"jeton","in":"path","required":true,"schema":{"type":"string","title":"Jeton"}},{"name":"lg","in":"query","required":false,"schema":{"type":"string","default":"fr","title":"Lg"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translatio/echantillon":{"post":{"tags":["translatio"],"summary":"Echantillon Libre","description":"Le test de la page d'accueil : un paragraphe collé, traduit sous les yeux.","operationId":"echantillon_libre_api_translatio_echantillon_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Echantillon"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translatio/documents/{jeton}/echantillon":{"post":{"tags":["translatio"],"summary":"Echantillon Document","description":"Avant d'acheter : un paragraphe du document, dans la langue choisie, par l'agent retenu.","operationId":"echantillon_document_api_translatio_documents__jeton__echantillon_post","parameters":[{"name":"jeton","in":"path","required":true,"schema":{"type":"string","title":"Jeton"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Echantillon"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translatio/documents/{jeton}/commander":{"post":{"tags":["translatio"],"summary":"Commander","operationId":"commander_api_translatio_documents__jeton__commander_post","parameters":[{"name":"jeton","in":"path","required":true,"schema":{"type":"string","title":"Jeton"}},{"name":"x-translatio-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Translatio-Jeton"}},{"name":"x-manuce-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Manuce-Jeton"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__translatio__Commande"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translatio/stripe/webhook":{"post":{"tags":["translatio"],"summary":"Webhook","operationId":"webhook_api_translatio_stripe_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/translatio/documents/{jeton}":{"get":{"tags":["translatio"],"summary":"Statut","operationId":"statut_api_translatio_documents__jeton__get","parameters":[{"name":"jeton","in":"path","required":true,"schema":{"type":"string","title":"Jeton"}},{"name":"session_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["translatio"],"summary":"Supprimer Document","description":"Le bouton « Supprimer » de l'espace : fichiers effacés tout de suite. Un document\npayé garde sa ligne, anonymisée (la facture, elle, est conservée 10 ans).","operationId":"supprimer_document_api_translatio_documents__jeton__delete","parameters":[{"name":"jeton","in":"path","required":true,"schema":{"type":"string","title":"Jeton"}},{"name":"x-translatio-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Translatio-Jeton"}},{"name":"x-manuce-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Manuce-Jeton"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translatio/documents/{jeton}/fichier/{langue}/{genre}":{"get":{"tags":["translatio"],"summary":"Telecharger","operationId":"telecharger_api_translatio_documents__jeton__fichier__langue___genre__get","parameters":[{"name":"jeton","in":"path","required":true,"schema":{"type":"string","title":"Jeton"}},{"name":"langue","in":"path","required":true,"schema":{"type":"string","title":"Langue"}},{"name":"genre","in":"path","required":true,"schema":{"type":"string","title":"Genre"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translatio/documents/{jeton}/facture.pdf":{"get":{"tags":["translatio"],"summary":"Telecharger Facture","description":"La facture d'un document, pour le client connecté qui l'a commandé.","operationId":"telecharger_facture_api_translatio_documents__jeton__facture_pdf_get","parameters":[{"name":"jeton","in":"path","required":true,"schema":{"type":"string","title":"Jeton"}},{"name":"x-translatio-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Translatio-Jeton"}},{"name":"x-manuce-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Manuce-Jeton"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translatio/tarifs":{"get":{"tags":["translatio"],"summary":"Tarifs","operationId":"tarifs_api_translatio_tarifs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/translatio/entreprises":{"get":{"tags":["translatio"],"summary":"Chercher Entreprise","description":"Autocomplétion de la raison sociale : l'annuaire public des entreprises (INSEE/INPI via api.gouv.fr).\nRenvoie de quoi remplir le formulaire ; le capital n'y figure pas (il est sur le Kbis).","operationId":"chercher_entreprise_api_translatio_entreprises_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translatio/orgs":{"post":{"tags":["translatio"],"summary":"Creer Org","operationId":"creer_org_api_translatio_orgs_post","parameters":[{"name":"x-translatio-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Translatio-Jeton"}},{"name":"x-manuce-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Manuce-Jeton"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Org"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translatio/orgs/moi":{"put":{"tags":["translatio"],"summary":"Maj Org","operationId":"maj_org_api_translatio_orgs_moi_put","parameters":[{"name":"x-translatio-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Translatio-Jeton"}},{"name":"x-manuce-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Manuce-Jeton"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Org"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translatio/orgs/moi/logo":{"post":{"tags":["translatio"],"summary":"Logo Org","operationId":"logo_org_api_translatio_orgs_moi_logo_post","parameters":[{"name":"x-translatio-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Translatio-Jeton"}},{"name":"x-manuce-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Manuce-Jeton"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_logo_org_api_translatio_orgs_moi_logo_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translatio/orgs/{org_id}/logo":{"get":{"tags":["translatio"],"summary":"Voir Logo","operationId":"voir_logo_api_translatio_orgs__org_id__logo_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"integer","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translatio/orgs/moi/membres":{"get":{"tags":["translatio"],"summary":"Membres","operationId":"membres_api_translatio_orgs_moi_membres_get","parameters":[{"name":"x-translatio-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Translatio-Jeton"}},{"name":"x-manuce-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Manuce-Jeton"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translatio/orgs/moi/invitations":{"post":{"tags":["translatio"],"summary":"Inviter","operationId":"inviter_api_translatio_orgs_moi_invitations_post","parameters":[{"name":"x-translatio-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Translatio-Jeton"}},{"name":"x-manuce-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Manuce-Jeton"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invitation"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translatio/orgs/moi/invitations/{email}/renvoyer":{"post":{"tags":["translatio"],"summary":"Renvoyer Invitation","description":"Renvoie l'invitation en attente (et la prolonge de 30 jours).","operationId":"renvoyer_invitation_api_translatio_orgs_moi_invitations__email__renvoyer_post","parameters":[{"name":"email","in":"path","required":true,"schema":{"type":"string","title":"Email"}},{"name":"x-translatio-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Translatio-Jeton"}},{"name":"x-manuce-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Manuce-Jeton"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translatio/orgs/moi/invitations/{email}":{"delete":{"tags":["translatio"],"summary":"Annuler Invitation","operationId":"annuler_invitation_api_translatio_orgs_moi_invitations__email__delete","parameters":[{"name":"email","in":"path","required":true,"schema":{"type":"string","title":"Email"}},{"name":"x-translatio-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Translatio-Jeton"}},{"name":"x-manuce-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Manuce-Jeton"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translatio/invitations/{token}/accepter":{"post":{"tags":["translatio"],"summary":"Accepter","operationId":"accepter_api_translatio_invitations__token__accepter_post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}},{"name":"x-translatio-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Translatio-Jeton"}},{"name":"x-manuce-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Manuce-Jeton"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translatio/orgs/moi/membres/{client_id}":{"delete":{"tags":["translatio"],"summary":"Retirer","operationId":"retirer_api_translatio_orgs_moi_membres__client_id__delete","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"integer","title":"Client Id"}},{"name":"x-translatio-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Translatio-Jeton"}},{"name":"x-manuce-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Manuce-Jeton"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translatio/orgs/moi/usage":{"get":{"tags":["translatio"],"summary":"Usage","description":"L'usage de l'espace : mots, langues, montant — par mois et par utilisateur (sans le contenu).","operationId":"usage_api_translatio_orgs_moi_usage_get","parameters":[{"name":"x-translatio-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Translatio-Jeton"}},{"name":"x-manuce-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Manuce-Jeton"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translatio/orgs/moi/abonnement":{"post":{"tags":["translatio"],"summary":"Abonnement","description":"Enregistrer le moyen de paiement de l'entreprise (carte ou SEPA). Le prélèvement a lieu\nchaque 1er du mois, sur une facture unique : abonnement + traductions du mois écoulé.","operationId":"abonnement_api_translatio_orgs_moi_abonnement_post","parameters":[{"name":"x-translatio-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Translatio-Jeton"}},{"name":"x-manuce-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Manuce-Jeton"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translatio/orgs/moi/factures":{"get":{"tags":["translatio"],"summary":"Factures","operationId":"factures_api_translatio_orgs_moi_factures_get","parameters":[{"name":"x-translatio-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Translatio-Jeton"}},{"name":"x-manuce-jeton","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Manuce-Jeton"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translatio/admin/promos":{"get":{"tags":["translatio"],"summary":"Promos","operationId":"promos_api_translatio_admin_promos_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["translatio"],"summary":"Creer Promo","operationId":"creer_promo_api_translatio_admin_promos_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Promo"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/translatio/admin/facturer":{"post":{"tags":["translatio"],"summary":"Facturer Maintenant","description":"Le Hub peut lancer la facturation d'un mois à la main (rattrapage) — d'un mois clos seulement :\nfacturer le mois en cours prélèverait l'entreprise avant la fin de ses traductions.","operationId":"facturer_maintenant_api_translatio_admin_facturer_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"mois","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mois"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translatio/admin/stats":{"get":{"tags":["translatio"],"summary":"Stats","operationId":"stats_api_translatio_admin_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/translatio/desinscription":{"get":{"tags":["translatio"],"summary":"Page Desinscription","operationId":"page_desinscription_api_translatio_desinscription_get","parameters":[{"name":"j","in":"query","required":false,"schema":{"type":"string","default":"","title":"J"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["translatio"],"summary":"Desinscrire Un Clic","operationId":"desinscrire_un_clic_api_translatio_desinscription_post","parameters":[{"name":"j","in":"query","required":false,"schema":{"type":"string","default":"","title":"J"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translatio/suivi":{"post":{"tags":["translatio"],"summary":"Suivi","description":"Le battement envoyé par le site. Jamais d'erreur renvoyée au visiteur : une\nmesure qui casse une page vaut moins que pas de mesure du tout.","operationId":"suivi_api_translatio_suivi_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/site/livraison/grille":{"get":{"tags":["site"],"summary":"Lire Grille","description":"La grille entière : zones, pays, tranches, franchise.\n\nElle sert la page « Livraison » du site, qui l'écrit aujourd'hui en dur. Un\ntarif changé dans le Hub doit se voir sur le site sans redéploiement — c'est\ntout l'intérêt de l'avoir mise en base.","operationId":"lire_grille_api_site_livraison_grille_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/site/livraison/simuler":{"get":{"tags":["site"],"summary":"Simuler","description":"« Combien coûte la livraison de tant d'euros vers tel pays ? »\n\nUtile à la page « Livraison » et, surtout, à qui veut vérifier une règle\nsans passer une commande. Elle ne connaît ni panier, ni client, ni code de\nréduction : c'est la grille seule, et c'est pour cela qu'elle peut être\nouverte.","operationId":"simuler_api_site_livraison_simuler_get","parameters":[{"name":"pays","in":"query","required":false,"schema":{"type":"string","default":"","title":"Pays"}},{"name":"montant","in":"query","required":false,"schema":{"type":"number","default":0,"title":"Montant"}},{"name":"mode","in":"query","required":false,"schema":{"type":"string","default":"","title":"Mode"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/livraison/admin/reglages":{"get":{"tags":["site"],"summary":"Lire Reglages","operationId":"lire_reglages_api_site_livraison_admin_reglages_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["site"],"summary":"Poser Reglage","operationId":"poser_reglage_api_site_livraison_admin_reglages_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Reglage"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/site/livraison/admin/zones":{"get":{"tags":["site"],"summary":"Lister Zones","operationId":"lister_zones_api_site_livraison_admin_zones_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["site"],"summary":"Creer Zone","operationId":"creer_zone_api_site_livraison_admin_zones_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZoneIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/site/livraison/admin/zones/{zone_id}":{"put":{"tags":["site"],"summary":"Modifier Zone","operationId":"modifier_zone_api_site_livraison_admin_zones__zone_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"zone_id","in":"path","required":true,"schema":{"type":"integer","title":"Zone Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZoneMaj"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["site"],"summary":"Supprimer Zone","operationId":"supprimer_zone_api_site_livraison_admin_zones__zone_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"zone_id","in":"path","required":true,"schema":{"type":"integer","title":"Zone Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/livraison/admin/pays":{"put":{"tags":["site"],"summary":"Poser Pays","operationId":"poser_pays_api_site_livraison_admin_pays_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaysIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/site/livraison/admin/tarifs":{"post":{"tags":["site"],"summary":"Creer Tarif","operationId":"creer_tarif_api_site_livraison_admin_tarifs_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarifIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/site/livraison/admin/tarifs/{tarif_id}":{"put":{"tags":["site"],"summary":"Modifier Tarif","operationId":"modifier_tarif_api_site_livraison_admin_tarifs__tarif_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tarif_id","in":"path","required":true,"schema":{"type":"integer","title":"Tarif Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TarifMaj"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["site"],"summary":"Supprimer Tarif","operationId":"supprimer_tarif_api_site_livraison_admin_tarifs__tarif_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tarif_id","in":"path","required":true,"schema":{"type":"integer","title":"Tarif Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/livraison/admin/journal":{"get":{"tags":["site"],"summary":"Journal","operationId":"journal_api_site_livraison_admin_journal_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limite","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/livraison/admin/commandes/{commande_id}/expedition":{"post":{"tags":["site"],"summary":"Marquer Expediee","description":"Marque une commande du site comme expédiée, et prévient le client.\n\n**Rien ne déclenche cet email tout seul.** L'expédition d'une montre se\ndécide devant le colis, pas dans un cron : un mail « votre commande est\npartie » envoyé par une règle automatique arrive un jour où la montre est\nencore sur l'établi, et c'est exactement ce qu'il ne faut pas faire.\n\nL'envoi ne peut pas faire échouer l'enregistrement : le statut est écrit et\nvalidé d'abord, l'email part ensuite, et son échec est rendu dans la réponse\nplutôt que remonté en erreur.","operationId":"marquer_expediee_api_site_livraison_admin_commandes__commande_id__expedition_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"commande_id","in":"path","required":true,"schema":{"type":"integer","title":"Commande Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Expedition"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/livraison/admin/commandes/{commande_id}/renvoyer-confirmation":{"post":{"tags":["site"],"summary":"Renvoyer Confirmation","description":"Rejoue le mail de confirmation d'une commande.\n\nIl existe parce que l'envoi ne fait jamais échouer la prise de commande : un\nrelais SMTP indisponible laisse une commande valide et un client sans\naccusé. La colonne `email_confirmation_erreur` dit lesquelles, et ce point\nd'entrée les rattrape.","operationId":"renvoyer_confirmation_api_site_livraison_admin_commandes__commande_id__renvoyer_confirmation_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"commande_id","in":"path","required":true,"schema":{"type":"integer","title":"Commande Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/test-quote/create":{"post":{"tags":["test-quote"],"summary":"Create Quote","description":"Cree un devis SAV dans Odoo (sale.order).","operationId":"create_quote_api_test_quote_create_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateQuoteRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/test-quote/sav/{sav_id}/parts":{"get":{"tags":["test-quote"],"summary":"Get Sav Parts","description":"Retourne les pieces disponibles pour un SAV (selon le modele de la montre).","operationId":"get_sav_parts_api_test_quote_sav__sav_id__parts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sav_id","in":"path","required":true,"schema":{"type":"integer","title":"Sav Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/search-client":{"get":{"tags":["sales-orders"],"summary":"Search Client Odoo","operationId":"search_client_odoo_api_sales_orders_search_client_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/search-catalogue":{"get":{"tags":["sales-orders"],"summary":"Search Catalogue","operationId":"search_catalogue_api_sales_orders_search_catalogue_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"title":"Q"}},{"name":"filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filter"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/search-club-products":{"get":{"tags":["sales-orders"],"summary":"Search Club Products","description":"Recherche les produits de la boutique Club (merch, coffrets, montres Club)\npour les insérer directement en ligne de BDC. Les déclinaisons (tailles) et\nl'image sont portées par la fiche `club_boutique_products` elle-même — pas\nbesoin d'appel PrestaShop live.","operationId":"search_club_products_api_sales_orders_search_club_products_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/clock-machines":{"get":{"tags":["sales-orders"],"summary":"List Clock Machines","description":"Catalogue des pendules « Clock Machine », pour le sélecteur du BDC.\n\nLes pendules n'existent ni dans PrestaShop ni dans Odoo — Odoo n'en connaît\nque les COMPOSANTS (socles, pales, aiguilles…), tous à 1 € : il n'y a aucun\nproduit vendable sur lequel s'appuyer. Le barème vit dans\n`pendules_orders.CATALOGUE`, celui-là même qui tarife les commandes du site :\non le lit, on ne le recopie pas.","operationId":"list_clock_machines_api_sales_orders_clock_machines_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/sales-orders/product-combinations/{ps_id}":{"get":{"tags":["sales-orders"],"summary":"Get Product Combinations","description":"Les déclinaisons d'un produit (couleur, taille…), pour le sélecteur du bon.\n\nLues en base locale (`site_declinaisons`, prix par `site_prix`) : le\nwebservice PrestaShop est éteint depuis le 21/09/2026. Il répondait 404, on\nrenvoyait « aucune déclinaison » et le front ajoutait le produit PARENT au\nprix de base — BRM-2026-0672, « Brake Titane Gris » sans couleur ni\ntaille. Désormais une panne est une erreur (503), jamais une liste vide.","operationId":"get_product_combinations_api_sales_orders_product_combinations__ps_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ps_id","in":"path","required":true,"schema":{"type":"integer","title":"Ps Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/search-serial":{"get":{"tags":["sales-orders"],"summary":"Search Serial For Order","description":"Recherche une montre par numéro de série dans Odoo (stock qty >= 1).","operationId":"search_serial_for_order_api_sales_orders_search_serial_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":3,"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/stock-suggestions":{"get":{"tags":["sales-orders"],"summary":"Stock Suggestions","description":"Liste les montres en stock dans BRM/COFFRE (Odoo) avec leur serial.\n\nUtilisé par la modale 'Lancer en production' pour permettre de sélectionner\nune montre stock spécifique par numéro de série Odoo. Filtre optionnel sur le\nnom du modèle ou le serial directement. Si une recherche serial précise ne\nmatche rien dans BRM/COFFRE, on élargit aux autres locations Odoo afin que\nChrystèle puisse retrouver une montre déjà déplacée/réservée.","operationId":"stock_suggestions_api_sales_orders_stock_suggestions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","description":"Filtre par nom de modèle ou serial","default":"","title":"Q"},"description":"Filtre par nom de modèle ou serial"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/search-custom-lines":{"get":{"tags":["sales-orders"],"summary":"Search Custom Lines","description":"Recherche des lignes montres perso dans les BDC existants (par ref BDC, nom client, ou nom produit).","operationId":"search_custom_lines_api_sales_orders_search_custom_lines_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/list-mine":{"get":{"tags":["sales-orders"],"summary":"List My Orders","description":"BDC du commercial connecté, groupés par statut pour le dashboard.","operationId":"list_my_orders_api_sales_orders_list_mine_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/sales-orders":{"get":{"tags":["sales-orders"],"summary":"List Orders","operationId":"list_orders_api_sales_orders_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5000,"minimum":1},{"type":"null"}],"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["sales-orders"],"summary":"Create Order","operationId":"create_order_api_sales_orders_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/stats":{"get":{"tags":["sales-orders"],"summary":"Get Stats","operationId":"get_stats_api_sales_orders_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/sales-orders/blank-form-pdf":{"get":{"tags":["sales-orders"],"summary":"Blank Order Form Pdf","description":"Fiche de vente VIERGE imprimable (toutes les cases à remplir à la main),\npour les commerciaux qui n'utilisent pas le Hub (ex. Bernard). On ressaisit\nensuite le BDC dans le Hub à partir de la fiche remplie.\n\nIMPORTANT : cette route littérale doit rester déclarée AVANT `/{order_id}`,\nsinon FastAPI fait matcher \"blank-form-pdf\" sur order_id:int → 422.","operationId":"blank_order_form_pdf_api_sales_orders_blank_form_pdf_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/sales-orders/commercial-teams":{"get":{"tags":["sales-orders"],"summary":"List Commercial Teams","description":"Équipes commerciales Odoo (crm.team), dont les duos — pour attribuer une vente.\nRésultat caché 10 min (l'appel Odoo XML-RPC est lent).","operationId":"list_commercial_teams_api_sales_orders_commercial_teams_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/sales-orders/{order_id}/commercial":{"post":{"tags":["sales-orders"],"summary":"Set Commercial Attribution","description":"(Ré)attribue la vente à un commercial / une équipe Odoo. Admin, Karine ou Ghislaine.","operationId":"set_commercial_attribution_api_sales_orders__order_id__commercial_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/by-ref/{reference}":{"get":{"tags":["sales-orders"],"summary":"Get Order By Reference","description":"Récupère un BDC par sa référence (ex. BRM-2026-0196) — permet une URL lisible et\npartageable par bon de commande. Délègue à get_order une fois l'id résolu.","operationId":"get_order_by_reference_api_sales_orders_by_ref__reference__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"reference","in":"path","required":true,"schema":{"type":"string","title":"Reference"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/carte-cadeau":{"get":{"tags":["sales-orders"],"summary":"Get Carte Cadeau","description":"Visuel d'une carte cadeau au montant demandé, composé au besoin.\n\n⚠️ Déclarée AVANT `/{order_id}` : l'attrape-tout capture sinon\n« /carte-cadeau » et répond « Not authenticated » sur une route qui\ndoit rester publique.\n\nSans authentification, comme les images du catalogue : la page de suivi\npublique et les clients mail y accèdent anonymement.\n\nLe fichier vit dans `/assets`, servi statiquement et mis en cache par le\nnavigateur. Cette route ne fait que garantir qu'il existe avant d'y renvoyer\n— l'appelant ne peut pas deviner l'URL d'une carte jamais composée.","operationId":"get_carte_cadeau_api_sales_orders_carte_cadeau_get","parameters":[{"name":"montant","in":"query","required":false,"schema":{"type":"number","default":0,"title":"Montant"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}":{"get":{"tags":["sales-orders"],"summary":"Get Order","operationId":"get_order_api_sales_orders__order_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["sales-orders"],"summary":"Update Order","operationId":"update_order_api_sales_orders__order_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/odoo-proforma-pdf":{"get":{"tags":["sales-orders"],"summary":"Download Odoo Proforma Pdf","description":"La facture proforma du devis Odoo, à télécharger — la même que celle\nenvoyée au client par « Envoyer la proforma ».","operationId":"download_odoo_proforma_pdf_api_sales_orders__order_id__odoo_proforma_pdf_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/odoo-quote-pdf":{"get":{"tags":["sales-orders"],"summary":"Download Odoo Quote Pdf","description":"PDF du devis Odoo lié au BDC (consultation dans le Hub).","operationId":"download_odoo_quote_pdf_api_sales_orders__order_id__odoo_quote_pdf_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/odoo-invoice-pdf":{"get":{"tags":["sales-orders"],"summary":"Download Odoo Invoice Pdf","description":"PDF d'une facture Odoo liée au BDC. `invoice_id` optionnel : par défaut la\ndernière facture du bon ; sinon une facture précise (vérifiée comme rattachée\nà ce bon, sécurité IDOR).","operationId":"download_odoo_invoice_pdf_api_sales_orders__order_id__odoo_invoice_pdf_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}},{"name":"invoice_id","in":"query","required":false,"schema":{"type":"integer","title":"Invoice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/no-review-request":{"put":{"tags":["sales-orders"],"summary":"Set No Review Request","description":"Exclut (ou réintègre) une commande de la demande d'avis Google automatique.\n\nLa relance part à J+21 de la livraison ; tant que cette date n'est pas passée,\nposer le drapeau suffit à l'empêcher. Après coup il n'annule évidemment rien.","operationId":"set_no_review_request_api_sales_orders__order_id__no_review_request_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoReviewUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/shipping-address":{"put":{"tags":["sales-orders"],"summary":"Update Shipping Address","description":"Modifier SEULEMENT l'adresse de livraison d'un BDC.\n\nContrairement à update_order (full edit réservé au brouillon / admin), ceci est\nouvert au commercial CRÉATEUR (et admin) à tout moment TANT QUE la commande n'est\nPAS FACTURÉE — un changement de lieu de livraison de dernière minute reste légitime\nmême une fois le devis Odoo créé et l'acompte encaissé. (Demande François 03/07.)","operationId":"update_shipping_address_api_sales_orders__order_id__shipping_address_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShippingAddressUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/lines":{"post":{"tags":["sales-orders"],"summary":"Add Line","operationId":"add_line_api_sales_orders__order_id__lines_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LineCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/lines/{line_id}":{"delete":{"tags":["sales-orders"],"summary":"Delete Line","operationId":"delete_line_api_sales_orders__order_id__lines__line_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}},{"name":"line_id","in":"path","required":true,"schema":{"type":"integer","title":"Line Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["sales-orders"],"summary":"Update Line","description":"Édite une ligne existante (description, specs, emballage, qté, prix…) À TOUT MOMENT,\net répercute sur le devis Odoo brouillon. Permet de compléter une description (ex.\nmontre stock sans fiche) avant facturation. Demande François 30/06.","operationId":"update_line_api_sales_orders__order_id__lines__line_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}},{"name":"line_id","in":"path","required":true,"schema":{"type":"integer","title":"Line Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/lines/{line_id}/wrist-size":{"put":{"tags":["sales-orders"],"summary":"Update Line Wrist Size","description":"Renseigne / corrige le TOUR DE POIGNET d'une ligne à tout moment (hors bon annulé/livré),\ny compris par le commercial PROPRIÉTAIRE APRÈS soumission — contrairement à l'édition de\nligne complète (réservée admin/power users post-soumission). Cas courant : commande saisie\navec tour de poignet « à définir », complété a posteriori depuis le BDC (demande François).\n\nLa ligne est la source de vérité unique du wrist : la demande de bracelet le lit en live\n(COALESCE) et le montage via `bdc_saisie`. On rafraîchit en plus le snapshot texte de la\ndemande de bracelet tant qu'elle est en attente (sinon « Tour de poignet : EN ATTENTE » y\nresterait figé).","operationId":"update_line_wrist_size_api_sales_orders__order_id__lines__line_id__wrist_size_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}},{"name":"line_id","in":"path","required":true,"schema":{"type":"integer","title":"Line Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/lines/{line_id}/limited-serial":{"post":{"tags":["sales-orders"],"summary":"Update Limited Serial","description":"Affecte le numéro de série limitée d'une ligne de BDC.\n\nRÉSERVÉ à la direction (et aux personnes habilitées à lancer la production).\nUn commercial ne choisit pas de tableau : il pose une option sur la page\nSéries limitées, sans avoir à identifier le bon modèle. C'est la direction qui\naffecte le numéro, au lancement en fabrication ou à l'affectation d'une montre\ndu stock — puis le tableau se remplit tout seul à la facturation.","operationId":"update_limited_serial_api_sales_orders__order_id__lines__line_id__limited_serial_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}},{"name":"line_id","in":"path","required":true,"schema":{"type":"integer","title":"Line Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/lines/{line_id}/stock-serial":{"post":{"tags":["sales-orders"],"summary":"Update Stock Serial","description":"Met à jour le N° de série physique (montre livrée du stock) d'une ligne.","operationId":"update_stock_serial_api_sales_orders__order_id__lines__line_id__stock_serial_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}},{"name":"line_id","in":"path","required":true,"schema":{"type":"integer","title":"Line Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/lines/{line_id}/customizations":{"post":{"tags":["sales-orders"],"summary":"Add Customization","operationId":"add_customization_api_sales_orders__order_id__lines__line_id__customizations_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}},{"name":"line_id","in":"path","required":true,"schema":{"type":"integer","title":"Line Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomizationCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/files":{"post":{"tags":["sales-orders"],"summary":"Upload File","operationId":"upload_file_api_sales_orders__order_id__files_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_file_api_sales_orders__order_id__files_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/files/{file_id}":{"delete":{"tags":["sales-orders"],"summary":"Delete File","operationId":"delete_file_api_sales_orders__order_id__files__file_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}},{"name":"file_id","in":"path","required":true,"schema":{"type":"integer","title":"File Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/payment":{"put":{"tags":["sales-orders"],"summary":"Update Payment","operationId":"update_payment_api_sales_orders__order_id__payment_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/payments":{"get":{"tags":["sales-orders"],"summary":"List Order Payments","operationId":"list_order_payments_api_sales_orders__order_id__payments_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["sales-orders"],"summary":"Add Order Payment","description":"Enregistre un encaissement supplémentaire (acompte, versement intermédiaire, solde).\n\nN'appelle AUCUNE facturation et ne débite personne : c'est un enregistrement\ncomptable interne de ce qui a déjà été encaissé.","operationId":"add_order_payment_api_sales_orders__order_id__payments_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentEntry"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/echeancier":{"get":{"tags":["sales-orders"],"summary":"Get Echeancier","description":"Échéancier chiffré du bon, avec ce qui est réglé, en retard ou à venir.","operationId":"get_echeancier_api_sales_orders__order_id__echeancier_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["sales-orders"],"summary":"Put Echeancier","description":"Remplace l'échéancier chiffré. Le texte de la proforma n'est pas touché.","operationId":"put_echeancier_api_sales_orders__order_id__echeancier_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/encaissements-disponibles":{"get":{"tags":["sales-orders"],"summary":"List Available Bank Payments","description":"Encaissements reçus (banque + Stripe) pas encore affectés à un bon.\n\nLe rapprochement automatique ne valide que sur référence : un virement dont le\nlibellé n'en porte aucune (« acompte/aanbetaling V6-44-SLB ») reste donc en\nattente. Plutôt que d'assouplir le garde-fou — un faux positif lance une\nproduction —, on rend ces encaissements visibles pour que l'humain tranche.\n\nTriés par pertinence : le montant qui tombe juste d'abord, puis le nom qui\nressemble, puis les plus récents.","operationId":"list_available_bank_payments_api_sales_orders__order_id__encaissements_disponibles_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}},{"name":"jours","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":7,"default":60,"title":"Jours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/rattacher-encaissement":{"post":{"tags":["sales-orders"],"summary":"Attach Bank Payment","description":"Rattache au bon un encaissement reçu (ligne de relevé Odoo), à la main.\n\nMême effet qu'un encaissement saisi : le bon avance. La différence est la\ntraçabilité — on garde le lien vers la ligne bancaire, ce qui interdit de\nl'affecter deux fois et permet de retrouver l'origine de l'argent.","operationId":"attach_bank_payment_api_sales_orders__order_id__rattacher_encaissement_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/payments/{payment_id}/receipt":{"post":{"tags":["sales-orders"],"summary":"Upload Payment Receipt","description":"Attache le justificatif d'un encaissement : ticket CB, avis de virement, remise.\n\nLe seul point d'upload d'un ticket CB était le formulaire d'édition du bon, et\nseulement quand le champ « Mode » de l'acompte valait `cb`. Depuis que les\nrèglements passent par le journal d'encaissements, ce champ n'est plus rempli :\nle bouton n'apparaissait plus nulle part, et sur un bon déjà validé le formulaire\nn'est plus ouvert. Le justificatif se pose donc là où vit le règlement.\n\nRattaché à l'encaissement, pas au bon : sur un dossier réglé en trois fois, un\njustificatif isolé ne dit pas lequel il prouve.","operationId":"upload_payment_receipt_api_sales_orders__order_id__payments__payment_id__receipt_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}},{"name":"payment_id","in":"path","required":true,"schema":{"type":"integer","title":"Payment Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_payment_receipt_api_sales_orders__order_id__payments__payment_id__receipt_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/payments/{payment_id}":{"delete":{"tags":["sales-orders"],"summary":"Delete Order Payment","description":"Supprime un encaissement saisi par erreur. Les colonnes historiques sont\nrecalculées derrière — un BDC peut donc repasser de « soldé » à « acompte reçu ».","operationId":"delete_order_payment_api_sales_orders__order_id__payments__payment_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}},{"name":"payment_id","in":"path","required":true,"schema":{"type":"integer","title":"Payment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/check-transfers":{"post":{"tags":["sales-orders"],"summary":"Check Transfers Nextcloud","description":"Lance immédiatement le rapprochement des virements reçus avec les ACOMPTES et\nSOLDES des BDC non soldés (marque payé/encaissé, historique + notif Slack).\n\nLit les comptes connectés à Odoo (banque + Stripe), comme le cron des 15 minutes.\nLe tableau Nextcloud de Ghislaine n'est plus la source depuis le 30/07/2026 : il\nn'est plus tenu. En dernier recours seulement — si Odoo ne rend aucune ligne —\non retombe dessus, le temps que la bascule soit derrière nous.","operationId":"check_transfers_nextcloud_api_sales_orders_check_transfers_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/sales-orders/{order_id}/request-balance":{"post":{"tags":["sales-orders"],"summary":"Request Balance","description":"Réclame le solde au client : email adapté au mode convenu, CC commercial + François.\nBloqué tant que la commande n'est pas prête à expédier (l'email annonce « votre\ncommande est prête ») — sauf force=True. Demande François 01/07/2026.","operationId":"request_balance_api_sales_orders__order_id__request_balance_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/note":{"post":{"tags":["sales-orders"],"summary":"Add Order Note","description":"Ajoute une note libre à l'historique d'un BDC, à TOUT moment — y compris\nquand le bon est expédié, facturé ou clôturé. Aucune garde de statut.","operationId":"add_order_note_api_sales_orders__order_id__note_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderNote"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/relances-pause":{"post":{"tags":["sales-orders"],"summary":"Pause Relances","description":"Met en pause toutes les relances automatiques du bon jusqu'à une date\n(solde, acompte, commande du site, relance hebdomadaire) — ou la lève.\nLe bouton manuel « réclamer le solde » reste libre.","operationId":"pause_relances_api_sales_orders__order_id__relances_pause_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelancesPause"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/relance-hebdo":{"post":{"tags":["sales-orders"],"summary":"Relance Hebdomadaire","description":"Active (ou coupe) la relance hebdomadaire de la proforma — voir\n`services/relance_hebdo`. Première relance 7 jours après l'activation.","operationId":"relance_hebdomadaire_api_sales_orders__order_id__relance_hebdo_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelanceHebdo"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/demander-facture-compensation":{"post":{"tags":["sales-orders"],"summary":"Demander Facture Compensation","description":"Réclame au client la facture qui solde une commande payée par compensation.\n\nUn échange ne se solde que quand les deux factures existent : la nôtre part\navec la commande, la sienne doit revenir. Sans elle, la comptabilité reste\nouverte et le colis attend — d'où cette relance, envoyée d'un clic, le\ncommercial du bon en copie pour qu'il suive le dossier.\n\nLe Hub n'établit ni n'encaisse rien ici : il demande une pièce.","operationId":"demander_facture_compensation_api_sales_orders__order_id__demander_facture_compensation_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/facture-compensation":{"post":{"tags":["sales-orders"],"summary":"Deposer Facture Compensation","description":"Reçoit la facture que le partenaire nous renvoie, et la met dans le circuit.\n\nCette facture-là est une facture d'ACHAT : le partenaire nous facture sa\nprestation, en face de la montre qu'on lui facture. Elle suit donc le même\nchemin que n'importe quelle facture fournisseur — archivée sur Nextcloud,\nenvoyée à DEXT, donc au cabinet — mais elle naît déjà soldée : il n'y a pas\nde virement à faire, c'est une compensation.\n\nSans ce bouton, il fallait la déposer à part dans « Paiements fournisseurs »\net se souvenir de la relier au bon. Ici le lien est écrit tout seul.","operationId":"deposer_facture_compensation_api_sales_orders__order_id__facture_compensation_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_deposer_facture_compensation_api_sales_orders__order_id__facture_compensation_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/submit":{"post":{"tags":["sales-orders"],"summary":"Submit Order","operationId":"submit_order_api_sales_orders__order_id__submit_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","description":"Forcer la soumission même si les preuves de paiement CB sont manquantes (ticket perdu)","default":false,"title":"Force"},"description":"Forcer la soumission même si les preuves de paiement CB sont manquantes (ticket perdu)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/validate-financing":{"post":{"tags":["sales-orders"],"summary":"Validate Financing","description":"François valide le financement → le BDC passe en 'submitted' pour Chrystèle.","operationId":"validate_financing_api_sales_orders__order_id__validate_financing_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/cancel-financing":{"post":{"tags":["sales-orders"],"summary":"Cancel Financing","description":"Financement refusé / abandonné (client a payé autrement) → le BDC repasse\ndans le flux normal ('submitted') SANS marquer le financement approuvé. Crée le\ndevis Odoo comme une soumission classique, et marque le dossier financement refusé.\nLe statut de paiement réel (virement reçu, etc.) n'est pas touché.","operationId":"cancel_financing_api_sales_orders__order_id__cancel_financing_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/validate":{"post":{"tags":["sales-orders"],"summary":"Validate Order","operationId":"validate_order_api_sales_orders__order_id__validate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/facturation-preview":{"get":{"tags":["sales-orders"],"summary":"Facturation Preview Endpoint","description":"Données pour la modale de facturation : montres + dispo stock + factures émises.","operationId":"facturation_preview_endpoint_api_sales_orders__order_id__facturation_preview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/facturer":{"post":{"tags":["sales-orders"],"summary":"Facturer Order","description":"Facture un BDC en sortant les montres du stock par n° de série (BL Odoo validé),\navec support de la facturation PARTIELLE (1 facture par livraison + backorder).\n\nBody : {\"selections\": [{\"production_order_id\": int, \"serial\": str}], \"force\": bool}\n  - selections : les montres à facturer maintenant (None/[] → toutes celles ayant\n    un n° de série en stock pas encore facturé) ;\n  - force : ignore la garde paiement (sinon : cumul facturé ≤ montant encaissé).\n\nGardes : réservé admin + comptabilité ; devis Odoo requis ; idempotent par n° de\nsérie. Rollback complet si la facturation Odoo échoue (le BDC reste non facturé).","operationId":"facturer_order_api_sales_orders__order_id__facturer_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/lines/{line_id}/attachable-productions":{"get":{"tags":["sales-orders"],"summary":"List Attachable Productions","description":"Fabrications en cours rattachables à une ligne du BDC.\n\nCas couvert : la montre vendue est DÉJÀ en cours de fabrication (lancée pour le\nstock, sans client). À ce moment-là elle n'est ni « stock » (pas encore de n° de\nsérie, il n'entre en stock qu'au QC) ni « production » (la relancer fabriquerait\nla montre en double). Sans ce rattachement, le seul contournement est d'attendre\nla fin de la fabrication : le BDC reste des semaines en « à traiter » et l'atelier\nignore que la pièce est vendue.\n\nSont proposés les ordres non archivés, non terminés, sans BDC rattaché. Le modèle\nde la ligne sert de tri (les plus proches d'abord), pas de filtre strict : les\nlibellés diffèrent souvent entre catalogue et atelier.","operationId":"list_attachable_productions_api_sales_orders__order_id__lines__line_id__attachable_productions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}},{"name":"line_id","in":"path","required":true,"schema":{"type":"integer","title":"Line Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/lines/{line_id}/annuler-production":{"post":{"tags":["sales-orders"],"summary":"Annuler Production","description":"Défaire un lancement en fabrication : la montre viendra du stock.\n\nLe Hub savait aiguiller une ligne vers la fabrication OU vers le stock, mais\npas revenir sur ce choix. Se tromper de voie arrivait pourtant : on lance une\nmontre neuve, puis on s'aperçoit qu'une montre en stock fera l'affaire avec\nune gravure. Sans ce retour, il fallait reprendre la base à la main.\n\nCe qu'on refuse, et pourquoi :\n- une fabrication qui porte un NUMÉRO DE SÉRIE : la montre existe, elle est\n  entrée en stock, l'annuler laisserait une pièce orpheline hors du Registre ;\n- une fabrication engagée (montage, contrôles, terminée) : ce n'est plus une\n  erreur d'aiguillage, c'est du travail fait, et ça se règle avec l'atelier.\n\nUne fabrication déjà gravée ou en attente d'assignation s'annule, mais\nseulement sur confirmation explicite : quelqu'un a peut-être déjà découpé un\ncadran.\n\nL'ordre est SUPPRIMÉ, pas archivé : un ordre archivé sans numéro de série\npollue le Registre et les statistiques, et celui-ci n'aurait jamais dû\nexister. Le numéro de série limitée qu'il réservait repart au tableau.","operationId":"annuler_production_api_sales_orders__order_id__lines__line_id__annuler_production_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}},{"name":"line_id","in":"path","required":true,"schema":{"type":"integer","title":"Line Id"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/lines/{line_id}/attach-production":{"post":{"tags":["sales-orders"],"summary":"Attach Existing Production","description":"Rattache une fabrication DÉJÀ EN COURS à une ligne du BDC (3e voie).\n\nNi nouvelle fabrication (doublon), ni sortie de stock (pas encore de n° de série) :\nl'ordre existant change simplement de destination — il devient une montre vendue.\n\nChoix assumés :\n- **l'atelier reste maître de son planning** : ni la priorité ni l'étape ne sont\n  touchées, et une date de livraison déjà posée n'est jamais écrasée ;\n- le rattachement est **notifié** à l'atelier, pour qu'un humain arbitre la\n  priorité en connaissance de cause.","operationId":"attach_existing_production_api_sales_orders__order_id__lines__line_id__attach_production_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}},{"name":"line_id","in":"path","required":true,"schema":{"type":"integer","title":"Line Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/lines/{line_id}/detacher-production":{"post":{"tags":["sales-orders"],"summary":"Detacher Production","description":"La montre part ailleurs : détacher la fabrication de la ligne du bon.\n\nL'inverse exact de « Rattacher une fabrication en cours ». Le Hub savait\nrediriger vers un bon une montre lancée pour le stock ; il ne savait pas la\nreprendre. Or une pièce finie se vend parfois AVANT celle qu'elle devait\nservir : la V6 Art Car de FASOLI (BRM-2026-0290) est sortie du QC avec son\nn° 101AA11, puis a été vendue à un autre client. Sans ce retour, il fallait\ntoucher la base à la main, et la ligne restait « servie » par une montre qui\nne viendrait jamais.\n\nCe que ça fait :\n- la fabrication perd son bon : elle redevient une montre SANS client, pour\n  le stock (`is_stock_pending`), planning et étape inchangés ;\n- si la montre est finie (n° de série + QC esthétique validé), elle EST déjà\n  en stock Odoo : on archive la fiche, exactement comme une montre lancée\n  pour le stock — sinon elle resterait coincée en QC, re-validable à l'infini ;\n- le registre des montres perd le client de CE bon : la montre n'est pas à\n  lui. Rien d'autre n'est touché (n° de série, stock Odoo, photos QC) ;\n- la ligne redevient à servir : le bouton habituel « Lancer / Affecter stock »\n  rouvre les trois voies — fabrication neuve, montre du stock Odoo, ou\n  rattachement d'une fabrication déjà en cours.\n\nCe qu'on refuse, et pourquoi :\n- un bon FACTURÉ : la montre est sur la facture, ça se règle par un avoir ;\n- une montre déjà EXPÉDIÉE : elle est partie, il n'y a plus rien à détacher.\n\nNe jamais confondre avec « Finalement : montre du stock » (`annuler-production`),\nqui SUPPRIME une fabrication lancée par erreur. Ici la montre existe ou se\nfabrique : elle change de destination, elle ne disparaît pas.","operationId":"detacher_production_api_sales_orders__order_id__lines__line_id__detacher_production_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}},{"name":"line_id","in":"path","required":true,"schema":{"type":"integer","title":"Line Id"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/launch-production":{"post":{"tags":["sales-orders"],"summary":"Launch Production","description":"Crée un ordre de production par MONTRE du BDC. Karine, Chrystèle + admins.\n\nUne fiche par exemplaire, pas par ligne : une ligne de quantité 20 ouvre vingt\nfiches. Ce n'était pas le cas jusqu'au 21/09/2026 — la quantité était ignorée\net une ligne « 20 × V6-44-HB » n'ouvrait qu'UNE fiche, alors que les demandes\nde bracelet, elles, bouclaient correctement sur les vingt. L'écart ne se voyait\nque sur la fiche du bon, et se rattrapait à la main (BRM-2026-0609, 20 montres\npour GIP-LUX : dix-neuf fiches recréées après coup).\n\nLe rattrapage est partiel : si une ligne a déjà des fiches, seules les\nmanquantes sont créées. Une fabrication annulée étant SUPPRIMÉE (et non\nmarquée), son exemplaire redevient à créer — c'est voulu.","operationId":"launch_production_api_sales_orders__order_id__launch_production_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/to-production":{"post":{"tags":["sales-orders"],"summary":"To Production","operationId":"to_production_api_sales_orders__order_id__to_production_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/in-prod-modify":{"post":{"tags":["sales-orders"],"summary":"In Prod Modify","description":"Ajoute une gravure/impression/note sur une PROD déjà en cours de fabrication.\n\nPermet à Kim/Karine/Chrystèle/admin d'ajouter a posteriori une instruction\nsur un BDC qui est déjà passé en production. Notifie l'horloger assigné,\nKim (atelier), Karine (production), et Guillaume (gravure) selon le cas.\n\nBody:\n  - production_order_id (int, optionnel) : cible une PROD précise. Sans id,\n    applique à toutes les PRODs non-archivées du BDC.\n  - modification_type ('gravure' | 'impression' | 'note') : nature de la modif.\n  - detail (str) : texte de l'instruction.","operationId":"in_prod_modify_api_sales_orders__order_id__in_prod_modify_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/lines/{line_id}/swap-preview":{"get":{"tags":["sales-orders"],"summary":"Swap Watch Preview","description":"Impact chiffré d'un échange de montre, AVANT toute écriture.\n\nSert l'écran de confirmation : ancien modèle → nouveau, différence de prix,\nfiches de fabrication réécrites, bracelets à recommander. Aucune écriture.","operationId":"swap_watch_preview_api_sales_orders__order_id__lines__line_id__swap_preview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}},{"name":"line_id","in":"path","required":true,"schema":{"type":"integer","title":"Line Id"}},{"name":"ps_id","in":"query","required":true,"schema":{"type":"integer","title":"Ps Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/lines/{line_id}/release-limited":{"post":{"tags":["sales-orders"],"summary":"Release Limited Number","description":"Libère le n° de série limitée réservé sur une ligne, et sur ses fiches d'atelier.\n\nLe pendant de l'affectation (`update_limited_serial`), et le préalable à un\nchangement de montre : un numéro réservé désigne un MODÈLE de la série. Tant\nqu'il reste accroché à la ligne, échanger la montre reviendrait à donner ce\nnuméro à un autre modèle sans que personne ne l'ait décidé.\n\nDeux origines possibles pour le numéro, traitées toutes les deux :\n  • une entrée du TABLEAU (`limited_entry_id`) → l'entrée repasse « disponible » ;\n  • un numéro saisi À LA MAIN sur la ligne (les BDC anciens en sont pleins) →\n    il n'y a rien à rendre au tableau, on le dit franchement plutôt que de\n    laisser croire que le tableau a été mis à jour.\n\nRéservé à la direction, comme l'affectation. Refuse si la montre existe\nvraiment (expédiée, facturée) : le numéro est alors définitivement à elle.","operationId":"release_limited_number_api_sales_orders__order_id__lines__line_id__release_limited_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}},{"name":"line_id","in":"path","required":true,"schema":{"type":"integer","title":"Line Id"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","default":{},"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/lines/{line_id}/swap-watch":{"post":{"tags":["sales-orders"],"summary":"Swap Watch","description":"Remplace la montre d'une ligne par un autre modèle du catalogue.\n\nRépercute en une fois : ligne du bon (specs, image, prix) → totaux → devis Odoo\nbrouillon → fiche de fabrication réécrite SOUS LE MÊME NUMÉRO → bracelet annulé\net redemandé → reste dû recalculé.\n\nBody :\n  - `ps_id` (int, requis) : produit catalogue de remplacement.\n  - `unit_price_ht` (float) : prix à porter sur la ligne (TVA FR incluse, comme\n    tout prix catalogue). Par défaut le prix catalogue du nouveau modèle.\n  - `wrist_size` (str) : nouveau tour de poignet. Par défaut celui de la ligne.\n  - `reason` (str) : motif, tracé partout (timeline, atelier, Slack).\n  - `force` (bool) : passer outre les blocages non financiers (admin seulement).","operationId":"swap_watch_api_sales_orders__order_id__lines__line_id__swap_watch_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}},{"name":"line_id","in":"path","required":true,"schema":{"type":"integer","title":"Line Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/ship":{"post":{"tags":["sales-orders"],"summary":"Ship Order","description":"Expédier une commande : saisie transporteur + tracking, email client, status → delivered.\n\nBDC mono-PROD ou sans PROD : marque le BDC delivered immédiatement (comportement historique).\nBDC multi-PROD : `production_order_ids` permet d'expédier un sous-ensemble. Le BDC ne passe\nen `delivered` que lorsque toutes ses PRODs ont été expédiées.","operationId":"ship_order_api_sales_orders__order_id__ship_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/aesthetic-qc/approve":{"post":{"tags":["sales-orders"],"summary":"Approve Aesthetic Qc","description":"Chrystèle/admin valide le Conformité commande — la commande est libérée pour expédition.\nArchive les PROD liées encore en stage 'qc_esthetique' (elles avaient attendu cette validation).","operationId":"approve_aesthetic_qc_api_sales_orders__order_id__aesthetic_qc_approve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/mark-ready-to-ship":{"post":{"tags":["sales-orders"],"summary":"Mark Ready To Ship","description":"Marque un BDC bracelet/accessoire (pas de Module Montage) comme prêt à expédier.","operationId":"mark_ready_to_ship_api_sales_orders__order_id__mark_ready_to_ship_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/aesthetic-qc/reject":{"post":{"tags":["sales-orders"],"summary":"Reject Aesthetic Qc","description":"Chrystèle/admin refuse le Conformité commande — la PROD ciblée retourne en Production\nchez l'horloger d'origine, en urgence, avec le motif affiché.\n\nSur un BDC multi-montres, `production_order_id` permet de cibler une PROD précise.\nSans id, la PROD la plus récente est réouverte (compatibilité mono-montre).","operationId":"reject_aesthetic_qc_api_sales_orders__order_id__aesthetic_qc_reject_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/deliver":{"post":{"tags":["sales-orders"],"summary":"Deliver Order","description":"Livraison en main propre — passe en delivered.\n\nPas d'email d'expédition (le client a la montre en main, un mail de tracking\nn'a pas de sens) — mais l'email de facture PDF est bien envoyé si une facture\nOdoo existe, comme pour `ship_order` (cf. incident BRM-2026 : 39 commandes\nlivrées en main propre n'avaient jamais reçu leur facture).\n\nBody JSON optionnel : {delivered_by, delivered_date} pour choisir le commercial\nqui a livré et la date (sinon utilisateur courant + maintenant).","operationId":"deliver_order_api_sales_orders__order_id__deliver_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/cancel":{"post":{"tags":["sales-orders"],"summary":"Cancel Order","operationId":"cancel_order_api_sales_orders__order_id__cancel_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}},{"name":"reason","in":"query","required":false,"schema":{"type":"string","default":"","title":"Reason"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/credit-note":{"post":{"tags":["sales-orders"],"summary":"Emit Credit Note","description":"Émet l'avoir manquant d'un bon déjà annulé.\n\nL'annulation n'interrompt jamais ses étapes suivantes quand l'avoir échoue —\nc'est voulu — mais le bon devient alors intouchable (`/cancel` refuse un bon\ndéjà annulé) et la facture reste vivante dans le registre des ventes : le\ncabinet voit une vente qui n'existe plus. Ce bouton rejoue cette seule étape.\n\nIdempotent : si l'avoir existe déjà dans Odoo, il est simplement rattaché.","operationId":"emit_credit_note_api_sales_orders__order_id__credit_note_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/refund-preview":{"get":{"tags":["sales-orders"],"summary":"Refund Preview","description":"Ce qui reste à rembourser au client, et par quel canal. Ne déclenche rien.","operationId":"refund_preview_api_sales_orders__order_id__refund_preview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/refund":{"post":{"tags":["sales-orders"],"summary":"Refund Order","description":"Rembourse le client sur son moyen de paiement d'origine.\n\nRéservé à la direction : c'est un mouvement d'argent sortant, pas une écriture\nde suivi. Le bon doit être annulé et son avoir émis au préalable — l'avoir est\nla pièce comptable qui justifie le décaissement.","operationId":"refund_order_api_sales_orders__order_id__refund_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/receipt-pdf":{"get":{"tags":["sales-orders"],"summary":"Receipt Pdf","description":"Génère un reçu de vente simplifié pour la comptabilité.","operationId":"receipt_pdf_api_sales_orders__order_id__receipt_pdf_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/receipts/list":{"get":{"tags":["sales-orders"],"summary":"List Receipts","description":"Liste tous les BDC avec paiement reçu, pour la vue reçus de vente compta.","operationId":"list_receipts_api_sales_orders_receipts_list_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"method","in":"query","required":false,"schema":{"type":"string","default":"","title":"Method"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/resend-invoice":{"post":{"tags":["sales-orders"],"summary":"Resend Invoice","description":"Renvoyer au client la facture du bon, avec copie à celui qui l'envoie.\n\nLa facture part toute seule à l'expédition et à la remise en main propre.\nMais un client dit « je ne l'ai pas reçue », une adresse change, un service\ncomptable la réclame des semaines plus tard — et il fallait alors aller la\nchercher dans Odoo et l'envoyer à la main, sans que le Hub en garde trace.\n\nLe renvoi est identique à l'envoi automatique : même PDF (celui d'Odoo, mis\nen cache), même email bilingue, même langue que le bon. Deux différences —\n**celui qui clique est en copie**, pour avoir la preuve de l'envoi dans sa\npropre boîte, et le renvoi est inscrit à l'historique du bon comme au\njournal des factures clients.\n\nLe destinataire reste l'adresse du bon : on ne saisit pas une adresse à la\nvolée dans un geste qui envoie un document comptable.","operationId":"resend_invoice_api_sales_orders__order_id__resend_invoice_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/send-receipt":{"post":{"tags":["sales-orders"],"summary":"Send Receipt Email","description":"Envoie le reçu de vente PDF par email à la comptabilité (COMPTA_RECU_EMAIL).","operationId":"send_receipt_email_api_sales_orders__order_id__send_receipt_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/watch-breakdown.pdf":{"get":{"tags":["sales-orders"],"summary":"Export Watch Breakdown Pdf","description":"La ventilation douanière américaine (Watch Sheet) seule.","operationId":"export_watch_breakdown_pdf_api_sales_orders__order_id__watch_breakdown_pdf_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/mot-cadeau.pdf":{"get":{"tags":["sales-orders"],"summary":"Export Mot Cadeau Pdf","description":"La feuille du mot cadeau seule, pour la réimprimer.","operationId":"export_mot_cadeau_pdf_api_sales_orders__order_id__mot_cadeau_pdf_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/pdf":{"get":{"tags":["sales-orders"],"summary":"Export Pdf","operationId":"export_pdf_api_sales_orders__order_id__pdf_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}},{"name":"token","in":"query","required":false,"schema":{"type":"string","title":"Token"}},{"name":"ancien","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Ancien"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/send-financing":{"post":{"tags":["sales-orders"],"summary":"Send Financing Request","description":"Crée un dossier de financement lié au BDC, envoie l'email au client, passe en pending_financing.","operationId":"send_financing_request_api_sales_orders__order_id__send_financing_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/send-to-client":{"post":{"tags":["sales-orders"],"summary":"Send Order To Client","description":"Envoie le bon de commande PDF par email au client.","operationId":"send_order_to_client_api_sales_orders__order_id__send_to_client_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/recap-preview":{"get":{"tags":["sales-orders"],"summary":"Preview Order Recap","description":"Aperçu HTML du récapitulatif — le commercial voit exactement ce que le\nclient recevra avant de cliquer Envoyer.","operationId":"preview_order_recap_api_sales_orders__order_id__recap_preview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/send-recap":{"post":{"tags":["sales-orders"],"summary":"Send Order Recap","description":"Envoie au client le récapitulatif global de sa commande.","operationId":"send_order_recap_api_sales_orders__order_id__send_recap_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecapSend"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/catalogue-image/{ps_id}":{"get":{"tags":["sales-orders"],"summary":"Get Catalogue Image","description":"Sert le visuel d'un produit, avec cache disque permanent.\n\nLe webservice PrestaShop et les adresses `brm-chronographes.com/img/p/…`\nsont morts depuis la bascule du domaine sur le VPS (21/09/2026) : les\noctets viennent du cache, puis de l'archive de la boutique.","operationId":"get_catalogue_image_api_sales_orders_catalogue_image__ps_id__get","parameters":[{"name":"ps_id","in":"path","required":true,"schema":{"type":"integer","title":"Ps Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/catalogue-image/{ps_id}/{image_id}":{"get":{"tags":["sales-orders"],"summary":"Get Catalogue Combination Image","description":"Le visuel d'une déclinaison, avec repli sur celui du produit.","operationId":"get_catalogue_combination_image_api_sales_orders_catalogue_image__ps_id___image_id__get","parameters":[{"name":"ps_id","in":"path","required":true,"schema":{"type":"integer","title":"Ps Id"}},{"name":"image_id","in":"path","required":true,"schema":{"type":"integer","title":"Image Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/configurator-options/{collection_id}":{"get":{"tags":["sales-orders"],"summary":"Get Configurator Options","description":"Retourne les options disponibles pour une collection (sans auth - données publiques).","operationId":"get_configurator_options_api_sales_orders_configurator_options__collection_id__get","parameters":[{"name":"collection_id","in":"path","required":true,"schema":{"type":"string","title":"Collection Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/lines/{line_id}/photo":{"post":{"tags":["sales-orders"],"summary":"Upload Line Photo","operationId":"upload_line_photo_api_sales_orders__order_id__lines__line_id__photo_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}},{"name":"line_id","in":"path","required":true,"schema":{"type":"integer","title":"Line Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_line_photo_api_sales_orders__order_id__lines__line_id__photo_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["sales-orders"],"summary":"Delete Line Photo","operationId":"delete_line_photo_api_sales_orders__order_id__lines__line_id__photo_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}},{"name":"line_id","in":"path","required":true,"schema":{"type":"integer","title":"Line Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/public/track/{token}":{"get":{"tags":["sales-orders"],"summary":"Public Track Order","description":"Suivi client public d'une commande via token (sans auth).","operationId":"public_track_order_api_sales_orders_public_track__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/public/track/{token}/invoice":{"get":{"tags":["sales-orders"],"summary":"Public Track Invoice","description":"Télécharge le PDF de la facture (si disponible) via le token public.","operationId":"public_track_invoice_api_sales_orders_public_track__token__invoice_get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/public/track/{token}/devis":{"get":{"tags":["sales-orders"],"summary":"Public Track Devis","description":"Télécharge le PDF du devis Odoo (si disponible) via le token public.","operationId":"public_track_devis_api_sales_orders_public_track__token__devis_get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales-orders/{order_id}/tracking-link":{"get":{"tags":["sales-orders"],"summary":"Get Tracking Link","description":"Renvoie (en créant si besoin) le lien de suivi public du BDC — pour le bouton\n'Copier le lien de suivi' du détail.","operationId":"get_tracking_link_api_sales_orders__order_id__tracking_link_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bracelet-requests":{"get":{"tags":["bracelet-requests"],"summary":"List Requests","description":"Liste les demandes de bracelets.\n\nDeux formes de réponse, pour ne casser aucun appelant existant :\n  • sans `limit`  → tableau JSON brut (comportement historique) ;\n  • avec `limit`  → {items, total, limit, offset, counts} — pagination serveur.\n\n`status` et `search` s'appliquent TOUJOURS à l'ensemble des demandes (le\nfiltrage est fait en SQL, avant la découpe en pages) ; `counts` renvoie les\ncompteurs globaux pour les onglets, indépendamment de la page affichée.\n`focus_id` : renvoie automatiquement la page qui contient cette demande\n(deep-link depuis un BDC), sauf si un `offset` explicite est fourni.","operationId":"list_requests_api_bracelet_requests_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"focus_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Focus Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["bracelet-requests"],"summary":"Create Manual Request","description":"Crée une demande de bracelet MANUELLE (hors BDC / hors production).\nChamps : bracelet_label (requis), bracelet_description, client, wrist_size,\nsales_order_id (optionnel — pour rattacher à un BDC existant).","operationId":"create_manual_request_api_bracelet_requests_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bracelet-requests/by-bdc/{order_id}":{"get":{"tags":["bracelet-requests"],"summary":"List For Bdc","operationId":"list_for_bdc_api_bracelet_requests_by_bdc__order_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bracelet-requests/{rid}/prefill/{supplier}":{"get":{"tags":["bracelet-requests"],"summary":"Prefill For Supplier","description":"Retourne les champs pré-remplis pour créer une commande LIC ou Fleurus\nà partir d'une demande de bracelet. La réponse est consommée par les pages\nLic.jsx / Fleurus.jsx pour ouvrir le formulaire de création.","operationId":"prefill_for_supplier_api_bracelet_requests__rid__prefill__supplier__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"integer","title":"Rid"}},{"name":"supplier","in":"path","required":true,"schema":{"type":"string","title":"Supplier"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bracelet-requests/{rid}":{"put":{"tags":["bracelet-requests"],"summary":"Update Request","operationId":"update_request_api_bracelet_requests__rid__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"integer","title":"Rid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["bracelet-requests"],"summary":"Delete Request","operationId":"delete_request_api_bracelet_requests__rid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"integer","title":"Rid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/distributeurs/moi":{"get":{"tags":["distributeurs"],"summary":"Moi","description":"Le profil du distributeur : boutique, langue, devise, remise, régime.","operationId":"moi_api_distributeurs_moi_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"boutique_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Boutique consultée (comptes BRM seulement)","title":"Boutique Id"},"description":"Boutique consultée (comptes BRM seulement)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/distributeurs/catalogue":{"get":{"tags":["distributeurs"],"summary":"Lister","description":"Les produits, filtrés et paginés, avec les prix de la boutique.","operationId":"lister_api_distributeurs_catalogue_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Q"}},{"name":"collection","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Collection"}},{"name":"univers","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Univers"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":5},{"type":"null"}],"title":"Lang"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":1,"title":"Page"}},{"name":"par_page","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":48,"title":"Par Page"}},{"name":"boutique_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Boutique consultée (comptes BRM seulement)","title":"Boutique Id"},"description":"Boutique consultée (comptes BRM seulement)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/distributeurs/catalogue/{psid}":{"get":{"tags":["distributeurs"],"summary":"Detail","description":"Un produit complet (fiche technique, tous les visuels) avec les prix de la boutique.","operationId":"detail_api_distributeurs_catalogue__psid__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"psid","in":"path","required":true,"schema":{"type":"string","title":"Psid"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":5},{"type":"null"}],"title":"Lang"}},{"name":"boutique_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Boutique consultée (comptes BRM seulement)","title":"Boutique Id"},"description":"Boutique consultée (comptes BRM seulement)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/distributeurs/image":{"get":{"tags":["Distributeurs — médias"],"summary":"Image","operationId":"image_api_distributeurs_image_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"src","in":"query","required":true,"schema":{"type":"string","maxLength":500,"title":"Src"}},{"name":"taille","in":"query","required":false,"schema":{"type":"string","default":"apercu","title":"Taille"}},{"name":"psid","in":"query","required":false,"schema":{"type":"string","maxLength":40,"default":"","title":"Psid"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","default":"jpg","title":"Format"}},{"name":"telecharger","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Telecharger"}},{"name":"boutique_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Boutique consultée (comptes BRM seulement)","title":"Boutique Id"},"description":"Boutique consultée (comptes BRM seulement)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/distributeurs/medias/{psid}.zip":{"get":{"tags":["Distributeurs — médias"],"summary":"Medias Zip","operationId":"medias_zip_api_distributeurs_medias__psid__zip_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"psid","in":"path","required":true,"schema":{"type":"string","title":"Psid"}},{"name":"langue","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Langue"}},{"name":"boutique_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Boutique consultée (comptes BRM seulement)","title":"Boutique Id"},"description":"Boutique consultée (comptes BRM seulement)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/distributeurs/medias/{psid}":{"get":{"tags":["Distributeurs — médias"],"summary":"Medias","operationId":"medias_api_distributeurs_medias__psid__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"psid","in":"path","required":true,"schema":{"type":"string","title":"Psid"}},{"name":"langue","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Langue"}},{"name":"boutique_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Boutique consultée (comptes BRM seulement)","title":"Boutique Id"},"description":"Boutique consultée (comptes BRM seulement)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/distributeurs/fiche/{psid}.pdf":{"get":{"tags":["Distributeurs — médias"],"summary":"Fiche","operationId":"fiche_api_distributeurs_fiche__psid__pdf_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"psid","in":"path","required":true,"schema":{"type":"string","title":"Psid"}},{"name":"langue","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Langue"}},{"name":"prix","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Prix"}},{"name":"boutique_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Boutique consultée (comptes BRM seulement)","title":"Boutique Id"},"description":"Boutique consultée (comptes BRM seulement)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/my-sales/":{"get":{"tags":["my-sales"],"summary":"List My Invoices","description":"Factures Odoo du mois, filtrées par équipe commerciale.","operationId":"list_my_invoices_api_my_sales__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"month","in":"query","required":false,"schema":{"type":"integer","title":"Month"}},{"name":"year","in":"query","required":false,"schema":{"type":"integer","title":"Year"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cms-pendules/modeles":{"get":{"tags":["cms-pendules"],"summary":"Liste Modeles","description":"La gamme, dans l'ordre du site, avec de quoi peupler le menu de gauche.","operationId":"liste_modeles_api_cms_pendules_modeles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/cms-pendules/page/{modele}":{"get":{"tags":["cms-pendules"],"summary":"Lire Page","operationId":"lire_page_api_cms_pendules_page__modele__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"modele","in":"path","required":true,"schema":{"type":"string","title":"Modele"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["cms-pendules"],"summary":"Ecrire Page","operationId":"ecrire_page_api_cms_pendules_page__modele__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"modele","in":"path","required":true,"schema":{"type":"string","title":"Modele"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cms-pendules/visuels/{modele}":{"get":{"tags":["cms-pendules"],"summary":"Lire Visuels","operationId":"lire_visuels_api_cms_pendules_visuels__modele__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"modele","in":"path","required":true,"schema":{"type":"string","title":"Modele"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cms-pendules/visuels":{"post":{"tags":["cms-pendules"],"summary":"Remplacer Visuel","description":"Remplace une image existante. On ne crée pas de teinte depuis ici : une\nteinte nouvelle demande un bouton, un prix et une référence, c'est une\nmodification de la page, pas un envoi de fichier.","operationId":"remplacer_visuel_api_cms_pendules_visuels_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_remplacer_visuel_api_cms_pendules_visuels_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/cms-pendules/livraisons":{"get":{"tags":["cms-pendules"],"summary":"Lire Livraisons","operationId":"lire_livraisons_api_cms_pendules_livraisons_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["cms-pendules"],"summary":"Ecrire Livraisons","operationId":"ecrire_livraisons_api_cms_pendules_livraisons_put","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/cms-pendules/versions":{"get":{"tags":["cms-pendules"],"summary":"Liste Versions","operationId":"liste_versions_api_cms_pendules_versions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/cms-pendules/versions/{version_id}/restaurer":{"post":{"tags":["cms-pendules"],"summary":"Restaurer Version","operationId":"restaurer_version_api_cms_pendules_versions__version_id__restaurer_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"string","title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site-cms/etat":{"get":{"tags":["site-cms"],"summary":"Etat","description":"Combien de pages, remplies dans quelles langues, et le menu est-il amorcé.","operationId":"etat_api_site_cms_etat_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/site-cms/pages":{"get":{"tags":["site-cms"],"summary":"Pages Liste","description":"Les 21 pages CMS, avec les langues réellement remplies pour chacune.","operationId":"pages_liste_api_site_cms_pages_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/site-cms/pages/{page_id}":{"get":{"tags":["site-cms"],"summary":"Page Lire","description":"Une page dans les douze langues (ou seulement celles demandées).","operationId":"page_lire_api_site_cms_pages__page_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"integer","title":"Page Id"}},{"name":"langues","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Langues"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["site-cms"],"summary":"Page Ecrire","description":"Enregistre une ou plusieurs langues. Pose `origine = 'hub'` : plus aucune\nresynchronisation depuis PrestaShop ne pourra écraser la page.","operationId":"page_ecrire_api_site_cms_pages__page_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"integer","title":"Page Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site-cms/visuels":{"get":{"tags":["site-cms"],"summary":"Visuels Bibliotheque","description":"Les visuels CMS que l'archive de la boutique détient réellement.","operationId":"visuels_bibliotheque_api_site_cms_visuels_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["site-cms"],"summary":"Visuel Deposer","description":"Dépose une image dans l'archive, sous un nom fabriqué par le serveur.\n\nL'archive est un volume Docker : c'est le seul endroit où une image survit\nà une reconstruction de l'image du conteneur.","operationId":"visuel_deposer_api_site_cms_visuels_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_visuel_deposer_api_site_cms_visuels_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/site-cms/pages/{page_id}/visuel":{"post":{"tags":["site-cms"],"summary":"Visuel Remplacer","description":"Échange une adresse d'image contre une autre dans le contenu de la page.","operationId":"visuel_remplacer_api_site_cms_pages__page_id__visuel_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"integer","title":"Page Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site-cms/menu":{"get":{"tags":["site-cms"],"summary":"Menu Lire","description":"Le menu, à plat et ordonné : chaque parent suivi de ses enfants.","operationId":"menu_lire_api_site_cms_menu_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["site-cms"],"summary":"Menu Ecrire","description":"Enregistre l'arbre entier : ordre, parenté, libellés, cibles, visibilité.","operationId":"menu_ecrire_api_site_cms_menu_put","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/site-cms/menu/amorcer":{"post":{"tags":["site-cms"],"summary":"Menu Amorcer","description":"Descend en base le menu que le site engendre aujourd'hui.\n\nRejouable : une entrée déjà corrigée au Hub n'est pas réécrite, sauf\n`forcer=true` — qui archive l'état courant avant de tout remettre.","operationId":"menu_amorcer_api_site_cms_menu_amorcer_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"forcer","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Forcer"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site-cms/menu/entree":{"post":{"tags":["site-cms"],"summary":"Menu Creer","description":"Une entrée neuve, née au Hub — elle n'existe pas dans le site engendré.","operationId":"menu_creer_api_site_cms_menu_entree_post","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/site-cms/menu/entree/{entree_id}":{"delete":{"tags":["site-cms"],"summary":"Menu Supprimer","description":"Retire une entrée et ses enfants. Archivé, donc réversible.","operationId":"menu_supprimer_api_site_cms_menu_entree__entree_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entree_id","in":"path","required":true,"schema":{"type":"integer","title":"Entree Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site-cms/versions":{"get":{"tags":["site-cms"],"summary":"Versions","description":"L'historique. Chaque enregistrement archive l'état qu'il remplace.","operationId":"versions_api_site_cms_versions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cible","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(page|menu)$"},{"type":"null"}],"title":"Cible"}},{"name":"cible_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cible Id"}},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":80,"title":"Limite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site-cms/versions/{version_id}/restaurer":{"post":{"tags":["site-cms"],"summary":"Restaurer","description":"Remet l'état d'avant. L'état courant est archivé : c'est réversible.","operationId":"restaurer_api_site_cms_versions__version_id__restaurer_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"integer","title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stand-ww/photos":{"get":{"tags":["stand-ww"],"summary":"Liste Photos","operationId":"liste_photos_api_stand_ww_photos_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"edition","in":"query","required":false,"schema":{"type":"string","default":"2027","title":"Edition"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["stand-ww"],"summary":"Deposer Photo","description":"Dépose une photo du plan papier, ou toute autre référence visuelle.","operationId":"deposer_photo_api_stand_ww_photos_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_deposer_photo_api_stand_ww_photos_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stand-ww/photos/{photo_id}":{"patch":{"tags":["stand-ww"],"summary":"Legender","operationId":"legender_api_stand_ww_photos__photo_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"photo_id","in":"path","required":true,"schema":{"type":"integer","title":"Photo Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["stand-ww"],"summary":"Supprimer Photo","operationId":"supprimer_photo_api_stand_ww_photos__photo_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"photo_id","in":"path","required":true,"schema":{"type":"integer","title":"Photo Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stand-ww/versions":{"get":{"tags":["stand-ww"],"summary":"Liste Versions","description":"Les versions gardées, la plus récente d'abord.","operationId":"liste_versions_api_stand_ww_versions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"edition","in":"query","required":false,"schema":{"type":"string","default":"2027","title":"Edition"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["stand-ww"],"summary":"Garder Version","description":"Fige le plan courant sous un nom, pour pouvoir y revenir.","operationId":"garder_version_api_stand_ww_versions_post","security":[{"HTTPBearer":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stand-ww/versions/{version_id}/restaurer":{"post":{"tags":["stand-ww"],"summary":"Restaurer Version","description":"Remet cette version en plan courant.\n\nLe plan courant est archivé au passage : revenir en arrière ne doit jamais\nêtre le geste qui fait perdre quelque chose.","operationId":"restaurer_version_api_stand_ww_versions__version_id__restaurer_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"integer","title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stand-ww/propositions":{"get":{"tags":["stand-ww"],"summary":"Liste Propositions","description":"Les plans existants. Une proposition = une disposition complète du stand.","operationId":"liste_propositions_api_stand_ww_propositions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["stand-ww"],"summary":"Dupliquer Proposition","description":"Duplique un plan sous une nouvelle clé, pour travailler une autre idée.\n\nLa cible n'est JAMAIS écrasée : si elle existe déjà, on refuse plutôt que de\nfaire disparaître un plan qu'on avait dessiné hier. Pour repartir de zéro sur\nune proposition existante, on l'ouvre et on la modifie — ses versions sont là.","operationId":"dupliquer_proposition_api_stand_ww_propositions_post","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/stand-ww/plan":{"get":{"tags":["stand-ww"],"summary":"Lire Plan","description":"Le plan courant. Tant qu'il n'existe pas, on renvoie un document vide :\nc'est la page qui décide quoi en faire, pas le serveur.","operationId":"lire_plan_api_stand_ww_plan_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"edition","in":"query","required":false,"schema":{"type":"string","default":"2027","title":"Edition"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["stand-ww"],"summary":"Ecrire Plan","description":"Enregistre le plan. La version précédente est gardée : un plan de stand\nse discute, donc il doit pouvoir se défaire.","operationId":"ecrire_plan_api_stand_ww_plan_put","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pendules-uniques":{"get":{"tags":["pendules-uniques"],"summary":"Lister","description":"Toutes les pièces (administration). Un commercial voit la même liste : le\nstock de pièces uniques n'a rien de confidentiel, c'est son argumentaire.","operationId":"lister_api_pendules_uniques_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"statut","in":"query","required":false,"schema":{"type":"string","default":"","title":"Statut"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["pendules-uniques"],"summary":"Creer","description":"Crée une pièce unique, au brouillon : elle n'est pas vendable tant que\nquelqu'un ne l'a pas publiée, photos et prix vérifiés.","operationId":"creer_api_pendules_uniques_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PieceCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pendules-uniques/disponibles":{"get":{"tags":["pendules-uniques"],"summary":"Disponibles","description":"Les pièces réellement vendables, pour le sélecteur du bon de commande.","operationId":"disponibles_api_pendules_uniques_disponibles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/pendules-uniques/{piece_id}":{"put":{"tags":["pendules-uniques"],"summary":"Modifier","description":"Modifie une pièce. Une pièce VENDUE ne se modifie plus : son libellé et\nson prix sont sur une facture.","operationId":"modifier_api_pendules_uniques__piece_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"piece_id","in":"path","required":true,"schema":{"type":"integer","title":"Piece Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["pendules-uniques"],"summary":"Supprimer","description":"Supprime une pièce. Refusé dès qu'elle est engagée sur un bon : sa\nréférence figure alors sur une ligne, et parfois sur un devis.","operationId":"supprimer_api_pendules_uniques__piece_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"piece_id","in":"path","required":true,"schema":{"type":"integer","title":"Piece Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pendules-uniques/{piece_id}/statut":{"post":{"tags":["pendules-uniques"],"summary":"Changer Statut","description":"Publier (`en_vente`) ou retirer (`brouillon`) une pièce.\n\nSeules ces deux transitions se pilotent à la main. `reservee` et `vendue`\nsont posées par le bon de commande : les décréter ici mentirait sur l'état\nréel — une pièce « vendue » sans facture, ou « en vente » alors qu'elle est\nsur un bon en cours.","operationId":"changer_statut_api_pendules_uniques__piece_id__statut_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"piece_id","in":"path","required":true,"schema":{"type":"integer","title":"Piece Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pendules-uniques/{piece_id}/photos":{"post":{"tags":["pendules-uniques"],"summary":"Ajouter Photo","description":"Ajoute une photo. Contrôles : type MIME réel, taille, nom de fichier\nrégénéré en UUID (le nom d'origine ne sert jamais de chemin).","operationId":"ajouter_photo_api_pendules_uniques__piece_id__photos_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"piece_id","in":"path","required":true,"schema":{"type":"integer","title":"Piece Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_ajouter_photo_api_pendules_uniques__piece_id__photos_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["pendules-uniques"],"summary":"Retirer Photo","description":"Retire une photo de la fiche. `path` doit être l'un des chemins déjà\nenregistrés : on ne construit jamais un chemin à partir de ce qui arrive.","operationId":"retirer_photo_api_pendules_uniques__piece_id__photos_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"piece_id","in":"path","required":true,"schema":{"type":"integer","title":"Piece Id"}},{"name":"path","in":"query","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/configurateur/modeles":{"get":{"tags":["configurateur"],"summary":"Liste Modeles","description":"Les modèles configurables, avec leur prix de base.","operationId":"liste_modeles_api_configurateur_modeles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/configurateur/modeles/{modele}/options":{"get":{"tags":["configurateur"],"summary":"Options Modele","description":"Le catalogue d'options d'un modèle : composants, références, suppléments.","operationId":"options_modele_api_configurateur_modeles__modele__options_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"modele","in":"path","required":true,"schema":{"type":"string","title":"Modele"}},{"name":"langue","in":"query","required":false,"schema":{"type":"string","maxLength":5,"default":"fr","title":"Langue"}},{"name":"composant","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Composant"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/configurateur/design":{"post":{"tags":["configurateur"],"summary":"Design","description":"Chiffre une configuration et en compose l'image.\n\nLes options se donnent par leur référence (`V6SA-B-N`) ; celles qu'on ne\nprécise pas gardent la valeur d'origine du modèle. Le rendu peut prendre une\nou deux secondes la première fois — le temps de télécharger les calques —\npuis il est servi depuis le cache.","operationId":"design_api_configurateur_design_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DesignEntrant"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/configurateur/references-manquantes":{"get":{"tags":["configurateur"],"summary":"References Manquantes","description":"Les options dont la référence commerciale reste inconnue.\n\nCes options sont proposables et dessinables, mais partent sans référence sur\nle bon de commande — l'atelier lit alors le libellé seul. La liste se comble\nd'elle-même à mesure que des configurations les emploient sur la boutique.","operationId":"references_manquantes_api_configurateur_references_manquantes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/configurateur/references":{"post":{"tags":["configurateur"],"summary":"Poser References","description":"Renseigne à la main des références commerciales que l'apprentissage n'a\npas trouvées — typiquement après une lecture du back-office.","operationId":"poser_references_api_configurateur_references_post","requestBody":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ReferenceCommerciale"},"type":"array","title":"Corps"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/configurateur/proposer-references":{"post":{"tags":["configurateur"],"summary":"Proposer References","description":"Déduit les références commerciales manquantes et les enregistre comme\npropositions — visibles, corrigeables, mais jamais envoyées sur un bon.","operationId":"proposer_references_api_configurateur_proposer_references_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/configurateur/controle-propositions":{"get":{"tags":["configurateur"],"summary":"Controle Propositions","description":"Justesse de la déduction, mesurée sur les références déjà connues.","operationId":"controle_propositions_api_configurateur_controle_propositions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/configurateur/valider-propositions":{"post":{"tags":["configurateur"],"summary":"Valider Propositions","description":"Confirme les références déduites : elles deviennent utilisables sur un bon\nde commande, et survivent aux synchronisations hebdomadaires.","operationId":"valider_propositions_api_configurateur_valider_propositions_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/configurateur/apparier-references":{"post":{"tags":["configurateur"],"summary":"Apparier References","description":"Relit les configurations enregistrées sur la boutique pour (ré)apprendre\nles références commerciales des options.","operationId":"apparier_references_api_configurateur_apparier_references_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/configurateur/recenser-commandes":{"post":{"tags":["configurateur"],"summary":"Recenser Commandes","description":"Relève les configurations qui ont donné lieu à une commande — boutique en\nligne et bons de commande du Hub. C'est ce qui permet de dire à un client que\nsa montre n'a jamais été assemblée, et de ne le dire que si c'est vrai.","operationId":"recenser_commandes_api_configurateur_recenser_commandes_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/configurateur/designs":{"get":{"tags":["configurateur"],"summary":"Designs Proposes","description":"Les montres dessinées par le conseiller, et ce qu'elles sont devenues.\n\nSans cette vue, personne ne sait ce que l'agent propose : quels modèles,\nà quels budgets, combien de fois, et combien finissent en commande. C'est la\nseule façon de savoir si ce qu'on a construit vend.","operationId":"designs_proposes_api_configurateur_designs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"jours","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Jours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/configurateur/sync":{"post":{"tags":["configurateur"],"summary":"Synchroniser","description":"Recharge le catalogue d'options depuis le configurateur (≈ 30 secondes).\n\nRefusée quand le Hub est maître : elle vide et réécrit les tables, elle\neffacerait ce qui a été saisi au back-office. `force=true` passe outre.","operationId":"synchroniser_api_configurateur_sync_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"force","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Slugs"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent/v1/models":{"get":{"tags":["agent-configurator"],"summary":"List configurable models","operationId":"route_modeles_api_agent_v1_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/agent/v1/models/{model_id}":{"get":{"tags":["agent-configurator"],"summary":"Describe a model: components, options, constraints","operationId":"route_modele_api_agent_v1_models__model_id__get","parameters":[{"name":"model_id","in":"path","required":true,"schema":{"type":"string","title":"Model Id"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","maxLength":5,"default":"en","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent/v1/configurations/validate":{"post":{"tags":["agent-configurator"],"summary":"Validate a configuration","operationId":"route_valider_api_agent_v1_configurations_validate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemandeValidation"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent/v1/configurations/quote":{"post":{"tags":["agent-configurator"],"summary":"Price a configuration for a delivery country","operationId":"route_chiffrer_api_agent_v1_configurations_quote_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemandeChiffrage"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent/v1/configurations/render":{"post":{"tags":["agent-configurator"],"summary":"Render the watch image","operationId":"route_rendre_api_agent_v1_configurations_render_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemandeRendu"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent/v1/configurations/share":{"post":{"tags":["agent-configurator"],"summary":"Create a shareable deep link","operationId":"route_partager_api_agent_v1_configurations_share_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemandePartage"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent/v1/requests":{"post":{"tags":["agent-configurator"],"summary":"Request an appointment, a quote or a special request","operationId":"route_demande_api_agent_v1_requests_post","parameters":[{"name":"idempotency-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemandeContact"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent/v1/orders":{"post":{"tags":["agent-orders"],"summary":"Prepare an order the customer must confirm by email","operationId":"route_creer_api_agent_v1_orders_post","parameters":[{"name":"idempotency-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemandeCommande"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent/v1/orders/by-idempotency-key":{"get":{"tags":["agent-orders"],"summary":"Order status from the Idempotency-Key","operationId":"route_etat_par_cle_api_agent_v1_orders_by_idempotency_key_get","parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","maxLength":80,"title":"Idempotency-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent/v1/orders/{order_id}":{"get":{"tags":["agent-orders"],"summary":"Order status (no customer data)","operationId":"route_etat_api_agent_v1_orders__order_id__get","parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"string","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/configurateur/admin/etat":{"get":{"tags":["configurateur-admin"],"summary":"Etat","description":"Qui fait foi, combien d'options, et ce qui a bougé récemment.","operationId":"etat_api_configurateur_admin_etat_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/configurateur/admin/maitre":{"post":{"tags":["configurateur-admin"],"summary":"Basculer Maitre","description":"Bascule la source de vérité. C'est le geste qui coupe la synchronisation.","operationId":"basculer_maitre_api_configurateur_admin_maitre_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"vers","in":"query","required":true,"schema":{"type":"string","pattern":"^(hub|agence)$","title":"Vers"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/configurateur/admin/langues":{"put":{"tags":["configurateur-admin"],"summary":"Poser Langues","operationId":"poser_langues_api_configurateur_admin_langues_put","requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array","title":"Codes"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/configurateur/admin/modeles":{"get":{"tags":["configurateur-admin"],"summary":"Liste Modeles","operationId":"liste_modeles_api_configurateur_admin_modeles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["configurateur-admin"],"summary":"Creer Modele","operationId":"creer_modele_api_configurateur_admin_modeles_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModeleEntrant"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/configurateur/admin/modeles/{slug}":{"put":{"tags":["configurateur-admin"],"summary":"Modifier Modele","operationId":"modifier_modele_api_configurateur_admin_modeles__slug__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModeleEntrant"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["configurateur-admin"],"summary":"Retirer Modele","description":"Par défaut on désactive : un modèle supprimé emporterait ses designs.","operationId":"retirer_modele_api_configurateur_admin_modeles__slug__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"definitif","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Definitif"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/configurateur/admin/modeles/{slug}/arbre":{"get":{"tags":["configurateur-admin"],"summary":"Arbre","description":"Le modèle, ses composants et leurs éléments — tout ce qu'édite la page.","operationId":"arbre_api_configurateur_admin_modeles__slug__arbre_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/configurateur/admin/categories":{"post":{"tags":["configurateur-admin"],"summary":"Creer Categorie","operationId":"creer_categorie_api_configurateur_admin_categories_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__configurateur_admin__CategorieEntrante"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/configurateur/admin/categories/{slug}/{cat_id}":{"put":{"tags":["configurateur-admin"],"summary":"Modifier Categorie","operationId":"modifier_categorie_api_configurateur_admin_categories__slug___cat_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"cat_id","in":"path","required":true,"schema":{"type":"string","title":"Cat Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__configurateur_admin__CategorieEntrante"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["configurateur-admin"],"summary":"Retirer Categorie","operationId":"retirer_categorie_api_configurateur_admin_categories__slug___cat_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"cat_id","in":"path","required":true,"schema":{"type":"string","title":"Cat Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/configurateur/admin/elements":{"post":{"tags":["configurateur-admin"],"summary":"Creer Element","operationId":"creer_element_api_configurateur_admin_elements_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ElementEntrant"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/configurateur/admin/elements/{slug}/{element_id}":{"put":{"tags":["configurateur-admin"],"summary":"Modifier Element","operationId":"modifier_element_api_configurateur_admin_elements__slug___element_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"element_id","in":"path","required":true,"schema":{"type":"integer","title":"Element Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ElementEntrant"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["configurateur-admin"],"summary":"Retirer Element","description":"Supprime l'élément, et promeut un remplaçant s'il était le choix d'ouverture.","operationId":"retirer_element_api_configurateur_admin_elements__slug___element_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"element_id","in":"path","required":true,"schema":{"type":"integer","title":"Element Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/configurateur/admin/reordonner":{"post":{"tags":["configurateur-admin"],"summary":"Reordonner","operationId":"reordonner_api_configurateur_admin_reordonner_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__configurateur_admin__Reordonnancement"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/configurateur/admin/elements/{slug}/{element_id}/vignette":{"post":{"tags":["configurateur-admin"],"summary":"Poser Vignette","description":"La vignette de l'option — celle que le client voit dans la liste des choix.","operationId":"poser_vignette_api_configurateur_admin_elements__slug___element_id__vignette_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"element_id","in":"path","required":true,"schema":{"type":"integer","title":"Element Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_poser_vignette_api_configurateur_admin_elements__slug___element_id__vignette_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/configurateur/admin/elements/{slug}/{element_id}/calques":{"post":{"tags":["configurateur-admin"],"summary":"Poser Calques","description":"Les images de rotation de l'option.\n\nLe rendu empile, pour une vue donnée, un fichier `<base>_<vue sur 3 chiffres>.png`\npar élément retenu. Trente vues au complet permettent de faire tourner la\nmontre ; une seule suffit pour la vue d'ouverture, et le rendu se contente de\nce qu'il trouve — un calque absent est ignoré, il ne casse rien.","operationId":"poser_calques_api_configurateur_admin_elements__slug___element_id__calques_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"element_id","in":"path","required":true,"schema":{"type":"integer","title":"Element Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_poser_calques_api_configurateur_admin_elements__slug___element_id__calques_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/configurateur/admin/calques/etat":{"get":{"tags":["configurateur-admin"],"summary":"Calques Etat","description":"Où vivent les calques, et où en est le rapatriement s'il tourne.","operationId":"calques_etat_api_configurateur_admin_calques_etat_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/configurateur/admin/calques/rapatrier":{"post":{"tags":["configurateur-admin"],"summary":"Rapatrier","description":"Lance le rapatriement en tâche de fond.\n\nLe travail dure une heure ou deux et pèse quelques gigaoctets : il ne peut\npas tenir dans une requête HTTP. Il tourne donc dans un fil, avec sa propre\nsession de base, et rend compte dans `configurateur_reglages`.","operationId":"rapatrier_api_configurateur_admin_calques_rapatrier_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slugs","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Slugs"}},{"name":"vues","in":"query","required":false,"schema":{"type":"integer","maximum":30,"minimum":1,"default":30,"title":"Vues"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/configurateur/admin/calques/vignettes":{"post":{"tags":["configurateur-admin"],"summary":"Rapatrier Vignettes","description":"Rapatrie les vignettes des options. Quelques dizaines de Mo : pas besoin\nde tâche de fond, la requête tient.","operationId":"rapatrier_vignettes_api_configurateur_admin_calques_vignettes_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/configurateur/admin/apercu/{slug}":{"get":{"tags":["configurateur-admin"],"summary":"Apercu","description":"La montre telle qu'elle s'ouvrira, avec le catalogue tel qu'il est là.","operationId":"apercu_api_configurateur_admin_apercu__slug__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"options","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":800},{"type":"null"}],"title":"Options"}},{"name":"vue","in":"query","required":false,"schema":{"type":"integer","maximum":29,"minimum":0,"default":0,"title":"Vue"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/configurateur/admin/journal":{"get":{"tags":["configurateur-admin"],"summary":"Journal","operationId":"journal_api_configurateur_admin_journal_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":80,"title":"Limite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/configurateur/admin/perso/etat":{"get":{"tags":["configurateur-admin"],"summary":"Perso Etat","description":"Toutes les zones de tous les modèles + le support (cadran | verre) de\nchaque élément de cadran, à faire valider.","operationId":"perso_etat_api_configurateur_admin_perso_etat_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/configurateur/admin/perso/{slug}/{zone}":{"get":{"tags":["configurateur-admin"],"summary":"Perso Zone","operationId":"perso_zone_api_configurateur_admin_perso__slug___zone__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"zone","in":"path","required":true,"schema":{"type":"string","pattern":"^(cadran|verre|couronne)$","title":"Zone"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/configurateur/admin/perso/{slug}/{zone}/apercu.jpg":{"get":{"tags":["configurateur-admin"],"summary":"Perso Apercu","operationId":"perso_apercu_api_configurateur_admin_perso__slug___zone__apercu_jpg_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"zone","in":"path","required":true,"schema":{"type":"string","pattern":"^(cadran|verre|couronne)$","title":"Zone"}},{"name":"vue","in":"query","required":false,"schema":{"type":"integer","maximum":29,"minimum":0,"default":27,"title":"Vue"}},{"name":"source","in":"query","required":false,"schema":{"type":"string","pattern":"^(mire|logo|initiales)$","default":"mire","title":"Source"}},{"name":"jeton","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Jeton"}},{"name":"initiales","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":3},{"type":"null"}],"title":"Initiales"}},{"name":"cadran","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":9999999,"minimum":1},{"type":"null"}],"title":"Cadran"}},{"name":"options","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":800},{"type":"null"}],"title":"Options"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/configurateur/admin/perso/{slug}/{zone}/params":{"post":{"tags":["configurateur-admin"],"summary":"Perso Params","operationId":"perso_params_api_configurateur_admin_perso__slug___zone__params_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"zone","in":"path","required":true,"schema":{"type":"string","pattern":"^(cadran|verre|couronne)$","title":"Zone"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersoParams"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/configurateur/admin/perso/{slug}/{zone}/vues/{vue}":{"post":{"tags":["configurateur-admin"],"summary":"Perso Vue","operationId":"perso_vue_api_configurateur_admin_perso__slug___zone__vues__vue__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"vue","in":"path","required":true,"schema":{"type":"integer","maximum":29,"minimum":0,"title":"Vue"}},{"name":"zone","in":"path","required":true,"schema":{"type":"string","pattern":"^(cadran|verre|couronne)$","title":"Zone"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersoVue"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/configurateur/admin/perso/{slug}/{zone}/valider":{"post":{"tags":["configurateur-admin"],"summary":"Perso Valider","operationId":"perso_valider_api_configurateur_admin_perso__slug___zone__valider_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"zone","in":"path","required":true,"schema":{"type":"string","pattern":"^(cadran|verre|couronne)$","title":"Zone"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/configurateur/admin/perso/amorcer":{"post":{"tags":["configurateur-admin"],"summary":"Perso Amorcer","description":"Relit les mesures versionnées. Les vues retouchées à la main et les\nparamètres déjà posés ne sont jamais écrasés.","operationId":"perso_amorcer_api_configurateur_admin_perso_amorcer_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/rendus-3d":{"get":{"tags":["rendus-3d"],"summary":"Lister","operationId":"lister_api_rendus_3d_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"statut","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":12},{"type":"null"}],"title":"Statut"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rendus-3d/{demande_id}/apercu":{"get":{"tags":["rendus-3d"],"summary":"Apercu","description":"L'email tel qu'il partira — images en URL plutôt qu'en CID.","operationId":"apercu_api_rendus_3d__demande_id__apercu_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"demande_id","in":"path","required":true,"schema":{"type":"integer","title":"Demande Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rendus-3d/{demande_id}/relancer":{"post":{"tags":["rendus-3d"],"summary":"Relancer","description":"Recompose les vues et refait le contrôle (après un échec, ou un rendu\nresté bloqué par un redémarrage de l'API).","operationId":"relancer_api_rendus_3d__demande_id__relancer_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"demande_id","in":"path","required":true,"schema":{"type":"integer","title":"Demande Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rendus-3d/{demande_id}/valider-envoyer":{"post":{"tags":["rendus-3d"],"summary":"Valider Envoyer","description":"Le clic « Valider et envoyer » — réservé aux administrateurs : c'est la\nseule porte par laquelle un rendu part chez un client.","operationId":"valider_envoyer_api_rendus_3d__demande_id__valider_envoyer_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"demande_id","in":"path","required":true,"schema":{"type":"integer","title":"Demande Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Validation"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rendus-3d/{demande_id}/refuser":{"post":{"tags":["rendus-3d"],"summary":"Refuser","operationId":"refuser_api_rendus_3d__demande_id__refuser_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"demande_id","in":"path","required":true,"schema":{"type":"integer","title":"Demande Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Refus"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/produits/admin/etat":{"get":{"tags":["produits-admin"],"summary":"Etat","operationId":"etat_api_produits_admin_etat_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/produits/admin/maitre":{"post":{"tags":["produits-admin"],"summary":"Basculer","description":"Bascule la source de vérité du catalogue.","operationId":"basculer_api_produits_admin_maitre_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"vers","in":"query","required":true,"schema":{"type":"string","pattern":"^(hub|prestashop)$","title":"Vers"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/produits/admin/liste":{"get":{"tags":["produits-admin"],"summary":"Liste","description":"Les fiches, filtrées. Les montres du configurateur sont exclues : elles\nne sont pas des produits du catalogue, elles sont des compositions.","operationId":"liste_api_produits_admin_liste_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Q"}},{"name":"collection","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Collection"}},{"name":"edites","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Edites"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":1,"title":"Page"}},{"name":"taille","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":40,"title":"Taille"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/produits/admin/fiche/{ps_id}":{"get":{"tags":["produits-admin"],"summary":"Fiche","description":"Une fiche complète : ses champs, ses images, ses huit langues.","operationId":"fiche_api_produits_admin_fiche__ps_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ps_id","in":"path","required":true,"schema":{"type":"integer","title":"Ps Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["produits-admin"],"summary":"Modifier","description":"Les champs non traduisibles : référence, collection, prix, stock, actif,\net les caractéristiques (qui sont ce que les fiches produit affichent).","operationId":"modifier_api_produits_admin_fiche__ps_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ps_id","in":"path","required":true,"schema":{"type":"integer","title":"Ps Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FicheEntrante"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/produits/admin/fiche":{"post":{"tags":["produits-admin"],"summary":"Creer","description":"Un produit neuf, né dans le Hub. Sans `ps_id` de boutique : il n'existe\nque chez nous, et aucune synchronisation ne peut l'effacer.","operationId":"creer_api_produits_admin_fiche_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FicheNeuve"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/produits/admin/fiche/{ps_id}/dupliquer":{"post":{"tags":["produits-admin"],"summary":"Dupliquer","description":"Reprendre une fiche entière sous un nouveau numéro.\n\nCe qui est copié : les champs, les caractéristiques, les catégories, les\nvisuels et les traductions. Ce qui ne l'est PAS : l'historique des ventes\n(`total_sold`, `total_revenue`, `order_count`, `monthly_sales`, `views`) —\nune copie qui hériterait des ventes de l'original fausserait les\n« meilleures ventes » du site dès le premier jour.\n\nLa copie naît **fermée** (`active = false`) : on relit, puis on ouvre.","operationId":"dupliquer_api_produits_admin_fiche__ps_id__dupliquer_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ps_id","in":"path","required":true,"schema":{"type":"integer","title":"Ps Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Duplication"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/produits/admin/fiche/{ps_id}/langue/{langue}":{"put":{"tags":["produits-admin"],"summary":"Traduire","description":"Écrit une langue. Le français va dans la fiche elle-même — c'est lui que\nlisent les trente-trois modules du Hub.","operationId":"traduire_api_produits_admin_fiche__ps_id__langue__langue__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ps_id","in":"path","required":true,"schema":{"type":"integer","title":"Ps Id"}},{"name":"langue","in":"path","required":true,"schema":{"type":"string","title":"Langue"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__produits_admin__Traduction"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/produits/admin/fiche/{ps_id}/image":{"post":{"tags":["produits-admin"],"summary":"Ajouter Image","description":"Une image de plus, hébergée par le Hub. La première de la liste est la\nprincipale : c'est elle que reprennent les listes et les emails.\n\nRend l'entrée créée avec ses dimensions et, si elle est trop petite pour\nson rôle, un `avertissement` (jamais bloquant). Les dérivés AVIF/WebP se\ncalculent ensuite en arrière-plan (`etat` : en_cours → pret).","operationId":"ajouter_image_api_produits_admin_fiche__ps_id__image_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ps_id","in":"path","required":true,"schema":{"type":"integer","title":"Ps Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_ajouter_image_api_produits_admin_fiche__ps_id__image_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/produits/admin/fiche/{ps_id}/images":{"put":{"tags":["produits-admin"],"summary":"Ordonner Images","description":"Réordonne, retire, change le rôle ou le texte alternatif des images.\n\nLe corps est la liste ordonnée. Chaque élément est soit une chaîne (l'id ou\nl'adresse d'une image — l'ancien format, toujours accepté), soit un objet\n`{id, role?, alt?}`. Ce qui n'est pas dans la liste disparaît de la fiche ;\nl'original et les dérivés restent sur le disque.","operationId":"ordonner_images_api_produits_admin_fiche__ps_id__images_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ps_id","in":"path","required":true,"schema":{"type":"integer","title":"Ps Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{},"title":"Images"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/produits/admin/journal":{"get":{"tags":["produits-admin"],"summary":"Journal","operationId":"journal_api_produits_admin_journal_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":80,"title":"Limite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/produit/{ps_id}/images":{"get":{"tags":["site"],"summary":"Images Pour Le Site","description":"Contrat de lecture — public, sans authentification, limité en débit.\n\nRéponse (200) :\n\n    {\n      \"ps_id\": 21885,\n      \"origine\": \"hub\" | \"miroir\",      # \"hub\" = au moins une image téléversée\n                                        # au BO (empreinte) ; \"miroir\" = rien que\n                                        # les images de la boutique, que le site\n                                        # a déjà — il ne remplace rien\n      \"images\": [                       # dans l'ordre du BO ; [0] = principale\n        {\n          \"id\": \"9f0c…\",                # stable tant que l'image reste sur la fiche\n          \"role\": \"vue\" | \"ambiance\" | \"section\",\n          \"largeur\": 3000, \"hauteur\": 4000,   # de l'original normalisé ; null si inconnues\n          \"alpha\": true,                # fond transparent (packshot détouré)\n          \"sources\": {\n            \"avif\": [{\"w\": 400, \"url\": \"https://…/catalogue-images/v/ab/<empreinte>-400.avif\"}, …],\n            \"webp\": [{\"w\": 400, \"url\": \"…-400.webp\"}, …]\n          },                            # largeurs croissantes, jamais au-dessus de l'original ;\n                                        # listes VIDES pour une image ancienne ou pas encore dérivée\n          \"jpeg\": \"https://…-1200.jpg\", # toujours présent : repli <img>, og:image, flux\n          \"alt\": \"…\"                    # texte saisi au BO, sinon le nom du produit\n        }\n      ]\n    }\n\nLes fichiers sous `/catalogue-images/v/` sont nommés par empreinte : ils ne\nchangent jamais, le cache peut les garder un an (`immutable`). Cette\nréponse-ci est gardée 5 minutes. 404 si le produit n'existe pas ou n'est pas\nvisible sur le site.","operationId":"images_pour_le_site_api_site_produit__ps_id__images_get","parameters":[{"name":"ps_id","in":"path","required":true,"schema":{"type":"integer","title":"Ps Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/catalogue/categories":{"get":{"tags":["site-catalogue-admin"],"summary":"Categories Arbre","description":"L'arborescence complète, à plat : l'écran la remonte en arbre.","operationId":"categories_arbre_api_site_catalogue_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["site-catalogue-admin"],"summary":"Categorie Creer","description":"Crée une catégorie — sans `ps_id` : elle n'existe pas dans la boutique.","operationId":"categorie_creer_api_site_catalogue_categories_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategorieNouvelle"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/site/catalogue/categories/{cat_id}":{"get":{"tags":["site-catalogue-admin"],"summary":"Categorie Detail","description":"Une catégorie et ses textes, langue par langue.","operationId":"categorie_detail_api_site_catalogue_categories__cat_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cat_id","in":"path","required":true,"schema":{"type":"integer","title":"Cat Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["site-catalogue-admin"],"summary":"Categorie Modifier","description":"Renommer, masquer, changer l'adresse, la bannière, les métadonnées (FR).","operationId":"categorie_modifier_api_site_catalogue_categories__cat_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cat_id","in":"path","required":true,"schema":{"type":"integer","title":"Cat Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__site_catalogue_admin__CategorieEntrante"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["site-catalogue-admin"],"summary":"Categorie Supprimer","description":"Ne supprime qu'une catégorie née au Hub, vide et sans enfant.\n\nUne catégorie venue de la boutique ne se supprime pas : elle se masque.\nSinon la prochaine resynchronisation la ferait revenir, et on ne saurait\npas pourquoi.","operationId":"categorie_supprimer_api_site_catalogue_categories__cat_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cat_id","in":"path","required":true,"schema":{"type":"integer","title":"Cat Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/catalogue/categories/{cat_id}/textes/{langue}":{"put":{"tags":["site-catalogue-admin"],"summary":"Categorie Texte","description":"Les textes d'une langue. FR et EN dans les colonnes, les dix autres à côté.","operationId":"categorie_texte_api_site_catalogue_categories__cat_id__textes__langue__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cat_id","in":"path","required":true,"schema":{"type":"integer","title":"Cat Id"}},{"name":"langue","in":"path","required":true,"schema":{"type":"string","title":"Langue"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TexteEntrant"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/catalogue/categories/{cat_id}/deplacer":{"post":{"tags":["site-catalogue-admin"],"summary":"Categorie Deplacer","description":"Change de parent, et de rang dans la fratrie. Refuse les cycles.","operationId":"categorie_deplacer_api_site_catalogue_categories__cat_id__deplacer_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cat_id","in":"path","required":true,"schema":{"type":"integer","title":"Cat Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Deplacement"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/catalogue/categories/reordonner":{"post":{"tags":["site-catalogue-admin"],"summary":"Categories Reordonner","description":"L'ordre d'une fratrie, dans l'ordre reçu. Rien d'autre ne bouge.","operationId":"categories_reordonner_api_site_catalogue_categories_reordonner_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__site_catalogue_admin__Reordonnancement"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/site/catalogue/declinaisons/produits":{"get":{"tags":["site-catalogue-admin"],"summary":"Declinaisons Produits","description":"Les produits qui ont des déclinaisons, et l'état de chacun.","operationId":"declinaisons_produits_api_site_catalogue_declinaisons_produits_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Q"}},{"name":"edites","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Edites"}},{"name":"orphelins","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Orphelins"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":1,"title":"Page"}},{"name":"taille","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":40,"title":"Taille"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/catalogue/declinaisons/produit/{ps_id}":{"get":{"tags":["site-catalogue-admin"],"summary":"Declinaisons Produit","description":"Les déclinaisons d'un produit, avec l'écart TTC calculé — pas additionné.","operationId":"declinaisons_produit_api_site_catalogue_declinaisons_produit__ps_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ps_id","in":"path","required":true,"schema":{"type":"integer","title":"Ps Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/catalogue/declinaisons/{dec_id}":{"put":{"tags":["site-catalogue-admin"],"summary":"Declinaison Modifier","description":"Écart de prix, stock, référence, activité. Le défaut a sa propre route.","operationId":"declinaison_modifier_api_site_catalogue_declinaisons__dec_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"dec_id","in":"path","required":true,"schema":{"type":"integer","title":"Dec Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeclinaisonEntrante"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/catalogue/declinaisons/{dec_id}/defaut":{"post":{"tags":["site-catalogue-admin"],"summary":"Declinaison Defaut","description":"Désigne la déclinaison qui ouvre la fiche — il y en a une, et une seule.\n\nToute la fratrie passe en `origine = 'hub'` : sans cela, la prochaine\nresynchronisation rendrait son drapeau à l'ancienne et la fiche aurait\ndeux défauts.","operationId":"declinaison_defaut_api_site_catalogue_declinaisons__dec_id__defaut_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"dec_id","in":"path","required":true,"schema":{"type":"integer","title":"Dec Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/site/catalogue/etat":{"get":{"tags":["site-catalogue-admin"],"summary":"Etat","description":"Ce que le back-office possède aujourd'hui — et en combien de langues.","operationId":"etat_api_site_catalogue_etat_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/rocket-ia/etat":{"get":{"tags":["rocket-ia"],"summary":"Etat","operationId":"etat_api_rocket_ia_etat_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/rocket-ia/sites/{slug}/{action}":{"post":{"tags":["rocket-ia"],"summary":"Action Site","operationId":"action_site_api_rocket_ia_sites__slug___action__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"action","in":"path","required":true,"schema":{"type":"string","title":"Action"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_action_site_api_rocket_ia_sites__slug___action__post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rocket-ia/studio/{action}":{"post":{"tags":["rocket-ia"],"summary":"Action Studio","operationId":"action_studio_api_rocket_ia_studio__action__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"action","in":"path","required":true,"schema":{"type":"string","title":"Action"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/sessions/config":{"get":{"tags":["sessions-site-public"],"summary":"Config","description":"Ce que la page doit faire pour cette session : collecter, filmer, survols.\n\nUne seule fois par session (la page garde la réponse) : c'est ici que se\ndécident l'échantillonnage, l'exclusion des robots et des adresses du\nbureau, et l'arrêt quand le disque déborde.","operationId":"config_api_public_sessions_config_get","parameters":[{"name":"s","in":"query","required":false,"schema":{"type":"string","maxLength":40,"default":"","title":"S"}},{"name":"u","in":"query","required":false,"schema":{"type":"string","maxLength":500,"default":"","title":"U"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/sessions/lot":{"post":{"tags":["sessions-site-public"],"summary":"Lot","description":"Un lot de la page : points des cartes, signaux, morceau de film.","operationId":"lot_api_public_sessions_lot_post","parameters":[{"name":"z","in":"query","required":false,"schema":{"type":"integer","maximum":1,"minimum":0,"default":0,"title":"Z"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/sessions/retrait":{"post":{"tags":["sessions-site-public"],"summary":"Retrait","description":"Le visiteur retire son consentement : ce que sa session avait envoyé est\neffacé (fichiers et lignes). Corps `text/plain` `{\"s\": \"<session>\"}`.","operationId":"retrait_api_public_sessions_retrait_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/sessions-site/resume":{"get":{"tags":["sessions-site"],"summary":"Resume","operationId":"resume_api_sessions_site_resume_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/sessions-site/sessions":{"get":{"tags":["sessions-site"],"summary":"Sessions","operationId":"sessions_api_sessions_site_sessions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limite"}},{"name":"decalage","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Decalage"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sessions-site/sessions/{sid}":{"get":{"tags":["sessions-site"],"summary":"Session","operationId":"session_api_sessions_site_sessions__sid__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"string","title":"Sid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["sessions-site"],"summary":"Marquer","operationId":"marquer_api_sessions_site_sessions__sid__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"string","title":"Sid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Marque"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sessions-site/sessions/{sid}/enregistrement":{"get":{"tags":["sessions-site"],"summary":"Film","description":"Les événements rrweb (toute la session, ou la page `n`).","operationId":"film_api_sessions_site_sessions__sid__enregistrement_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"string","title":"Sid"}},{"name":"n","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":1000,"minimum":0},{"type":"null"}],"title":"N"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sessions-site/modeles":{"get":{"tags":["sessions-site"],"summary":"Modeles","operationId":"modeles_api_sessions_site_modeles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/sessions-site/carte":{"get":{"tags":["sessions-site"],"summary":"Carte","operationId":"carte_api_sessions_site_carte_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/sessions-site/entonnoir":{"get":{"tags":["sessions-site"],"summary":"Entonnoir","operationId":"entonnoir_api_sessions_site_entonnoir_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/sessions-site/zones":{"get":{"tags":["sessions-site"],"summary":"Zones","operationId":"zones_api_sessions_site_zones_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/sessions-site/par-panier/{token}":{"get":{"tags":["sessions-site"],"summary":"Par Panier","description":"Les sessions d'un panier (lien depuis les paniers abandonnés).","operationId":"par_panier_api_sessions_site_par_panier__token__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sessions-site/par-visiteur/{visiteur}":{"get":{"tags":["sessions-site"],"summary":"Par Visiteur","description":"Les sessions d'un visiteur (lien depuis une conversation du chat).","operationId":"par_visiteur_api_sessions_site_par_visiteur__visiteur__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"visiteur","in":"path","required":true,"schema":{"type":"string","title":"Visiteur"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sessions-site/reglages":{"get":{"tags":["sessions-site"],"summary":"Lire Reglages","operationId":"lire_reglages_api_sessions_site_reglages_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["sessions-site"],"summary":"Ecrire Reglages","operationId":"ecrire_reglages_api_sessions_site_reglages_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Reglages"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/sessions-site/purger":{"post":{"tags":["sessions-site"],"summary":"Purger","description":"Purge et contrôle disque à la demande (ce que fait la nuit).","operationId":"purger_api_sessions_site_purger_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/health":{"get":{"summary":"Health Check","operationId":"health_check_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/health/ready":{"get":{"summary":"Health Ready","description":"Readiness probe — utilisée par le healthcheck Docker.\n\nRetourne 503 si la DB est inaccessible (pool saturé, connexions mortes).\nPermet à autoheal de redémarrer le container quand le pool fuit.","operationId":"health_ready_api_health_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/health/full":{"get":{"summary":"Health Check Full","description":"Health check complet incluant les services externes.","operationId":"health_check_full_api_health_full_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"Adresse":{"properties":{"line1":{"type":"string","maxLength":120,"minLength":3,"title":"Line1"},"line2":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Line2"},"postal_code":{"type":"string","maxLength":16,"minLength":2,"title":"Postal Code"},"city":{"type":"string","maxLength":80,"minLength":1,"title":"City"},"region":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Region","description":"State / province / region when the country uses one."},"country":{"type":"string","maxLength":2,"minLength":2,"title":"Country","description":"ISO-3166 alpha-2, e.g. 'US'."}},"type":"object","required":["line1","postal_code","city","country"],"title":"Adresse"},"Article":{"properties":{"titre":{"type":"string","maxLength":300,"title":"Titre","default":""},"chapo":{"type":"string","maxLength":1000,"title":"Chapo","default":""},"date_publication":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Date Publication"},"rubriques":{"items":{"type":"integer"},"type":"array","maxItems":7,"title":"Rubriques"},"couverture":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Couverture"},"blocs":{"items":{"type":"object"},"type":"array","maxItems":120,"title":"Blocs"}},"type":"object","title":"Article"},"Avis":{"properties":{"oui":{"type":"boolean","title":"Oui"}},"type":"object","required":["oui"],"title":"Avis"},"Body_action_site_api_rocket_ia_sites__slug___action__post":{"properties":{"confirmation":{"type":"boolean","title":"Confirmation","default":false}},"type":"object","title":"Body_action_site_api_rocket_ia_sites__slug___action__post"},"Body_ajouter_image_api_produits_admin_fiche__ps_id__image_post":{"properties":{"fichier":{"type":"string","format":"binary","title":"Fichier"},"role":{"type":"string","title":"Role","default":"vue"},"alt":{"type":"string","title":"Alt","default":""}},"type":"object","required":["fichier"],"title":"Body_ajouter_image_api_produits_admin_fiche__ps_id__image_post"},"Body_ajouter_photo_api_pendules_uniques__piece_id__photos_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_ajouter_photo_api_pendules_uniques__piece_id__photos_post"},"Body_deposer_api_translatio_documents_post":{"properties":{"fichier":{"type":"string","format":"binary","title":"Fichier"},"email":{"type":"string","title":"Email","default":""},"langue_site":{"type":"string","title":"Langue Site","default":"fr"},"visiteur":{"type":"string","title":"Visiteur","default":""}},"type":"object","required":["fichier"],"title":"Body_deposer_api_translatio_documents_post"},"Body_deposer_facture_compensation_api_sales_orders__order_id__facture_compensation_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"montant":{"type":"string","title":"Montant","default":""}},"type":"object","required":["file"],"title":"Body_deposer_facture_compensation_api_sales_orders__order_id__facture_compensation_post"},"Body_deposer_photo_api_stand_ww_photos_post":{"properties":{"fichier":{"type":"string","format":"binary","title":"Fichier"},"legende":{"type":"string","title":"Legende","default":""},"edition":{"type":"string","title":"Edition","default":"2027"}},"type":"object","required":["fichier"],"title":"Body_deposer_photo_api_stand_ww_photos_post"},"Body_depot_api_site_guide_bracelets_depot__jeton__post":{"properties":{"photo":{"type":"string","format":"binary","title":"Photo"}},"type":"object","required":["photo"],"title":"Body_depot_api_site_guide_bracelets_depot__jeton__post"},"Body_image_api_journal_images_post":{"properties":{"fichier":{"type":"string","format":"binary","title":"Fichier"}},"type":"object","required":["fichier"],"title":"Body_image_api_journal_images_post"},"Body_logo_org_api_translatio_orgs_moi_logo_post":{"properties":{"fichier":{"type":"string","format":"binary","title":"Fichier"}},"type":"object","required":["fichier"],"title":"Body_logo_org_api_translatio_orgs_moi_logo_post"},"Body_poser_calques_api_configurateur_admin_elements__slug___element_id__calques_post":{"properties":{"fichiers":{"items":{"type":"string","format":"binary"},"type":"array","title":"Fichiers"},"depart":{"type":"integer","title":"Depart","default":0}},"type":"object","required":["fichiers"],"title":"Body_poser_calques_api_configurateur_admin_elements__slug___element_id__calques_post"},"Body_poser_vignette_api_configurateur_admin_elements__slug___element_id__vignette_post":{"properties":{"fichier":{"type":"string","format":"binary","title":"Fichier"}},"type":"object","required":["fichier"],"title":"Body_poser_vignette_api_configurateur_admin_elements__slug___element_id__vignette_post"},"Body_remplacer_visuel_api_cms_pendules_visuels_post":{"properties":{"fichier":{"type":"string","title":"Fichier"},"image":{"type":"string","format":"binary","title":"Image"}},"type":"object","required":["fichier","image"],"title":"Body_remplacer_visuel_api_cms_pendules_visuels_post"},"Body_upload_file_api_sales_orders__order_id__files_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"customization_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Customization Id"},"line_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Line Id"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"file_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Type"}},"type":"object","required":["file"],"title":"Body_upload_file_api_sales_orders__order_id__files_post"},"Body_upload_line_photo_api_sales_orders__order_id__lines__line_id__photo_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_line_photo_api_sales_orders__order_id__lines__line_id__photo_post"},"Body_upload_payment_receipt_api_sales_orders__order_id__payments__payment_id__receipt_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_payment_receipt_api_sales_orders__order_id__payments__payment_id__receipt_post"},"Body_visuel_deposer_api_site_cms_visuels_post":{"properties":{"fichier":{"type":"string","format":"binary","title":"Fichier"}},"type":"object","required":["fichier"],"title":"Body_visuel_deposer_api_site_cms_visuels_post"},"CategorieNouvelle":{"properties":{"nom":{"type":"string","maxLength":200,"minLength":1,"title":"Nom"},"slug":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Slug"},"parent_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Parent Id"},"active":{"type":"boolean","title":"Active","default":true}},"type":"object","required":["nom"],"title":"CategorieNouvelle"},"Client":{"properties":{"email":{"type":"string","maxLength":200,"title":"Email"},"first_name":{"type":"string","maxLength":60,"minLength":1,"title":"First Name"},"last_name":{"type":"string","maxLength":60,"minLength":1,"title":"Last Name"},"phone":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Phone"}},"type":"object","required":["email","first_name","last_name"],"title":"Client"},"Code":{"properties":{"email":{"type":"string","title":"Email"},"langue":{"type":"string","title":"Langue","default":"fr"}},"type":"object","required":["email"],"title":"Code"},"ColissimoManualRequest":{"properties":{"recipient":{"$ref":"#/components/schemas/ManualRecipient"},"weight":{"type":"number","title":"Weight"},"product_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Code"},"goods_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Goods Value"},"signature":{"type":"boolean","title":"Signature","default":true},"non_machinable":{"type":"boolean","title":"Non Machinable","default":false},"insurance":{"type":"boolean","title":"Insurance","default":false},"tariff_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tariff Number"},"deposit_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deposit Date"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content","default":"Colis BRM"},"reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference"},"notify_recipient":{"type":"boolean","title":"Notify Recipient","default":false}},"type":"object","required":["recipient","weight"],"title":"ColissimoManualRequest"},"ColissimoRequest":{"properties":{"product_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Code"},"weight":{"type":"number","title":"Weight"},"goods_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Goods Value"},"signature":{"type":"boolean","title":"Signature","default":true},"non_machinable":{"type":"boolean","title":"Non Machinable","default":false},"insurance":{"type":"boolean","title":"Insurance","default":false},"tariff_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tariff Number"},"deposit_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deposit Date"},"notify_recipient":{"type":"boolean","title":"Notify Recipient","default":true},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"production_order_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Production Order Ids"},"accessory_line_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Accessory Line Ids"}},"type":"object","required":["weight"],"title":"ColissimoRequest"},"Connexion":{"properties":{"email":{"type":"string","title":"Email"},"code":{"type":"string","title":"Code"}},"type":"object","required":["email","code"],"title":"Connexion"},"Consentement":{"properties":{"cgv":{"type":"boolean","title":"Cgv","default":false},"newsletter":{"type":"boolean","title":"Newsletter","default":false},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"page":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page"},"langue":{"type":"string","title":"Langue","default":"fr"}},"type":"object","title":"Consentement","description":"Ce que le client a accepté, quand, et dans quelle version.\n\n`accepte` seul ne vaut rien : ce qui est opposable, c'est « il a accepté\nCETTE version de CE texte, à CETTE date ». La version et le texte viennent\ndu serveur (`site_rgpd`), pas du navigateur — sinon un client pourrait\nprétendre avoir accepté une version qui n'a jamais existé."},"ConsentementVisiteur":{"properties":{"visiteur":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Visiteur"},"choix":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Choix"},"cgv":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Cgv"},"newsletter":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Newsletter"},"langue":{"type":"string","title":"Langue","default":"fr"},"page":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page"},"source":{"type":"string","title":"Source","default":"bandeau"}},"type":"object","title":"ConsentementVisiteur","description":"Le choix d'un visiteur, avec ou sans compte.\n\n`visiteur` est le jeton opaque que le site garde dans le navigateur. Absent\nou mal formé, le serveur en pose un neuf et le rend : le bandeau n'a jamais\nà en fabriquer un lui-même, et n'a donc jamais l'occasion d'en fabriquer un\ndevinable.\n\n`choix` porte les catégories du bandeau — ``{\"mesure\": true, \"marketing\":\nfalse}``. Les noms viennent du bandeau, pas du serveur : figer la liste ici\nobligerait à redéployer l'API pour ajouter une case."},"Contact":{"properties":{"email":{"type":"string","maxLength":200,"title":"Email"},"name":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Name"},"phone":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Phone"}},"type":"object","required":["email"],"title":"Contact"},"ContactIn":{"properties":{"nom":{"type":"string","maxLength":120,"title":"Nom","default":""},"email":{"type":"string","format":"email","title":"Email"},"telephone":{"type":"string","maxLength":40,"title":"Telephone","default":""},"sujet":{"type":"string","maxLength":80,"title":"Sujet","default":""},"message":{"type":"string","maxLength":5000,"minLength":10,"title":"Message"},"site":{"type":"string","maxLength":200,"title":"Site","default":""},"canal":{"type":"string","enum":["contact","conseiller"],"title":"Canal","default":"contact"},"pays":{"type":"string","maxLength":2,"title":"Pays","default":""},"langue":{"type":"string","maxLength":12,"title":"Langue","default":""},"page":{"type":"string","maxLength":500,"title":"Page","default":""},"modele":{"type":"string","maxLength":160,"title":"Modele","default":""},"reference":{"type":"string","maxLength":80,"title":"Reference","default":""},"consentement":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Consentement"},"arrivee":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Arrivee"},"visiteur":{"type":"string","maxLength":40,"title":"Visiteur","default":""}},"type":"object","required":["email","message"],"title":"ContactIn"},"CreateQuoteRequest":{"properties":{"sav_id":{"type":"integer","title":"Sav Id"},"lines":{"items":{"$ref":"#/components/schemas/QuoteLine"},"type":"array","title":"Lines","default":[]},"free_lines":{"items":{"$ref":"#/components/schemas/FreeLineSchema"},"type":"array","title":"Free Lines","default":[]},"include_shipping":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Shipping"},"discount_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discount Type"},"discount_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Discount Value"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["sav_id"],"title":"CreateQuoteRequest"},"CreateShipmentRequest":{"properties":{"service":{"$ref":"#/components/schemas/ServiceChoice"},"weight":{"type":"number","title":"Weight"},"length":{"type":"integer","title":"Length","default":25},"width":{"type":"integer","title":"Width","default":20},"height":{"type":"integer","title":"Height","default":12},"quantity":{"type":"integer","title":"Quantity","default":1},"goods_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Goods Value"},"insurance":{"type":"boolean","title":"Insurance","default":false},"ddp":{"type":"boolean","title":"Ddp","default":false},"tariff_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tariff Number"},"saturday_delivery":{"type":"boolean","title":"Saturday Delivery","default":false},"holiday_delivery":{"type":"boolean","title":"Holiday Delivery","default":false},"pickup_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pickup Date"},"notify_recipient":{"type":"boolean","title":"Notify Recipient","default":true},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"production_order_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Production Order Ids"},"accessory_line_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Accessory Line Ids"}},"type":"object","required":["service","weight"],"title":"CreateShipmentRequest"},"CustomizationCreate":{"properties":{"customization_type":{"type":"string","title":"Customization Type"},"zone":{"type":"string","title":"Zone"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"position":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Position"},"dimensions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dimensions"}},"type":"object","required":["customization_type","zone"],"title":"CustomizationCreate"},"DeclinaisonEntrante":{"properties":{"impact_ht":{"anyOf":[{"type":"number","maximum":1000000.0,"minimum":-1000000.0},{"type":"null"}],"title":"Impact Ht"},"impact_ttc":{"anyOf":[{"type":"number","maximum":1000000.0,"minimum":-1000000.0},{"type":"null"}],"title":"Impact Ttc"},"quantite":{"anyOf":[{"type":"integer","maximum":1000000.0,"minimum":0.0},{"type":"null"}],"title":"Quantite"},"reference":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Reference"},"ean13":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Ean13"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"},"position":{"anyOf":[{"type":"integer","maximum":9999.0,"minimum":0.0},{"type":"null"}],"title":"Position"}},"type":"object","title":"DeclinaisonEntrante","description":"L'écart peut être saisi HT (ce que la base garde) ou TTC (ce qui s'affiche)."},"DemandeAtelier":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"consentement":{"type":"boolean","title":"Consentement","default":false},"code":{"type":"string","maxLength":40,"title":"Code"},"langue":{"type":"string","maxLength":5,"title":"Langue","default":"fr"},"page":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Page"},"ps_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ps Id"},"ecart_vise":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Ecart Vise"},"essai":{"type":"boolean","title":"Essai","default":false}},"type":"object","required":["email","code"],"title":"DemandeAtelier"},"DemandeChiffrage":{"properties":{"configuration":{"$ref":"#/components/schemas/app__routers__agent_configurateur__Configuration"},"country":{"type":"string","maxLength":60,"title":"Country","description":"Delivery country, ISO-3166 alpha-2 preferred."},"display_currency":{"anyOf":[{"type":"string","maxLength":3},{"type":"null"}],"title":"Display Currency"},"lang":{"type":"string","maxLength":5,"title":"Lang","default":"en"}},"type":"object","required":["configuration","country"],"title":"DemandeChiffrage"},"DemandeCode":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"langue":{"type":"string","title":"Langue","default":"fr"}},"type":"object","required":["email"],"title":"DemandeCode"},"DemandeCommande":{"properties":{"configuration":{"$ref":"#/components/schemas/app__routers__agent_configurateur__Configuration"},"customer":{"$ref":"#/components/schemas/Client"},"shipping_address":{"$ref":"#/components/schemas/Adresse"},"lang":{"type":"string","maxLength":5,"title":"Lang","default":"en"},"user_consent":{"type":"boolean","title":"User Consent","description":"MUST be true: the user explicitly asked to order this watch and agreed to share their name, email and address with B.R.M for this order."}},"type":"object","required":["configuration","customer","shipping_address","user_consent"],"title":"DemandeCommande"},"DemandeContact":{"properties":{"kind":{"type":"string","pattern":"^(appointment|quote|special_request)$","title":"Kind"},"contact":{"$ref":"#/components/schemas/Contact"},"country":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Country"},"lang":{"type":"string","maxLength":5,"title":"Lang","default":"en"},"message":{"type":"string","maxLength":2000,"minLength":10,"title":"Message"},"configuration":{"anyOf":[{"$ref":"#/components/schemas/app__routers__agent_configurateur__Configuration"},{"type":"null"}]},"user_consent":{"type":"boolean","title":"User Consent","description":"MUST be true: the user explicitly asked to be contacted."}},"type":"object","required":["kind","contact","message","user_consent"],"title":"DemandeContact"},"DemandeLien":{"properties":{"renouveler":{"type":"boolean","title":"Renouveler","default":false}},"type":"object","title":"DemandeLien"},"DemandePartage":{"properties":{"configuration":{"$ref":"#/components/schemas/app__routers__agent_configurateur__Configuration"},"lang":{"type":"string","maxLength":5,"title":"Lang","default":"en"},"view":{"type":"integer","maximum":29.0,"minimum":0.0,"title":"View","default":0}},"type":"object","required":["configuration"],"title":"DemandePartage"},"DemandeRendu":{"properties":{"configuration":{"$ref":"#/components/schemas/app__routers__agent_configurateur__Configuration"},"view":{"type":"integer","maximum":29.0,"minimum":0.0,"title":"View","default":0},"width":{"type":"integer","maximum":1600.0,"minimum":300.0,"title":"Width","default":900}},"type":"object","required":["configuration"],"title":"DemandeRendu"},"DemandeRetour":{"properties":{"dossier":{"type":"string","maxLength":64,"minLength":3,"title":"Dossier"}},"type":"object","required":["dossier"],"title":"DemandeRetour"},"DemandeSuppression":{"properties":{"confirmation":{"type":"string","title":"Confirmation","default":""}},"type":"object","title":"DemandeSuppression"},"DemandeTraduction":{"properties":{"langues":{"items":{"type":"string"},"type":"array","maxItems":11,"title":"Langues"},"tout":{"type":"boolean","title":"Tout","default":false}},"type":"object","title":"DemandeTraduction"},"DemandeValidation":{"properties":{"configuration":{"$ref":"#/components/schemas/app__routers__agent_configurateur__Configuration"},"lang":{"type":"string","maxLength":5,"title":"Lang","default":"en"},"country":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Country"}},"type":"object","required":["configuration"],"title":"DemandeValidation"},"Deplacement":{"properties":{"parent_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Parent Id"},"position":{"anyOf":[{"type":"integer","maximum":9999.0,"minimum":0.0},{"type":"null"}],"title":"Position"}},"type":"object","title":"Deplacement"},"DesignEntrant":{"properties":{"modele":{"type":"string","maxLength":80,"title":"Modele"},"options":{"items":{"type":"string"},"type":"array","maxItems":40,"title":"Options"},"langue":{"type":"string","maxLength":5,"title":"Langue","default":"fr"},"vue":{"type":"integer","maximum":29.0,"minimum":0.0,"title":"Vue","default":0},"image":{"type":"boolean","title":"Image","default":true}},"type":"object","required":["modele"],"title":"DesignEntrant"},"DevisEmail":{"properties":{"email":{"type":"string","title":"Email"},"langue_site":{"type":"string","title":"Langue Site","default":"fr"},"societe":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Societe"},"nom":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nom"},"identite":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Identite"}},"type":"object","required":["email"],"title":"DevisEmail"},"DeviseMaj":{"properties":{"libelle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Libelle"},"taux":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Taux"},"symbole":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Symbole"},"position":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Position"},"decimales":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Decimales"},"facturable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Facturable"},"actif":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Actif"},"taux_fixe":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Taux Fixe"}},"type":"object","title":"DeviseMaj"},"DeviseNouvelle":{"properties":{"code":{"type":"string","title":"Code"},"libelle":{"type":"string","title":"Libelle","default":""},"taux":{"type":"number","title":"Taux"},"symbole":{"type":"string","title":"Symbole","default":""},"position":{"type":"string","title":"Position","default":"apres"},"decimales":{"type":"integer","title":"Decimales","default":2},"facturable":{"type":"boolean","title":"Facturable","default":false}},"type":"object","required":["code","taux"],"title":"DeviseNouvelle"},"Duplication":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Name"},"reference":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Reference"},"images":{"type":"boolean","title":"Images","default":true},"traductions":{"type":"boolean","title":"Traductions","default":true}},"type":"object","title":"Duplication"},"Echantillon":{"properties":{"langue":{"type":"string","title":"Langue"},"texte":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Texte"},"domaine":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domaine"},"langue_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Langue Source"},"niveau":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Niveau"}},"type":"object","required":["langue"],"title":"Echantillon"},"ElementEntrant":{"properties":{"slug":{"type":"string","maxLength":80,"title":"Slug"},"element_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Element Id"},"cat_id":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Cat Id"},"reference":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Reference"},"noms":{"additionalProperties":{"type":"string"},"type":"object","title":"Noms"},"prix":{"anyOf":[{"type":"number","maximum":1000000.0,"minimum":0.0},{"type":"null"}],"title":"Prix"},"position":{"anyOf":[{"type":"integer","maximum":9999.0,"minimum":0.0},{"type":"null"}],"title":"Position"},"par_defaut":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Par Defaut"},"base_url":{"anyOf":[{"type":"string","maxLength":600},{"type":"null"}],"title":"Base Url"},"vignette":{"anyOf":[{"type":"string","maxLength":600},{"type":"null"}],"title":"Vignette"},"actif":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Actif"}},"type":"object","required":["slug"],"title":"ElementEntrant"},"Expedition":{"properties":{"transporteur":{"type":"string","maxLength":80,"title":"Transporteur","default":""},"numero_suivi":{"type":"string","maxLength":80,"title":"Numero Suivi","default":""},"url_suivi":{"type":"string","maxLength":500,"title":"Url Suivi","default":""},"prevenir":{"type":"boolean","title":"Prevenir","default":true}},"type":"object","title":"Expedition"},"Express":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"Express"},"Favori":{"properties":{"ps_id":{"type":"integer","title":"Ps Id"},"fiche":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Fiche"}},"type":"object","required":["ps_id"],"title":"Favori"},"FicheEntrante":{"properties":{"reference":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Reference"},"collection":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Collection"},"price_ttc":{"anyOf":[{"type":"number","maximum":1000000.0,"minimum":0.0},{"type":"null"}],"title":"Price Ttc"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"},"quantity":{"anyOf":[{"type":"integer","maximum":100000.0,"minimum":0.0},{"type":"null"}],"title":"Quantity"},"features":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Features"},"demande_bracelet":{"anyOf":[{"type":"string","enum":["auto","oui","non"]},{"type":"null"}],"title":"Demande Bracelet"}},"type":"object","title":"FicheEntrante"},"FicheNeuve":{"properties":{"name":{"type":"string","maxLength":500,"minLength":2,"title":"Name"},"reference":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Reference"},"collection":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Collection"},"price_ttc":{"type":"number","maximum":1000000.0,"minimum":0.0,"title":"Price Ttc","default":0},"description_short":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Description Short"},"description":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}],"title":"Description"},"quantity":{"type":"integer","maximum":100000.0,"minimum":0.0,"title":"Quantity","default":0},"active":{"type":"boolean","title":"Active","default":false},"demande_bracelet":{"type":"string","enum":["auto","oui","non"],"title":"Demande Bracelet","default":"auto"}},"type":"object","required":["name"],"title":"FicheNeuve"},"Fractionne":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"moyen":{"type":"string","title":"Moyen"},"echeances":{"type":"integer","title":"Echeances"},"retour":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Retour"}},"type":"object","required":["email","moyen","echeances"],"title":"Fractionne","description":"Le paiement en plusieurs fois, demandé DEPUIS le tunnel."},"FreeLineSchema":{"properties":{"description":{"type":"string","title":"Description"},"price_ht":{"type":"number","title":"Price Ht"},"quantity":{"type":"integer","title":"Quantity","default":1}},"type":"object","required":["description","price_ht"],"title":"FreeLineSchema"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IdentiteDevis":{"properties":{"identite":{"type":"object","title":"Identite","default":{}}},"type":"object","title":"IdentiteDevis"},"Invitation":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"role":{"type":"string","title":"Role","default":"membre"}},"type":"object","required":["email"],"title":"Invitation"},"LigneCommande":{"properties":{"type":{"type":"string","title":"Type","default":"produit"},"ps_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ps Id"},"reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference"},"nom":{"type":"string","title":"Nom"},"variante":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variante"},"declinaison":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Declinaison"},"prix":{"type":"number","title":"Prix","default":0},"qte":{"type":"integer","title":"Qte","default":1},"image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image"},"options":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Options"},"calques":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Calques"},"perso":{"anyOf":[{"$ref":"#/components/schemas/PersoModel"},{"type":"null"}]}},"type":"object","required":["nom"],"title":"LigneCommande"},"LineCreate":{"properties":{"line_type":{"type":"string","title":"Line Type","default":"watch"},"ps_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ps Id"},"combo_image_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Combo Image Id"},"ps_declinaison_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ps Declinaison Id"},"catalogue_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Catalogue Ref"},"catalogue_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Catalogue Name"},"collection":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Collection"},"model_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Ref"},"model_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Name"},"base_price":{"type":"number","title":"Base Price","default":0},"selected_options":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Selected Options"},"options_total":{"type":"number","title":"Options Total","default":0},"custom_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Description"},"special_customization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Special Customization"},"needle_config":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Needle Config"},"watch_description":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Watch Description"},"custom_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Image"},"quantity":{"type":"integer","title":"Quantity","default":1},"unit_price_ht":{"type":"number","title":"Unit Price Ht","default":0},"sort_order":{"type":"integer","title":"Sort Order","default":0},"wrist_size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wrist Size"},"cord_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cord Color"},"limited_serial":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Limited Serial"},"limited_series_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limited Series Id"},"limited_entry_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limited Entry Id"},"stock_serial":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stock Serial"},"piece_unique_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Piece Unique Id"},"delivery_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Status"},"delivery_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Mode"},"packaging_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Packaging Type","default":"ecrin"},"packaging_details":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Packaging Details"},"discount_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discount Type"},"discount_value":{"type":"number","title":"Discount Value","default":0}},"type":"object","title":"LineCreate"},"MajConsentement":{"properties":{"newsletter":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Newsletter"},"cgv":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Cgv"},"langue":{"type":"string","title":"Langue","default":"fr"},"page":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page"}},"type":"object","title":"MajConsentement"},"MajDevise":{"properties":{"libelle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Libelle"},"taux":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Taux"},"symbole":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Symbole"},"position":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Position"},"decimales":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Decimales"},"facturable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Facturable"},"actif":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Actif"},"taux_fixe":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Taux Fixe"}},"type":"object","title":"MajDevise"},"ManualAvailableRequest":{"properties":{"recipient":{"$ref":"#/components/schemas/ManualRecipient"},"weight":{"type":"number","title":"Weight"},"length":{"type":"integer","title":"Length","default":25},"width":{"type":"integer","title":"Width","default":20},"height":{"type":"integer","title":"Height","default":12},"quantity":{"type":"integer","title":"Quantity","default":1},"goods_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Goods Value"},"insurance":{"type":"boolean","title":"Insurance","default":false},"ddp":{"type":"boolean","title":"Ddp","default":false},"tariff_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tariff Number"},"saturday_delivery":{"type":"boolean","title":"Saturday Delivery","default":false},"holiday_delivery":{"type":"boolean","title":"Holiday Delivery","default":false},"pickup_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pickup Date"}},"type":"object","required":["recipient","weight"],"title":"ManualAvailableRequest"},"ManualCreateRequest":{"properties":{"recipient":{"$ref":"#/components/schemas/ManualRecipient"},"weight":{"type":"number","title":"Weight"},"length":{"type":"integer","title":"Length","default":25},"width":{"type":"integer","title":"Width","default":20},"height":{"type":"integer","title":"Height","default":12},"quantity":{"type":"integer","title":"Quantity","default":1},"goods_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Goods Value"},"insurance":{"type":"boolean","title":"Insurance","default":false},"ddp":{"type":"boolean","title":"Ddp","default":false},"tariff_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tariff Number"},"saturday_delivery":{"type":"boolean","title":"Saturday Delivery","default":false},"holiday_delivery":{"type":"boolean","title":"Holiday Delivery","default":false},"pickup_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pickup Date"},"service":{"$ref":"#/components/schemas/ManualServiceChoice"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content","default":"Colis BRM"},"reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference"},"notify_recipient":{"type":"boolean","title":"Notify Recipient","default":false}},"type":"object","required":["recipient","weight","service"],"title":"ManualCreateRequest"},"ManualRecipient":{"properties":{"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company","default":""},"firstname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Firstname","default":""},"lastname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lastname","default":""},"address_line1":{"type":"string","title":"Address Line1"},"postal_code":{"type":"string","title":"Postal Code"},"city":{"type":"string","title":"City"},"country":{"type":"string","title":"Country","default":"France"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State","default":""},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone","default":""},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","default":""}},"type":"object","required":["address_line1","postal_code","city"],"title":"ManualRecipient"},"ManualServiceChoice":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"carrier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Carrier"},"total_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Price"}},"type":"object","required":["id"],"title":"ManualServiceChoice"},"Marque":{"properties":{"interessante":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Interessante"},"note":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Note"}},"type":"object","title":"Marque"},"MesureEvenement":{"properties":{"event_name":{"type":"string","title":"Event Name"},"event_id":{"type":"string","title":"Event Id"},"event_source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Source Url"},"fbp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fbp"},"fbc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fbc"},"custom_data":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Custom Data"},"consent":{"type":"boolean","title":"Consent","default":false}},"type":"object","required":["event_name","event_id"],"title":"MesureEvenement"},"ModeleEntrant":{"properties":{"slug":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Slug"},"reference":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Reference"},"nom":{"anyOf":[{"type":"string","maxLength":160},{"type":"null"}],"title":"Nom"},"prix_base":{"anyOf":[{"type":"number","maximum":1000000.0,"minimum":0.0},{"type":"null"}],"title":"Prix Base"},"diametre_mm":{"anyOf":[{"type":"integer","maximum":80.0,"minimum":10.0},{"type":"null"}],"title":"Diametre Mm"},"image":{"anyOf":[{"type":"string","maxLength":600},{"type":"null"}],"title":"Image"},"position":{"anyOf":[{"type":"integer","maximum":999.0,"minimum":0.0},{"type":"null"}],"title":"Position"},"actif":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Actif"}},"type":"object","title":"ModeleEntrant"},"ModeleMaj":{"properties":{"ecart":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Ecart"},"statut":{"type":"string","pattern":"^(confirme|a_confirmer|hors_gamme)$","title":"Statut"},"conflit":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Conflit"},"ps_id_image":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ps Id Image"}},"type":"object","required":["statut"],"title":"ModeleMaj"},"Multiplicateur":{"properties":{"coef":{"type":"number","title":"Coef"},"appliquer":{"type":"boolean","title":"Appliquer","default":true}},"type":"object","required":["coef"],"title":"Multiplicateur"},"NoReviewUpdate":{"properties":{"no_review_request":{"type":"boolean","title":"No Review Request","default":true}},"type":"object","title":"NoReviewUpdate"},"NouveauCode":{"properties":{"code":{"type":"string","title":"Code"},"libelle":{"type":"string","title":"Libelle","default":""},"type":{"type":"string","title":"Type","default":"montant"},"valeur":{"type":"number","title":"Valeur"},"devise":{"type":"string","title":"Devise","default":"EUR"},"plafond":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Plafond"},"minimum":{"type":"number","title":"Minimum","default":0},"debut":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Debut"},"fin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fin"},"usages_max":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Usages Max"},"usages_par_client":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Usages Par Client"},"unique_par_client":{"type":"boolean","title":"Unique Par Client","default":true},"cumulable":{"type":"boolean","title":"Cumulable","default":false},"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"},"email_cible":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Cible"},"ps_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Ps Ids"},"categories":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Categories"},"actif":{"type":"boolean","title":"Actif","default":true}},"type":"object","required":["code","valeur"],"title":"NouveauCode","description":"Un code de réduction tel que la direction le décide. Rien n'a de défaut\nfinancier : un code vaut ce que l'administrateur y met, et pas un centime de\nplus. Aucun code n'existe au départ — c'est voulu."},"NouvelleDevise":{"properties":{"code":{"type":"string","title":"Code"},"libelle":{"type":"string","title":"Libelle","default":""},"taux":{"type":"number","title":"Taux"},"symbole":{"type":"string","title":"Symbole","default":""},"position":{"type":"string","title":"Position","default":"apres"},"decimales":{"type":"integer","title":"Decimales","default":2},"facturable":{"type":"boolean","title":"Facturable","default":false}},"type":"object","required":["code","taux"],"title":"NouvelleDevise"},"NouvelleSession":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"consentement":{"type":"boolean","title":"Consentement","default":false},"langue":{"type":"string","maxLength":5,"title":"Langue","default":"fr"},"page":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Page"},"ps_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ps Id"},"ecart_vise":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Ecart Vise"},"base_qr":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Base Qr"},"essai":{"type":"boolean","title":"Essai","default":false}},"type":"object","required":["email"],"title":"NouvelleSession"},"OrderCreate":{"properties":{"client_type":{"type":"string","title":"Client Type","default":"B2C"},"client_odoo_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Odoo Id"},"client_company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Company"},"client_siret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Siret"},"client_vat_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Vat Number"},"client_first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client First Name"},"client_last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Last Name"},"client_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Email"},"client_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Phone"},"shipping_address_line1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shipping Address Line1"},"shipping_address_line2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shipping Address Line2"},"shipping_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shipping City"},"shipping_postal_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shipping Postal Code"},"shipping_country":{"type":"string","title":"Shipping Country","default":"France"},"shipping_state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shipping State"},"shipping_recipient_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shipping Recipient Name"},"shipping_recipient_company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shipping Recipient Company"},"shipping_recipient_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shipping Recipient Phone"},"billing_same_as_shipping":{"type":"boolean","title":"Billing Same As Shipping","default":true},"billing_address_line1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Address Line1"},"billing_address_line2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Address Line2"},"billing_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing City"},"billing_postal_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Postal Code"},"billing_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Country"},"tva_zone":{"type":"string","title":"Tva Zone","default":"france"},"web_prix_paye":{"type":"boolean","title":"Web Prix Paye","default":false},"discount_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discount Type"},"discount_value":{"type":"number","title":"Discount Value","default":0},"shipping_cost":{"type":"number","title":"Shipping Cost","default":0},"delivery_delay_default":{"type":"string","title":"Delivery Delay Default","default":"6-8 semaines"},"delivery_rush_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Delivery Rush Days"},"delivery_date_estimated":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Date Estimated"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"internal_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Internal Notes"},"payment_schedule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Schedule"},"pdf_language":{"type":"string","title":"Pdf Language","default":"fr"},"commercial_attribution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commercial Attribution"},"commercial_team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Commercial Team Id"}},"type":"object","title":"OrderCreate"},"OrderNote":{"properties":{"text":{"type":"string","title":"Text"}},"type":"object","required":["text"],"title":"OrderNote"},"Org":{"properties":{"nom":{"type":"string","title":"Nom"},"adresse":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Adresse"},"code_postal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code Postal"},"ville":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ville"},"pays":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pays","default":"FR"},"siret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Siret"},"tva_intracom":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tva Intracom"},"capital":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Capital"},"forme_juridique":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Forme Juridique"},"email_facturation":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email Facturation"},"langues_defaut":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Langues Defaut"},"domaine_defaut":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domaine Defaut"},"couleur":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Couleur"},"budget_mensuel_ht":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Budget Mensuel Ht"}},"type":"object","required":["nom"],"title":"Org"},"PanierEmail":{"properties":{"token":{"type":"string","maxLength":40,"minLength":8,"title":"Token"},"email":{"type":"string","format":"email","title":"Email"},"relance":{"type":"boolean","title":"Relance","default":false},"rappel":{"type":"boolean","title":"Rappel","default":false},"telephone":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Telephone"},"langue":{"type":"string","title":"Langue","default":"fr"},"pays":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pays"},"devise":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Devise"},"articles":{"items":{},"type":"array","title":"Articles","default":[]},"total":{"type":"number","title":"Total","default":0},"page":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Page"},"visiteur":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Visiteur"}},"type":"object","required":["token","email"],"title":"PanierEmail","description":"Le cadre « Recevoir mon panier par email », sur la page panier."},"PanierEnCours":{"properties":{"token":{"type":"string","maxLength":40,"minLength":8,"title":"Token"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"nom":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nom"},"langue":{"type":"string","title":"Langue","default":"fr"},"pays":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pays"},"devise":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Devise"},"etape":{"type":"string","title":"Etape","default":"panier"},"articles":{"items":{},"type":"array","title":"Articles","default":[]},"total":{"type":"number","title":"Total","default":0},"visiteur":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Visiteur"},"arrivee":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Arrivee"},"publicite":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Publicite"}},"type":"object","required":["token"],"title":"PanierEnCours"},"PayPalCapture":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"order_id":{"type":"string","maxLength":40,"minLength":5,"title":"Order Id"}},"type":"object","required":["email","order_id"],"title":"PayPalCapture"},"PaymentEntry":{"properties":{"amount":{"type":"number","title":"Amount"},"method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Method","default":""},"paid_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Paid At"},"reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference","default":""},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note","default":""}},"type":"object","required":["amount"],"title":"PaymentEntry"},"PaymentUpdate":{"properties":{"deposit_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Deposit Amount"},"deposit_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deposit Method"},"deposit_received":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Deposit Received"},"deposit_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deposit Date"},"balance_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Balance Amount"},"balance_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Balance Method"},"balance_received":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Balance Received"},"balance_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Balance Date"}},"type":"object","title":"PaymentUpdate"},"PaysDevise":{"properties":{"pays":{"type":"string","title":"Pays"},"devise":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Devise"}},"type":"object","required":["pays"],"title":"PaysDevise"},"PaysIn":{"properties":{"pays":{"items":{"type":"string"},"type":"array","title":"Pays"},"zone_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Zone Id"}},"type":"object","required":["pays"],"title":"PaysIn"},"PersoCadran":{"properties":{"jeton":{"type":"string","pattern":"^[A-Za-z0-9_-]{16,32}$","title":"Jeton"},"support":{"type":"string","enum":["cadran","verre"],"title":"Support"},"fond_retire":{"type":"boolean","title":"Fond Retire","default":false},"taille":{"type":"integer","enum":[70,85,100,115,130],"title":"Taille","default":100}},"type":"object","required":["jeton","support"],"title":"PersoCadran","description":"Logo client à 6 h : imprimé sur le cadran (plein) ou sur le verre (squelette)."},"PersoCouronne":{"properties":{"type":{"type":"string","enum":["logo","initiales"],"title":"Type"},"jeton":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9_-]{16,32}$"},{"type":"null"}],"title":"Jeton"},"initiales":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Initiales"}},"type":"object","required":["type"],"title":"PersoCouronne","description":"Bout de couronne : logo client gravé OU initiales (1 à 3, A–Z / 0–9)."},"PersoModel":{"properties":{"cadran":{"anyOf":[{"$ref":"#/components/schemas/PersoCadran"},{"type":"null"}]},"couronne":{"anyOf":[{"$ref":"#/components/schemas/PersoCouronne"},{"type":"null"}]}},"type":"object","title":"PersoModel","description":"`perso` d'une ligne du configurateur (contrat du 18/10/2026)."},"PersoParams":{"properties":{"largeur":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Largeur"},"hauteur_max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Hauteur Max"},"decalage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Decalage"},"dx":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Dx"},"dy":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Dy"},"k_verre":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"K Verre"},"largeur_logo":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Largeur Logo"},"largeur_initiales":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Largeur Initiales"}},"type":"object","title":"PersoParams"},"PersoVue":{"properties":{"dx":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Dx"},"dy":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Dy"},"echelle":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Echelle"},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Visible"},"reinitialiser":{"type":"boolean","title":"Reinitialiser","default":false}},"type":"object","title":"PersoVue"},"PieceCreate":{"properties":{"nom":{"type":"string","maxLength":160,"minLength":2,"title":"Nom"},"modele_ref":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Modele Ref"},"execution":{"type":"string","maxLength":120,"title":"Execution","default":""},"teinte":{"type":"string","maxLength":120,"title":"Teinte","default":""},"description":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Description"},"prix_ttc":{"type":"number","maximum":1000000.0,"minimum":0.0,"title":"Prix Ttc","default":0}},"type":"object","required":["nom"],"title":"PieceCreate"},"PriceRequest":{"properties":{"collection":{"type":"string","maxLength":80,"title":"Collection","default":""},"model_ref":{"type":"string","maxLength":80,"title":"Model Ref","default":""},"options":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Options"},"accessories":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Accessories"},"country":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Country"},"lang":{"type":"string","maxLength":5,"title":"Lang","default":"en"}},"type":"object","title":"PriceRequest","description":"`options` : les `option_id` du configurateur (voir\n/api/public/configurator/options/{collection}), en liste ou — forme\nhistorique — en dictionnaire catégorie → option_id. `country` (facultatif)\najoute le prix du pays de livraison."},"Promo":{"properties":{"code":{"type":"string","title":"Code"},"remise_pct":{"type":"integer","title":"Remise Pct"},"usages_max":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Usages Max"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["code","remise_pct"],"title":"Promo"},"QuoteLine":{"properties":{"tarif_part_id":{"type":"integer","title":"Tarif Part Id"},"quantity":{"type":"integer","title":"Quantity","default":1}},"type":"object","required":["tarif_part_id"],"title":"QuoteLine"},"Rang":{"properties":{"id":{"type":"string","title":"Id"},"position":{"type":"integer","maximum":9999.0,"minimum":0.0,"title":"Position"}},"type":"object","required":["id","position"],"title":"Rang"},"RecapSend":{"properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"attach_invoice":{"type":"boolean","title":"Attach Invoice","default":false}},"type":"object","title":"RecapSend"},"RecipientUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"address_line1":{"type":"string","title":"Address Line1"},"address_line2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Line2"},"postal_code":{"type":"string","title":"Postal Code"},"city":{"type":"string","title":"City"},"country":{"type":"string","title":"Country"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},"type":"object","required":["address_line1","postal_code","city","country"],"title":"RecipientUpdate","description":"Édition du destinataire d'expédition juste avant envoi (changement client de\ndernière minute) : adresse + éventuellement nom et société du destinataire."},"ReferenceCommerciale":{"properties":{"modele":{"type":"string","maxLength":80,"title":"Modele"},"reference_image":{"type":"string","maxLength":120,"title":"Reference Image"},"reference_commerciale":{"type":"string","maxLength":120,"title":"Reference Commerciale"}},"type":"object","required":["modele","reference_image","reference_commerciale"],"title":"ReferenceCommerciale"},"Refus":{"properties":{"motif":{"type":"string","maxLength":500,"title":"Motif","default":""}},"type":"object","title":"Refus"},"Reglage":{"properties":{"cle":{"type":"string","maxLength":40,"minLength":1,"title":"Cle"},"valeur":{"type":"string","title":"Valeur","default":""}},"type":"object","required":["cle"],"title":"Reglage"},"Reglages":{"properties":{"actif":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Actif"},"taux_enregistrement":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Taux Enregistrement"},"taux_survol":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Taux Survol"},"retention_jours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retention Jours"},"retention_interessantes_jours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retention Interessantes Jours"},"plafond_go":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Plafond Go"},"seuil_disque_pct":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seuil Disque Pct"},"reprise_disque_pct":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reprise Disque Pct"},"ips_internes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Ips Internes"},"alertes_actives":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Alertes Actives"},"alerte_panier_eur":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Alerte Panier Eur"},"alerte_panier_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Alerte Panier Minutes"},"analyste_actif":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Analyste Actif"},"analyste_plafond_usd_mois":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Analyste Plafond Usd Mois"}},"type":"object","title":"Reglages"},"ReglagesAcompteFinancement":{"properties":{"actif":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Actif"},"minimum_pourcentage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Minimum Pourcentage"},"minimum_euros":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Minimum Euros"},"solde_minimum":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Solde Minimum"},"seuil_ouverture":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Seuil Ouverture"},"durees":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Durees"},"temps2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Temps2"}},"type":"object","title":"ReglagesAcompteFinancement"},"RegleCatalogue":{"properties":{"portee":{"type":"string","title":"Portee"},"cible":{"type":"integer","title":"Cible"},"visible":{"type":"boolean","title":"Visible","default":true},"commandable":{"type":"boolean","title":"Commandable","default":true},"motif":{"type":"string","title":"Motif"},"actif":{"type":"boolean","title":"Actif","default":true}},"type":"object","required":["portee","cible","motif"],"title":"RegleCatalogue"},"RelanceHebdo":{"properties":{"active":{"type":"boolean","title":"Active","default":true},"emails":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emails"},"cc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cc"},"jours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Jours"},"test":{"type":"boolean","title":"Test","default":false}},"type":"object","title":"RelanceHebdo"},"RelancesPause":{"properties":{"jusqu":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Jusqu"},"motif":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Motif"}},"type":"object","title":"RelancesPause"},"RocketLead":{"properties":{"name":{"type":"string","maxLength":120,"minLength":2,"title":"Name"},"email":{"type":"string","format":"email","title":"Email"},"company":{"anyOf":[{"type":"string","maxLength":160},{"type":"null"}],"title":"Company"},"team_size":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Team Size"},"challenge":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Challenge"}},"type":"object","required":["name","email"],"title":"RocketLead"},"ServiceChoice":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"carrier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Carrier"},"total_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Price"}},"type":"object","required":["id"],"title":"ServiceChoice"},"ShippingAddressUpdate":{"properties":{"billing_same_as_shipping":{"type":"boolean","title":"Billing Same As Shipping","default":false},"shipping_address_line1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shipping Address Line1"},"shipping_address_line2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shipping Address Line2"},"shipping_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shipping City"},"shipping_postal_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shipping Postal Code"},"shipping_country":{"type":"string","title":"Shipping Country","default":"France"},"shipping_state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shipping State"},"shipping_recipient_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shipping Recipient Name"},"shipping_recipient_company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shipping Recipient Company"},"shipping_recipient_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shipping Recipient Phone"}},"type":"object","title":"ShippingAddressUpdate"},"Statut":{"properties":{"statut":{"type":"string","title":"Statut"}},"type":"object","required":["statut"],"title":"Statut"},"Suivi":{"properties":{"reference":{"type":"string","maxLength":30,"minLength":3,"title":"Reference"},"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["reference","email"],"title":"Suivi"},"TarifIn":{"properties":{"zone_id":{"type":"integer","title":"Zone Id"},"mini":{"type":"number","title":"Mini","default":0},"maxi":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Maxi"},"prix":{"type":"number","title":"Prix","default":0},"transporteur":{"type":"string","title":"Transporteur","default":""},"delai":{"type":"string","title":"Delai","default":""}},"type":"object","required":["zone_id"],"title":"TarifIn"},"TarifMaj":{"properties":{"mini":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mini"},"maxi":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Maxi"},"prix":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Prix"},"transporteur":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transporteur"},"delai":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delai"},"actif":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Actif"}},"type":"object","title":"TarifMaj"},"TexteEntrant":{"properties":{"nom":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Nom"},"slug":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Slug"},"description":{"anyOf":[{"type":"string","maxLength":60000},{"type":"null"}],"title":"Description"},"meta_titre":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Meta Titre"},"meta_description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Meta Description"}},"type":"object","title":"TexteEntrant"},"Validation":{"properties":{"message":{"anyOf":[{"type":"string","maxLength":1200},{"type":"null"}],"title":"Message"}},"type":"object","title":"Validation"},"ValidationCode":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"code":{"type":"string","maxLength":8,"minLength":4,"title":"Code"},"consentement":{"anyOf":[{"$ref":"#/components/schemas/Consentement"},{"type":"null"}]}},"type":"object","required":["email","code"],"title":"ValidationCode"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VerifPromo":{"properties":{"code":{"type":"string","title":"Code"},"lignes":{"items":{"$ref":"#/components/schemas/LigneCommande"},"type":"array","title":"Lignes"},"pays_livraison":{"type":"string","title":"Pays Livraison","default":""},"societe":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Societe"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"langue":{"type":"string","title":"Langue","default":"fr"}},"type":"object","required":["code","lignes"],"title":"VerifPromo"},"ZoneIn":{"properties":{"code":{"type":"string","maxLength":20,"minLength":1,"title":"Code"},"libelle":{"type":"string","title":"Libelle","default":""},"ordre":{"type":"integer","title":"Ordre","default":0}},"type":"object","required":["code"],"title":"ZoneIn"},"ZoneMaj":{"properties":{"libelle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Libelle"},"ordre":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ordre"},"actif":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Actif"}},"type":"object","title":"ZoneMaj"},"app__routers__agent_configurateur__Configuration":{"properties":{"model":{"type":"string","maxLength":80,"title":"Model","description":"Model slug, e.g. 'v6-44-sa'."},"options":{"items":{"type":"string"},"type":"array","maxItems":40,"title":"Options","description":"option_id values from GET /models/{model}."},"engraving":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Engraving"}},"type":"object","required":["model"],"title":"Configuration"},"app__routers__configurateur_admin__CategorieEntrante":{"properties":{"slug":{"type":"string","maxLength":80,"title":"Slug"},"cat_id":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Cat Id"},"noms":{"additionalProperties":{"type":"string"},"type":"object","title":"Noms"},"position":{"anyOf":[{"type":"integer","maximum":999.0,"minimum":0.0},{"type":"null"}],"title":"Position"},"parent_cat_id":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Parent Cat Id"},"calque_cat":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Calque Cat"},"z_index":{"anyOf":[{"type":"integer","maximum":999.0,"minimum":0.0},{"type":"null"}],"title":"Z Index"},"z_vues":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Z Vues"},"depends_on":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Depends On"},"actif":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Actif"}},"type":"object","required":["slug"],"title":"CategorieEntrante"},"app__routers__configurateur_admin__Reordonnancement":{"properties":{"slug":{"type":"string","maxLength":80,"title":"Slug"},"quoi":{"type":"string","pattern":"^(categories|elements)$","title":"Quoi"},"rangs":{"items":{"$ref":"#/components/schemas/Rang"},"type":"array","maxItems":500,"title":"Rangs"}},"type":"object","required":["slug","quoi"],"title":"Reordonnancement"},"app__routers__journal__DemandePublication":{"properties":{"mode":{"type":"string","pattern":"^(essai|complete)$","title":"Mode","default":"complete"}},"type":"object","title":"DemandePublication"},"app__routers__journal__Traduction":{"properties":{"segments":{"additionalProperties":{"type":"string"},"type":"object","title":"Segments"}},"type":"object","title":"Traduction"},"app__routers__produits_admin__Traduction":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}],"title":"Description"},"description_short":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Description Short"},"meta_title":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Meta Title"},"meta_description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Meta Description"}},"type":"object","title":"Traduction"},"app__routers__site_boutique__Commande":{"properties":{"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"lignes":{"items":{"$ref":"#/components/schemas/LigneCommande"},"type":"array","title":"Lignes"},"moyen_paiement":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Moyen Paiement"},"echeances":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Echeances"},"acompte_montant":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Acompte Montant"},"livraison":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Livraison"},"facturation":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Facturation"},"adresse_livraison":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Adresse Livraison"},"societe":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Societe"},"gravure":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gravure"},"commentaire":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commentaire"},"cadeau":{"type":"boolean","title":"Cadeau","default":false},"cadeau_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cadeau Message"},"consentement":{"anyOf":[{"$ref":"#/components/schemas/Consentement"},{"type":"null"}]},"langue":{"type":"string","title":"Langue","default":"fr"},"devise":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Devise"},"frais_port":{"type":"number","title":"Frais Port","default":0},"code_promo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code Promo"},"panier_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Panier Token"}},"type":"object","required":["lignes"],"title":"Commande"},"app__routers__site_boutique__Configuration":{"properties":{"nom":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nom"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference"},"prix":{"type":"number","title":"Prix","default":0},"selection":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Selection"},"gravure":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gravure"},"options":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Options"},"calques":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Calques"}},"type":"object","title":"Configuration"},"app__routers__site_boutique__Devis":{"properties":{"lignes":{"items":{"$ref":"#/components/schemas/LigneCommande"},"type":"array","title":"Lignes"},"pays_livraison":{"type":"string","title":"Pays Livraison","default":""},"societe":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Societe"},"devise":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Devise"},"langue":{"type":"string","title":"Langue","default":"fr"},"frais_port":{"type":"number","title":"Frais Port","default":0},"code_promo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code Promo"},"livraison":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Livraison"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},"type":"object","required":["lignes"],"title":"Devis","description":"Ce qu'il faut au serveur pour chiffrer un panier, et rien de plus.\n\nPas d'email, pas de nom : un visiteur doit pouvoir savoir ce qu'il paiera\nsans se présenter."},"app__routers__site_boutique__Profil":{"properties":{"prenom":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prenom"},"nom":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nom"},"telephone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Telephone"},"adresse":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Adresse"},"societe":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Societe"}},"type":"object","title":"Profil"},"app__routers__site_catalogue_admin__CategorieEntrante":{"properties":{"nom":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Nom"},"slug":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Slug"},"description":{"anyOf":[{"type":"string","maxLength":60000},{"type":"null"}],"title":"Description"},"meta_titre":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Meta Titre"},"meta_description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Meta Description"},"banniere":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Banniere"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"},"parent_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Parent Id"},"position":{"anyOf":[{"type":"integer","maximum":9999.0,"minimum":0.0},{"type":"null"}],"title":"Position"}},"type":"object","title":"CategorieEntrante","description":"Ce qu'on accepte de recevoir — et rien d'autre (pas d'affectation en masse)."},"app__routers__site_catalogue_admin__Reordonnancement":{"properties":{"parent_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Parent Id"},"ordre":{"items":{"type":"integer"},"type":"array","maxItems":500,"minItems":1,"title":"Ordre"}},"type":"object","required":["ordre"],"title":"Reordonnancement"},"app__routers__site_publication__DemandePublication":{"properties":{"mode":{"type":"string","pattern":"^(essai|complete)$","title":"Mode","default":"complete"},"etapes":{"items":{"type":"string"},"type":"array","maxItems":20,"title":"Etapes"},"commentaire":{"type":"string","maxLength":2000,"title":"Commentaire","default":""}},"type":"object","title":"DemandePublication","description":"Ce que l'écran envoie. Rien de tout cela n'atteint une commande shell :\n`mode` choisit entre deux argv constants, `etapes` sert uniquement à tester\nl'appartenance à un catalogue figé, `commentaire` ne va qu'en base."},"app__routers__translatio__Commande":{"properties":{"email":{"type":"string","title":"Email"},"langue_site":{"type":"string","title":"Langue Site","default":"fr"},"cgv":{"type":"boolean","title":"Cgv","default":false},"identite":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Identite"}},"type":"object","required":["email"],"title":"Commande"},"app__routers__translatio__Devis":{"properties":{"langues":{"items":{"type":"string"},"type":"array","title":"Langues"},"options":{"type":"object","title":"Options","default":{}},"domaine":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domaine"},"niveau":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Niveau"},"code_promo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code Promo"},"langue_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Langue Source"}},"type":"object","required":["langues"],"title":"Devis"},"app__routers__translatio__Profil":{"properties":{"prenom":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prenom"},"nom":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nom"},"langue":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Langue"},"societe":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Societe"}},"type":"object","title":"Profil"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}