Содержание

Структура базы данных ProBonus

В статье описана структура базы данных системы лояльности ProBonus: таблицы, поля, ключи, индексы и связи между ними. Статья предназначена для специалистов, которые сопровождают систему, строят собственные отчёты по данным ProBonus или интегрируют её с внешними системами.

Описание соответствует версии схемы БД 00088 (ProBonus 1.2.86.411). Номер версии схемы конкретной базы хранится в таблице db_information, поле version_num.

Важно! Структуру БД создаёт и обновляет сервер ProBonus при подключении к базе и при обновлении версии. Не изменяйте структуру и данные таблиц вручную — все операции со счетами, балансами и акциями выполняйте через веб-интерфейс или ProBonus API. Прямые SQL-запросы к базе допустимы только на чтение (например, для отчётов).

Общие сведения

Соглашения

Схема связей

Основные связи, сгруппированные вокруг ключевых таблиц. Запись A ──► B означает, что таблица A содержит внешний ключ на таблицу B. Полный перечень ключей приведён в описании каждой таблицы.

account (гость)
 ├──► account_group ──► account_template ──► discount ◄── discount_level
 ├──► discount                      (индивидуальная составная скидка)
 │
 │  Ссылаются на account:
 ├◄── phone, email, additional_contact
 ├◄── identifier ──► identifier_type
 ├◄── accounts_tags ──► tag ──► tag_group
 ├◄── discount_temporary, account_coupon_dish ──► coupon_dish
 ├◄── account_event ◄── account_event_handling
 ├◄── anti_fraud_events, segment_account ──► segment
 ├◄── account_referral (пригласивший и приглашённый)
 ├◄── transaction_balance, mailing_message, review, promotion_actuation_log
 └◄── transaction

transaction (операция по счёту)
 ├──► check ◄── check_cache ──► dishes_cache_by_check
 ├──► identifier, restaurant
 ├──► transaction_manual ──► user
 ├◄── transaction_balance
 ├◄── transaction_promo_stamp ──► promo_stamp
 └◄── account_coupon_dish, anti_fraud_events

promo_stamp (акция «Штампики»)
 ├◄── promo_stamp_dish_code
 ├◄── promo_stamp_account_group ──► account_group
 └◄── promo_stamp_restaurant ──► restaurant

promotion (сегментная акция) ──► segment
 └◄── promotion_action ──► segment
       ├◄── promotion_actuation ◄── promotion_actuation_log
       ├◄── mailing ◄── mailing_message ──► message_content ◄── message_content_media ──► media
       └◄── promocode_activation, accounts_tags

promotion_trigger
 ├◄── promotion_trigger_promo_stamp_settings ◄── promotion_trigger_promo_stamp_settings_stamp ──► promo_stamp
 └◄── promotion_actuation_log

review ──► account, additional_contact, restaurant
 └◄── review_message ──► media

Состав базы по разделам

Раздел Таблицы Назначение
Счета гостей account, account_group, account_template, phone, email, additional_contact, identifier, identifier_type, tag_group, tag, accounts_tags, account_event, account_event_handling, anti_fraud_events Гости, их контакты и идентификаторы, группы и шаблоны условий, теги, события и антифрод
Скидки discount, discount_level, discount_temporary Составные скидки (лестницы уровней) и временные скидки
Транзакции и чеки transaction, transaction_balance, transaction_manual, check, dishes_cache_by_check, check_cache, restaurant Операции по счетам, баланс и сгорание бонусов, чеки r_keeper
Штампики и товарные купоны promo_stamp, promo_stamp_dish_code, promo_stamp_account_group, promo_stamp_restaurant, transaction_promo_stamp, coupon_dish, account_coupon_dish Акция «Штампики N+1» и товарные купоны
Сегменты и акции segment, segment_account, promotion, promotion_action, promotion_actuation, promotion_actuation_log, promocode_activation, promotion_trigger, promotion_trigger_promo_stamp_settings, promotion_trigger_promo_stamp_settings_stamp Сегменты, сегментные и триггерные акции, промокоды, журнал применения
Реферальная программа referral_program, account_referral Настройки программы и связи «пригласивший — приглашённый»
Рассылки, боты и отзывы mailing, mailing_message, message_content, message_content_media, media, review, review_message, policy_text_version Рассылки и сообщения гостям, отзывы, тексты политик
Wallet wallet_cards_template, wallet_device_cards Карты Apple Wallet
Интеграция с r_keeper и кассами rkeeper_bonus_types, rkeeper_discount_tree, cash_registration_settings Кэш справочников r_keeper, регистрация гостей с кассы
Пользователи веб-интерфейса user, user_role, user_role_right, user_refresh_token, user_db_object_permission Пользователи, роли, права и сессии
Служебные таблицы db_information, metric, sysdiagrams Версия схемы, статистика API

Ключевые связи

Описание таблиц

Обозначения в колонке «Ключ»: PK — первичный ключ, ID — автоинкремент (IDENTITY), FK — внешний ключ (в скобках — правило удаления, если оно отличается от NO ACTION), DF — значение по умолчанию.

