stable версия 2.0
FSP Core 2.0
Общий язык: услуги, единицы начисления, категории товара, габаритные профили, оператор и склад.
Общий язык протокола. Всё остальное ссылается сюда: цена начисляется за услугу из каталога по единице из справочника метрик, мощность продаётся под категорию товара, заявка описывается теми же кодами.
Зависимостей нет. Объявить любой другой модуль без core нельзя.
Реестры
Каталог — что вообще делают на складе
| Реестр | Что внутри |
|---|---|
catalog_services |
61 услуга: 55 базовых и 6 отраслевых. Код неизменяем после публикации (CAT-001) |
categories |
Классификатор товарных категорий, корень any |
parameters |
Варианты выполнения операции. Вариант не создаёт новую услугу (CAT-011) |
billing_metrics |
Закрытый справочник единиц начисления и правил округления |
materials |
Материалы отдельно от операций (CAT-003) |
exclusions |
Явные границы: что не получает код услуги (субаренда, штрафы, реклама, самовыкуп) |
Связи — нормализованные, проверяются на целостность
| Реестр | Что связывает |
|---|---|
category_links |
Услуга ↔ категория: применимость (CAT-006) |
service_parameters |
Услуга ↔ параметр, с признаком обязательности |
service_metrics |
Услуга ↔ допустимая единица начисления. Источник истины для billing_metric (CAT-010) |
category_mapping |
Категории маркетплейсов ↔ категории стандарта, версионируемо (MAP-001) |
Габариты и вычисления
| Реестр | Что задаёт |
|---|---|
size_profiles |
Размерные классы версионируемого профиля. Класс всегда квалифицирован как <profile>:<version>:<class> (SIZE-006) |
derived_metrics |
Канонические формулы: сумма сторон, объём, объёмный и тарифицируемый вес (SIZE-005) |
Стороны и точки на карте
| Реестр | Что задаёт |
|---|---|
operators |
Оператор и его склады. На operator_id ссылается rate_cards.provider_id в FSP Pricing |
destinations |
Пункты назначения: склады и сортировочные центры маркетплейсов. Код неизменяем (CAT-012) |
Почему пункты назначения лежат здесь
«Доставка до Коледино» и «доставка до Каледино» — два разных прайса, которые невозможно сравнить, хотя склад один. Пока направление было свободной строкой, сравнение упиралось в орфографию.
Реестр даёт направлению код, на который ссылаются маршрут в FSP Capacity, условие цены в FSP Pricing и запрос сметы в FSP Quote. Название рядом остаётся, но идентификатором не является (CAP-005).
Реестр собран из официальных справочников маркетплейсов и содержит 1039 пунктов: склады поставок и точки сдачи Wildberries, фулфилмент-центры, сортировочные и распределительные центры, кросс-доки и точки приёма заказов Ozon. У каждой строки лежит идентификатор маркетплейса, поэтому ссылка однозначна и на его стороне.
У каждого пункта есть страна в коде ISO 3166-1. Это не формальность: в реестре уже лежат 31 точка Казахстана, Беларуси, Армении и Киргизии, и без страны склад в Алматы неотличим от склада в Астрахани по юрисдикции, валюте и режиму НДС. Страна обязательна и у склада оператора.
Список площадок не ограничен Россией: кроме Wildberries, Ozon, Яндекс Маркета, Авито, Ламоды, М.Видео и Леруа в нём есть Kaspi (Казахстан) и Uzum (Узбекистан).
Пункты выдачи покупателю и постаматы в реестр не заносятся. Их тысячи, состав меняется постоянно, и вести такой список внутри стандарта невозможно. Ссылка на них идёт внешним идентификатором маркетплейса — тем самым, которым он зовёт их у себя.
Правила
rules — нормативные правила модуля: CAT-* (каталог), SIZE-* (габариты), MAP-* (маппинг категорий), DATA-* (целостность), SCOPE-* (границы), PROFILE-* (манифест и согласование сторон).
Почему оператор и склад лежат здесь
operator_location нужен и мощностям, и смете, и будущим заказам. Здесь лежит только медленно меняющееся: кто это и где находится. Свободная площадь и пропускная способность меняются часто и описаны в FSP Capacity.
Что здесь принципиально
Каталог определяет смысл операции, но не её цену и не её исполнителя (CAT-002, CAT-011). Поэтому два прайса раскладываются в одни и те же коды и становятся сравнимыми.
Нормативные правила
Обязательны для соответствия модулю. Префиксы объявлены в манифесте:
CAT-*, SIZE-*, MAP-*, DATA-*, SCOPE-*, PROFILE-*.
CAT-001Коды стандартных услуг неизменяемы после публикации.CAT-002Одна строка прайса ФФ может включать несколько стандартных услуг.CAT-003Материалы хранятся отдельно от операций.CAT-004Для каждой услуги в каталоге хранится полный закрытый список допустимых billing_metric v1: код и название. Значение вне списка требует новой версии стандарта.CAT-005Разделы каталога используются только для навигации и не определяют категорийную применимость услуги.CAT-006Применимость услуги к товарной категории задаётся только на реестре «Связи категорий» по кодам услуги и категории.SIZE-001Размерные классы принадлежат версионируемому профилю.SIZE-002ФФ может использовать собственный профиль размеров.SIZE-003Если товар совпал с несколькими классами профиля, выбирается класс с минимальным числовым priority. Если совпадений нет, возвращается SIZE_PROFILE_NO_MATCH.MAP-001Категории WB/Ozon сопоставляются отдельными версионируемыми строками.CAT-007Связь с категорией any распространяется на все дочерние категории; более специфичная связь не отменяет any.CAT-008Каждый параметр услуги обязан существовать на реестре «Параметры», а связь — на реестре «Параметры услуг».CAT-009Тип услуги хранится явно: base или industry. Положение строки и название раздела не являются типом.SIZE-004Отсутствие обязательного входа размерного правила возвращает SIZE_PROFILE_INPUT_MISSING; null никогда не считается совпадением.SIZE-005sum_sides_cm, max_side_cm, volume_m3, volumetric_weight_kg и chargeable_weight_kg вычисляются только по реестру «Расчётные метрики».MAP-002Для пары source_system + source_category_id периоды active-маппингов не пересекаются; результат сопоставления должен быть единственным.DATA-001Все id уникальны в пределах сущности; все ссылки обязаны существовать; публикация блокируется при любой ошибке на реестре «Проверки».CAT-010Источник истины для допустимых billing_metric — реестр «Метрики услуг»; строковые списки каталога являются только витриной.SIZE-006size_class_id всегда квалифицирован как <profile>:<version>:<class>; использование S/M/L без профиля запрещено.SIZE-007Договорный размерный профиль и фактическая логика калькулятора хранятся раздельно; расхождение блокирует публикацию тарифа.CAT-011Варианты материала, размера, маршрута и объёма не создают новую услугу: они задаются материалом, параметром, метрикой или условием цены.SCOPE-001Позиции из реестра «Исключения» не добавляются в каталог и при импорте получают статус out_of_scope.SCOPE-002Самовыкуп и стимулированный отзыв не получают код услуги и не входят в предложение оператора.PROFILE-001Манифест публикуется по адресу /.well-known/fsp и является единственным источником сведений о поддерживаемых модулях. Договорённость вне манифеста не заменяет его.PROFILE-002Объявлять модуль, чьи зависимости не объявлены, запрещено: манифест с таким набором модулей недействителен.PROFILE-003Активны только модули, объявленные обеими сторонами. Для каждого общего модуля берётся пересечение версий и выбирается наибольшая; при пустом пересечении модуль исключается.PROFILE-004Исключение модуля исключает все модули, которые от него зависят, и все расширения, чей родительский модуль исключён. Пересчёт повторяется до стабилизации.PROFILE-005Итог согласования вычисляет и фиксирует принимающая сторона, возвращая его в ответе. При расхождении сторон действует итог принимающей.PROFILE-006Для модуля с уровнями соответствия согласованным считается наименьший общий уровень. Требование уровня выше согласованного не исключает сторону из обмена, а возвращается кодом непокрытия.PROFILE-007Имя расширения имеет вид x-<vendor>:<code> и обязано указывать родительский модуль. Расширение только добавляет поля и никогда не переопределяет поля стандарта.PROFILE-008Неизвестное поле, модуль или расширение игнорируется и не является ошибкой обмена. Отсутствие у другой стороны объявленного модуля тоже не ошибка.CAT-012Коды пунктов назначения неизменяемы после публикации. В реестр входят точки, до которых оператор осуществляет доставку: склады, сортировочные и распределительные центры, транзитные хабы и точки сдачи заказов. Пункты выдачи покупателю и постаматы в реестр не заносятся: их десятки тысяч и состав меняется постоянно, ссылка на них идёт внешним идентификатором маркетплейса.
Схема
JSON Schema 2020-12: /1.0/core/schema.json.
Определения: service_code, category_id, billing_metric, size_class_id, marketplace, scheme, country, destination_code, destination_type, destination, weekday, operator, operator_location.
Манифест модуля
{
"module": "core",
"title": "FSP Core",
"version": "2.0",
"versions": [
"1.0",
"1.1",
"1.2",
"1.3",
"1.4",
"2.0"
],
"status": "stable",
"summary": "Общий язык: услуги, единицы начисления, категории товара, габаритные профили, оператор и склад.",
"depends": [],
"registries": [
"catalog_services",
"categories",
"category_links",
"parameters",
"service_parameters",
"billing_metrics",
"service_metrics",
"materials",
"exclusions",
"size_profiles",
"derived_metrics",
"category_mapping",
"destinations",
"operators",
"rules"
],
"rule_prefixes": [
"CAT",
"SIZE",
"MAP",
"DATA",
"SCOPE",
"PROFILE"
],
"schema": "schema.json",
"profile": "../../profile/fsp-profile.schema.json"
}