API публикации и истории тарифов продукта
Management API консоли вендора предоставляет неизменяемую историю версий одной серии тарифа Product и явную публикацию Draft. Эти маршруты не входят в публичное подмножество Partner API.
Операции
| Метод и путь | Права | Результат |
|---|---|---|
GET /api/v1/catalog/products/{productId}/tariffs/{vendorOfferId}/versions?offset=0&limit=50 | catalog.read + commerce.read | Упорядоченная неизменяемая история версий |
POST /api/v1/catalog/products/{productId}/tariffs/{vendorOfferId}/versions/{offerVersionId}/publish | catalog.read + commerce.read + commerce.manage + policies.read | Публикация точного допустимого Draft |
История содержит безопасные коммерческие поля, lifecycle timestamps, актуальную отображаемую метку Policy и явный статус разрешения technical package. Она не возвращает Tenant id, PriceBook id, provider price id, канонические package references, хеши и внутренние коды.
Читатель без одновременных дополнительных прав commerce.manage и
policies.read получает publishAction: null. При наличии обоих прав каждая
строка содержит безопасный publishAction.blockingReason; только единственный
допустимый Draft может вернуть Ready и allowed: true. Недоступная
историческая Policy остаётся видимой без метки и с completeness
TechnicalPackageUnresolved.
Сценарий в Console
В Product → «Тарифы» название тарифа открывает его неизменяемую историю версий. Локализованная таблица показывает версию и lifecycle, цену, актуальную метку Policy, период действия, полноту и готовность к публикации без отображения raw owner id, package reference и hash. В read-only истории нет кнопки публикации; заблокированные строки показывают серверную причину, но не становятся доступными для действия.
Только Draft со статусом Ready открывает подтверждение с повтором безопасных
данных. Одно подтверждение создаёт одну неизменяемую попытку. При сбое
зависимости повтор сохраняет точные path, body и idempotency key; stale-данные
закрывают подтверждение, обновляют историю и требуют нового подтверждения.
Успех и exact replay обновляют историю и агрегат тарифов Product.
Правила публикации
POST принимает ровно { "expectedRevision": positive-safe-integer }, один
печатный ASCII Idempotency-Key длиной 1–128 символов и JSON content type.
Неизвестные, повторяющиеся и authority-поля отклоняются до owner-вызовов. Tenant
берётся из аутентифицированного контекста, Product, тариф и версия — только из
канонического пути.
Durable exact replay разрешается до проверок изменяемого Product и Policy. Для
новой попытки сервис проверяет Active Product, свежую историю VCM, точную
ревизию Draft и закреплённый экспортируемый Policy package до фиксации
публикации в VCM. Успех и replay возвращают безопасную квитанцию Published;
у replay указано isIdempotentReplay: true.
Безопасные ошибки
Маршруты используют стабильные ошибки commerce.tariff_*: неверный запрос
(400), источник не найден (404), неверное состояние, stale-данные, конфликт
идемпотентности или неверные owner-evidence (409), недоступная зависимость
(503). Сбой обязательного владельца не возвращает частичную историю.
Авторитетные wire-схемы находятся в committed Management OpenAPI; полный Management artifact не публикуется как общедоступная загрузка Partner API.