Счета гостей

account

Счёт гостя — центральная таблица системы. Хранит анкету гостя, его группу, индивидуальные настройки скидки/бонуса, лимиты и признаки блокировки. Настройки, заданные в счёте, переопределяют настройки шаблона группы. См. Счета.

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор счёта (ID гостя)
is_deleted bit Признак удаления (мягкое удаление)
first_name nvarchar(100) да Имя
last_name nvarchar(100) да Фамилия
middle_name nvarchar(100) да Отчество
birthday date да Дата рождения (используется в сегментах «День рождения»)
sex int да Пол
text nvarchar(max) да Доп. информация о госте
message_to_screen nvarchar(max) да «Сообщение для экрана» — выводится кассиру при применении карты
message_on_check nvarchar(max) да «Сообщение для печати» — печатается в чеке/пречеке
account_group_id int FK → account_group.id Группа счетов
discount_id int да FK → discount.id Составная скидка (лестница уровней), если задана индивидуально
discount_limit_period int да Ограничение скидок/бонусов: период лимита суммы
discount_limit_amount bigint да Ограничение скидок/бонусов: максимальная сумма за период
discount_use_limit_period int да Ограничение скидок/бонусов: период лимита количества применений
discount_use_limit_count int да Ограничение скидок/бонусов: максимальное количество применений за период
rk_code int да Код скидки (бонуса) в r_keeper
rk_bonus_type_code int да Код типа бонуса в r_keeper
pay_limit_period int да Ограничение оплат со счёта: период лимита суммы
pay_limit_amount bigint да Ограничение оплат со счёта: максимальная сумма за период
pay_use_limit_period int да Ограничение оплат со счёта: период лимита количества
pay_use_limit_count int да Ограничение оплат со счёта: максимальное количество оплат за период
bonus_lifetime int да Срок жизни начисляемых бонусов, дней
is_blocked bit DF 0 Счёт заблокирован
block_reason nvarchar(100) да Причина блокировки
block_type int да Тип блокировки
create_datetime datetime да Дата и время создания счёта
utm nvarchar(max) да UTM-метки, с которыми гость пришёл в систему (бот, ссылка регистрации)
except_from_anti_fraud bit DF 0 Исключить счёт из проверок антифрода
bonus_delayed_days int да Отложенное начисление бонусов, дней
valid_to date да Срок действия счёта
not_award_bonuses_if_paid_with_bonuses bit DF 0 Не начислять бонусы, если чек оплачен бонусами. См. Либо начисление, либо оплата бонусами

Индексы:

На таблицу ссылаются: account_coupon_dish.account_id, account_event.account_id, account_referral.invited_account_id, account_referral.inviting_account_id, accounts_tags.account_id, additional_contact.account_id (CASCADE), anti_fraud_events.account_id, discount_temporary.account_id, email.account_id, identifier.account_id, mailing_message.account_id, phone.account_id, promocode_activation.account_id, promotion_actuation_log.account_id (CASCADE), review.account_id, segment_account.account_id (CASCADE), transaction.account_id, transaction_balance.account_id

account_group

Группа счетов. Объединяет гостей с одинаковыми условиями лояльности; условия задаются через шаблон. См. Группы счетов.

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор группы
is_deleted bit Признак удаления
name nvarchar(100) Наименование группы
account_template_id int да FK → account_template.id Шаблон настроек группы
except_from_anti_fraud bit DF 0 Исключить всю группу из проверок антифрода

На таблицу ссылаются: account.account_group_id, promo_stamp_account_group.account_group_id, referral_program.invited_account_group_id

account_template

Шаблон группы счетов — набор настроек, которые получает счёт группы: скидка/бонус, лимиты, стартовый баланс, сроки жизни бонусов. Поля аналогичны одноимённым полям account.

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор шаблона
message_to_screen nvarchar(max) да Сообщение для экрана по умолчанию
message_on_check nvarchar(max) да Сообщение для печати по умолчанию
discount_id int да FK → discount.id Составная скидка
discount_limit_period int да Период лимита суммы скидок/бонусов
discount_limit_amount bigint да Лимит суммы скидок/бонусов
discount_use_limit_period int да Период лимита количества применений
discount_use_limit_count int да Лимит количества применений
pay_limit_period int да Период лимита суммы оплат со счёта
pay_limit_amount bigint да Лимит суммы оплат со счёта
pay_use_limit_period int да Период лимита количества оплат
pay_use_limit_count int да Лимит количества оплат
rk_code int да Код скидки (бонуса) в r_keeper
rk_bonus_type_code int да Код типа бонуса в r_keeper
starting_balance bigint да Стартовый (приветственный) баланс нового счёта
bonus_lifetime int да Срок жизни начисляемых бонусов, дней
starting_balance_lifetime int да Срок жизни стартового баланса, дней
bonus_delayed_days int да Отложенное начисление бонусов, дней
not_award_bonuses_if_paid_with_bonuses bit DF 0 Не начислять бонусы, если чек оплачен бонусами

