Vizen Shop

Quantity pricing rules

/docs/pricingcurrentМашинный перевод с английского· проверено 2026-08-22

Статус: current · public quantity Цена является active На витрине написано, cart, Гостевая цитата и checkout · проверенный: 2026-08-22, resolver/unit испытания, PostgreSQL up/down/up, public-surface/tenant/cart/order/receipt/lock Интеграционные тесты · владелец: гладиатр API документация Служить: GET /docs/pricing

1.Что существует сейчас

The API может создавать, перечислять, читать, редактировать явно activate/deactivate, мягкий, preview и атомарно мутирует quantity Правила. created одиночный или общий партия rule это always неактивный, даже если Клиент отправляет active:true. редактирование cannot изменение active Государство; используйте явное конечная точка активации с current expected_version.

Ан active public rule это applied в quantity=1 через GetProduct, GetProductBySlug, GetProducts, variants_info, список пожеланий, рынок и Проекции модерации. Тот же самый решатель использует реальный quantity в GetCart и QuoteCart; checkout повторяет расчет в своей операции. SEO, JSON-LD и vz-* HTML потреблять нормализованные product ДТО и не запускайте браузер-side Решитель. Соответствие line возврат catalog_unit_price, price_source=pricing_rule, promotion_locked=true, pricing_min_quantity и pricing_quantity_scope. Идентичность правил и внутренние Имена намеренно отсутствуют у покупателей.

Те, кто product Поверхности также return quantity_prices: сортированный public лестница будущего quantity пороговые значения. item содержит только min_quantity, unit_price и quantity_scope. Не является серийным PricingRule; тот Сервер решает победителя заново на каждом live Порог и опущенные точки, которые Не меняйте эффективный result. Это позволяет card правдиво показать “от 30 шт. — 95 ⁇ /шт..” before Покупатель меняет cart quantity, без утечка rule id/code/name, будущий клиент groups или административные метаданные. конфигурация products never Разоблачить лестницу.

ProductPrice использует аналогичный catalog_price field. Вариантные прогнозы Носить тот же сейф fields. Необработанный нуль ProductVariant.price конечная точка owner-остается только и остается editor Проекция, а не покупатель price.

GET    /pricing-rules
GET    /pricing-rules/{id}
POST   /pricing-rules
PUT    /pricing-rules/{id}
POST   /pricing-rules/{id}/active
DELETE /pricing-rules/{id}
POST   /pricing-rules/preview
POST   /pricing-rules/batch
PUT    /pricing-rules/collections/{collection_code}
POST   /pricing-rules/collections/{collection_code}/active

Каждая конечная точка является частной для current Токен-компания. id возвращает 404, Не является подтверждением того, что rule существует.

Generic Batch Upsert принимает решение о создании (id=0, expected_version=0) и обновлять items Все они (или все) являются none. Сбор заменит угощения items как Полное желаемое collection; expected_versions Необходимо точно описать полный current collection, включая rows Это будет удалено. publish желанный collection с active=true В том же пособии. Активация также сравнивает полную предзагрузку-image before Изменять любое row.

Все три звонка требуют idempotency_key. Повторение одного и того же запроса возвращает сохраненные result с replayed=true; повторное использование key для разных content Неудачи с PRICING_IDEMPOTENCY_KEY_REUSED. Оценка целевых показателей арендаторов, currency, Исключение конфигурации и полный будущий монотонный масштаб before Покупатель, следовательно, наблюдает либо за старым, либо за new commercial price список, never частично импортируемого.

2.Раздельно price отбор из promotions

Расчеты намеренно составляют два-stage:

catalog / variant / combo server price
        ↓
best applicable pricing_rule → fixed unit price + promotion_locked
        ↓
promotion engine (skips locked lines completely)

Разница в цене не записывается в discount_total, не потребляет а promotion бюджет кампании и не создает купонного выкупа. Отчеты могут позже отличать «проданный на оптовом уровне» от «предоставленного». promotion скидка”.

конфигурация products Они исключены. Их price Это доверенная конфигурация snapshot и ценообразование rule При этом один из них отвергается. CONFIGURATION_PRICING_RULE_NOT_ALLOWED.

3.Правило fields v1 граница

product_id это required; variant_id сужает target. min_quantity 1.9999 и unit_price является неотрицательным целым числом в shop currency. quantity_scope=line Проверить один exact cart line. quantity_scope=product Неконфигурационные линии одной и той же product поперек variants; а variant-целевой rule Меняется только то, что variant line.

MVP-А принимает audience=all. The schema резервы audience=customer_groups для MVP-б, но и API Отклонить его до местного магазина клиенты, group членства и их проекция чтения в частном порядке. Это покупатель groups, не staff/organisation роли.

v1 цели exact products или variants и использует fixed цены. Намеренно. не добавляет category-широкие проценты, такие как "все стулья -20%”; promotions уже own formula/category Если бы мы его дублировали и сопоставляли, то это привело бы к Второй конфликтный двигатель.

4. Конкретный победитель

