{
  "openapi": "3.1.0",
  "info": {
    "title": "B.R.M Chronographes Public API",
    "description": "Public API for B.R.M Chronographes, a French luxury watch manufacture (EPV label). Browse the catalogue, explore collections, configure custom watches, verify serial numbers, and calculate prices. No authentication required.",
    "version": "1.0.0",
    "contact": {
      "name": "B.R.M Chronographes Digital",
      "email": "communication@brm-manufacture.com",
      "url": "https://brm-chronographes.com"
    }
  },
  "servers": [
    {
      "url": "https://api.brm-chronographes.com",
      "description": "BRM Production API"
    }
  ],
  "paths": {
    "/api/public/status": {
      "get": {
        "tags": [
          "BRM Public API"
        ],
        "summary": "Public Status",
        "operationId": "public_status_api_public_status_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      }
    },
    "/api/public/catalogue": {
      "get": {
        "tags": [
          "BRM Public API"
        ],
        "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": [
          "BRM Public API"
        ],
        "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": [
          "BRM Public API"
        ],
        "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": [
          "BRM Public API"
        ],
        "summary": "Public Configurator Options",
        "description": "Available customization options for a collection.",
        "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": [
          "BRM Public API"
        ],
        "summary": "Public Configurator Price",
        "description": "Calculate price for a custom watch configuration.",
        "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": [
          "BRM Public API"
        ],
        "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"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "AcceptInviteRequest": {
        "properties": {
          "token": {
            "type": "string",
            "title": "Token"
          },
          "first_name": {
            "type": "string",
            "maxLength": 100,
            "minLength": 1,
            "title": "First Name"
          },
          "last_name": {
            "type": "string",
            "maxLength": 100,
            "minLength": 1,
            "title": "Last Name"
          },
          "password": {
            "type": "string",
            "minLength": 10,
            "title": "Password"
          },
          "phone": {
            "type": "string",
            "maxLength": 20,
            "minLength": 10,
            "title": "Phone"
          }
        },
        "type": "object",
        "required": [
          "token",
          "first_name",
          "last_name",
          "password",
          "phone"
        ],
        "title": "AcceptInviteRequest"
      },
      "AddPartLine": {
        "properties": {
          "sav_id": {
            "type": "integer",
            "title": "Sav Id"
          },
          "tarif_part_id": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Tarif Part Id"
          },
          "designation": {
            "type": "string",
            "title": "Designation"
          },
          "category": {
            "type": "string",
            "title": "Category",
            "default": "Autre"
          },
          "quantity": {
            "type": "integer",
            "title": "Quantity",
            "default": 1
          }
        },
        "type": "object",
        "required": [
          "sav_id",
          "designation"
        ],
        "title": "AddPartLine"
      },
      "AiAnswersPayload": {
        "properties": {
          "answers": {
            "items": {},
            "type": "array",
            "title": "Answers"
          }
        },
        "type": "object",
        "required": [
          "answers"
        ],
        "title": "AiAnswersPayload"
      },
      "AiPrediagRequest": {
        "properties": {
          "all_answers": {
            "items": {},
            "type": "array",
            "title": "All Answers"
          }
        },
        "type": "object",
        "required": [
          "all_answers"
        ],
        "title": "AiPrediagRequest"
      },
      "AiRound2Request": {
        "properties": {
          "first_answers": {
            "items": {},
            "type": "array",
            "title": "First Answers"
          }
        },
        "type": "object",
        "required": [
          "first_answers"
        ],
        "title": "AiRound2Request"
      },
      "Body_add_comment_api_knowledge_articles__article_id__comments_post": {
        "properties": {
          "content": {
            "type": "string",
            "title": "Content"
          }
        },
        "type": "object",
        "required": [
          "content"
        ],
        "title": "Body_add_comment_api_knowledge_articles__article_id__comments_post"
      },
      "Body_create_article_api_knowledge_articles_post": {
        "properties": {
          "title": {
            "type": "string",
            "title": "Title"
          },
          "content": {
            "type": "string",
            "title": "Content"
          },
          "summary": {
            "type": "string",
            "title": "Summary",
            "default": ""
          },
          "category_id": {
            "type": "integer",
            "title": "Category Id"
          },
          "status": {
            "type": "string",
            "title": "Status",
            "default": "pending"
          },
          "tags": {
            "type": "string",
            "title": "Tags",
            "default": "[]"
          },
          "models": {
            "type": "string",
            "title": "Models",
            "default": "[]"
          },
          "related_parts": {
            "type": "string",
            "title": "Related Parts",
            "default": "[]"
          }
        },
        "type": "object",
        "required": [
          "title",
          "content",
          "category_id"
        ],
        "title": "Body_create_article_api_knowledge_articles_post"
      },
      "Body_create_category_api_knowledge_categories_post": {
        "properties": {
          "name": {
            "type": "string",
            "title": "Name"
          },
          "description": {
            "type": "string",
            "title": "Description",
            "default": ""
          },
          "icon": {
            "type": "string",
            "title": "Icon",
            "default": "FileText"
          }
        },
        "type": "object",
        "required": [
          "name"
        ],
        "title": "Body_create_category_api_knowledge_categories_post"
      },
      "Body_review_article_api_knowledge_articles__article_id__review_put": {
        "properties": {
          "action": {
            "type": "string",
            "title": "Action"
          },
          "note": {
            "type": "string",
            "title": "Note",
            "default": ""
          }
        },
        "type": "object",
        "required": [
          "action"
        ],
        "title": "Body_review_article_api_knowledge_articles__article_id__review_put"
      },
      "Body_update_article_api_knowledge_articles__article_id__put": {
        "properties": {
          "title": {
            "type": "string",
            "title": "Title"
          },
          "content": {
            "type": "string",
            "title": "Content"
          },
          "summary": {
            "type": "string",
            "title": "Summary",
            "default": ""
          },
          "category_id": {
            "type": "integer",
            "title": "Category Id"
          },
          "tags": {
            "type": "string",
            "title": "Tags",
            "default": "[]"
          },
          "models": {
            "type": "string",
            "title": "Models",
            "default": "[]"
          },
          "related_parts": {
            "type": "string",
            "title": "Related Parts",
            "default": "[]"
          }
        },
        "type": "object",
        "required": [
          "title",
          "content",
          "category_id"
        ],
        "title": "Body_update_article_api_knowledge_articles__article_id__put"
      },
      "Body_update_category_api_knowledge_categories__category_id__put": {
        "properties": {
          "name": {
            "type": "string",
            "title": "Name"
          },
          "description": {
            "type": "string",
            "title": "Description",
            "default": ""
          },
          "icon": {
            "type": "string",
            "title": "Icon",
            "default": "FileText"
          }
        },
        "type": "object",
        "required": [
          "name"
        ],
        "title": "Body_update_category_api_knowledge_categories__category_id__put"
      },
      "Body_upload_attachment_api_knowledge_articles__article_id__attachments_post": {
        "properties": {
          "file": {
            "type": "string",
            "format": "binary",
            "title": "File"
          }
        },
        "type": "object",
        "required": [
          "file"
        ],
        "title": "Body_upload_attachment_api_knowledge_articles__article_id__attachments_post"
      },
      "Body_upload_photo_api_sav__sav_id__photos_post": {
        "properties": {
          "file": {
            "type": "string",
            "format": "binary",
            "title": "File"
          }
        },
        "type": "object",
        "required": [
          "file"
        ],
        "title": "Body_upload_photo_api_sav__sav_id__photos_post"
      },
      "CategoryUpdate": {
        "properties": {
          "default_threshold": {
            "type": "integer",
            "title": "Default Threshold"
          },
          "orange_pct": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Orange Pct",
            "default": 10
          }
        },
        "type": "object",
        "required": [
          "default_threshold"
        ],
        "title": "CategoryUpdate"
      },
      "CertificateRequest": {
        "properties": {
          "serial_number": {
            "type": "string",
            "title": "Serial Number"
          },
          "client_name": {
            "type": "string",
            "title": "Client Name"
          },
          "client_address": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Client Address"
          },
          "client_postal_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Client Postal Code"
          },
          "client_city": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Client City"
          },
          "client_country": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Client Country"
          }
        },
        "type": "object",
        "required": [
          "serial_number",
          "client_name"
        ],
        "title": "CertificateRequest"
      },
      "ChangePasswordRequest": {
        "properties": {
          "current_password": {
            "type": "string",
            "title": "Current Password"
          },
          "new_password": {
            "type": "string",
            "minLength": 10,
            "title": "New Password"
          }
        },
        "type": "object",
        "required": [
          "current_password",
          "new_password"
        ],
        "title": "ChangePasswordRequest"
      },
      "ChatMessage": {
        "properties": {
          "role": {
            "type": "string",
            "title": "Role"
          },
          "content": {
            "type": "string",
            "title": "Content"
          }
        },
        "type": "object",
        "required": [
          "role",
          "content"
        ],
        "title": "ChatMessage"
      },
      "ChatRequest": {
        "properties": {
          "messages": {
            "items": {
              "$ref": "#/components/schemas/ChatMessage"
            },
            "type": "array",
            "title": "Messages"
          }
        },
        "type": "object",
        "required": [
          "messages"
        ],
        "title": "ChatRequest"
      },
      "ClientBase": {
        "properties": {
          "last_name": {
            "type": "string",
            "maxLength": 100,
            "minLength": 1,
            "title": "Last Name"
          },
          "first_name": {
            "type": "string",
            "maxLength": 100,
            "minLength": 1,
            "title": "First Name"
          },
          "email": {
            "type": "string",
            "format": "email",
            "title": "Email"
          },
          "phone": {
            "type": "string",
            "minLength": 1,
            "title": "Phone"
          },
          "address": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Address"
          },
          "address2": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Address2"
          },
          "postal_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Postal Code"
          },
          "city": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "City"
          },
          "country": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Country"
          }
        },
        "type": "object",
        "required": [
          "last_name",
          "first_name",
          "email",
          "phone"
        ],
        "title": "ClientBase"
      },
      "ClubClientUpdate": {
        "properties": {
          "phone": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Phone"
          },
          "address": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Address"
          },
          "city": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "City"
          },
          "country": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Country"
          },
          "preferences": {
            "anyOf": [
              {
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Preferences"
          }
        },
        "type": "object",
        "title": "ClubClientUpdate"
      },
      "ClubSavCreate": {
        "properties": {
          "watch_serial": {
            "type": "string",
            "title": "Watch Serial"
          },
          "watch_model": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Watch Model"
          },
          "problem_description": {
            "type": "string",
            "title": "Problem Description"
          },
          "client_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Client Name"
          },
          "client_phone": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Client Phone"
          }
        },
        "type": "object",
        "required": [
          "watch_serial",
          "problem_description"
        ],
        "title": "ClubSavCreate"
      },
      "ClubTokenResponse": {
        "properties": {
          "access_token": {
            "type": "string",
            "title": "Access Token"
          },
          "token_type": {
            "type": "string",
            "title": "Token Type",
            "default": "bearer"
          },
          "client": {
            "type": "object",
            "title": "Client"
          }
        },
        "type": "object",
        "required": [
          "access_token",
          "client"
        ],
        "title": "ClubTokenResponse"
      },
      "HTTPValidationError": {
        "properties": {
          "detail": {
            "items": {
              "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
          }
        },
        "type": "object",
        "title": "HTTPValidationError"
      },
      "InviteRequest": {
        "properties": {
          "email": {
            "type": "string",
            "format": "email",
            "title": "Email"
          },
          "role": {
            "type": "string",
            "title": "Role",
            "default": "horloger"
          },
          "tools": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Tools",
            "default": []
          }
        },
        "type": "object",
        "required": [
          "email"
        ],
        "title": "InviteRequest"
      },
      "InviteResponse": {
        "properties": {
          "message": {
            "type": "string",
            "title": "Message"
          },
          "email": {
            "type": "string",
            "title": "Email"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time",
            "title": "Expires At"
          }
        },
        "type": "object",
        "required": [
          "message",
          "email",
          "expires_at"
        ],
        "title": "InviteResponse"
      },
      "MagicLinkRequest": {
        "properties": {
          "email": {
            "type": "string",
            "title": "Email"
          }
        },
        "type": "object",
        "required": [
          "email"
        ],
        "title": "MagicLinkRequest"
      },
      "MagicLinkVerify": {
        "properties": {
          "token": {
            "type": "string",
            "title": "Token"
          }
        },
        "type": "object",
        "required": [
          "token"
        ],
        "title": "MagicLinkVerify"
      },
      "MovementCreate": {
        "properties": {
          "part_id": {
            "type": "integer",
            "title": "Part Id"
          },
          "type": {
            "type": "string",
            "title": "Type"
          },
          "quantity": {
            "type": "integer",
            "title": "Quantity"
          },
          "note": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Note"
          }
        },
        "type": "object",
        "required": [
          "part_id",
          "type",
          "quantity"
        ],
        "title": "MovementCreate"
      },
      "NoteCreate": {
        "properties": {
          "content": {
            "type": "string",
            "minLength": 1,
            "title": "Content"
          }
        },
        "type": "object",
        "required": [
          "content"
        ],
        "title": "NoteCreate"
      },
      "NoteResponse": {
        "properties": {
          "id": {
            "type": "integer",
            "title": "Id"
          },
          "user_name": {
            "type": "string",
            "title": "User Name"
          },
          "content": {
            "type": "string",
            "title": "Content"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "title": "Created At"
          }
        },
        "type": "object",
        "required": [
          "id",
          "user_name",
          "content",
          "created_at"
        ],
        "title": "NoteResponse"
      },
      "NotificationCount": {
        "properties": {
          "unread": {
            "type": "integer",
            "title": "Unread"
          },
          "notifications": {
            "items": {
              "$ref": "#/components/schemas/NotificationOut"
            },
            "type": "array",
            "title": "Notifications"
          }
        },
        "type": "object",
        "required": [
          "unread",
          "notifications"
        ],
        "title": "NotificationCount"
      },
      "NotificationOut": {
        "properties": {
          "id": {
            "type": "integer",
            "title": "Id"
          },
          "type": {
            "type": "string",
            "title": "Type"
          },
          "title": {
            "type": "string",
            "title": "Title"
          },
          "message": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Message"
          },
          "link": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Link"
          },
          "read": {
            "type": "boolean",
            "title": "Read"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "title": "Created At"
          }
        },
        "type": "object",
        "required": [
          "id",
          "type",
          "title",
          "read",
          "created_at"
        ],
        "title": "NotificationOut"
      },
      "OTPVerifyRequest": {
        "properties": {
          "email": {
            "type": "string",
            "format": "email",
            "title": "Email"
          },
          "code": {
            "type": "string",
            "maxLength": 6,
            "minLength": 6,
            "title": "Code"
          }
        },
        "type": "object",
        "required": [
          "email",
          "code"
        ],
        "title": "OTPVerifyRequest"
      },
      "PhotoResponse": {
        "properties": {
          "id": {
            "type": "integer",
            "title": "Id"
          },
          "filename": {
            "type": "string",
            "title": "Filename"
          },
          "filepath": {
            "type": "string",
            "title": "Filepath"
          },
          "phase": {
            "type": "string",
            "title": "Phase"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "title": "Created At"
          }
        },
        "type": "object",
        "required": [
          "id",
          "filename",
          "filepath",
          "phase",
          "created_at"
        ],
        "title": "PhotoResponse"
      },
      "PriceRequest": {
        "properties": {
          "collection": {
            "type": "string",
            "title": "Collection"
          },
          "model_ref": {
            "type": "string",
            "title": "Model Ref"
          },
          "options": {
            "anyOf": [
              {
                "additionalProperties": {
                  "type": "string"
                },
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Options",
            "default": {}
          },
          "accessories": {
            "anyOf": [
              {
                "additionalProperties": {
                  "type": "integer"
                },
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Accessories",
            "default": {}
          }
        },
        "type": "object",
        "required": [
          "collection",
          "model_ref"
        ],
        "title": "PriceRequest"
      },
      "ProfileUpdate": {
        "properties": {
          "first_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "First Name"
          },
          "last_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Name"
          },
          "phone": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Phone"
          },
          "email_notifications": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Email Notifications"
          }
        },
        "type": "object",
        "title": "ProfileUpdate"
      },
      "RefreshRequest": {
        "properties": {
          "refresh_token": {
            "type": "string",
            "title": "Refresh Token"
          }
        },
        "type": "object",
        "required": [
          "refresh_token"
        ],
        "title": "RefreshRequest"
      },
      "SavAssign": {
        "properties": {
          "user_id": {
            "type": "integer",
            "title": "User Id"
          },
          "phase": {
            "type": "string",
            "pattern": "^(diagnostic|repair)$",
            "title": "Phase"
          }
        },
        "type": "object",
        "required": [
          "user_id",
          "phase"
        ],
        "title": "SavAssign",
        "description": "Assignation à un horloger (diagnostic ou réparation)"
      },
      "SavCreate": {
        "properties": {
          "client": {
            "$ref": "#/components/schemas/ClientBase"
          },
          "watch": {
            "$ref": "#/components/schemas/WatchBase"
          },
          "reason": {
            "type": "string",
            "minLength": 1,
            "title": "Reason"
          },
          "reason_other": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Reason Other"
          },
          "issue_description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Issue Description"
          },
          "ai_followup_data": {
            "anyOf": [
              {
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ai Followup Data"
          },
          "shipping_method": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Shipping Method"
          },
          "lang": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Lang",
            "default": "fr"
          },
          "send_email": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Send Email",
            "default": true
          }
        },
        "type": "object",
        "required": [
          "client",
          "watch",
          "reason"
        ],
        "title": "SavCreate",
        "description": "Schéma pour la création d'un SAV via le formulaire client"
      },
      "SavDiagnostic": {
        "properties": {
          "watchmaker_actions": {
            "type": "string",
            "title": "Watchmaker Actions"
          },
          "watchmaker_parts": {
            "type": "string",
            "title": "Watchmaker Parts"
          }
        },
        "type": "object",
        "required": [
          "watchmaker_actions",
          "watchmaker_parts"
        ],
        "title": "SavDiagnostic",
        "description": "Diagnostic horloger"
      },
      "SavListItem": {
        "properties": {
          "id": {
            "type": "integer",
            "title": "Id"
          },
          "reference": {
            "type": "string",
            "title": "Reference"
          },
          "status": {
            "type": "string",
            "title": "Status"
          },
          "client_last_name": {
            "type": "string",
            "title": "Client Last Name"
          },
          "client_first_name": {
            "type": "string",
            "title": "Client First Name"
          },
          "client_email": {
            "type": "string",
            "title": "Client Email"
          },
          "client_phone": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Client Phone"
          },
          "watch_model": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Watch Model"
          },
          "watch_serial": {
            "type": "string",
            "title": "Watch Serial"
          },
          "reason": {
            "type": "string",
            "title": "Reason"
          },
          "reason_other": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Reason Other"
          },
          "stolen_check": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Stolen Check"
          },
          "warranty": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Warranty"
          },
          "warranty_days": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Warranty Days"
          },
          "quote_amount": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Quote Amount"
          },
          "shipping_tracking": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Shipping Tracking"
          },
          "return_tracking": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Return Tracking"
          },
          "payment_status": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Payment Status"
          },
          "reception_date": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "title": "Reception Date"
          },
          "reminders_sent": {
            "type": "integer",
            "title": "Reminders Sent"
          },
          "assigned_to": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Assigned To"
          },
          "repair_assigned_to": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Repair Assigned To"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "title": "Created At"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "title": "Updated At"
          }
        },
        "type": "object",
        "required": [
          "id",
          "reference",
          "status",
          "client_last_name",
          "client_first_name",
          "client_email",
          "client_phone",
          "watch_model",
          "watch_serial",
          "reason",
          "reason_other",
          "stolen_check",
          "warranty",
          "warranty_days",
          "quote_amount",
          "payment_status",
          "reception_date",
          "reminders_sent",
          "assigned_to",
          "repair_assigned_to",
          "created_at",
          "updated_at"
        ],
        "title": "SavListItem"
      },
      "SavPayment": {
        "properties": {
          "payment_method": {
            "type": "string",
            "pattern": "^(virement|cb|stripe|garantie)$",
            "title": "Payment Method"
          }
        },
        "type": "object",
        "required": [
          "payment_method"
        ],
        "title": "SavPayment",
        "description": "Enregistrement du paiement"
      },
      "SavQuote": {
        "properties": {
          "quote_amount": {
            "anyOf": [
              {
                "type": "number",
                "minimum": 0.0
              },
              {
                "type": "string"
              }
            ],
            "title": "Quote Amount"
          },
          "odoo_invoice_ref": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Odoo Invoice Ref"
          },
          "odoo_invoice_date": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "title": "Odoo Invoice Date"
          }
        },
        "type": "object",
        "required": [
          "quote_amount"
        ],
        "title": "SavQuote",
        "description": "Création / mise à jour du devis"
      },
      "SavQuoteSent": {
        "properties": {
          "sent": {
            "type": "boolean",
            "title": "Sent",
            "default": true
          }
        },
        "type": "object",
        "title": "SavQuoteSent",
        "description": "Marquer le devis comme envoyé"
      },
      "SavShipReturn": {
        "properties": {
          "return_tracking": {
            "type": "string",
            "title": "Return Tracking"
          },
          "return_carrier": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Return Carrier"
          },
          "return_date": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "title": "Return Date"
          }
        },
        "type": "object",
        "required": [
          "return_tracking"
        ],
        "title": "SavShipReturn",
        "description": "Expédition retour au client"
      },
      "SavStats": {
        "properties": {
          "total": {
            "type": "integer",
            "title": "Total"
          },
          "by_status": {
            "type": "object",
            "title": "By Status"
          },
          "total_quotes": {
            "type": "string",
            "title": "Total Quotes"
          },
          "paid_quotes": {
            "type": "string",
            "title": "Paid Quotes",
            "default": "0"
          },
          "avg_days": {
            "type": "number",
            "title": "Avg Days"
          },
          "warranty_rate": {
            "type": "number",
            "title": "Warranty Rate"
          },
          "overdue_count": {
            "type": "integer",
            "title": "Overdue Count"
          }
        },
        "type": "object",
        "required": [
          "total",
          "by_status",
          "total_quotes",
          "avg_days",
          "warranty_rate",
          "overdue_count"
        ],
        "title": "SavStats"
      },
      "SavStolenCheck": {
        "properties": {
          "stolen": {
            "type": "boolean",
            "title": "Stolen"
          }
        },
        "type": "object",
        "required": [
          "stolen"
        ],
        "title": "SavStolenCheck",
        "description": "Vérification montre volée"
      },
      "SavUpdateClient": {
        "properties": {
          "last_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Name"
          },
          "first_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "First Name"
          },
          "email": {
            "anyOf": [
              {
                "type": "string",
                "format": "email"
              },
              {
                "type": "null"
              }
            ],
            "title": "Email"
          },
          "phone": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Phone"
          },
          "address": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Address"
          },
          "address2": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Address2"
          },
          "postal_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Postal Code"
          },
          "city": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "City"
          },
          "country": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Country"
          }
        },
        "type": "object",
        "title": "SavUpdateClient",
        "description": "Mise à jour des infos client par Kim"
      },
      "SavUpdateReason": {
        "properties": {
          "reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Reason"
          },
          "reason_other": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Reason Other"
          },
          "issue_description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Issue Description"
          },
          "ai_followup_data": {
            "anyOf": [
              {
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ai Followup Data"
          }
        },
        "type": "object",
        "title": "SavUpdateReason",
        "description": "Mise à jour du motif par Kim"
      },
      "SavUpdateReception": {
        "properties": {
          "reception_date": {
            "type": "string",
            "format": "date",
            "title": "Reception Date"
          },
          "awaiting_watch": {
            "type": "boolean",
            "title": "Awaiting Watch",
            "default": false
          },
          "reception_condition": {
            "type": "string",
            "title": "Reception Condition",
            "default": ""
          }
        },
        "type": "object",
        "required": [
          "reception_date"
        ],
        "title": "SavUpdateReception",
        "description": "Réception de la montre"
      },
      "SavUpdateShipping": {
        "properties": {
          "shipping_date": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "title": "Shipping Date"
          },
          "shipping_carrier": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Shipping Carrier"
          },
          "shipping_tracking": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Shipping Tracking"
          },
          "return_tracking": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Return Tracking"
          }
        },
        "type": "object",
        "title": "SavUpdateShipping",
        "description": "Infos d'envoi client"
      },
      "SavUpdateWatch": {
        "properties": {
          "model": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Model"
          },
          "serial": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Serial"
          },
          "purchase_date": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "title": "Purchase Date"
          },
          "invoice": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Invoice"
          }
        },
        "type": "object",
        "title": "SavUpdateWatch",
        "description": "Mise à jour des infos montre par Kim"
      },
      "UpdatePartLine": {
        "properties": {
          "quantity": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Quantity"
          },
          "price_ht": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Price Ht"
          }
        },
        "type": "object",
        "title": "UpdatePartLine"
      },
      "UserOut": {
        "properties": {
          "id": {
            "type": "integer",
            "title": "Id"
          },
          "email": {
            "type": "string",
            "title": "Email"
          },
          "first_name": {
            "type": "string",
            "title": "First Name"
          },
          "last_name": {
            "type": "string",
            "title": "Last Name"
          },
          "role": {
            "type": "string",
            "title": "Role"
          },
          "status": {
            "type": "string",
            "title": "Status"
          },
          "tools": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Tools"
          },
          "last_login": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Login"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "title": "Created At"
          }
        },
        "type": "object",
        "required": [
          "id",
          "email",
          "first_name",
          "last_name",
          "role",
          "status",
          "tools",
          "created_at"
        ],
        "title": "UserOut"
      },
      "UserUpdate": {
        "properties": {
          "role": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Role"
          },
          "tools": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Tools"
          },
          "status": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Status"
          },
          "phone": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Phone"
          }
        },
        "type": "object",
        "title": "UserUpdate"
      },
      "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"
      },
      "WatchBase": {
        "properties": {
          "model": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Model"
          },
          "serial": {
            "type": "string",
            "maxLength": 50,
            "minLength": 2,
            "title": "Serial"
          },
          "purchase_date": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "title": "Purchase Date"
          },
          "invoice": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Invoice"
          }
        },
        "type": "object",
        "required": [
          "serial"
        ],
        "title": "WatchBase"
      },
      "app__routers__parts__PartCreate": {
        "properties": {
          "reference": {
            "type": "string",
            "title": "Reference"
          },
          "name": {
            "type": "string",
            "title": "Name"
          },
          "category_id": {
            "type": "integer",
            "title": "Category Id"
          },
          "modele": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Modele"
          },
          "matiere": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Matiere"
          },
          "couleur": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Couleur"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "stock": {
            "type": "integer",
            "title": "Stock",
            "default": 0
          },
          "threshold_override": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Threshold Override"
          },
          "emplacement": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Emplacement"
          }
        },
        "type": "object",
        "required": [
          "reference",
          "name",
          "category_id"
        ],
        "title": "PartCreate"
      },
      "app__routers__parts__PartUpdate": {
        "properties": {
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name"
          },
          "category_id": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Category Id"
          },
          "modele": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Modele"
          },
          "matiere": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Matiere"
          },
          "couleur": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Couleur"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "threshold_override": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Threshold Override"
          },
          "emplacement": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Emplacement"
          }
        },
        "type": "object",
        "title": "PartUpdate"
      },
      "app__routers__tarifs_sav__PartCreate": {
        "properties": {
          "tab": {
            "type": "string",
            "title": "Tab"
          },
          "designation": {
            "type": "string",
            "title": "Designation"
          },
          "category": {
            "type": "string",
            "title": "Category",
            "default": "Autre"
          },
          "price_ht": {
            "type": "number",
            "title": "Price Ht"
          }
        },
        "type": "object",
        "required": [
          "tab",
          "designation",
          "price_ht"
        ],
        "title": "PartCreate"
      },
      "app__routers__tarifs_sav__PartUpdate": {
        "properties": {
          "designation": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Designation"
          },
          "category": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Category"
          },
          "price_ht": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Price Ht"
          }
        },
        "type": "object",
        "title": "PartUpdate"
      }
    },
    "securitySchemes": {
      "HTTPBearer": {
        "type": "http",
        "scheme": "bearer"
      }
    }
  }
}