На таблицу ссылаются: account_group.account_template_id

phone

Телефоны гостя. У счёта может быть несколько номеров, один из них — основной.

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор записи
is_deleted bit Признак удаления
number nvarchar(15) Номер телефона (цифры, с кодом страны, например 79991234567)
is_primary bit Основной номер
account_id int FK → account.id Счёт гостя
text nvarchar(max) да Комментарий

Индексы:

На таблицу ссылаются: transaction.identifier_id, wallet_device_cards.identifier_id

identifier_type

Справочник типов идентификаторов. Системные типы создаются автоматически: phone, card, wallet, wallet_dynamic, system, temporary, system_tg, temporary_tg, system_max, temporary_max.

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор типа
is_deleted bit Признак удаления
name nvarchar(100) Наименование типа
system bit DF 1 Системный тип (нельзя удалить)
system_type varchar(20) да Код системного типа (см. описание таблицы)
temporary bit DF 0 Временный идентификатор (имеет срок действия)
front_visible bit DF 1 Отображать в веб-интерфейсе
front_editable bit DF 1 Разрешено редактировать в веб-интерфейсе

На таблицу ссылаются: identifier.identifier_type_id

tag_group

Группы тегов счетов. См. Теги счетов.

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор группы тегов
is_deleted bit DF 0 Признак удаления
name nvarchar(100) Наименование

На таблицу ссылаются: tag.group_id

tag

Теги счетов — метки для классификации гостей.

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор тега
is_deleted bit DF 0 Признак удаления
name nvarchar(100) Наименование тега
group_id int FK → tag_group.id Группа тегов

На таблицу ссылаются: accounts_tags.tag_id

accounts_tags

Назначение тегов счетам с периодом действия. Тег может быть назначен вручную пользователем или автоматически акцией.

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор назначения
tag_id int FK → tag.id Тег
account_id int FK → account.id Счёт гостя
date_begin date DF getdate() Дата начала действия тега
date_end date да Дата окончания (NULL — бессрочно)
assignment_type int DF 1 Способ назначения (вручную / акцией)
user_id int да FK → user.id Пользователь, назначивший тег
promotion_action_id int да FK → promotion_action.id Действие акции, назначившее тег
promotion_action_type int да Тип действия акции
comment nvarchar(max) да Комментарий

Индексы:

transaction_manual

Ручные операции — пополнения и изъятия из веб-интерфейса, групповых операций, акций и реферальной программы. См. Пополнение и изъятие.

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор операции
refill_reason nvarchar(max) да Причина (комментарий) операции
user_id int да FK → user.id Пользователь, выполнивший операцию
type int да Тип ручной операции

На таблицу ссылаются: transaction.transaction_manual_id

check

Чеки r_keeper — исходные данные чека, полученные с кассы через FarCards.

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор чека
date datetime да Дата и время чека
xml nvarchar(max) да XML чека (текст)
check_guid uniqueidentifier да GUID чека r_keeper
chmode int да Режим чека r_keeper: 1 — оплата, 3 — возврат. См. Режимы чека
rest_code nvarchar(9) да Код ресторана r_keeper
external_data nvarchar(max) да Дополнительные данные чека
xml_native xml да XML чека (тип xml)
cash_server_name nvarchar(255) да Имя кассового сервера (MID)

На таблицу ссылаются: check_cache.check_id, transaction.check_id

dishes_cache_by_check

Справочник блюд из чеков — блюда, встречавшиеся в чеках, по ресторанам. Используется отчётами и выбором блюд в акциях.

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор записи
name nvarchar(500) Наименование блюда
code int Код блюда r_keeper
rest_code nvarchar(9) Код ресторана r_keeper

Индексы:

На таблицу ссылаются: check_cache.dishes_cache_by_check_id

check_cache

Состав чеков — блюда в каждом чеке с количеством (разобранный XML для быстрых отчётов).

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор записи
check_id int FK → check.id Чек
dishes_cache_by_check_id int FK → dishes_cache_by_check.id Блюдо
count numeric(19,4) Количество

Индексы:

restaurant

Рестораны, подключённые к ProBonus (с учётом лицензирования). См. Рестораны.

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор ресторана
is_deleted bit Признак удаления
name nvarchar(100) Наименование
code nvarchar(9) Код ресторана r_keeper

На таблицу ссылаются: promo_stamp_restaurant.restaurant_id, review.restaurant_id, transaction.restaurant_id

Штампики и товарные купоны

promo_stamp

Акции «Штампики N+1». См. Штампики.

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор акции
is_deleted bit Признак удаления
name nvarchar(20) Наименование (до 20 символов)
date_start datetime Начало действия
date_stop datetime да Окончание действия (NULL — бессрочно)
discount_code int Код скидки r_keeper для подарочного блюда (уникальная для каждой акции)
promo_dish_count int «Порций купить» — N, количество акционных блюд для получения подарка
gift_dish_count int «Подарочных порций» — количество подарков за цикл
hide_progress_without_activity bit DF 0 Не показывать прогресс гостям без покупок по акции

