Операционная конфигурация¶
Операционная конфигурация — набор системных параметров, определяющих, как модуль лояльности выполняет денежные операции по балльному леджеру: какие системные счета участвуют в начислении, списании, сгорании и корректировке баллов, какая валюта представляет баллы, в каком порядке списываются лоты, на какой срок резервируются баллы и в каком часовом поясе работает программа. Параметры едины для всего модуля.
В отличие от справочников (НСИ), описывающих допустимые значения предметной области, операционная конфигурация задаёт внутреннюю механику леджера — небольшой, но критичный для целостности учёта набор настроек. Бизнес-правила программы — акции программы, правила списания, уровни — задаёт конфигурация программы.
Параметры¶
| Параметр (ключ) | Назначение | Значение по умолчанию |
|---|---|---|
Счёт-источник начислений (accrual.source-account) |
Системный счёт, с которого фондируются начисления (кредитовая сторона проводки начисления). | MRK (LOYALTY_ACCRUAL_SOURCE_ACCOUNT) |
Счёт-приёмник списаний (redemption.sink-account) |
Системный счёт, на который выводятся списанные (погашенные) баллы. | RDM (LOYALTY_REDEMPTION_SINK_ACCOUNT) |
Счёт сгорания баллов (expiry.breakage-account) |
Системный счёт, на который списываются сгоревшие (просроченные) баллы при закрытии лотов. | BRK (LOYALTY_EXPIRY_BREAKAGE_ACCOUNT) |
Счёт корректировок (correction.sink-account) |
Контрсчёт проводки «Корректировка» ручной операции — отдельный от счетов списания и сгорания. | CORR (LOYALTY_CORRECTION_SINK_ACCOUNT) |
Валюта баллов (points.currency) |
Код валюты баллов программы — единый источник истины для начисления, списания и витрины баланса. В неё начисляет программа: конфигурация программы валюту не выбирает. | PTS |
Порядок списания лотов (redemption.consume-order) |
Стратегия выбора лота при списании: FIFO, LIFO или FEFO. |
FEFO |
Срок жизни резерва баллов (redemption.hold-ttl) |
Срок действия резерва (холда), если вызывающий не задал свой, в формате ISO-8601 (например, PT30M). |
PT30M |
Часовой пояс программы (program.timezone) |
Единый часовой пояс контура (идентификатор IANA): в нём интерфейс вводит и показывает даты, а сервер считает календарные границы и трактует расписания — см. ниже. | Europe/Moscow (LOYALTY_PROGRAM_TIMEZONE) |
Двойная бухгалтерия
Леджер построен на двойной записи: каждая операция начисления, списания, сгорания или корректировки проводится между клиентским счётом и одним из системных счетов выше. Корректность этих значений напрямую определяет балансовую целостность учёта баллов.
Системные счета (MRK, RDM, BRK, CORR и др.) определяются в плане счетов модуля, валюта баллов
(PTS) и прочие валюты — в справочнике валют. Параметры операционной конфигурации
ссылаются на эти сущности по их кодам; счета и валюты должны существовать заранее.
Три системных счёта — по умолчанию разные
Источник начислений, счёт списаний и счёт сгорания по умолчанию — разные счета (MRK, RDM, BRK):
по номеру счёта-получателя отчёты делят ушедшие с клиентских счетов баллы на «списано» и «сгорело».
Счета RDM и BRK заводятся миграцией на базовом субсчёте валюты баллов, если их ещё нет;
заданные на контуре переопределения параметров не меняются.
Изменение параметров¶
Список параметров с действующими значениями и собственными переопределениями отдаёт
GET /v1/admin/system-config; задать или снять переопределение — PUT /v1/admin/system-config/{key},
без перезапуска модуля. Отдельной карточки для правки операционной конфигурации в интерфейсе нет:
интерфейс только читает параметры — например, валюту баллов программы для конфигурации программы и
для подсказки о сроке жизни баллов в форме акции.
Действующее значение определяется так: если для параметра задано собственное переопределение в базе — используется оно; иначе берётся значение из конфигурации среды (переменная окружения / свойство приложения), заданное при развёртывании. Так поведение по умолчанию совпадает с прежним, а правка через API переопределяет его без обновления конфигурации среды и без перезапуска экземпляра.
Согласованность с леджером
Изменение системного счёта или валюты баллов на «горячем» инстансе с уже накопленными остатками — операция повышенного риска: ранее проведённые операции остаются привязаны к прежним счетам. Такие изменения выполняются согласованно с планом счетов и, как правило, только на этапе ввода в эксплуатацию.
Срок жизни резерва: неразбираемое значение не ломает списание
Если переопределение поля «Срок жизни резерва баллов» не удаётся разобрать как срок ISO-8601 (например, из-за опечатки), модуль откатывается к значению из конфигурации среды — списание не остаётся без срока резерва.
Часовой пояс программы¶
program.timezone — единый пояс контура, и его применяет не только интерфейс, но и сервер:
- интерфейс вводит и показывает все даты в этом поясе, а не в поясе браузера; под полями с временем —
подсказка «Часовой пояс: UTC+3» со смещением на выбранный момент. Пояс открыт любому пользователю
интерфейса —
GET /v1/program/timezone→{zone}; - сервер режет в нём календарные сутки, недели и месяцы (календарный лимит участий в акции за день, неделю или месяц, итоги субсчёта за даты, дневные разрезы отчётов и мониторинга), подписывает даты в текстах клиенту и в именах файлов выгрузок;
- если операционный день не открыт, учётная дата проводки — календарная дата в этом поясе (с учётом переопределения);
- расписания фоновых заданий (сгорание баллов, предупреждения о сгорании, выгрузки во внешние системы) трактуются в этом поясе.
Значение — только идентификатор IANA (например, Europe/Moscow): Moscow или UTC+3 отклоняются
422 program_timezone_invalid, а непригодный LOYALTY_PROGRAM_TIMEZONE не даёт модулю стартовать.
Смена пояса действует без перезапуска (другие экземпляры модуля видят её в пределах срока кэша
справочников LOYALTY_REFERENCE_CACHE_TTL, по умолчанию 30 секунд), но расписания сгорания баллов и
предупреждений о сгорании перечитывают пояс только при старте модуля. Прошлое не пересчитывается:
проставленные учётные даты и сроки лотов остаются как есть.
Прочие настройки программы¶
Раздел меню «Настройка ПЛ» (экран «Настройка программы лояльности») содержит карточки:
| Карточка | Назначение | Роли |
|---|---|---|
| Ограничения на списание баллов | Общая политика списания: тип («Фикс (₽)» / «Процент (%)») и значение минимального и максимального списания за транзакцию, переключатель в заголовке карточки. Действует, пока у активной конфигурации программы нет своих правил списания. | чтение/запись LOYALTY_DICTIONARY_READ / WRITE |
| Лимиты по разрезам | Лимиты списания для конкретного уровня, сегмента или валюты баллов (TIER / SEGMENT / CURRENCY), флажок «Лимит активен». Частное бьёт общее: уровень → сегмент → валюта → правила активной конфигурации → общая политика. Лимит уровня задаётся кодом уровня и действует на этот код в любой конфигурации. Из нескольких сегментов клиента действует самое строгое ограничение. |
LOYALTY_DICTIONARY_READ / WRITE |
| Глобальная механика | Базовое начисление (кешбэк в процентах от суммы покупки), применяемое ко всем покупкам вне акций: переключатель в заголовке карточки, «Процент начисления», «Описание». | LOYALTY_DICTIONARY_READ / WRITE |
Управляющие флаги этих настроек (enabled политики списания, лимита и глобальной механики)
обязательны в контракте: сохранение полной формы без этих полей отклоняется с указанием
отсутствующего поля, а не общей ошибкой разбора тела.
Блок «Валюты и баллы» убран
Прежний блок управления балльными валютами в разделе «Настройка ПЛ» удалён из интерфейса. Балльные
валюты заводятся и настраиваются в разделе «Администрирование» → «Валюты» — см.
справочник валют программы. API /v1/admin/point-currencies сохранён для
совместимости и работает поверх того же справочника.
Перенос настроек между контурами¶
Операционная конфигурация как таковая (переопределения system-config) между контурами не
переносится — она возвращается к значениям из конфигурации среды целевого контура. Переносятся
смежные объекты, от которых зависит работа акций:
flowchart LR
A[Акции] --> B[Механики]
B --> C[Справочники]
| Что переносится | Правила | Подробнее |
|---|---|---|
| Механики (диаграммы RT Flow) с определениями параметров | Опознание по коду, отсутствующее создаётся, существующее пропускается, ошибка одной механики не отменяет перенос остальных. Механика едет вместе с определениями своих параметров одной транзакцией. Механика проверяется так же, как при заведении в админке (код, название, тип, диаграмма RT Flow), параметры — ключ и название обязательны, ключ не повторяется, тип из списка; набор без списка параметров переносит механику без параметров. Перенесённая механика попадает в журнал справочника механик. | GET/POST /v1/admin/mechanics/export, /import |
| Справочники (НСИ) | Те же правила, статус записи переносится как есть. | Справочники — перенос между контурами |
| Акции | Опознание по коду; приезжают выключенными (сбрасываются в черновик). Условие «Уровень клиента» ссылается на конфигурацию программы целевого контура: пара с конфигурацией или уровнем, которых там нет, отклоняется (422 promotion_level_unknown). |
см. руководство по акциям |
Конфигурации программы с их уровнями между контурами не переносятся — их заводят в целевом контуре.
Перенос акции без её механики в целевом контуре бессмыслен: карточка акции строится из определений параметров механики, и без них форма пуста. Поэтому механики переносятся тем же приёмом, что и акции: выгрузка → предпросмотр → применение.
Предпросмотр импорта. Загрузка бандла механик или справочников с параметром dryRun=true
ничего не записывает, но считает итог по тем же правилам, что и настоящая загрузка: что будет
создано, что пропущено как уже существующее, что не пройдёт (включая полную проверку создания —
период, лимиты, параметры — для акций). Отдельной ручки предпросмотра нет: предпросмотр и
применение обязаны отвечать одинаково, иначе предпросмотр показывал бы «всё хорошо» там, где
настоящая загрузка отказывает. Права на предпросмотр — те же, что на запись.
# Экспорт механик (все или по кодам)
GET /v1/admin/mechanics/export?codes=cashback_v1,cashback_v2
# Предпросмотр импорта — ничего не пишет
POST /v1/admin/mechanics/import?dryRun=true
# Применение
POST /v1/admin/mechanics/import
Просмотр через раздел «Справочники»¶
Эффективные системные счета, валюты и единицы измерения доступны для просмотра в разделе «Справочники» как справочники только для чтения — модуль отображает их актуальные значения из соответствующих системных таблиц.
| Справочник | Что показывает |
|---|---|
| Системные счета | Список счетов плана счетов: код, наименование, балансовая природа, тип погашения. |
| Валюты | Список валют: код, наименование, символ, точность (знаков после запятой). |
| Единицы измерения | Единицы для начисления по объёму, массе, штукам: код, символ, размерность, точность. |
# Просмотр системных счетов (read-only)
GET /v1/admin/dictionaries/system-account/entries
# Просмотр валют (read-only)
GET /v1/admin/dictionaries/currency/entries
Управление доступом¶
| Роль | Возможности |
|---|---|
LOYALTY_DICTIONARY_READ |
Просмотр операционной конфигурации и её эффективных значений. |
LOYALTY_DICTIONARY_WRITE |
Изменение параметров операционной конфигурации, политики списания, лимитов по разрезам и глобальной механики. |
LOYALTY_PROMOTION_READ / WRITE |
Экспорт / импорт механик между контурами. |
Программный интерфейс¶
| Метод и путь | Назначение | Роль |
|---|---|---|
GET /v1/admin/system-config |
Список параметров операционной конфигурации с эффективными значениями. | LOYALTY_DICTIONARY_READ |
PUT /v1/admin/system-config/{key} |
Задать (или снять — пустым значением) переопределение параметра; неизвестный ключ — 404 system_config_not_found, пояс не IANA — 422 program_timezone_invalid. |
LOYALTY_DICTIONARY_WRITE |
GET /v1/program/timezone |
Часовой пояс программы {zone}. |
любой аутентифицированный пользователь |
GET /v1/admin/redemption-policy |
Глобальная политика списания. | LOYALTY_DICTIONARY_READ |
PUT /v1/admin/redemption-policy |
Изменить глобальную политику списания. | LOYALTY_DICTIONARY_WRITE |
GET /v1/admin/redemption-limits |
Лимиты списания по разрезам. | LOYALTY_DICTIONARY_READ |
PUT /v1/admin/redemption-limits/{scopeType}/{scopeKey} |
Изменить (или создать) лимит по разрезу; DELETE на том же пути снимает его. |
LOYALTY_DICTIONARY_WRITE |
GET /v1/admin/global-mechanic |
Базовое начисление (глобальная механика). | LOYALTY_DICTIONARY_READ |
PUT /v1/admin/global-mechanic |
Изменить базовое начисление. | LOYALTY_DICTIONARY_WRITE |
GET/POST /v1/admin/mechanics/export, /import |
Перенос механик между контурами (dryRun — предпросмотр). |
LOYALTY_PROMOTION_READ / WRITE |
Пример ответа GET /v1/admin/system-config: