{
  "standard": "FSP",
  "module": "quote",
  "version": "1.0",
  "registry": "quote_model",
  "title": "Запрос сметы и ответ — FSP Quote 1.0",
  "description": "Единый контракт запроса (ТЗ + объём) и ответа (подошедшие операторы, смета, непокрытое). Формулы вывода величин стандартом не нормируются: применённые допущения возвращаются в assumptions.",
  "in_standard": true,
  "columns": [
    "Сущность",
    "Поле",
    "Тип",
    "Обязательно",
    "Назначение",
    "Пример"
  ],
  "rows": [
    {
      "Сущность": "quote_request",
      "Поле": "category_id",
      "Тип": "id",
      "Обязательно": "да",
      "Назначение": "Категория товара",
      "Пример": "apparel"
    },
    {
      "Сущность": "quote_request",
      "Поле": "attributes",
      "Тип": "list<flag>",
      "Обязательно": "нет",
      "Назначение": "fragile / honest_mark / high_value / frozen",
      "Пример": "honest_mark"
    },
    {
      "Сущность": "quote_request",
      "Поле": "size_profile",
      "Тип": "string",
      "Обязательно": "нет",
      "Назначение": "Габаритный класс",
      "Пример": "MPFIT_STD_2026:M"
    },
    {
      "Сущность": "quote_request",
      "Поле": "operations",
      "Тип": "list<object>",
      "Обязательно": "нет",
      "Назначение": "Операции ТЗ в service_code (+ кратность); из текста разбирает LLM",
      "Пример": "{goods_acceptance,1}; {product_marking,2}"
    },
    {
      "Сущность": "quote_request",
      "Поле": "demand",
      "Тип": "object",
      "Обязательно": "нет",
      "Назначение": "{shipments_per_day, turnover_days, unit_volume_l} — объём, из него рекомендуется место",
      "Пример": "{100, 30, 2}"
    },
    {
      "Сущность": "quote_request",
      "Поле": "storage_need",
      "Тип": "object",
      "Обязательно": "нет",
      "Назначение": "Явное место {storage_type, temp_mode, qty_m2}; необязательно — иначе выводится из demand",
      "Пример": "{pallet, ambient, 20}"
    },
    {
      "Сущность": "quote_request",
      "Поле": "throughput_need",
      "Тип": "object",
      "Обязательно": "нет",
      "Назначение": "{operation, metric, qty}; = shipments_per_day",
      "Пример": "{outbound, orders_per_day, 300}"
    },
    {
      "Сущность": "quote_request",
      "Поле": "origin_geo",
      "Тип": "string",
      "Обязательно": "нет",
      "Назначение": "Откуда забор (город/адрес)",
      "Пример": "Москва"
    },
    {
      "Сущность": "quote_request",
      "Поле": "target_destinations",
      "Тип": "list",
      "Обязательно": "нет",
      "Назначение": "Куда отгрузки (МП / направления)",
      "Пример": "Коледино; Хоругвино"
    },
    {
      "Сущность": "quote_request",
      "Поле": "services_needed",
      "Тип": "list<service_code>",
      "Обязательно": "нет",
      "Назначение": "Нужные услуги стандарта",
      "Пример": "goods_acceptance; honest_mark_labeling"
    },
    {
      "Сущность": "quote_request",
      "Поле": "scheme",
      "Тип": "enum",
      "Обязательно": "нет",
      "Назначение": "FBO / FBS / DBS",
      "Пример": "FBO"
    },
    {
      "Сущность": "quote_request",
      "Поле": "start_date",
      "Тип": "date",
      "Обязательно": "нет",
      "Назначение": "Желаемый старт",
      "Пример": "2026-08-01"
    },
    {
      "Сущность": "quote_request",
      "Поле": "term",
      "Тип": "string",
      "Обязательно": "нет",
      "Назначение": "Срок",
      "Пример": "от 6 мес"
    },
    {
      "Сущность": "quote_request",
      "Поле": "free_text",
      "Тип": "string",
      "Обязательно": "нет",
      "Назначение": "Исходный текст запроса (свободная форма)",
      "Пример": "нужно хранить 50 паллет одежды, отгрузки на WB из Москвы"
    },
    {
      "Сущность": "quote_response",
      "Поле": "listing_id",
      "Тип": "id",
      "Обязательно": "да",
      "Назначение": "Какое предложение подошло",
      "Пример": "listing_sklad_msk"
    },
    {
      "Сущность": "quote_response",
      "Поле": "operator",
      "Тип": "string",
      "Обязательно": "да",
      "Назначение": "Имя ФФ",
      "Пример": "Складсервис"
    },
    {
      "Сущность": "quote_response",
      "Поле": "location_geo",
      "Тип": "string",
      "Обязательно": "да",
      "Назначение": "Город склада",
      "Пример": "Москва"
    },
    {
      "Сущность": "quote_response",
      "Поле": "fit",
      "Тип": "enum",
      "Обязательно": "да",
      "Назначение": "full / partial",
      "Пример": "full"
    },
    {
      "Сущность": "quote_response",
      "Поле": "free_m2",
      "Тип": "decimal",
      "Обязательно": "да",
      "Назначение": "Свободная площадь по данным ФФ",
      "Пример": "80"
    },
    {
      "Сущность": "quote_response",
      "Поле": "recommended_storage_m2",
      "Тип": "decimal",
      "Обязательно": "нет",
      "Назначение": "Рекомендуемое место из demand",
      "Пример": "4"
    },
    {
      "Сущность": "quote_response",
      "Поле": "avg_stock_units",
      "Тип": "decimal",
      "Обязательно": "нет",
      "Назначение": "Средний остаток шт = отгрузки × оборачиваемость",
      "Пример": "3000"
    },
    {
      "Сущность": "quote_response",
      "Поле": "handling_cost_per_unit",
      "Тип": "decimal",
      "Обязательно": "нет",
      "Назначение": "Смета обработки за 1 шт по ТЗ",
      "Пример": "92"
    },
    {
      "Сущность": "quote_response",
      "Поле": "handling_cost_monthly",
      "Тип": "decimal",
      "Обязательно": "нет",
      "Назначение": "Обработка за месяц = за шт × отгрузки × 30",
      "Пример": "276000"
    },
    {
      "Сущность": "quote_response",
      "Поле": "storage_cost_monthly",
      "Тип": "decimal",
      "Обязательно": "нет",
      "Назначение": "Хранение за месяц по ставке ФФ",
      "Пример": "21600"
    },
    {
      "Сущность": "quote_response",
      "Поле": "estimated_quote",
      "Тип": "decimal",
      "Обязательно": "нет",
      "Назначение": "Итоговая смета (обработка + хранение)",
      "Пример": "297600"
    },
    {
      "Сущность": "quote_response",
      "Поле": "quote_basis",
      "Тип": "string",
      "Обязательно": "нет",
      "Назначение": "Из чего смета",
      "Пример": "обработка 92 ₽/шт × 3000 + хранение 6 м³ × 120 ₽ × 30"
    },
    {
      "Сущность": "quote_response",
      "Поле": "contact",
      "Тип": "string",
      "Обязательно": "да",
      "Назначение": "Куда вести лид",
      "Пример": "tg:@sklad_ff"
    },
    {
      "Сущность": "quote_response",
      "Поле": "unmet",
      "Тип": "list",
      "Обязательно": "нет",
      "Назначение": "Что не покрыто (если partial)",
      "Пример": "нет заморозки"
    },
    {
      "Сущность": "quote_request",
      "Поле": "pricing_level_min",
      "Тип": "enum",
      "Обязательно": "нет",
      "Назначение": "Минимальный уровень FSP Pricing, с которым вызывающая сторона готова считать смету",
      "Пример": "L1"
    },
    {
      "Сущность": "quote_response",
      "Поле": "assumptions",
      "Тип": "list<object>",
      "Обязательно": "условно",
      "Назначение": "Допущения расчёта {code, value}; обязательны, если смета опирается на выведенные величины",
      "Пример": "{turnover_basis, stock_days}; {volume_per_m2, 1.8}"
    },
    {
      "Сущность": "quote_response",
      "Поле": "pricing_level_used",
      "Тип": "enum",
      "Обязательно": "нет",
      "Назначение": "Уровень FSP Pricing, на котором фактически посчитана смета",
      "Пример": "L2"
    }
  ]
}