На таблицу ссылаются: promo_stamp_account_group.promo_stamp_id, promo_stamp_dish_code.promo_stamp_id, promo_stamp_restaurant.promo_stamp_id, promotion_trigger_promo_stamp_settings_stamp.promo_stamp_id (CASCADE), transaction_promo_stamp.promo_stamp_id

promo_stamp_dish_code

Блюда акции «Штампики» — акционные (покупаемые) и подарочные.

Поле Тип NULL Ключ Описание
promo_stamp_id int PK, FK → promo_stamp.id Акция
dish_code int PK Код блюда r_keeper
dish_type int PK 0 — акционное блюдо, 1 — подарочное блюдо
comment nvarchar(50) да Наименование блюда (для отображения)

promo_stamp_account_group

Группы счетов, участвующие в акции «Штампики». Нет записей — акция действует для всех групп.

Поле Тип NULL Ключ Описание
promo_stamp_id int PK, FK → promo_stamp.id Акция
account_group_id int PK, FK → account_group.id Группа счетов

promo_stamp_restaurant

Рестораны акции «Штампики». Нет записей — акция действует во всех ресторанах.

Поле Тип NULL Ключ Описание
promo_stamp_id int PK, FK → promo_stamp.id Акция
restaurant_id int PK, FK → restaurant.id Ресторан

transaction_promo_stamp

Движения по акции «Штампики» — каждая покупка акционного блюда и каждая выдача подарка в чеке. Отдельного счётчика нет: прогресс гостя вычисляется по этой таблице (см. раздел «Типовые запросы»).

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор записи
promo_stamp_id int FK → promo_stamp.id Акция
transaction_id int FK → transaction.id Транзакция (чек)
kind int 0 — куплено акционное блюдо, 1 — выдан подарок
check_dish_code int Код блюда в чеке
check_dish_name nvarchar(500) Наименование блюда в чеке
check_dish_qnt int Количество (отрицательное — возврат/отмена)
check_dish_sum bigint DF 0 Сумма по блюду, копейки
check_sum bigint DF 0 Сумма чека, копейки

Индексы:

coupon_dish

Товарные купоны (справочник). См. Товарные купоны.

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор купона
name nvarchar(max) Наименование
discount_code int Код скидки r_keeper (уникальный для купона)
dish_code int Код блюда r_keeper

На таблицу ссылаются: account_coupon_dish.coupon_dish_id, referral_program.invited_reward_coupon_dish_id, referral_program.inviting_reward_coupon_dish_id

account_coupon_dish

Товарные купоны, выданные гостям.

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор записи
account_id int FK → account.id Счёт гостя
date_of_issue datetime Дата выдачи
date_stop datetime да Действует до (NULL — бессрочно)
coupon_dish_id int FK → coupon_dish.id Купон
date_apply datetime да Дата погашения
transaction_id int да FK → transaction.id Транзакция погашения
text nvarchar(max) да Комментарий / основание выдачи
is_deleted bit Признак удаления

Сегменты и акции

segment

Сегменты гостей — правила отбора («Все гости», день рождения, составной, ручной по списку, сгорающие бонусы, RFM и др.). См. Сегменты.

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор сегмента
is_deleted bit Признак удаления
type int да Тип сегмента
name nvarchar(100) да Наименование
parameters nvarchar(max) да Параметры отбора (JSON)
last_update datetime да Дата последнего пересчёта состава
system bit Системный сегмент (например, «Все гости»)

На таблицу ссылаются: promotion.segment_id, promotion_action.segment_id, segment_account.segment_id (CASCADE)

segment_account

Состав сегментов — счета, попавшие в сегмент при последнем пересчёте.

Поле Тип NULL Ключ Описание
account_id int PK, FK → account.id (CASCADE) Счёт гостя
segment_id int PK, FK → segment.id (CASCADE) Сегмент

promotion

Сегментные акции — контейнер с расписанием и сегментом, объединяющий одно или несколько действий (с версии 1.2.82.395). См. Сегментные акции.

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор акции
is_deleted bit Признак удаления
name nvarchar(100) да Наименование
date_start date да Дата начала
date_stop date да Дата окончания
actuation_type int да Тип применения (единожды / раз в N дней / в N-й день месяца)
actuation_periodicity int да Периодичность, дней
actuation_month_date int да День месяца срабатывания
actuation_time time да Время срабатывания
segment_id int да FK → segment.id Сегмент гостей
is_active bit DF 1 Акция активна

На таблицу ссылаются: promotion_action.promotion_id

promotion_action

