Направление работ: Back Код раздела: 2.7.3 Объекты и предложения > Скидки > Скидки баллами Статус: черновик Ответственный: Панкова Л.А. Версия: 0.1 Обновлено: 20.07.26
1. Назначение
Скидка баллами задает максимальную долю стоимости заказа, которую пользователь может оплатить М-баллами для выбранных объектов, площадок или услуг.
Запись настраивается внутри партнерской зоны и дополняет глобальные правила балльной системы. Фактическое списание баллов выполняется при обработке заказа.
2. Ключевые понятия
Скидка баллами — запись с максимальным процентом стоимости заказа, доступным для оплаты М-баллами.
М-баллы — баллы лояльности пользователя, которые могут быть списаны при оплате заказа по правилам балльной системы.
Глобальные правила балльной системы — общие настройки начисления и списания баллов, действующие на уровне системы.
3. Scope
Входит
S1 Скидки баллами: сущность, связь с партнерской зоной и место в правилах списания М-баллов.
S2 Параметры и данные: объекты, площадки или услуги, максимальный процент оплаты баллами и будущие условия активации.
Не входит
- Back 2.7 Скидки — общая модель скидок и операции над ними
- Back 2.7.1 Акции и промокоды — автоматические и ручные скидки на заказы
- Back 2.7.2 Горящие предложения — скидки на незанятое время площадок и услуг
- Back 8.4.2 Настройки балльной системы — глобальные правила начисления и списания М-баллов
- Back 3.2 Процессинг заказов — фактическое списание баллов при оплате заказа
- Back 2.1 Объекты партнеров и Back 2.2 Площадки партнеров — управление объектами, площадками и услугами
- Back 8.2.1 Сферы и опции — управление справочником опций и их диапазонами
4. Требования
Правила и ограничения бизнеса на уровне данных, источник истины в системе.
| ID | Требование | Комментарий | Тип требования | Вес | Статус |
|---|---|---|---|---|---|
| S1: BR2.7.3-1 | Скидка баллами должна определять максимальный процент итоговой стоимости заказа, доступный для оплаты М-баллами. | Фактическое списание выполняется в Back 3.2. | Бизнес | 1 | Реализовано OQ2.7.3-2, OQ2.7.3-7 |
| S1: BR2.7.3-2 | Скидка баллами должна настраиваться отдельно в каждой партнерской зоне с учетом глобальных правил балльной системы. | Глобальные правила раскрываются в Back 8.4.2. | Бизнес | 1 | Частично OQ2.7.3-3 |
| S2: BR2.7.3-3 | Скидка баллами должна быть связана хотя бы с одним объектом партнерской зоны. | Системное | 1 | — OQ2.7.3-1 | |
| S2: BR2.7.3-4 | Если площадки или услуги не выбраны, скидка баллами должна действовать на все площадки и услуги выбранного объекта. | Бизнес | 1 | Частично OQ2.7.3-4 | |
| S2: BR2.7.3-5 | Максимальный размер скидки баллами должен задаваться в процентах от итоговой стоимости заказа и составлять не менее 5%. | Значение хранится как числовой процент. | Системное | 1 | Частично OQ2.7.3-5 |
| S2: BR2.7.3-6 | Скидка баллами должна поддерживать дополнительные условия активации (после релиза реализация). | Состав условий: - опции и диапазоны опций (если не заданы — все опции и любые диапазоны) - источники заказа: «Мобильное» и «Каталог» - дни недели (если не заданы — все дни) - один или несколько интервалов времени (если не заданы — весь день) - признак «День в день» (если не задан — ограничение не применяется) - календарный период действия (если не задан — без ограничения по периоду) - минимальная длительность заказа (если не задана — не учитывается) | Системное | 3 | Не реализовано OQ2.7.3-6 |
5. Открытые вопросы
Сверка с кодом: BRD 2.7.3 v0.1 · репозиторий
booking-monorepo· commit83423b21/main· 26.07.26 · якоряsrc/services/booking.partner-management(хранение) иsrc/services/booking.orders(применение) Сводка: 7 вопросов (Open 5 · Подтверждено 2) Внимание: сущности «скидка баллами» в сервисе скидок нет — функциональность живёт в других сервисах, якорь отличается от разделов 2.7, 2.7.1 и 2.7.2. Маршрутизация без сверки с гайдбуком (гайдбук не передавался).
| ID | Источник | Вопрос | Кому | Статус | Рекомендации | Итоговое решение |
|---|---|---|---|---|---|---|
| OQ2.7.3-1 | Код BR2.7.3-3 | Требование говорит: скидка баллами — это запись, связанная хотя бы с одним объектом партнёрской зоны. В коде такой записи не существует: максимальный процент оплаты баллами — это поле объекта и поле площадки, оно лежит в сервисе управления партнёрскими зонами рядом с названием, описанием и вместимостью. Отдельной сущности «скидка баллами» нет ни в сервисе скидок, ни где-либо ещё: нечего создавать, архивировать или связывать с объектами. Требование BR2.7.3-3 к текущей модели неприменимо — поэтому в статусе «—», а не «Не реализовано». \ RoomInfo.cs:35 (поле площадки), Base.cs:29 (поле объекта), UpdateRoomCommand.cs:33, CreateBaseCommand.cs:40 | Бизнес | Open | (А) Привести BRD к коду (рекоменд.): описать скидку баллами как параметр объекта и площадки, а не как отдельную запись со связями; тогда BR2.7.3-3 снимается, а BR2.7.3-4 превращается в правило наследования значения (см. OQ2.7.3-4). (Б) Если нужна именно отдельная настраиваемая запись (со своими условиями активации из BR2.7.3-6) — это новая сущность и новый сервисный контур; тогда раздел стоит переписать как описание будущей функциональности и отметить это в статусе, иначе при каждой сверке он будет расходиться с кодом. | |
| OQ2.7.3-2 | Код BR2.7.3-1 | Требование говорит: скидка баллами определяет максимальный процент итоговой стоимости заказа, доступный для оплаты М-баллами. В коде процент считается от стоимости после применения всех скидок, но до вычета баллов, и результат округляется вниз до целого рубля; затем берётся меньшее из этой величины и баланса клиента. Термин «итоговая стоимость» в BRD не расшифрован, а вариантов как минимум три: до скидок, после скидок, после скидок и сборов — суммы получаются разные. \ CalculationService.cs:423 (база расчёта), :427 (процент и округление вниз), :428 и :446 (ограничение балансом), :450 (вычет баллов) | Бизнес | Open | (А) Подтвердить текущую базу (рекоменд.): процент от стоимости после скидок — так баллы не «съедают» акционную цену дважды; тогда в BR2.7.3-1 заменить «итоговой стоимости» на «стоимости после применения скидок» и добавить про округление вниз. (Б) Если база должна быть другой — это правка расчёта заказа (Back 4.2), и её нужно согласовывать там же. Отдельно уточните, входят ли в базу дополнительные позиции: сейчас входят. | |
| OQ2.7.3-3 | Код BR2.7.3-2 | Требование говорит: скидка баллами настраивается отдельно в каждой партнёрской зоне с учётом глобальных правил балльной системы. В коде первая часть выполняется: процент задаётся у каждого объекта и каждой площадки, то есть внутри своей партнёрской зоны. Вторая часть в расчёте не подтверждается: при вычислении доступных к списанию баллов используются только процент площадки и баланс клиента — обращения к глобальным настройкам балльной системы в этом месте нет, и верхнего общесистемного ограничения на процент не применяется. Возможно, глобальные правила действуют раньше — при начислении баллов или в разделе Back 8.4.2, который в этот обход не входил. \ CalculationService.cs:427-446 (в расчёте только процент площадки и баланс) | Бизнес | Open | Сформулировать, что означает «с учётом глобальных правил»: глобальная настройка ограничивает процент партнёра сверху, задаёт значение по умолчанию или относится только к начислению баллов. От ответа зависит, дефект это или неточность формулировки. Проверку удобно совместить со сверкой Back 8.4.2 — в текущем обходе (объекты, площадки, расчёт заказа) глобальных правил нет. | |
| OQ2.7.3-4 | Код BR2.7.3-4 | Требование говорит: если площадки или услуги не выбраны, скидка баллами действует на все площадки и услуги выбранного объекта. В коде связь объекта и площадки устроена как разовое копирование, а не наследование: при создании площадки, если процент не указан явно, берётся текущее значение объекта и записывается в площадку. Дальше значения живут независимо — если потом изменить процент у объекта, у ранее созданных площадок он останется прежним. Расчёт заказа всегда смотрит только на процент площадки. \ CreateRoomCommandHandler.cs:89 (копирование при создании), UpdateBaseCommandHandler.cs:116 (изменение объекта не затрагивает площадки), CalculationService.cs:427 (расчёт по площадке) | Разработка | Open | Сначала нужен ответ бизнеса по OQ2.7.3-1 — от модели зависит, что чинить. Если модель «параметр объекта и площадки» остаётся, стоит завести тикет в Bitrix: либо распространять изменение процента объекта на площадки, у которых значение не переопределено (для этого нужен признак «унаследовано»), либо честно описать в BRD, что значение копируется один раз при создании площадки. Сейчас партнёр, меняющий процент у объекта, скорее всего ожидает первого, а получает второе. | |
| OQ2.7.3-5 | Код BR2.7.3-5 | Требование говорит: максимальный размер задаётся в процентах и составляет не менее 5%. В коде значение хранится числом (процентом) — это соответствует требованию, — но никаких проверок нет: ни минимума 5%, ни границ 0–100. Можно сохранить 0 (оплата баллами фактически отключается), отрицательное число или 500%. При 500% ограничение сведётся к балансу клиента, и он сможет оплатить баллами весь заказ. \ RoomInfo.cs:20 и :35 (сохранение без проверок), Base.cs:29; проверок нет ни в командах создания, ни в командах изменения объекта и площадки | Разработка | Open | Завести тикет в Bitrix: проверять процент при сохранении объекта и площадки — не менее 5% и не более 100%. Продуктового выбора почти нет, уточнить у бизнеса стоит одно: допустимо ли значение 0 как способ отключить оплату баллами для площадки. Если да — правило звучит как «0 или от 5% до 100%», и это стоит записать в BR2.7.3-5, потому что сейчас поиск отбирает площадки по условию «процент больше нуля». | |
| OQ2.7.3-6 | Код BR2.7.3-6 | Что подтверждено: дополнительных условий активации у скидки баллами в коде нет — ни опций и диапазонов, ни источников заказа, ни дней недели, интервалов, признака «День в день», периода действия или минимальной длительности. Хранится ровно одно число — процент. Это соответствует пометке самого требования «(после релиза реализация)» и весу 3: расхождением не является, зафиксировано как отправная точка для будущей сверки. \ RoomInfo.cs:13-22 (полный состав полей площадки), Base.cs:29 | — | Подтверждено | Расхождения нет — требование помечено как будущее. При планировании реализации учтите ответ по OQ2.7.3-1: условия активации требуют отдельной сущности, в поле объекта или площадки их не разместить. | — |
| OQ2.7.3-7 | Код BR2.7.3-1 | Что подтверждено: механизм оплаты баллами работает end-to-end. Процент площадки передаётся в расчёт заказа, по нему вычисляется максимально возможное списание, оно ограничивается балансом клиента, вычитается из стоимости после скидок, и итог не может стать отрицательным. Учёт баллов можно выключить признаком у заказа — тогда списание равно нулю; для уже оплаченных заказов сохраняется ранее списанное значение, даже если оно больше текущего баланса. Само списание и история операций живут в сервисе клиентов. \ GetRoomPointsInfosInternalQuery.cs:24-29 и RoomReadOnlyRepository.cs:1664-1677 (передача процента), CalculationService.cs:427-450 (расчёт и вычет), booking.clients/…/PointsAggregate/ (списание и история) | — | Подтверждено | Расхождения нет. | — |