{"openapi":"3.1.0","info":{"title":"ProTarget — мобильный API торговых точек — API v2","description":"New API (migration in progress).\n\nv2 — актуальная бизнес-логика и новые схемы. Все новые изменения добавляем сюда.","contact":{"name":"Protarget Team"},"version":"2.0"},"servers":[{"url":"/api/v2"}],"paths":{"/orders":{"post":{"tags":["Orders"],"summary":"Создать заказ","description":"Создаёт заказ **в актуальной логике v2**.\n\n## Общие правила\n- Пользователь берётся из `Authorization` (initiator = текущий пользователь).\n- Все проверки корзины/остатков/минимальной суммы/лимитов/промо выполняются в сервисе.\n- Операция атомарная: запись заказа + транзакций + подарков выполняется в рамках `OrderUnitOfWork`.\n\n## Лимиты акций\n- Если остатка бюджета акции недостаточно для расчётной скидки заказа,\n  акция к заказу не применяется целиком (без частичных скидок).\n\n## Отличия от v1\n- v2 — единственная поддерживаемая версия создания заказа.\n- v1 (`POST /api/v1/orders`) помечен deprecated и всегда возвращает 410.","operationId":"create_order_orders_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"Accept-Language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOrderRequestV2Schema","description":"Данные для создания заказа.","examples":[{"outlet_id":"8d8c2d3a-1111-2222-3333-444444444444","organization_id":"2a0f01f4-9b7b-4f2e-8a21-7e40ba2cbf0b","suborganization_id":"2b7bdc2a-9aa2-4c98-8a4b-1234567890ab","portfolio_id":"4e301256-1808-4212-8abc-2b2aedac3e7f","delivery_date":"2026-06-30","payment_method":"cash"}]}}}},"responses":{"201":{"description":"Заказ успешно создан.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponseSchema"}}}},"400":{"description":"Ошибка в данных запроса или нарушение бизнес-ограничений.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"401":{"description":"Неавторизованный пользователь.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"404":{"description":"Не найдены торговая точка / портфель / продукт или связанный ресурс.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"409":{"description":"Конфликт состояния при создании заказа.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"500":{"description":"Внутренняя ошибка сервера.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"422":{"description":"Ошибка валидации тела запроса."}}}},"/orders/{order_id}":{"get":{"tags":["Orders"],"summary":"Получить детализацию заказа","description":"Возвращает детализацию заказа текущего пользователя по `order_id`.\n\n## Правила\n- Заказ должен принадлежать текущему пользователю.\n- При отсутствии — 404.\n\nПримечание: если у тебя есть отдельная v2-схема ответа — подставь её в `response_model`.","operationId":"get_order_orders__order_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"string","format":"uuid4","description":"UUID заказа","examples":["5af8c223-d882-4351-a33b-b0dc50eedd53"],"title":"Order Id"},"description":"UUID заказа"},{"name":"Accept-Language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Детали заказа.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderDetailResponseV2Schema"}}}},"401":{"description":"Неавторизованный пользователь.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"404":{"description":"Заказ не найден/недоступен.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"500":{"description":"Внутренняя ошибка сервера.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Orders"],"summary":"Обновить pending-заказ","description":"Обновляет **pending** заказ (v2).\n\n## Ключевые правила\n- Обновляется только `pending` заказ.\n- Дополнительно применяется ограничение по “свежести” (например, <= 10 минут), если оно у тебя есть.\n- Пересборка транзакций/подарков выполняется сервисом атомарно через `OrderUnitOfWork`.\n\n## selected_gifts\n- Если `selected_gifts` не передан (`null`) — сервис может переиспользовать текущие gifts заказа.","operationId":"update_order_orders__order_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"string","format":"uuid4","description":"UUID заказа","examples":["5af8c223-d882-4351-a33b-b0dc50eedd53"],"title":"Order Id"},"description":"UUID заказа"},{"name":"Accept-Language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOrderRequestSchema","description":"Данные обновления заказа:\n- `product_id`: товар для изменения;\n- `quantity`: новое количество (в упаковках);\n- `selected_gifts`: выбранные подарки или null для переиспользования.\n"}}}},"responses":{"200":{"description":"Заказ успешно обновлён.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponseSchema"}}}},"400":{"description":"Нарушение бизнес-ограничений.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"401":{"description":"Неавторизованный пользователь.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"404":{"description":"Заказ не найден/не pending/не свежий.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"409":{"description":"Конфликт состояния при пересборке.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"500":{"description":"Внутренняя ошибка сервера.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/carts":{"get":{"tags":["Carts"],"summary":"Получить корзину","description":"Возвращает корзину **в актуальном формате v2**.\n\n## Группировка\n- Верхний уровень: **parent-организация**\n- Внутри: список **портфелей** этой parent-организации\n\n## Что возвращается для портфеля\n- товары + промо (скидки/подарки)\n- суммы/скидки\n- доступные контракты\n- доступные способы оплаты (всегда содержит `cash` и `pos_terminal`)\n- маршруты (v2)\n- настройки торговой точки, релевантные портфелю\n\n## Оптимизация\n- позиции корзины читаются одним запросом (get_products_v2)\n- портфели одним запросом\n- дальше bulk/parallel: parent orgs, sub orgs, routes, outlet types, warehouses, contracts\n- тяжёлое (product_details + promotions) считается батчами по sub-org\n\n## Лимиты акций\n- Если по акции не хватает остатка бюджета, скидка по ней в корзине не применяется.\n- Товар остаётся в корзине по стандартной цене.","operationId":"get_cart_carts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"outlet_id","in":"query","required":true,"schema":{"type":"string","format":"uuid4","description":"Идентификатор торговой точки, для которой нужно получить корзину","examples":["8d8c2d3a-1111-2222-3333-444444444444"],"title":"Outlet Id"},"description":"Идентификатор торговой точки, для которой нужно получить корзину"},{"name":"Accept-Language","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept-Language"}}],"responses":{"200":{"description":"Корзина пользователя по указанной торговой точке (v2).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CartResponseV2Schema"}}}},"400":{"description":"Нарушение бизнес-ограничений/неконсистентное состояние корзины.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"401":{"description":"Неавторизованный или неактивный пользователь.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"404":{"description":"Торговая точка не найдена/недоступна.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"409":{"description":"Конфликт/недоступность части данных корзины (например, товары недоступны).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"500":{"description":"Внутренняя ошибка сервера при сборке корзины.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"CartContractSchema":{"properties":{"type":{"$ref":"#/components/schemas/ContractTypeEnum","description":"Тип контракта (credit, mix, cash, prepayment и т.д.).","examples":["credit","mix"]},"number":{"type":"string","title":"Number","description":"Номер контракта, по которому будет оформлен заказ.","examples":["CT-2024-004121","MX-5521"]}},"type":"object","required":["type","number"],"title":"Cart Contract Schema","description":"Схема контракта, привязанного к корзине.\n\nИспользуется для отображения информации о том,\nпо какому контракту будет оформлен заказ:\n  - тип контракта (credit, mix, cash и т.п.)\n  - номер контракта\n\nЭти данные приходят из слоя бизнес-логики расчёта корзины."},"CartGiftResponseSchema":{"properties":{"id":{"type":"string","format":"uuid4","title":"Id","description":"Уникальный идентификатор товара (UID в БД). Во внешнем API отдаётся под ключом 'id'."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Основное наименование товара."},"images":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Images","description":"Список URL-адресов изображений товара."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Основное текстовое описание товара."},"pieces_per_package":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pieces Per Package","description":"Количество единиц товара в одной упаковке."},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active","description":"Флаг активности товара (если False — скрыт из каталога).","examples":[true]},"category_id":{"anyOf":[{"type":"string","format":"uuid4"},{"type":"null"}],"title":"Category Id","description":"UUID категории товара.","examples":["a72f0c62-9869-4db2-b20c-45d8b3bd2c68"]},"id_product":{"type":"integer","title":"Id Product","description":"Внутренний числовой ID товара.","examples":[103030]},"brand_id":{"anyOf":[{"type":"string","format":"uuid4"},{"type":"null"}],"title":"Brand Id","description":"UUID бренда товара.","examples":["c81d3c93-faa4-4632-b9ad-21d9d8e1463e"]},"remaining":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Remaining","description":"Доступный остаток данного подарочного товара.","examples":[5,20]},"warehouse_id":{"anyOf":[{"type":"string","format":"uuid4"},{"type":"null"}],"title":"Warehouse Id","description":"Склад, с которого может быть выдан подарок.","examples":["73f8cc2f-c7eb-49fe-9a6a-77f92437d2b1"]},"base_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Base Price","description":"Базовая цена товара. Используется для расчётов стоимости подарков, бюджетных ограничений и аналитики.","examples":[120.5]},"reference_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference Code","description":"Внутренний справочный код товара в рамках организации.","examples":["CHC-50-CL"]}},"type":"object","required":["id","id_product"],"title":"Cart Gift Response Schema","description":"Схема товара-подарка, используемого в промоакциях.\n\nНе содержит всей товарной информации (как ProductResponseSchema),\nа только минимальный набор данных, необходимых для отображения списка подарков."},"CartOrganizationGroupV2Schema":{"properties":{"organization":{"$ref":"#/components/schemas/OrganizationResponseSchema","description":"Родительская организация, к которой относится эта группа корзины."},"portfolios":{"items":{"$ref":"#/components/schemas/CartPortfolioBlockV2Schema"},"type":"array","title":"Portfolios","description":"Список портфельных блоков этой организации (все портфели организации)."}},"type":"object","required":["organization"],"title":"Cart Organization Group V2 Schema","description":"Группа корзины для одной parent-организации (V2).\n\nВнутри — все портфели, принадлежащие этой организации\n(каждый портфель — отдельный блок)."},"CartPortfolioBlockV2Schema":{"properties":{"portfolio":{"$ref":"#/components/schemas/PortfolioResponseSchema","description":"Портфель, к которому относятся товары."},"sum":{"type":"number","title":"Sum","description":"Сумма по портфелю без учёта скидок.","examples":[150600.0]},"discount_sum":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Discount Sum","description":"Суммарная скидка по портфелю (если есть).","examples":[10000.0,null]},"products":{"items":{"$ref":"#/components/schemas/ProductCheckoutSchema"},"type":"array","title":"Products","description":"Товарные позиции по данному портфелю."},"gifts":{"anyOf":[{"items":{"$ref":"#/components/schemas/PromotionGiftsSchema"},"type":"array"},{"type":"null"}],"title":"Gifts","description":"Подарки по промо, относящиеся к этому портфелю."},"contracts":{"anyOf":[{"items":{"$ref":"#/components/schemas/CartContractSchema"},"type":"array"},{"type":"null"}],"title":"Contracts","description":"Контракты, доступные для оформления заказа по данному портфелю."},"routes":{"anyOf":[{"items":{"$ref":"#/components/schemas/ScheduledRouteResponseSchema"},"type":"array"},{"type":"null"}],"title":"Routes","description":"Маршруты, релевантные store_type данного портфеля."},"payment_methods":{"items":{"$ref":"#/components/schemas/PaymentMethodEnum"},"type":"array","title":"Payment Methods","description":"Доступные способы оплаты для store_type данного портфеля. Всегда содержит 'cash' и 'pos_terminal'. 'bank' доступен только если у портфеля есть контракт типа bank или mix. 'credit' доступен только если у портфеля есть контракт типа credit или mix."},"outlet_setting":{"anyOf":[{"$ref":"#/components/schemas/OutletSettingResponseSchema"},{"type":"null"}],"description":"Настройки торговой точки, релевантные store_type данного портфеля."}},"type":"object","required":["portfolio","sum","payment_methods"],"title":"Cart Portfolio Block V2 Schema","description":"Блок корзины для одного портфеля + store_type-зависимые метаданные.\n\nИспользуется, когда клиенту нужно получать:\n  - маршруты для store_type данного портфеля,\n  - доступные способы оплаты (вычисленные по контрактам),\n  - настройки торговой точки (релевантные store_type)."},"CartResponseV2Schema":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/CartOrganizationGroupV2Schema"},"type":"array","title":"Groups","description":"Список групп корзины по parent-организациям."}},"type":"object","title":"Cart Grouped By Parent Organization Response Schema (V2)","description":"Ответ корзины (V2).\n\nКорзина состоит из нескольких групп:\n  - каждая группа относится к одной parent-организации;\n  - внутри группы — все портфели этой организации (без дополнительной группировки по store_type);\n  - каждый портфель содержит товары, подарки, суммы и store_type-зависимые метаданные\n    (маршруты/способы оплаты/настройки)."},"ContractTypeEnum":{"type":"string","enum":["bank","credit","mix"],"title":"ContractTypeEnum"},"CreateOrderRequestV2Schema":{"properties":{"outlet_id":{"type":"string","format":"uuid4","title":"Outlet Id","description":"Идентификатор торговой точки, для которой создаётся заказ.","examples":["5af8c223-d882-4351-a33b-b0dc50eedd53"]},"organization_id":{"type":"string","format":"uuid4","title":"Organization Id","description":"Идентификатор родительской организации, от имени которой создаётся заказ.","examples":["2a0f01f4-9b7b-4f2e-8a21-7e40ba2cbf0b"]},"payment_method":{"$ref":"#/components/schemas/PaymentMethodEnum","description":"Способ оплаты заказа (наличные/безнал/отсрочка и т.п.).","examples":["cash","pos_terminal","bank","credit"]},"selected_gifts":{"anyOf":[{"items":{"$ref":"#/components/schemas/OrderGiftRequestSchema"},"type":"array"},{"type":"null"}],"title":"Selected Gifts","description":"Список выбранных пользователем подарков по доступным промоакциям. Для каждой пары (promotion_id, product_id) допускается только одна запись.","examples":[[{"product_id":"304e7c03-69d5-4032-ac44-e56951e06f89","promotion_id":"25356657-88c9-4e85-b5dc-d856e67bef32","quantity":1}],null]},"delivery_date":{"type":"string","format":"date","title":"Delivery Date","description":"Дата планируемой доставки заказа (локальное время клиента).","examples":["2025-06-15"]},"suborganization_id":{"type":"string","format":"uuid4","title":"Suborganization Id","description":"Идентификатор суб-организации (organization_id портфеля). Нужен для корректной загрузки SettingsOutlet / outlet_type_ids / финансов.","examples":["2b7bdc2a-9aa2-4c98-8a4b-1234567890ab"]},"portfolio_id":{"type":"string","format":"uuid4","title":"Portfolio Id","description":"Идентификатор портфеля, по которому создаётся заказ (в V2 — один портфель).","examples":["4e301256-1808-4212-8abc-2b2aedac3e7f"]},"contract_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contract Number","description":"Номер договора для данного портфеля. Может быть не указан, если политика оплаты это допускает.","examples":["CN-2025-00123",null]}},"type":"object","required":["outlet_id","organization_id","payment_method","delivery_date","suborganization_id","portfolio_id"],"title":"Order Create Schema V2","description":"CreateOrderRequest V2.\n\nПравки относительно V1:\n  - transfer_type УБРАН полностью;\n  - заказ создаётся строго по одному портфелю;\n  - вместо portfolio_contracts(list) — ОДНА связка на верхнем уровне:\n      * portfolio_id\n      * contract_number (опционален/обязателен по политике payment_method)\n  - добавлен suborganization_id (суб-организация портфеля).\n\nЭто подразумевает создание заказа строго по одному портфелю за запрос."},"DeliveryResponseSchema":{"properties":{"id":{"type":"string","format":"uuid4","title":"Id","description":"Уникальный идентификатор рейса доставки (UUID). Используется как основной идентификатор в API.","examples":["73f8cc2f-c7eb-49fe-9a6a-77f92437d2b1"]},"trip_id":{"type":"integer","title":"Trip Id","description":"Внутренний числовой идентификатор рейса в логистической системе. Может использоваться для интеграций с внешними системами и отладкой.","examples":[1024]},"delivery_date":{"type":"string","format":"date","title":"Delivery Date","description":"Дата рейса / планируемой доставки заказов в рамках этого рейса. Временная зона зависит от бизнес-настроек, обычно локальное время региона.","examples":["2025-06-15"]}},"type":"object","required":["id","trip_id","delivery_date"],"title":"Delivery Response Schema","description":"Схема ответа с информацией о рейсе доставки.\n\nИспользуется, например, в составе `OrderResponseSchema.trip`\nдля отображения краткой информации о рейсе, к которому привязан заказ.\n\nСтруктура полей:\n  * Идентификаторы:\n      - `id` — основной UUID рейса (используется как ключ в API);\n      - `trip_id` — числовой внутренний идентификатор рейса.\n  * Даты:\n      - `delivery_date` — дата рейса / планируемой доставки."},"ErrorDetailSchema":{"properties":{"code":{"type":"integer","title":"Code"},"message":{"type":"string","title":"Message"},"key":{"type":"string","title":"Key"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta"}},"type":"object","required":["code","message","key"],"title":"ErrorDetailSchema"},"ErrorResponseSchema":{"properties":{"detail":{"$ref":"#/components/schemas/ErrorDetailSchema"}},"type":"object","required":["detail"],"title":"ErrorResponseSchema"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"MessageResponseSchema":{"properties":{"message":{"type":"string","title":"Message","description":"Текст ответа, кратко описывающий результат операции.","examples":["Password updated successfully","Operation completed"]},"detail":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Detail","description":"Дополнительная информация для клиента или отладки. Может содержать произвольный набор полей.","examples":[{"affected_rows":1},{"reason":"token expired"}]}},"type":"object","required":["message"],"title":"MessageResponseSchema","description":"Универсальная схема текстового ответа API.\n\nПредназначена для возврата простого человекочитаемого сообщения (`message`)\nи, при необходимости, дополнительной диагностической информации (`detail`).\n\nИспользуется:\n  * для информирования об успешном выполнении операции;\n  * для возврата простых статусов;\n  * как fallback-ответ в ряде эндпоинтов без сложной структуры данных."},"OrderDetailResponseV2Schema":{"properties":{"id":{"type":"string","format":"uuid4","title":"Id","description":"Уникальный идентификатор заказа (UUID).","examples":["5af8c223-d882-4351-a33b-b0dc50eedd53"]},"internal_order_id":{"type":"integer","title":"Internal Order Id","description":"Числовой идентификатор заказа (внутренний порядковый номер).","examples":[12345]},"organization":{"anyOf":[{"$ref":"#/components/schemas/OrganizationResponseSchema"},{"type":"null"}],"description":"Информация об организации, от имени которой оформлен заказ. Может быть `null`, если организация не найдена (что считается аномалией)."},"outlet":{"anyOf":[{"$ref":"#/components/schemas/OutletResponseSchema"},{"type":"null"}],"description":"Информация о торговой точке (Outlet), к которой относится заказ. Может быть `null`, если точка не подгружалась или не найдена."},"status":{"$ref":"#/components/schemas/OrderStatusEnum","description":"Текущий статус заказа."},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"Дополнительное текстовое пояснение к статусу заказа, если есть.","examples":["Отменён клиентом",null]},"payment_method":{"$ref":"#/components/schemas/PaymentMethodEnum","description":"Способ оплаты заказа."},"payment_status":{"$ref":"#/components/schemas/PaymentStatusEnum","description":"Текущий статус оплаты заказа."},"total_sum":{"type":"number","title":"Total Sum","description":"Итоговая сумма заказа с учётом всех скидок (`final_price`).","examples":[12500.5]},"creation_date":{"type":"string","format":"date-time","title":"Creation Date","description":"Дата и время создания заказа (в UTC)."},"trip":{"anyOf":[{"$ref":"#/components/schemas/DeliveryResponseSchema"},{"type":"null"}],"description":"Информация о доставке / рейсе, к которому привязан заказ. Может быть `null`, если заказ ещё не распределён по рейсам."},"contract_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contract Number","description":"Номер договора заказа (если применим).","examples":["CN-2025-00123",null]},"products":{"items":{"$ref":"#/components/schemas/ProductCheckoutSchema"},"type":"array","title":"Products","description":"Единый список товарных позиций заказа."},"gifts":{"anyOf":[{"items":{"$ref":"#/components/schemas/OrderGiftResponseSchema"},"type":"array"},{"type":"null"}],"title":"Gifts","description":"Список подарков, начисленных по промоакциям в рамках заказа."}},"type":"object","required":["id","internal_order_id","status","payment_method","payment_status","total_sum","creation_date"],"title":"Order Detail Response V2 Schema","description":"Детализация заказа — V2 (упрощённая).\n\nОтличия от V1:\n  - НЕТ группировки по договорам.\n  - Возвращается один `contract_number` (optional).\n  - `products` — единый список всех позиций заказа.\n  - `gifts` — подарки по промо (опционально).\n\ncontract_number:\n  - None, если договор не применим/не задан;\n  - если транзакции содержат разные номера договоров (грязные данные) —\n    сервис ставит None и пишет warning (см. реализацию)."},"OrderGiftRequestSchema":{"properties":{"promotion_id":{"type":"string","format":"uuid4","title":"Promotion Id","description":"Идентификатор промоакции, из которой выбирается подарок.","examples":["25356657-88c9-4e85-b5dc-d856e67bef32"]},"product_id":{"type":"string","format":"uuid4","title":"Product Id","description":"Идентификатор продукта-подарка, доступного в рамках промоакции.","examples":["304e7c03-69d5-4032-ac44-e56951e06f89"]},"quantity":{"type":"integer","exclusiveMinimum":0.0,"title":"Quantity","description":"Количество выбранных подарков данного товара по промоакции.","examples":[1,2,5]}},"type":"object","required":["promotion_id","product_id","quantity"],"title":"Order Gift Request Schema","description":"Элемент списка выбранных подарков по промоакциям при создании заказа.\n\nОписывает:\n  * какую промоакцию пользователь использует;\n  * какой продукт-подарок выбрал;\n  * в каком количестве он выбирает этот подарок."},"OrderGiftResponseSchema":{"properties":{"id":{"type":"string","format":"uuid4","title":"Id","description":"Уникальный идентификатор товара (UID в БД). Во внешнем API отдаётся под ключом 'id'."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Основное наименование товара."},"images":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Images","description":"Список URL-адресов изображений товара."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Основное текстовое описание товара."},"pieces_per_package":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pieces Per Package","description":"Количество единиц товара в одной упаковке."},"secondary_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secondary Name","description":"Дополнительное/альтернативное наименование товара (например, на другом языке или сокращённый вариант).","examples":["Coca-Cola 1L"]},"brand_id":{"anyOf":[{"type":"string","format":"uuid4"},{"type":"null"}],"title":"Brand Id","description":"Идентификатор бренда подарочного товара.","examples":["c81d3c93-faa4-4632-b9ad-21d9d8e1463e",null]},"id_product":{"type":"integer","title":"Id Product","description":"Внутренний числовой ID товара.","examples":[103030]},"quantity":{"type":"integer","title":"Quantity","description":"Количество подарочного товара в этом заказе.","examples":[1,2,5]},"promotion_id":{"anyOf":[{"type":"string","format":"uuid4"},{"type":"null"}],"title":"Promotion Id","description":"Идентификатор промоакции, по которой был начислен подарок.","examples":["ea48a435-941f-4bf2-a6db-d3df8217ff96",null]},"reference":{"anyOf":[{"$ref":"#/components/schemas/ProductReferenceSchema"},{"type":"null"}],"description":"Справочная информация товара (артикул/код/и т.п.). Должна совпадать с тем, что отдаёт каталог. Обычно выбирается по organization_id (из портфеля/заказа)."}},"type":"object","required":["id","id_product","quantity"],"title":"Order Gift Response Schema","description":"Схема товара-подарка внутри оформленного заказа.\n\nНаследуется от `ProductBaseSchema`, поэтому включает базовую товарную\nинформацию, а также дополнительные поля, относящиеся к подарку в контексте заказа:\n\n  * `brand_id` — бренд товара;\n  * `id_product` — внутренний числовой ID товара;\n  * `quantity` — количество подарочных единиц в заказе;\n  * `promotion_id` — промоакция, по которой начислен подарок."},"OrderStatusEnum":{"type":"string","enum":["pending","approved","confirmed","processing","assembled","rejected","shipped","delivered","completed","cancelled","failed"],"title":"OrderStatusEnum"},"OrganizationResponseSchema":{"properties":{"id":{"type":"string","format":"uuid4","title":"Id","description":"Уникальный идентификатор организации.","examples":["8d8c0cf5-94b2-4f32-8aab-9d4b9c9c3c10"]},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Наименование организации.","examples":["ТОО Example Company"]},"parent_id":{"anyOf":[{"type":"string","format":"uuid4"},{"type":"null"}],"title":"Parent Id","description":"UID родительской организации (если есть).","examples":["6b0dc2f0-9a61-4cba-8b56-6b8a3c8f39f2"]}},"type":"object","required":["id"],"title":"Organization Response Schema","description":"Короткая схема организации — обычно используется в выпадающих списках/связках.\n\nСодержит минимум:\n- id (uid) организации\n- name\n- parent_id\n\nПримечание:\n- `uid` отдаём как `id` через alias для удобства фронта."},"OutletBankDetailsSchema":{"properties":{"name":{"type":"string","title":"Name","description":"Наименование юридического лица / торговой точки для банковских реквизитов.","examples":["ТОО «Ромашка»"]},"bin":{"type":"string","title":"Bin","description":"БИН/ИНН организации.","examples":["990740001234"]},"bic":{"type":"string","title":"Bic","description":"БИК банка.","examples":["ALMNKZKA"]},"iban":{"type":"string","title":"Iban","description":"Номер банковского счёта (IBAN).","examples":["KZ779999999999999999"]},"kbe":{"type":"string","title":"Kbe","description":"Код назначения платежа (КБе).","examples":["17"]},"bank_name":{"type":"string","title":"Bank Name","description":"Наименование банка, в котором открыт счёт.","examples":["АО «Казкоммерцбанк»"]},"contact":{"type":"string","title":"Contact","description":"Контактная информация по реквизитам (ФИО, телефон и т.п.).","examples":["Иванов Иван, +7 777 000 00 00"]}},"type":"object","title":"Outlet Bank Details Schema","description":"Банковские реквизиты торговой точки.\n\nВсе строковые поля по умолчанию возвращаются как пустая строка,\nдаже если в базе они были NULL. Это упрощает работу фронта:\nможно не проверять поле на None."},"OutletResponseSchema":{"properties":{"id":{"type":"string","format":"uuid4","title":"Id","description":"Уникальный идентификатор торговой точки.","examples":["5af8c223-d882-4351-a33b-b0dc50eedd53"]},"name":{"type":"string","title":"Name","description":"Отображаемое название торговой точки.","examples":["Magnum Small №123"]},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"Контактный email торговой точки. Может быть пустой строкой.","default":"","examples":["outlet@example.com",""]},"status":{"$ref":"#/components/schemas/OutletStatusEnum","description":"Текущий статус торговой точки (активна, заблокирована и т.п.).","examples":["active","blocked"]},"street":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Street","description":"Адрес торговой точки (улица, дом).","default":"","examples":["ул. Абая, 10",""]},"location_id":{"anyOf":[{"type":"string","format":"uuid4"},{"type":"null"}],"title":"Location Id","description":"Идентификатор локации/города, к которой привязана торговая точка.","examples":["8d8c0cf5-94b2-4f32-8aab-9d4b9c9c3c10",null]},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude","description":"Широта торговой точки (в формате WGS84).","examples":[43.238949,null]},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude","description":"Долгота торговой точки (в формате WGS84).","examples":[76.889709,null]},"bank_details":{"items":{"$ref":"#/components/schemas/OutletBankDetailsSchema"},"type":"array","title":"Bank Details","description":"Список банковских реквизитов торговой точки. Может быть пустым, если реквизиты не заполнены.","examples":[[{"bank_name":"АО «Казкоммерцбанк»","bic":"ALMNKZKA","bin":"990740001234","contact":"Иванов Иван, +7 777 000 00 00","iban":"KZ779999999999999999","kbe":"17","name":"ТОО «Ромашка»"}],[]]}},"type":"object","required":["id","name","status"],"title":"Outlet Response Schema","description":"Основная схема ответа для торговой точки.\n\nИспользуется, например, при:\n  - получении списка торговых точек пользователя;\n  - детализации информации по конкретной точке;\n  - привязке точки к заказу/маршруту и т.п."},"OutletSettingResponseSchema":{"properties":{"outlet_type_id":{"type":"string","format":"uuid4","title":"Outlet Type Id","description":"UUID типа торговой точки. Определяет бизнес-правила, опции оплаты, маршрутизацию и другие характеристики точки.","examples":["7e0f0c1b-d2ff-44ab-bf33-5b9fd58e52cb"]},"max_debts_limit":{"type":"number","title":"Max Debts Limit","description":"Максимально допустимая задолженность торговой точки. Если текущий долг превышает это значение, заказ может быть запрещён.","examples":[500000.0]},"expire_days":{"type":"integer","title":"Expire Days","description":"Количество дней, через которое истекает действие заказа или связанных данных.","examples":[7,14]},"min_order_limit":{"type":"number","title":"Min Order Limit","description":"Минимальная сумма заказа, ниже которой оформление невозможно.","examples":[10000.0]}},"type":"object","required":["outlet_type_id","max_debts_limit","expire_days","min_order_limit"],"title":"Outlet Setting Response Schema","description":"Настройки торговой точки, описывающие лимиты, тип точки\nи правила, влияющие на создание заказов."},"OutletStatusEnum":{"type":"string","enum":["active","notregistered","inactive","on_moderation"],"title":"OutletStatusEnum"},"PaymentMethodEnum":{"type":"string","enum":["cash","pos_terminal","credit","bank","free","cash_credit","pre_cash"],"title":"PaymentMethodEnum"},"PaymentStatusEnum":{"type":"string","enum":["pending","paid","failed"],"title":"PaymentStatusEnum"},"PortfolioResponseSchema":{"properties":{"id":{"type":"string","format":"uuid4","title":"Id","description":"Уникальный идентификатор портфеля (UID в БД). Во внешнем API отдаётся под ключом 'id'."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Человекочитаемое название портфеля (например, 'Основной', 'Акционный', 'Ключевые клиенты')."},"store_type":{"anyOf":[{"$ref":"#/components/schemas/StoreTypeEnum"},{"type":"null"}],"description":"Тип магазина/канала, к которому относится портфель (значение перечисления StoreTypeEnum, сериализуется в строку)."},"organization":{"anyOf":[{"$ref":"#/components/schemas/OrganizationResponseSchema"},{"type":"null"}],"description":"Организация-владелец портфеля."}},"type":"object","required":["id"],"title":"Portfolio Response Schema","description":"Основная схема ответа для портфеля.\n\nИспользуется, например, при выдаче списка портфелей,\nпри выборе портфеля для корзины/заказа и т.п."},"ProductCheckoutSchema":{"properties":{"id":{"type":"string","format":"uuid4","title":"Id","description":"Уникальный идентификатор товара (UID в БД). Во внешнем API отдаётся под ключом 'id'."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Основное наименование товара."},"images":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Images","description":"Список URL-адресов изображений товара."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Основное текстовое описание товара."},"pieces_per_package":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pieces Per Package","description":"Количество единиц товара в одной упаковке."},"total_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Price","description":"Цена всей позиции без скидки (quantity × unit_price).","examples":[1500.0]},"unit_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Unit Price","description":"Цена за одну единицу товара без скидок.","examples":[150.0]},"base_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Base Price","description":"Базовая цена товара по складу (до применения промо-скидок).","examples":[150.0]},"quantity":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Quantity","description":"Количество товара в корзине.","examples":[1,2,5.5]},"stock_remaining":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Stock Remaining","description":"Доступный остаток товара на складах.","examples":[23,120,0]},"promotion":{"anyOf":[{"$ref":"#/components/schemas/PromotionCheckoutResponseSchema"},{"type":"null"}],"description":"Результат применения промо к позиции. Если промо не применено — null."},"reference":{"anyOf":[{"$ref":"#/components/schemas/ProductReferenceSchema"},{"type":"null"}],"description":"Справочная информация товара (артикул/код/и т.п.). Должна совпадать с тем, что отдаёт каталог. Обычно выбирается по organization_id (из портфеля/заказа)."},"added_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Added At","description":"Дата и время добавления товара в корзину.","examples":["2025-01-23T11:42:01Z"]}},"type":"object","required":["id"],"title":"Product Response Cart Schema","description":"Схема товара в корзине или заказе.\n\nВажно:\n  - базовые поля товара приходят из ProductBaseSchema;\n  - количество, остатки и \"обычные\" цены — производные значения;\n  - всё, что относится к применённой промоакции и итоговым ценам \"после промо\"\n    вынесено в объект `promotion`;\n  - reference — справочник товара в разрезе организации (как отдаёт каталог)."},"ProductReferenceSchema":{"properties":{"organization_id":{"type":"string","format":"uuid4","title":"Organization Id","description":"Идентификатор организации, для которой актуальна данная запись справочника товара."},"code":{"type":"string","title":"Code","description":"Внутренний код товара в учётной системе организации."},"article":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Article","description":"Артикул товара (если используется в учётной системе)."},"display_with_zero":{"type":"boolean","title":"Display With Zero","description":"Флаг, отображать ли товар в витрине/каталоге при нулевом остатке.","default":false},"status":{"type":"boolean","title":"Status","description":"Флаг активности товара для данной организации. Если False — товар считается отключённым.","default":true},"publish_status":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Publish Status","description":"Флаг публикации товара во внешнем каталоге/витрине.","default":true},"icpu_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icpu Code","description":"Код ICPU или аналогичный внутренний классификатор товара (если используется)."},"product_group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Group","description":"Группа/категория товара в системе организации."},"gtin_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gtin Code","description":"GTIN / штрих-код товара (EAN/UPC и т.п.)."},"manufacturer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Manufacturer","description":"Наименование производителя товара."},"external_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Id","description":"Внешний идентификатор товара (например, ID в 1С/SAP/другой системе)."}},"type":"object","required":["organization_id","code"],"title":"Product Reference Schema","description":"Справочная информация о товаре в разрезе организации.\n\nИсточник данных: модель ProductReference.\n\nОдна запись описывает, как конкретный товар отображается и учитывается\nв рамках одной организации (свой код, артикул, статусы и т.п.)."},"PromotionCheckoutResponseSchema":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid4"},{"type":"null"}],"title":"Id","description":"UID промоакции, применённой к товару.","examples":["ea48a435-941f-4bf2-a6db-d3df8217ff96",null]},"type":{"anyOf":[{"$ref":"#/components/schemas/PromotionTypeEnum"},{"type":"null"}],"description":"Тип применённой промоакции (cart, assortment, by_brand, ...).","examples":["cart","assortment",null]},"reward_type":{"anyOf":[{"$ref":"#/components/schemas/RewardTypeEnum"},{"type":"null"}],"description":"Тип награды промо для позиции. discount — скидка, bonus_product — бонусный товар.","examples":["discount","bonus_product",null]},"discount_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Discount Percent","description":"Процент скидки по активной промоакции (например 15.0 = 15%).","examples":[null,5.0,15.0]},"discount_limit_quantity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Discount Limit Quantity","description":"Максимальное количество товара, на которое распространяется скидка по промо. Если None — лимит отсутствует или не применим к данному типу промо.","examples":[null,3]},"bonus_quantity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bonus Quantity","description":"Количество бонусных товаров, полученных по промо для этой позиции.","examples":[null,1,2]},"unit_discount_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Unit Discount Price","description":"Цена за одну единицу товара с учётом промо.","examples":[120.0]},"final_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Final Price","description":"Итоговая цена всей позиции (quantity × unit_discount_price) с учётом промо.","examples":[1240.5]}},"type":"object","title":"Promotion Checkout Response Schema","description":"Информация о применённой промоакции для конкретной позиции (товара) в корзине/заказе.\n\nЭто \"результат применения промо\" на уровне позиции.\n\nСодержит:\n  - идентификацию промо (type/id),\n  - тип награды (discount/bonus),\n  - параметры скидки/бонуса,\n  - пересчитанные цены, которые получились из-за промо:\n      * unit_discount_price — цена за единицу с учётом промо\n      * final_price — итоговая цена всей позиции с учётом промо\n\nПравила заполнения:\n  - Если промо не применено — promotion=None на верхнем уровне.\n  - При reward_type=discount обычно заполняются discount_percent и цены.\n  - При reward_type=bonus_product обычно заполняется bonus_quantity,\n    а цены могут совпадать с обычными (или быть None — как у вас принято)."},"PromotionGiftsSchema":{"properties":{"promotion_id":{"type":"string","format":"uuid4","title":"Promotion Id","description":"UUID промоакции, предоставляющей подарки.","examples":["ea48a435-941f-4bf2-a6db-d3df8217ff96"]},"promotion_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Promotion Name","description":"Название промоакции.","examples":["Купи 5 — получи подарок"]},"gift_products":{"anyOf":[{"items":{"$ref":"#/components/schemas/CartGiftResponseSchema"},"type":"array"},{"type":"null"}],"title":"Gift Products","description":"Список подарков, доступных пользователю в рамках промо."},"gift_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Gift Amount","description":"Количество подарков, начисленных пользователю по данной промоакции.","examples":[1,2,5]}},"type":"object","required":["promotion_id"],"title":"Promotion Gifts Schema","description":"Схема ответа для промоакции типа \"подарки за покупку\",\nсодержащая список доступных подарков и ограничение по их количеству.\n\nИспользуется для:\n  - отображения подарков, доступных пользователю,\n  - выбора подарков в корзине,\n  - вычисления ограничений промо."},"PromotionTypeEnum":{"type":"string","enum":["fixed","overhead","cart","catalog","assortment","msl","discount_sku_percentage","by_brand"],"title":"PromotionTypeEnum"},"RewardTypeEnum":{"type":"string","enum":["discount","bonus_product"],"title":"RewardTypeEnum"},"RouteInfoSchema":{"properties":{"uid":{"type":"string","format":"uuid4","title":"Uid","description":"Уникальный идентификатор маршрута.","examples":["1e5af48a-246c-4ead-9b33-b38bc672bb75"]},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Название маршрута.","examples":["Маршрут №3 (Центр → Алтай)"]},"index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Index","description":"Порядковый номер маршрута в списке.","examples":[1,2,3]},"organization_id":{"type":"string","format":"uuid4","title":"Organization Id","description":"UUID организации, которой принадлежит маршрут.","examples":["51aaf244-bd43-49a9-8ec1-11a1fe60fa51"]},"type_of_transfer":{"type":"string","title":"Type Of Transfer","description":"Тип доставки / передачи (например, авто, пеший курьер).","examples":["car","foot"]},"default_courier_pinfl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Courier Pinfl","description":"PINFL курьера, закреплённого за маршрутом по умолчанию.","examples":["12345678901234"]},"default_car_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Car Number","description":"Номер автомобиля, используемого по умолчанию на маршруте.","examples":["123ABC01"]}},"type":"object","required":["uid","organization_id","type_of_transfer"],"title":"Route Info Schema","description":"Информация о маршруте (маршрут как сущность без привязки к дате).\n\nИспользуется для отображения списка маршрутов,\nвыбора маршрута в интерфейсе навигации и привязки к расписанию."},"ScheduledRouteResponseSchema":{"properties":{"route":{"$ref":"#/components/schemas/RouteInfoSchema","description":"Информация о маршруте (основная сущность маршрута)."},"weekday":{"$ref":"#/components/schemas/WeekdayEnum","description":"День недели, для которого назначен маршрут.","examples":["monday","wednesday"]},"real_date":{"type":"string","format":"date","title":"Real Date","description":"Конкретная дата, на которую запланирован маршрут.","examples":["2025-02-14"]}},"type":"object","required":["route","weekday","real_date"],"title":"Scheduled Route Response Schema","description":"Схема запланированного маршрута.\n\nВключает информацию о маршруте (RouteInfoSchema),\nдень недели и конкретную дату, на которую маршрут запланирован."},"StoreTypeEnum":{"type":"string","enum":["food","nonfood","ref","mixed"],"title":"StoreTypeEnum"},"UpdateOrderRequestSchema":{"properties":{"product_id":{"type":"string","format":"uuid4","title":"Product Id","description":"Товар, количество которого меняется."},"quantity":{"type":"integer","minimum":0.0,"title":"Quantity","description":"Новое количество товара (в упаковках)."},"selected_gifts":{"anyOf":[{"items":{"$ref":"#/components/schemas/OrderGiftRequestSchema"},"type":"array"},{"type":"null"}],"title":"Selected Gifts","description":"Выбранные подарки. Если null — сервис переиспользует прошлый выбор из заказа."}},"type":"object","required":["product_id","quantity"],"title":"Order Base Schema","description":"Запрос на обновление заказа: изменить количество одного товара и (опционально) выбрать подарки."},"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"},"WeekdayEnum":{"type":"string","enum":["monday","tuesday","wednesday","thursday","friday","saturday","sunday"],"title":"WeekdayEnum"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}},"tags":[{"name":"Carts","description":"Корзина (v2).\n\nАктуальный формат и обновлённая бизнес-логика корзины.\nОбычно включает:\n- корректную группировку/структуру ответа (например, по parent-org)\n- более строгие схемы и валидации\n- расширенные поля для UI/аналитики\n\n✅ Все новые изменения корзины добавляем сюда."},{"name":"Orders","description":"Заказы (v2).\n\nНовая версия заказов: обновлённые схемы и логика.\nЦели v2:\n- согласованные поля ответа\n- улучшенная трассировка/ошибки\n- актуальные правила расчёта\n\n✅ Все новые фичи/изменения по заказам добавляем сюда."}]}