Направление работ: Back Код раздела: 2.7.3 Объекты и предложения > Скидки > Скидки баллами Статус: черновик Ответственный: Панкова Л.А. Версия: 0.1 Обновлено: 20.07.26


1. Назначение

Скидка баллами задает максимальную долю стоимости заказа, которую пользователь может оплатить М-баллами для выбранных объектов, площадок или услуг.

Запись настраивается внутри партнерской зоны и дополняет глобальные правила балльной системы. Фактическое списание баллов выполняется при обработке заказа.

2. Ключевые понятия

Скидка баллами — запись с максимальным процентом стоимости заказа, доступным для оплаты М-баллами.

М-баллы — баллы лояльности пользователя, которые могут быть списаны при оплате заказа по правилам балльной системы.

Глобальные правила балльной системы — общие настройки начисления и списания баллов, действующие на уровне системы.

3. Scope

Входит

S1 Скидки баллами: сущность, связь с партнерской зоной и место в правилах списания М-баллов.

S2 Параметры и данные: объекты, площадки или услуги, максимальный процент оплаты баллами и будущие условия активации.

Не входит

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 · commit 83423b21 / 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/ (списание и история)ПодтвержденоРасхождения нет.

0 items under this folder.