{
  "standard": "FSP",
  "module": "pricing",
  "version": "1.0",
  "registry": "price_model",
  "title": "Модель тарифов — FSP Pricing 1.0",
  "description": "Как оператор описывает свой прайс: rate_cards → offers → price_rules → price_tiers/price_adjustments. Маршруты и графики отправки описываются в FSP Capacity; здесь route_id — только входное поле условия.",
  "in_standard": true,
  "columns": [
    "Сущность",
    "Поле",
    "Тип",
    "Обязательно",
    "Назначение",
    "Пример"
  ],
  "rows": [
    {
      "Сущность": "rate_cards",
      "Поле": "id",
      "Тип": "id",
      "Обязательно": "да",
      "Назначение": "Идентификатор тарифного плана",
      "Пример": "rate_card_123"
    },
    {
      "Сущность": "rate_cards",
      "Поле": "provider_id",
      "Тип": "id",
      "Обязательно": "да",
      "Назначение": "Фулфилмент оператор",
      "Пример": "ff_123"
    },
    {
      "Сущность": "rate_cards",
      "Поле": "currency",
      "Тип": "enum",
      "Обязательно": "да",
      "Назначение": "Валюта",
      "Пример": "RUB"
    },
    {
      "Сущность": "rate_cards",
      "Поле": "vat_mode",
      "Тип": "enum",
      "Обязательно": "да",
      "Назначение": "Режим НДС",
      "Пример": "included / excluded"
    },
    {
      "Сущность": "offers",
      "Поле": "id",
      "Тип": "id",
      "Обязательно": "да",
      "Назначение": "Идентификатор предложения",
      "Пример": "offer_123"
    },
    {
      "Сущность": "offers",
      "Поле": "rate_card_id",
      "Тип": "id",
      "Обязательно": "да",
      "Назначение": "Тарифный план",
      "Пример": "rate_card_123"
    },
    {
      "Сущность": "offers",
      "Поле": "primary_service_code",
      "Тип": "string",
      "Обязательно": "нет",
      "Назначение": "Опциональная основная услуга для показа; полный состав хранится в offer_services",
      "Пример": "goods_acceptance"
    },
    {
      "Сущность": "offers",
      "Поле": "active",
      "Тип": "boolean",
      "Обязательно": "да",
      "Назначение": "Признак доступности предложения",
      "Пример": "true"
    },
    {
      "Сущность": "price_rules",
      "Поле": "id",
      "Тип": "id",
      "Обязательно": "да",
      "Назначение": "Идентификатор правила цены",
      "Пример": "price_rule_123"
    },
    {
      "Сущность": "price_rules",
      "Поле": "offer_id",
      "Тип": "id",
      "Обязательно": "да",
      "Назначение": "Предложение ФФ",
      "Пример": "offer_123"
    },
    {
      "Сущность": "price_rules",
      "Поле": "calculation_method",
      "Тип": "enum",
      "Обязательно": "да",
      "Назначение": "flat / per_unit / per_metric / tiered / minimum_charge / manual_quote",
      "Пример": "per_unit"
    },
    {
      "Сущность": "price_rules",
      "Поле": "billing_metric",
      "Тип": "enum",
      "Обязательно": "условно",
      "Назначение": "Код из реестра «Метрики тарификации»; обязателен для per_unit, per_metric и tiered",
      "Пример": "items"
    },
    {
      "Сущность": "price_rules",
      "Поле": "amount",
      "Тип": "decimal",
      "Обязательно": "условно",
      "Назначение": "Ставка для flat/per_unit/per_metric; порог для minimum_charge; пусто для tiered/manual_quote",
      "Пример": "15"
    },
    {
      "Сущность": "price_rules",
      "Поле": "priority",
      "Тип": "integer",
      "Обязательно": "да",
      "Назначение": "Уникален в рамках offer_id; меньшее число выбирается первым",
      "Пример": "100"
    },
    {
      "Сущность": "price_rule_conditions",
      "Поле": "id",
      "Тип": "id",
      "Обязательно": "да",
      "Назначение": "Идентификатор условия",
      "Пример": "condition_123"
    },
    {
      "Сущность": "price_rule_conditions",
      "Поле": "price_rule_id",
      "Тип": "id",
      "Обязательно": "да",
      "Назначение": "Правило цены",
      "Пример": "price_rule_123"
    },
    {
      "Сущность": "price_rule_conditions",
      "Поле": "condition_group",
      "Тип": "integer",
      "Обязательно": "да",
      "Назначение": "Номер группы условий",
      "Пример": "1"
    },
    {
      "Сущность": "price_rule_conditions",
      "Поле": "field",
      "Тип": "enum",
      "Обязательно": "да",
      "Назначение": "Поле контекста",
      "Пример": "weight_kg"
    },
    {
      "Сущность": "price_rule_conditions",
      "Поле": "operator",
      "Тип": "enum",
      "Обязательно": "да",
      "Назначение": "Оператор",
      "Пример": "gte"
    },
    {
      "Сущность": "price_rule_conditions",
      "Поле": "value",
      "Тип": "typed",
      "Обязательно": "да",
      "Назначение": "Значение условия",
      "Пример": "5"
    },
    {
      "Сущность": "price_tiers",
      "Поле": "id",
      "Тип": "id",
      "Обязательно": "да",
      "Назначение": "Идентификатор диапазона",
      "Пример": "tier_123"
    },
    {
      "Сущность": "price_tiers",
      "Поле": "price_rule_id",
      "Тип": "id",
      "Обязательно": "да",
      "Назначение": "Правило цены",
      "Пример": "price_rule_123"
    },
    {
      "Сущность": "price_tiers",
      "Поле": "metric",
      "Тип": "enum",
      "Обязательно": "нет",
      "Назначение": "Устарело: шкала задаётся в price_rules.tier_variable. При заполнении обязано совпадать с ним",
      "Пример": "units_per_month"
    },
    {
      "Сущность": "price_tiers",
      "Поле": "quantity_from",
      "Тип": "decimal",
      "Обязательно": "да",
      "Назначение": "Нижняя граница включительно",
      "Пример": "20000"
    },
    {
      "Сущность": "price_tiers",
      "Поле": "quantity_to",
      "Тип": "decimal",
      "Обязательно": "нет",
      "Назначение": "Верхняя граница исключительно",
      "Пример": "50000"
    },
    {
      "Сущность": "price_tiers",
      "Поле": "amount",
      "Тип": "decimal",
      "Обязательно": "да",
      "Назначение": "Ставка для диапазона",
      "Пример": "9"
    },
    {
      "Сущность": "price_adjustments",
      "Поле": "id",
      "Тип": "id",
      "Обязательно": "да",
      "Назначение": "Идентификатор модификатора",
      "Пример": "adjustment_123"
    },
    {
      "Сущность": "price_adjustments",
      "Поле": "price_rule_id",
      "Тип": "id",
      "Обязательно": "да",
      "Назначение": "Базовое правило цены",
      "Пример": "price_rule_123"
    },
    {
      "Сущность": "price_adjustments",
      "Поле": "adjustment_type",
      "Тип": "enum",
      "Обязательно": "да",
      "Назначение": "Тип модификатора",
      "Пример": "fixed / percent / multiplier"
    },
    {
      "Сущность": "price_adjustments",
      "Поле": "value",
      "Тип": "decimal",
      "Обязательно": "да",
      "Назначение": "Числовая величина модификатора",
      "Пример": "2"
    },
    {
      "Сущность": "price_adjustments",
      "Поле": "priority",
      "Тип": "integer",
      "Обязательно": "да",
      "Назначение": "Уникален в рамках price_rule_id и stacking_group",
      "Пример": "100"
    },
    {
      "Сущность": "price_adjustment_conditions",
      "Поле": "id",
      "Тип": "id",
      "Обязательно": "да",
      "Назначение": "Идентификатор условия модификатора",
      "Пример": "adjustment_condition_123"
    },
    {
      "Сущность": "price_adjustment_conditions",
      "Поле": "price_adjustment_id",
      "Тип": "id",
      "Обязательно": "да",
      "Назначение": "Модификатор цены",
      "Пример": "adjustment_123"
    },
    {
      "Сущность": "price_adjustment_conditions",
      "Поле": "condition_group",
      "Тип": "integer",
      "Обязательно": "да",
      "Назначение": "Номер группы условий",
      "Пример": "1"
    },
    {
      "Сущность": "price_adjustment_conditions",
      "Поле": "field",
      "Тип": "enum",
      "Обязательно": "да",
      "Назначение": "Поле контекста",
      "Пример": "urgency"
    },
    {
      "Сущность": "price_adjustment_conditions",
      "Поле": "operator",
      "Тип": "enum",
      "Обязательно": "да",
      "Назначение": "Оператор",
      "Пример": "eq"
    },
    {
      "Сущность": "price_adjustment_conditions",
      "Поле": "value",
      "Тип": "typed",
      "Обязательно": "да",
      "Назначение": "Значение условия",
      "Пример": "urgent"
    },
    {
      "Сущность": "rate_cards",
      "Поле": "version",
      "Тип": "integer",
      "Обязательно": "да",
      "Назначение": "Версия в рамках provider_id + series_code; комбинация уникальна",
      "Пример": "1"
    },
    {
      "Сущность": "rate_cards",
      "Поле": "status",
      "Тип": "enum",
      "Обязательно": "да",
      "Назначение": "draft / active / retired",
      "Пример": "active"
    },
    {
      "Сущность": "rate_cards",
      "Поле": "effective_from",
      "Тип": "datetime",
      "Обязательно": "да",
      "Назначение": "Начало действия включительно",
      "Пример": "2026-01-01T00:00:00+03:00"
    },
    {
      "Сущность": "rate_cards",
      "Поле": "effective_to",
      "Тип": "datetime",
      "Обязательно": "нет",
      "Назначение": "Конец действия исключительно; пусто для открытого периода",
      "Пример": ""
    },
    {
      "Сущность": "rate_cards",
      "Поле": "published_at",
      "Тип": "datetime",
      "Обязательно": "условно",
      "Назначение": "Обязательно при status=active",
      "Пример": "2025-12-20T12:00:00+03:00"
    },
    {
      "Сущность": "rate_cards",
      "Поле": "vat_rate",
      "Тип": "decimal",
      "Обязательно": "да",
      "Назначение": "Ставка НДС; 0 допустим",
      "Пример": "0.20"
    },
    {
      "Сущность": "rate_cards",
      "Поле": "volumetric_divisor_cm3_per_kg",
      "Тип": "decimal",
      "Обязательно": "условно",
      "Назначение": "Обязателен при использовании volumetric_weight_kg",
      "Пример": "5000"
    },
    {
      "Сущность": "offers",
      "Поле": "source_name",
      "Тип": "string",
      "Обязательно": "нет",
      "Назначение": "Исходное название строки прайса",
      "Пример": "Приёмка с размещением"
    },
    {
      "Сущность": "offers",
      "Поле": "source_row_ref",
      "Тип": "string",
      "Обязательно": "нет",
      "Назначение": "Ссылка на источник или номер строки для аудита",
      "Пример": "price.xlsx!A17"
    },
    {
      "Сущность": "offer_services",
      "Поле": "id",
      "Тип": "id",
      "Обязательно": "да",
      "Назначение": "Идентификатор компонента предложения",
      "Пример": "offer_service_123"
    },
    {
      "Сущность": "offer_services",
      "Поле": "offer_id",
      "Тип": "id",
      "Обязательно": "да",
      "Назначение": "Ссылка на offers.id",
      "Пример": "offer_123"
    },
    {
      "Сущность": "offer_services",
      "Поле": "service_code",
      "Тип": "string",
      "Обязательно": "да",
      "Назначение": "Ссылка на код стандартной услуги",
      "Пример": "goods_acceptance"
    },
    {
      "Сущность": "offer_services",
      "Поле": "quantity_rule",
      "Тип": "typed",
      "Обязательно": "нет",
      "Назначение": "Правило количества компонента в пакете",
      "Пример": "1 / same_as_billing_quantity"
    },
    {
      "Сущность": "offer_services",
      "Поле": "included",
      "Тип": "boolean",
      "Обязательно": "да",
      "Назначение": "Компонент включён в цену предложения",
      "Пример": "true"
    },
    {
      "Сущность": "price_rules",
      "Поле": "base_price_rule_id",
      "Тип": "id",
      "Обязательно": "условно",
      "Назначение": "Обязателен для minimum_charge; результат=max(базовый расчёт, amount)",
      "Пример": "price_rule_base_123"
    },
    {
      "Сущность": "price_rules",
      "Поле": "rounding_mode",
      "Тип": "enum",
      "Обязательно": "да",
      "Назначение": "none / floor / ceil / half_up",
      "Пример": "ceil"
    },
    {
      "Сущность": "price_rules",
      "Поле": "rounding_step",
      "Тип": "decimal",
      "Обязательно": "да",
      "Назначение": "Шаг округления тарифицируемого количества",
      "Пример": "1"
    },
    {
      "Сущность": "price_rules",
      "Поле": "minimum_billable_quantity",
      "Тип": "decimal",
      "Обязательно": "нет",
      "Назначение": "Минимальное тарифицируемое количество до расчёта",
      "Пример": "1"
    },
    {
      "Сущность": "price_rules",
      "Поле": "time_basis",
      "Тип": "enum",
      "Обязательно": "условно",
      "Назначение": "calendar_day / rolling_24h / started_hour / exact",
      "Пример": "calendar_day"
    },
    {
      "Сущность": "price_adjustments",
      "Поле": "application_base",
      "Тип": "enum",
      "Обязательно": "да",
      "Назначение": "base_amount / current_total",
      "Пример": "current_total"
    },
    {
      "Сущность": "price_adjustments",
      "Поле": "stacking_group",
      "Тип": "string",
      "Обязательно": "нет",
      "Назначение": "В одной группе разрешён только один применившийся модификатор",
      "Пример": "urgency"
    },
    {
      "Сущность": "offer_materials",
      "Поле": "id",
      "Тип": "id",
      "Обязательно": "да",
      "Назначение": "Идентификатор материала предложения",
      "Пример": "offer_material_123"
    },
    {
      "Сущность": "offer_materials",
      "Поле": "offer_id",
      "Тип": "id",
      "Обязательно": "да",
      "Назначение": "Ссылка на offers.id",
      "Пример": "offer_123"
    },
    {
      "Сущность": "offer_materials",
      "Поле": "material_code",
      "Тип": "string",
      "Обязательно": "да",
      "Назначение": "Ссылка на Материалы.code",
      "Пример": "carton"
    },
    {
      "Сущность": "offer_materials",
      "Поле": "included_quantity",
      "Тип": "decimal",
      "Обязательно": "нет",
      "Назначение": "Количество материала, включённое без доплаты",
      "Пример": "1"
    },
    {
      "Сущность": "offer_materials",
      "Поле": "billing_metric",
      "Тип": "enum",
      "Обязательно": "условно",
      "Назначение": "База начисления, если материал платный",
      "Пример": "items"
    },
    {
      "Сущность": "offer_materials",
      "Поле": "amount",
      "Тип": "decimal",
      "Обязательно": "условно",
      "Назначение": "Цена материала; пусто, если полностью включён",
      "Пример": "25"
    },
    {
      "Сущность": "price_tiers",
      "Поле": "sequence",
      "Тип": "integer",
      "Обязательно": "да",
      "Назначение": "Уникальный порядок диапазона в рамках price_rule_id",
      "Пример": "1"
    },
    {
      "Сущность": "rate_cards",
      "Поле": "source_document_ref",
      "Тип": "string",
      "Обязательно": "нет",
      "Назначение": "Ссылка на исходный опубликованный прайс",
      "Пример": "drive_file_id"
    },
    {
      "Сущность": "rate_cards",
      "Поле": "money_scale",
      "Тип": "integer",
      "Обязательно": "да",
      "Назначение": "Число знаков денежного округления",
      "Пример": "2"
    },
    {
      "Сущность": "rate_cards",
      "Поле": "series_code",
      "Тип": "string",
      "Обязательно": "да",
      "Назначение": "Стабильный код логической линейки тарифов",
      "Пример": "standard_fulfillment"
    },
    {
      "Сущность": "rate_cards",
      "Поле": "previous_rate_card_id",
      "Тип": "id",
      "Обязательно": "нет",
      "Назначение": "Предыдущая опубликованная версия для аудита цепочки",
      "Пример": "rate_card_122"
    },
    {
      "Сущность": "price_rules",
      "Поле": "tier_mode",
      "Тип": "enum",
      "Обязательно": "условно",
      "Назначение": "Обязателен при calculation_method=tiered; slab — вся величина по ставке итогового диапазона, progressive — величина делится по диапазонам",
      "Пример": "progressive"
    },
    {
      "Сущность": "price_rules",
      "Поле": "tier_variable",
      "Тип": "enum",
      "Обязательно": "условно",
      "Назначение": "Обязателен при calculation_method=tiered; код из реестра «Переменные диапазонов» — шкала, по которой режутся ступени",
      "Пример": "storage_age_days"
    },
    {
      "Сущность": "price_rules",
      "Поле": "tier_scope",
      "Тип": "enum",
      "Обязательно": "условно",
      "Назначение": "Обязателен при calculation_method=tiered; код из реестра «Области диапазонов» — группа, внутри которой шкала считается заново",
      "Пример": "batch"
    },
    {
      "Сущность": "price_tiers",
      "Поле": "tier_amount_type",
      "Тип": "enum",
      "Обязательно": "нет",
      "Назначение": "rate — ставка за единицу тарифицируемого количества (по умолчанию); fixed — фиксированная сумма за попадание в диапазон",
      "Пример": "rate"
    }
  ]
}