Действия акций: назначение временной скидки/бонуса, начисление бонусов, рассылка, начисление товарного купона, промокод. Параметры действия хранятся в JSON.

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор действия
is_deleted bit Признак удаления
type int да Тип действия
name nvarchar(100) да Наименование
date_start date да Дата начала
date_stop date да Дата окончания
actuation_periodicity int да Периодичность, дней
actuation_time time да Время срабатывания
last_actuation datetime да Дата и время последнего срабатывания
last_actuation_spent_time datetime да Длительность последнего срабатывания
parameters nvarchar(max) да Параметры действия (JSON: сумма, код скидки, текст рассылки и т. п.)
segment_id int да FK → segment.id Сегмент гостей
is_active bit DF 1 Действие активно
activation_phrase nvarchar(255) да Кодовое слово промокода
activation_message nvarchar(255) да Сообщение гостю при активации промокода
account_group_ids nvarchar(max) да Список групп счетов (строка с идентификаторами)
activation_type int DF 1 Способ активации действия
actuation_type int да Тип применения
actuation_month_date int да День месяца срабатывания
promotion_id int да FK → promotion.id Сегментная акция, в которую входит действие
delay_minutes int DF 0 Сдвиг запуска относительно начала акции, минут

Индексы:

На таблицу ссылаются: accounts_tags.promotion_action_id, mailing.promotion_action_id, promocode_activation.promotion_action_id, promotion_actuation.promotion_action_id, promotion_actuation_log.promotion_action_id

promotion_actuation

Запуски акций — каждое срабатывание действия по расписанию.

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор запуска
datetime datetime Дата и время запуска
spent_time datetime да Длительность выполнения
promotion_action_id int FK → promotion_action.id Действие акции
promotion_actuation_datetime datetime да Плановое время срабатывания
is_completed bit DF 0 Запуск завершён
mailing_id int да FK → mailing.id Созданная рассылка (для действий-рассылок)

На таблицу ссылаются: promotion_actuation_log.promotion_actuation_id

promotion_actuation_log

Журнал применения акций к гостям — по строке на каждого гостя в каждом запуске или срабатывании триггера. См. Логи акций.

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор записи
datetime datetime Дата и время
text nvarchar(max) да Текст результата
account_id int FK → account.id (CASCADE) Счёт гостя
promotion_actuation_id int да FK → promotion_actuation.id Запуск акции
promotion_action_id int да FK → promotion_action.id Действие акции
promotion_trigger_id int да FK → promotion_trigger.id Триггер (для триггерных событий)

Индексы:

promocode_activation

Активации промокодов гостями. Гость может активировать промокод один раз (уникальный индекс). См. Промокоды.

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор записи
promotion_action_id int FK → promotion_action.id Действие-промокод
account_id int FK → account.id Счёт гостя
activation_datetime datetime Дата и время активации

Индексы:

promotion_trigger

Триггеры — реакции на события по счёту. Системные триггеры: обновление баланса Wallet-карты, вознаграждение и оповещение по реферальной программе; пользовательский — «Транзакция в акции «Штампики»».

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор триггера
is_deleted bit Признак удаления
type int да Тип триггера
name nvarchar(100) да Наименование
date_start date да Дата начала (1753-01-01 — без ограничения)
date_stop date да Дата окончания
is_active bit Триггер активен
is_sys bit да Системный триггер

На таблицу ссылаются: promotion_actuation_log.promotion_trigger_id, promotion_trigger_promo_stamp_settings.promotion_trigger_id (CASCADE)

promotion_trigger_promo_stamp_settings

Настройки триггера по штампикам — шаблон сообщения гостю после покупки/получения подарка.

Поле Тип NULL Ключ Описание
promotion_trigger_id int PK, FK → promotion_trigger.id (CASCADE) Триггер
text_template nvarchar(max) да Шаблон сообщения; подстановки {promo_stamp_name}, {event_kind}, {stamp_progress}
filter_enabled bit DF 0 Включён фильтр по акциям (см. следующую таблицу)

На таблицу ссылаются: promotion_trigger_promo_stamp_settings_stamp.promotion_trigger_id (CASCADE)

promotion_trigger_promo_stamp_settings_stamp

Акции «Штампики», по которым срабатывает триггер (при включённом фильтре).

Поле Тип NULL Ключ Описание
promotion_trigger_id int PK, FK → promotion_trigger_promo_stamp_settings.promotion_trigger_id (CASCADE) Триггер
promo_stamp_id int PK, FK → promo_stamp.id (CASCADE) Акция «Штампики»

Реферальная программа

referral_program

Настройки реферальной программы (одна запись). Вознаграждение пригласившему (inviting_*) и приглашённому (invited_*): бонусы или товарный купон, условие получения и тексты сообщений для бота и Wallet. См. Реферальная программа.

