FSP / Модули / pricing / rules
Нормативные правила FSP Pricing 1.0
Правила расчёта цены: выбор правила, условия, модификаторы, ступени, округление, версии прайса. Обязательны для соответствия модулю.
Строк: 25. Машиночитаемо: JSON · CSV
| ID | Правило |
|---|---|
PRICE-001 | Цена может зависеть от класса размера и от сырых метрик: веса, сторон, объёма и объёмного веса. |
PRICE-002 | Условия одной группы объединяются AND, группы объединяются OR. |
PRICE-003 | Пустая цена не равна нулю. |
PRICE-004 | Индивидуальная цена возвращает MANUAL_QUOTE_REQUIRED. |
PRICE-005 | Модификаторы показываются отдельной строкой расчёта. |
PRICE-006 | price_rules.amount обязателен для flat, per_unit, per_metric и minimum_charge. Для tiered и manual_quote поле пустое. |
PRICE-007 | Каждая строка price_tiers обязана содержать собственный amount и ссылку price_rule_id. |
PRICE-008 | Каждый price_adjustments обязан содержать value и ссылку price_rule_id. |
PRICE-009 | Подходящие price_rules сортируются по priority по возрастанию. Одинаковый priority в одном offer запрещён и возвращает PRICE_RULE_PRIORITY_CONFLICT. |
PRICE-010 | Если применимого активного правила нет, возвращается PRICE_RULE_NO_MATCH; нулевая цена допустима только как явный amount=0. |
PRICE-011 | Модификаторы применяются по priority. Одинаковый priority в одном stacking_group запрещён; application_base определяет базу fixed/percent/multiplier. |
PRICE-012 | minimum_charge требует base_price_rule_id и рассчитывается как max(результат базового правила, amount). Циклические ссылки запрещены. |
PRICE-013 | Диапазоны price_tiers одного правила не пересекаются, не имеют дыр, сортируются по sequence; quantity_from включена, quantity_to исключена. |
PRICE-014 | До умножения amount количество округляется по rounding_mode и rounding_step после применения minimum_billable_quantity. |
PRICE-015 | Денежный результат округляется half_up до rate_cards.money_scale; НДС рассчитывается по vat_mode и vat_rate и показывается отдельно. |
TIME-001 | Для calculation_datetime выбирается ровно одна active-версия rate_card с effective_from <= t < effective_to; пересечение периодов запрещено. |
STORAGE-001 | Бесплатный период хранения задаётся условиями по storage_age_days; метод FIFO/FEFO/LIFO не заменяет ценовое условие. |
PRICE-016 | calculation_method=tiered требует tier_mode, tier_variable и tier_scope. Переменная берётся только из реестра «Переменные диапазонов», область — только из реестра «Области диапазонов»; иное значение возвращает TIER_VARIABLE_UNKNOWN или TIER_SCOPE_UNKNOWN. |
PRICE-017 | tier_mode=slab: вся тарифицируемая величина считается по ставке диапазона, в который попало итоговое значение переменной. tier_mode=progressive: величина делится по диапазонам, каждая часть считается по своей ставке, результат суммируется. |
PRICE-018 | Ставки диапазонов не обязаны меняться монотонно: цена может расти и убывать по шкале. Бесплатный диапазон задаётся явным amount=0 и не равен пустой цене. |
PRICE-019 | tier_scope задаёт группу, внутри которой переменная считается заново: расчёт выполняется по каждой группе отдельно, суммы групп складываются. Режим и область обязаны входить в списки, разрешённые переменной. |
PRICE-020 | Разная цена первой и последующих единиц одного товара задаётся tier_variable=unit_sequence с областью уровня товара (order_sku, supply_sku, batch) и tier_mode=progressive. Отдельная услуга для этого не создаётся. |
PRICE-021 | minimum_billable_quantity и округление по PRICE-014 применяются к тарифицируемому количеству до разбиения по диапазонам; к частям в режиме progressive повторно не применяются. |
STORAGE-002 | Зависимость цены хранения от срока задаётся диапазонами по storage_age_days в сутках от приёмки партии: в режиме progressive каждые сутки тарифицируются по ставке своего диапазона, в режиме slab по storage_stay_days весь срок считается по ставке итогового диапазона. Направление ставок любое. |
STORAGE-003 | При частичном списании возраст остатка определяется методом ротации inventory_rotation_method (FIFO/FEFO/LIFO). Без указанного метода ступени по сроку не рассчитываются и возвращается STORAGE_ROTATION_REQUIRED. |