Все применимые правила устанавливаются:

  1. самый низкий unit_price;
  2. variant target before product target;
  3. больше min_quantity;
  4. клиент-group audience before public audience (используемый after MVP-B);
  5. больше priority;
  6. ниже rule id.

Поэтому приоритет cannot Заставить покупателя заплатить more чем другой применимый fixed price. Для одного target/audience/scope, более высокий quantity не может увеличиваться тот price; Как пишет Break the Scale Failure with PRICING_SCALE_MUST_NOT_INCREASE.

PreviewPricingRules (POST /pricing-rules/preview) гидратирует current product/variant/combo price С сервера. Запрос never Ответы на все вопросы объясняются кандидат со стабильной reason такой как matched, below_min_quantity, variant_mismatch, inactive_or_outside_period или configuration_excluded.

5. API-Токен и граница webhook

Правила требуют специальных чувствительных prod scopes:

  • pricing:read — list/read/preview;
  • pricing:write — create/edit/activate/delete атомный batch/collection операции.

catalog:* и promotions:* не предоставляет доступ к ценообразованию. owner/admin Может быть, вы можете выдать любую цену scope. Дев-contour ПАТ cannot читать или Пишите правила, price fields или их values. Кабинет может: сеанс переключается на draft contour Пишет правила ценообразования, price fields (с их стороны visibility и привязки, то price rows Спектр-template layout и product price-field values входить draft. Они добираются до магазина следующим publish и оставить его в ROLLBACK - атрибут visibility Путешествует тем же путем. Издатель отказывается before Любые изменения, когда field deleted в draft до сих пор используется live (или другой путь round), когда draft row точками в одной audience который был изменен off или в а product deleted в draft, когда live и draft Правила вместе нарушают price масштаб. publish, Правила a commercial field взять audience из field's Окончательный доступ, как live field Редактировать можно. rule РПК и внутренние деньги values оставаться live (DEV_MODE_UNAVAILABLE в draft). Клиенты, роли клиентов, аудитория и политика доступа operational: а draft-contour Сеанс пишет их live. Каждый rule Измененный a publish посылать то же самое event и action как прямой монтаж (created, updated, deleted; activated/deactivated как pricing_rule.activated).

Webhooks — это уведомления, а не альтернативные записи. API. События pricing_rule.changed и pricing_rule.activated содержать только company_id, rule id, action и version. Они опускают fixed Цены, имена, Аудитория и будущее group членство. Подписываясь на commercial events является owner/admin операция; интеграция считывает объект отдельно с помощью live pricing:read PAT.

6. Запись., order snapshot направление бухгалтерского учета

Checkout берет общий ценовой замок и магазины, которые не подлежат обнулению order_items.pricing_snapshot в том же обязательстве, что и order, движение акций и promotion Искупление.Внутреннее snapshot содержит catalog/resolved суммы, source, rule id/code/name/version, quantity основа и promotion_locked; покупатель order API return только его безопасная проекция. существующий orders оставаться неизменным.

Если хотя бы один rule применяется, ConfirmCart.expected_total является обязательным. Пропущенное подтверждение не справляется PRICE_CONFIRMATION_REQUIRED; другой amount Неудачи с PRICE_CHANGED. Протобуф field это optional Так что настоящий ноль total Отличается от старого клиента, который его пропустил..

Закрытые линии остаются платными и участвуют в движении акций, но они не являются исключаемый из product/bundle/order/key/gift и условия эмиссионного купона. Order распределение скидок в фискальных чеках использует сохраненную маску замка, поэтому не часть а promotion молчаливо переносится на fixed-price line.

Стоимость материалов, price этажи, author/referral суммы, сборы и выплаты являются не columns из pricing_rules. Более поздняя бухгалтерская подсистема прикрепляет own Версированные снимки стоимости и неизменяемые транзакции breakdown до завершения order. Это разделение позволяет одному отчету собрать весь денежный поток без Позволяет снизить внутренние затраты data Утечка через API ценообразования покупателей.

7. Границы публичных ссылок

Не каждый number вблизи product это checkout кандидат. GiftPreview.value, combo компонент base_price/effective_price и owner-только сырой variant values явно reference/editor data. Цена rule относится к окончательной полученный combo line, never Рекурсивно к его компонентам. min_price/max_price и sort=price Сохранить свой установленный каталог-price query Семантика в MVP-А.; quantity ярусы являются resolved Возвращаясь назад cards и в cart quantity. меняться pagination/filter Семантика требует отдельного материализованный покупатель-price index не осуществляется имплицитно в R5.

8. Локальное визуальное demo

После этого W5 Backend и storefront работают, создают или обновляют выделенные demo shop с:

./tools/pricing/seed-demo-store.sh

The script создавать pricing-demo, четыре public products и трех видов поверхность: двухступенчатая лестница (включая запрашиваемый порог от 30), двухступенчатая лестница, а product-scope порог и контроль product с Не особенный price. Он пишет учетные данные и URL-адреса для .w5-stand/pricing-demo.json и утверждает, что public API лестница before завершающий.

Исходник: https://api.vizen.shop/docs/pricing?full=1

Работает в демо-режиме