Поле Тип NULL Ключ Описание
id int PK Идентификатор (всегда одна запись)
enabled bit Программа включена
inviting_reward_type int Пригласившему: тип вознаграждения (бонусы / купон)
inviting_reward_bonuses_amount int да Пригласившему: сумма бонусов
inviting_reward_coupon_dish_id int да FK → coupon_dish.id Пригласившему: товарный купон
inviting_reward_lifetime int да Пригласившему: срок жизни вознаграждения, дней
inviting_reward_receiving_condition int Пригласившему: условие получения вознаграждения
inviting_invited_registered_text nvarchar(max) Пригласившему: текст «друг зарегистрировался» (бот)
inviting_got_reward_text nvarchar(max) Пригласившему: текст «получено вознаграждение» (бот)
wallet_inviting_invited_registered_text nvarchar(max) Пригласившему: текст «друг зарегистрировался» (Wallet)
wallet_inviting_got_reward_text nvarchar(max) Пригласившему: текст «получено вознаграждение» (Wallet)
invited_account_group_id int да FK → account_group.id Группа счетов для приглашённых
invited_reward_type int Приглашённому: тип вознаграждения
invited_reward_bonuses_amount int да Приглашённому: сумма бонусов
invited_reward_coupon_dish_id int да FK → coupon_dish.id Приглашённому: товарный купон
invited_reward_lifetime int да Приглашённому: срок жизни вознаграждения, дней
invited_reward_receiving_condition int Приглашённому: условие получения
invited_registered_text nvarchar(max) Приглашённому: текст при регистрации (бот)
invited_got_reward_text nvarchar(max) Приглашённому: текст «получено вознаграждение» (бот)
wallet_invited_registered_text nvarchar(max) Приглашённому: текст при регистрации (Wallet)
wallet_invited_got_reward_text nvarchar(max) Приглашённому: текст «получено вознаграждение» (Wallet)
get_link_bot_btn_text nvarchar(max) Текст кнопки «Получить ссылку» в боте
get_link_text nvarchar(max) Текст сообщения с реферальной ссылкой

account_referral

Связи «пригласивший — приглашённый». Приглашённый может быть приглашён только один раз (уникальный индекс).

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор записи
inviting_account_id int да FK → account.id Пригласивший гость
invited_account_id int да FK → account.id Приглашённый гость
inviting_reward_received datetime да Когда пригласивший получил вознаграждение
invited_reward_received datetime да Когда приглашённый получил вознаграждение

Индексы:

Рассылки, боты и отзывы

mailing

Рассылки — пакет сообщений, созданный вручную или действием акции. См. Рассылки.

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор рассылки
creating_datetime datetime да Дата и время создания
promotion_action_id int да FK → promotion_action.id Действие акции, создавшее рассылку

На таблицу ссылаются: mailing_message.mailing_id, promotion_actuation.mailing_id

mailing_message

Сообщения гостям — очередь и история отправки по каналам (Telegram, MAX, Wallet и др.), в том числе одиночные сообщения и запросы отзывов.

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор сообщения
creating_datetime datetime да Дата и время создания
sending_status int да Статус отправки
sending_datetime datetime да Дата и время отправки
channel_type int да Канал отправки
channel_destination nvarchar(max) да Адресат в канале
account_id int FK → account.id Счёт гостя
message_content_id int да FK → message_content.id Содержимое сообщения
mailing_id int да FK → mailing.id Рассылка (если сообщение входит в рассылку)
review_id int да FK → review.id Отзыв (для запросов оценки)
creator_user_id int да FK → user.id (CASCADE) Пользователь — автор сообщения
creator_type int да Источник сообщения

Индексы:

message_content

Содержимое сообщений — текст, тема и кнопка-ссылка.

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор
text nvarchar(max) да Текст сообщения
subject nvarchar(150) да Тема
button_text nvarchar(max) да Текст кнопки
button_url nvarchar(max) да Ссылка кнопки

На таблицу ссылаются: mailing_message.message_content_id, message_content_media.message_content_id (CASCADE)

message_content_media

Вложения сообщений (изображения) с порядком вывода.

Поле Тип NULL Ключ Описание
message_content_id int PK, FK → message_content.id (CASCADE) Содержимое сообщения
sort_order int PK Порядковый номер вложения
media_id int FK → media.id Файл

media

Файлы (изображения рассылок, фото из отзывов), хранятся в БД.

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор файла
contents varbinary(max) да Содержимое файла (двоичные данные)
type nvarchar(50) да MIME-тип
hash nvarchar(max) да Хэш содержимого (для исключения дублей)

На таблицу ссылаются: message_content_media.media_id, review_message.media_id

review

Отзывы гостей из бота. См. Отзывы.

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор отзыва
status int да Статус отзыва
grade int да Оценка
begin_datetime datetime да Начало диалога
end_datetime datetime да Завершение диалога
account_id int FK → account.id Счёт гостя
additional_contact_id int да FK → additional_contact.id Контакт мессенджера, через который получен отзыв
restaurant_id int да FK → restaurant.id Ресторан
source nvarchar(255) да Источник отзыва
ai_ask_datetime datetime да Когда отзыв отправлен на анализ ИИ

На таблицу ссылаются: mailing_message.review_id, review_message.review_id

review_message

Сообщения в отзыве — текст и фото от гостя.

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор сообщения
datetime datetime да Дата и время
text nvarchar(max) да Текст
media_id int да FK → media.id Приложенный файл
review_id int да FK → review.id Отзыв

policy_text_version

Версии текстов политик и соглашений, которые гость принимает в боте. Допустимые типы (CHECK): personal_policy, argeement, argeement_advertisement, loyalty_rules, age_confirmation. См. Образцы политик.

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор
text nvarchar(max) Текст политики
text_type nvarchar(32) Тип документа (уникален в паре с версией)
date datetime Дата версии
version int Номер версии
enabled bit Требовать принятие

