{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/akeda-ru/json-schema/akeda-ru-core-sales-channel-schema.json",
  "title": "CoreSalesChannel",
  "x-generated": "2026-11-01",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/akeda-ru-openapi.yaml#/components/schemas/CoreSalesChannel",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "id",
    "code",
    "label",
    "is_active",
    "is_system",
    "sort_order",
    "type",
    "contact_ids",
    "store_ids",
    "article_source",
    "code_source",
    "contacts",
    "stores",
    "article_products",
    "barcode_products",
    "price_mode",
    "require_article",
    "require_barcode",
    "ean_only",
    "requirement_defaults",
    "sales_scheme",
    "transfer_price",
    "reserve_on",
    "reserve_over_available",
    "marking_sale",
    "stock_condition_strict",
    "title_transfer"
  ],
  "properties": {
    "id": {
      "$ref": "#/$defs/UUID"
    },
    "code": {
      "type": "string",
      "description": "Код канала — пространство артикулов и штрихкодов товара (source_ref) и ключ шаблона этикетки канала. Не меняется."
    },
    "label": {
      "type": "string"
    },
    "is_active": {
      "type": "boolean"
    },
    "is_system": {
      "type": "boolean",
      "description": "Канал площадки, на код которого ссылается модуль маркетплейсов: не удаляется, тип — marketplace."
    },
    "sort_order": {
      "type": "integer"
    },
    "type": {
      "$ref": "#/$defs/CoreSalesChannelType"
    },
    "contact_ids": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/UUID"
      },
      "description": "Контрагенты канала."
    },
    "store_ids": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/UUID"
      },
      "description": "Магазины площадки канала."
    },
    "article_source": {
      "$ref": "#/$defs/CoreSalesChannelDocumentSource"
    },
    "code_source": {
      "$ref": "#/$defs/CoreSalesChannelDocumentSource"
    },
    "stock_condition_id": {
      "oneOf": [
        {
          "$ref": "#/$defs/UUID"
        },
        {
          "type": "null"
        }
      ],
      "description": "Состояние товара для отгрузки в канал; null — основное."
    },
    "stock_condition_strict": {
      "type": "boolean",
      "description": "Режим состояния канала (ERP-2877): true — «Строго», отгрузка канала и отгрузка на маркетплейс только из состояния канала, при нехватке отказ; строки по резерву продажи не проверяются — резерв уходит как есть (ERP-2959); false — «Мягко», состояние канала берётся первым, не хватит — остальное годное. Без состояния канала всегда false."
    },
    "ship_warehouse_id": {
      "oneOf": [
        {
          "$ref": "#/$defs/UUID"
        },
        {
          "type": "null"
        }
      ],
      "description": "Склад отгрузки по умолчанию (склад модуля stock): продажа канала без склада получает его при заведении; окно «Отгрузить» ставит его после склада продажи и резерва."
    },
    "department_id": {
      "oneOf": [
        {
          "$ref": "#/$defs/UUID"
        },
        {
          "type": "null"
        }
      ],
      "description": "Подразделение по умолчанию (справочник «Подразделения», ERP-2879): продажа канала без подразделения получает его, пустой ЦФО — ЦФО подразделения. Выбранное человеком сильнее, умолчание товара слабее канала."
    },
    "cfo_id": {
      "oneOf": [
        {
          "$ref": "#/$defs/UUID"
        },
        {
          "type": "null"
        }
      ],
      "description": "ЦФО по умолчанию (справочник «ЦФО», ERP-2879): продажа канала без ЦФО получает его; сильнее ЦФО подразделения и умолчания товара, слабее выбранного человеком."
    },
    "project_id": {
      "oneOf": [
        {
          "$ref": "#/$defs/UUID"
        },
        {
          "type": "null"
        }
      ],
      "description": "Проект по умолчанию (справочник «Проекты», ERP-2879): продажа канала без проекта получает его, если разрез «Проекты» включён."
    },
    "revenue_item_id": {
      "oneOf": [
        {
          "$ref": "#/$defs/UUID"
        },
        {
          "type": "null"
        }
      ],
      "description": "Статья выручки канала (статья ОПиУ)."
    },
    "contacts": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/CoreSalesChannelRef"
      }
    },
    "stores": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/CoreSalesChannelRef"
      }
    },
    "stock_condition": {
      "oneOf": [
        {
          "$ref": "#/$defs/CoreSalesChannelRef"
        },
        {
          "type": "null"
        }
      ]
    },
    "ship_warehouse": {
      "oneOf": [
        {
          "$ref": "#/$defs/CoreSalesChannelRef"
        },
        {
          "type": "null"
        }
      ]
    },
    "department": {
      "oneOf": [
        {
          "$ref": "#/$defs/CoreSalesChannelRef"
        },
        {
          "type": "null"
        }
      ]
    },
    "cfo": {
      "oneOf": [
        {
          "$ref": "#/$defs/CoreSalesChannelRef"
        },
        {
          "type": "null"
        }
      ]
    },
    "project": {
      "oneOf": [
        {
          "$ref": "#/$defs/CoreSalesChannelRef"
        },
        {
          "type": "null"
        }
      ]
    },
    "missing_dimensions": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "project",
          "department",
          "cfo"
        ]
      },
      "description": "Обязательные на сегодня разрезы, которых канал своим заказам не даст: нет своего значения, а для ЦФО — и ЦФО подразделения канала. Заказ загрузки такого канала без разреза не подтвердится."
    },
    "marketplace_warehouses": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/CoreSalesChannelStoreWarehouse"
      },
      "description": "Только показ: склад исполнения магазинов канала из настроек «Склад → Настройки → Склады маркетплейсов»."
    },
    "revenue_item": {
      "oneOf": [
        {
          "$ref": "#/$defs/CoreSalesChannelRef"
        },
        {
          "type": "null"
        }
      ]
    },
    "price_type_id": {
      "oneOf": [
        {
          "$ref": "#/$defs/UUID"
        },
        {
          "type": "null"
        }
      ],
      "description": "Вид цены канала (attrs.price_type_id, ERP-2489): им подбор цен даёт цену продажи канала."
    },
    "price_type": {
      "oneOf": [
        {
          "$ref": "#/$defs/CoreSalesChannelRef"
        },
        {
          "type": "null"
        }
      ]
    },
    "price_mode": {
      "type": "string",
      "enum": [
        "required",
        "not_needed"
      ],
      "description": "Действующее значение «Цена в документах» (с умолчанием по типу)."
    },
    "require_article": {
      "type": "boolean",
      "description": "Каналу нужен свой артикул у товара (для отметки «готов»)."
    },
    "require_barcode": {
      "type": "boolean",
      "description": "Каналу нужен штрихкод товара: свой штрихкод канала или общий штрихкод товара."
    },
    "ean_only": {
      "type": "boolean",
      "description": "Канал принимает только EAN-13/EAN-8: на этикетках и в документах канала без Code 128. По умолчанию выключен у всех каналов."
    },
    "sales_scheme": {
      "type": "string",
      "enum": [
        "own",
        "commission",
        "agency"
      ],
      "description": "Действующая схема продаж (с умолчанием по типу канала)."
    },
    "transfer_price": {
      "type": "string",
      "enum": [
        "",
        "none",
        "price_type"
      ],
      "description": "Действующая цена в документе передачи; пустая строка у схемы own — передачи нет."
    },
    "reserve_on": {
      "type": "string",
      "enum": [
        "",
        "none",
        "arrival",
        "confirm"
      ],
      "description": "Когда склад резервирует заказ канала (ERP-2885): none — никогда, arrival — как только заказ поступил, confirm — только подтверждённый. Пустая строка — как до правила (резерв при загрузке заказа). Резерв, поставленный человеком, правило не отменяет; склад, который готовится к запуску, резерв не держит при любом правиле."
    },
    "reserve_over_available": {
      "type": "string",
      "enum": [
        "",
        "block",
        "warn"
      ],
      "description": "Резерв сверх свободного остатка для заказов канала (ERP-2885): block — нельзя, warn — можно с предупреждением. Пустая строка — как в настройке склада кабинета."
    },
    "marking_sale": {
      "type": "string",
      "enum": [
        "",
        "unit",
        "gtin"
      ],
      "description": "Маркировка при продаже по заказу канала (решение владельца 27.10): unit — сканировать каждую единицу, коды в отгрузке обязательны поверх строгости юрлица и режима ОСУ товара (продажа покупателю выводит коды только поштучно); gtin — по GTIN, без сканирования, коды в отгрузке не требуются (отсканированные учитываются). Пустая строка — как в настройках маркировки. У подключения Яндекс KIT gtin отключает запись кодов в заказ KIT."
    },
    "title_transfer": {
      "type": "string",
      "enum": [
        "",
        "shipment",
        "acceptance"
      ],
      "description": "Когда право собственности на товар переходит к покупателю по заказам канала (ERP-2772): shipment — при отгрузке (выручка датой отгрузки), acceptance — при приёмке покупателем (отгрузка уводит товар на 45, выручку и НДС признаёт «Приёмка покупателем» датой подписанного УПД). Пустая строка — при отгрузке, как до правила. Отгрузка замораживает правило при заведении."
    },
    "requirement_defaults": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "price_mode",
          "require_article",
          "require_barcode",
          "ean_only",
          "sales_scheme",
          "transfer_price"
        ]
      },
      "description": "Реквизиты, которые человек не сохранял: действует умолчание канала (по типу, схеме продаж и настройке «Артикул в УПД»)."
    },
    "article_products": {
      "type": "integer",
      "minimum": 0,
      "description": "Сколько товаров с действующим артикулом канала."
    },
    "barcode_products": {
      "type": "integer",
      "minimum": 0,
      "description": "Сколько товаров с действующим штрихкодом канала."
    }
  },
  "$defs": {
    "CoreSalesChannelDocumentSource": {
      "type": "string",
      "enum": [
        "",
        "sku",
        "manufacturer",
        "channel",
        "none"
      ],
      "description": "Что уходит покупателю канала в артикуле или коде товара УПД: sku — основной артикул, manufacturer — артикул производителя, channel — артикул этого канала, none — не передавать; пустая строка — не задано."
    },
    "CoreSalesChannelRef": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "id",
        "name",
        "found"
      ],
      "properties": {
        "id": {
          "$ref": "#/$defs/UUID"
        },
        "name": {
          "type": "string"
        },
        "found": {
          "type": "boolean",
          "description": "Объект найден; false — погашен или удалён после назначения."
        },
        "platform": {
          "type": "string",
          "description": "Площадка магазина; только у магазинов."
        }
      }
    },
    "CoreSalesChannelStoreWarehouse": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "store_id",
        "store_name",
        "warehouse_id",
        "warehouse_name"
      ],
      "properties": {
        "store_id": {
          "$ref": "#/$defs/UUID"
        },
        "store_name": {
          "type": "string"
        },
        "warehouse_id": {
          "$ref": "#/$defs/UUID"
        },
        "warehouse_name": {
          "type": "string"
        }
      }
    },
    "CoreSalesChannelType": {
      "type": "string",
      "enum": [
        "",
        "marketplace",
        "retail_chain",
        "own_shop",
        "wholesale"
      ],
      "description": "Тип канала: marketplace — площадка, retail_chain — торговая сеть, own_shop — свой магазин или сайт, wholesale — опт; пустая строка — не задан."
    },
    "UUID": {
      "type": "string",
      "format": "uuid"
    }
  }
}