Индексы:

Пользователи веб-интерфейса

user

Пользователи веб-интерфейса и API. См. Пользователи.

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор пользователя
is_deleted bit Признак удаления
login nvarchar(50) Логин
password_hash nvarchar(100) да Хэш пароля
commentary nvarchar(max) да Комментарий
role_id varchar(max) да Роли пользователя (строка с идентификаторами)
is_superuser bit Суперпользователь (все права)
hidden bit DF 0 Скрытый служебный пользователь
create_date_time datetime да Дата и время создания
api_key varchar(50) да Бессрочный токен пользователя для API

На таблицу ссылаются: accounts_tags.user_id, mailing_message.creator_user_id (CASCADE), transaction_manual.user_id, user_db_object_permission.user_ref, user_refresh_token.user_id

user_role

Роли. См. Роли.

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор роли
name nvarchar(max) Наименование
comment nvarchar(max) да Комментарий

На таблицу ссылаются: user_role_right.role_id

user_role_right

Права роли — разрешённые методы API (<метод>/<путь>, например get/api/v0/accounts/get).

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор
role_id int FK → user_role.id Роль
method varchar(max) HTTP-метод и путь API

user_refresh_token

Refresh-токены сессий веб-интерфейса — по одному на пару «пользователь — устройство (fingerprint)».

Поле Тип NULL Ключ Описание
id int PK, ID Идентификатор
user_id int FK → user.id Пользователь
fingerprint nvarchar(400) Отпечаток браузера/устройства
refresh_token nvarchar(400) Refresh-токен
refresh_token_expires datetime Срок действия токена

Индексы:

user_db_object_permission

Доступ пользователей к объектам — например, к ресторанам (entity_type = restaurant).

Поле Тип NULL Ключ Описание
user_ref int PK, FK → user.id Пользователь
entity_ref int PK Идентификатор объекта
entity_type varchar(max) Тип объекта

Служебные таблицы

db_information

Сведения о БД (одна запись): версия схемы, владелец лицензии, GUID базы.

Поле Тип NULL Ключ Описание
version_num varchar(32) PK Номер версии схемы БД (миграции), например 00088
owner nvarchar(max) да Владелец
name nvarchar(max) да Имя системы
guid uniqueidentifier да Уникальный идентификатор базы
wallet_agent_id int да Идентификатор агента Wallet

metric

Счётчики обращений к API по дням (ключ — метод и путь).

Поле Тип NULL Ключ Описание
key varchar(897) PK Ключ метрики (например, base get/api/v0/accounts/get)
date date PK Дата
count int да Количество обращений

sysdiagrams

Стандартная таблица SQL Server Management Studio для хранения диаграмм БД. Системой ProBonus не используется.

Поле Тип NULL Ключ Описание
name sysname Имя диаграммы
principal_id int Владелец
diagram_id int PK, ID Идентификатор диаграммы
version int да Версия
definition varbinary(max) да Содержимое диаграммы

Индексы:

Последовательности

Последовательность Начальное значение Назначение
transaction_balance_tag 1 Номера «порций» бонусов — поле transaction_balance.tag

Каскадное удаление

Для большинства внешних ключей действует правило NO ACTION: удалить запись, на которую есть ссылки, нельзя. Каскадное удаление (ON DELETE CASCADE) настроено для следующих связей:

Дочерняя таблица.поле Родительская таблица
additional_contact.account_id account
segment_account.account_id account
promotion_actuation_log.account_id account
segment_account.segment_id segment
mailing_message.creator_user_id user
account_event_handling.account_event_id account_event
message_content_media.message_content_id message_content
promotion_trigger_promo_stamp_settings.promotion_trigger_id promotion_trigger
promotion_trigger_promo_stamp_settings_stamp.promotion_trigger_id promotion_trigger_promo_stamp_settings
promotion_trigger_promo_stamp_settings_stamp.promo_stamp_id promo_stamp

Коды и перечисления

Значения перечислений задаются сервером ProBonus. Ниже приведены значения, назначение которых однозначно определено.

Поле Значение Смысл
transaction.chmode, check.chmode 1 Оплата (продажа). Подробнее — в таблице режимов чека ниже
3 Возврат чека (суммы транзакции с обратным знаком)
transaction_promo_stamp.kind 0 Куплено акционное блюдо
1 Выдан подарок
promo_stamp_dish_code.dish_type 0 Акционное блюдо (засчитывается в штампики)
1 Подарочное блюдо
identifier_type.system_type phone Телефон
card Пластиковая карта
wallet / wallet_dynamic Карта Wallet (статический / динамический код)
system / temporary Системный / временный код гостя
system_tg / temporary_tg Системный / временный код Telegram-бота
system_max / temporary_max Системный / временный код MAX-бота
policy_text_version.text_type personal_policy Политика обработки персональных данных
argeement Соглашение, принимаемое гостем при регистрации
argeement_advertisement Согласие на получение рекламных рассылок
loyalty_rules Правила программы лояльности
age_confirmation Подтверждение возраста
promotion_trigger.type 1 Обновление баланса Wallet-карты (системный)
2 Вознаграждение по реферальной программе (системный)
3 Оповещение о регистрации по реферальной ссылке (системный)
4 Транзакция в акции «Штампики»

Суммы в transaction (копейки). Поля sum_0–sum_3 заполняются по данным r_keeper при применении карты на кассе:

Поле Содержимое Знак
sum_0 Сумма оплаты бонусами отрицательная при продаже
sum_1 Скидка отрицательная при продаже
sum_2 Начисление бонусов положительная при продаже
sum_3 Сумма к оплате (с учётом скидки) положительная при продаже
sum_4 Сумма ручной операции (пополнение / изъятие) + пополнение, − изъятие

При возврате (chmode = 3) знаки сумм меняются на противоположные.

Режимы чека (chmode)

Поле chmode в таблицах transaction и check (а также атрибут chmode тега CHECK в XML чека) содержит режим чека r_keeper, переданный кассой через FarCards.
В таблицах ProBonus на практике встречаются только значения 1 (оплата) и 3 (возврат) — транзакции по завершённым кассовым операциям. У ручных операций (без чека) transaction.chmode равно NULL.

Значение Константа r_keeper Режим Встречается в БД ProBonus
1 XMLchmodeSale Оплата — касса проводит оплату заказа да
3 XMLchmodeReturn Возврат чека после успешного оформления да

Важно! Для определения возврата используйте chmode = 3. Поле transaction.is_return признаком возврата чека не является: у кассовых транзакций оно содержит 0 или NULL независимо от режима чека.

Типовые запросы

Примеры запросов для построения собственных отчётов. Запросы только читают данные.

Текущий баланс счёта

Баланс — сумма записей transaction_balance, действующих в текущий момент. Сгоревшие порции (с истёкшим date_stop) и порции с отложенным начислением (date_start в будущем) в баланс не входят.

SELECT b.account_id,
       SUM(b.sum) / 100.0 AS balance_rub
FROM transaction_balance b
WHERE b.account_id = @account_id
  AND b.date_start <= GETDATE()
  AND b.date_stop  >  GETDATE()
GROUP BY b.account_id;

Гость по номеру телефона

SELECT a.id, a.last_name, a.first_name, a.middle_name, g.name AS account_group
FROM phone p
JOIN account a       ON a.id = p.account_id
JOIN account_group g ON g.id = a.account_group_id
WHERE p.number = '79991234567'
  AND p.is_deleted = 0
  AND a.is_deleted = 0;

Прогресс гостей по акции «Штампики»

Отдельного счётчика штампиков в БД нет: прогресс вычисляется по transaction_promo_stamp. Возвраты (отрицательное количество) вычитаются.

WITH s AS (
    SELECT t.account_id, ps.promo_stamp_id,
           SUM(CASE WHEN ps.kind = 0 THEN ps.check_dish_qnt ELSE 0 END) AS bought,
           SUM(CASE WHEN ps.kind = 1 THEN ps.check_dish_qnt ELSE 0 END) AS redeemed
    FROM transaction_promo_stamp ps
    JOIN [TRANSACTION] t ON t.id = ps.transaction_id
    GROUP BY t.account_id, ps.promo_stamp_id
)
SELECT s.account_id,
       p.name                                                      AS promo,
       s.bought                                                    AS dishes_bought,
       s.bought / p.promo_dish_count * p.gift_dish_count           AS gifts_accrued,
       s.redeemed                                                  AS gifts_redeemed,
       s.bought / p.promo_dish_count * p.gift_dish_count - s.redeemed AS gifts_left,
       s.bought % p.promo_dish_count                               AS in_current_cycle
FROM s
JOIN promo_stamp p ON p.id = s.promo_stamp_id
WHERE p.is_deleted = 0 AND s.bought > 0
ORDER BY s.bought DESC;

Операции гостя за период

SELECT t.date,
       CASE t.chmode WHEN 1 THEN 'Продажа' WHEN 3 THEN 'Возврат' ELSE 'Ручная операция' END AS operation,
       r.name                 AS restaurant,
       t.sum_3 / 100.0        AS amount_due,
       t.sum_1 / 100.0        AS discount,
       t.sum_0 / 100.0        AS paid_with_bonuses,
       t.sum_2 / 100.0        AS bonus_accrued,
       t.sum_4 / 100.0        AS manual_sum,
       m.refill_reason
FROM [TRANSACTION] t
LEFT JOIN restaurant r         ON r.id = t.restaurant_id
LEFT JOIN transaction_manual m ON m.id = t.transaction_manual_id
WHERE t.account_id = @account_id
  AND t.date >= @date_from AND t.date < @date_to
ORDER BY t.date;

Важно! Имена таблиц transaction, check и user совпадают с зарезервированными словами SQL — в запросах их нужно заключать в квадратные скобки: [transaction], [check], [user].

Обслуживание базы