Это старая версия документа!
Структура базы данных ProBonus
В статье описана структура базы данных системы лояльности ProBonus: таблицы, поля, ключи, индексы и связи между ними. Статья предназначена для специалистов, которые сопровождают систему, строят собственные отчёты по данным ProBonus или интегрируют её с внешними системами.
Описание соответствует версии схемы БД 00088 (ProBonus 1.2.86.411). Номер версии схемы конкретной базы хранится в таблице db_information, поле version_num.
Важно! Структуру БД создаёт и обновляет сервер ProBonus при подключении к базе и при обновлении версии. Не изменяйте структуру и данные таблиц вручную — все операции со счетами, балансами и акциями выполняйте через веб-интерфейс или ProBonus API. Прямые SQL-запросы к базе допустимы только на чтение (например, для отчётов).
Общие сведения
- СУБД: Microsoft SQL Server 2017 и выше (подходит редакция Express). Подробнее о создании и подключении базы: БД. Создание, Подключение, Заполнение.
- Схема: все объекты находятся в схеме
dbo. - Состав: 64 таблицы, 78 внешних ключей, 7 уникальных ограничений, 1 CHECK-ограничение, 1 последовательность (
transaction_balance_tag). - Программная логика: хранимых процедур, функций, представлений и триггеров ProBonus в базе нет — вся бизнес-логика выполняется сервером ProBonus. (Процедуры
sp_*diagram*и функцияfn_diagramobjects— стандартные объекты SQL Server Management Studio для диаграмм.)
Соглашения
- Имена таблиц и полей — строчные, слова разделены подчёркиванием (
account_group,date_start). - Первичный ключ большинства таблиц — поле
idтипаintс автоинкрементом (IDENTITY). Таблицы-связки (например,segment_account) имеют составной первичный ключ из полей связи. - Мягкое удаление. Записи справочников и счетов не удаляются физически: при удалении в веб-интерфейсе поле
is_deletedпринимает значение1. В отчётах такие записи нужно исключать условиемis_deleted = 0. - Суммы (балансы, бонусы, суммы чеков и скидок) хранятся в целых копейках в полях типа
bigint. Например,10000= 100,00 руб. - Дата и время хранятся в типе
datetimeв локальном времени сервера ProBonus. Значение1753-01-01(минимальная дата SQL Server) означает «без ограничения начала»,9999-12-31— «бессрочно». - Коды r_keeper. Поля
rk_code,discount_code,dish_code,rest_codeсодержат коды объектов справочников r_keeper (скидок, типов бонусов, блюд, ресторанов). - Перечисления (поля
type,status,kindи т. п.) хранятся целыми числами; их значения определяются сервером ProBonus. Известные значения приведены в разделе Коды и перечисления. - Параметры акций, сегментов и настроек хранятся в формате JSON в полях
nvarchar(max)(parameters,settings_jsonи др.).
Схема связей
Основные связи, сгруппированные вокруг ключевых таблиц. Запись 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/Google 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 |
Ключевые связи
- Гость — это запись
account. Все данные гостя (телефоны, идентификаторы, транзакции, купоны, теги, сообщения, отзывы) ссылаются наaccount.id. - Условия лояльности гостя определяются цепочкой
account→account_group→account_template→discount→discount_level. Значения, заданные непосредственно вaccount, имеют приоритет над шаблоном группы. Временные скидки гостя хранятся вdiscount_temporary. - Применение карты на кассе создаёт запись
transaction, ссылающуюся наcheck(данные чека r_keeper). Изменения баланса записываются вtransaction_balance; покупки по акции «Штампики» — вtransaction_promo_stamp. - Ручное пополнение/изъятие создаёт
transactionсо ссылкой наtransaction_manual(без чека). - Сегментная акция:
promotion(расписание, сегмент) →promotion_action(действия) →promotion_actuation(запуски) →promotion_actuation_log(результат по каждому гостю). Рассылки акции —mailing→mailing_message.
Описание таблиц
Обозначения в колонке «Ключ»: 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 | Не начислять бонусы, если чек оплачен бонусами. См. Либо начисление, либо оплата бонусами |
Индексы:
ixaccountis_deletedaccount_group_idid— (is_deleted, account_group_id, id)IX_account_group_id— (account_group_id)
На таблицу ссылаются: 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) | да | Комментарий |
Индексы:
ixphoneaccount_id— (account_id)ixphoneaccount_idis_deleted— (account_id), включённые поля: code, identifier_type_id, is_blocked, is_sys_code, фильтр:— (account_id), включённые поля: number, фильтр:([is_deleted]=(0))ixphoneis_deleted
*— (is_deleted)id
==== email ====
Адреса электронной почты гостя.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
|| int | | PK, ID | Идентификатор записи |address
|| nvarchar(320) | | | Адрес e-mail |is_primary
|| bit | | | Основной адрес |account_id
|| int | | FK →account.id| Счёт гостя |ixemailaccount_id
Индексы:
*— (account_id), включённые поля: addressid
==== additional_contact ====
Дополнительные контакты гостя в мессенджерах (Telegram, MAX) — используются ботами и рассылками.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
|| int | | PK, ID | Идентификатор контакта |is_deleted
|| bit | | | Признак удаления |type
|| int | | | Тип контакта (канал мессенджера) |value
|| nvarchar(256) | | | Значение (идентификатор чата/пользователя в мессенджере) |account_id
|| int | | FK →account.id(CASCADE) | Счёт гостя |telegram_fail_count
|| int | | DF0| Счётчик неудачных отправок в Telegram |max_fail_count
|| int | | DF0| Счётчик неудачных отправок в MAX |ix_additional_contact_type_value
Индексы:
*— (type, value)review.additional_contact_id
На таблицу ссылаются:id
==== identifier ====
Идентификаторы гостя — всё, по чему гостя можно найти на кассе: телефон, пластиковая карта, Wallet, системный и временный (QR) коды бота. См. Типы идентификаторов.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
|| int | | PK, ID | Идентификатор записи |is_deleted
|| bit | | | Признак удаления |code
|| nvarchar(50) | да | | Код идентификатора (номер карты, телефон, код QR) |account_id
|| int | да | FK →account.id| Счёт гостя |identifier_type_id
|| int | да | FK →identifier_type.id| Тип идентификатора |is_using_with_manager_card
|| bit | | | Применяется вместе с картой менеджера |is_blocked
|| bit | | | Идентификатор заблокирован |delete_reason
|| nvarchar(100) | да | | Причина удаления |block_reason
|| nvarchar(100) | да | | Причина блокировки |expired
|| datetime | да | | Срок действия (для временных кодов) |is_sys_code
|| bit | да | | Системный код |code_upper
|| nvarchar(50) | да | | Код в верхнем регистре — для регистронезависимого поиска |ixidentifieraccount_id
Индексы:
*— (account_id)ixidentifieraccount_idlist
*([is_deleted]=(0))ixidentifieridentifier_type_id— (identifier_type_id)ixidentifieris_deleted— (is_deleted)ixidentifieris_sys_code— (is_sys_code)IX_identifier_code— (code)IX_identifier_code_upper— (code_upper), включённые поля: id, account_id, is_deleted, is_blocked, expired
На таблицу ссылаются: 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) | да | Комментарий |
Индексы:
ixaccounts_tagsaccount_iddate_end— (account_id, date_start, date_stop), включённые поля: sum— (account_id, date_end), включённые поля: tag_idix_accounts_tags_account_tag
*— (account_id, tag_id)id
==== account_event ====
События по счёту (регистрация, транзакция, движение по штампикам и т. п.) — источник для триггерных акций и уведомлений.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
|| int | | PK, ID | Идентификатор события |type
|| int | да | | Тип события |parameters
|| nvarchar(max) | да | | Параметры события (JSON) |datetime
|| datetime | да | | Дата и время события |account_id
|| int | | FK →account.id| Счёт гостя |account_event_handling.account_event_id
На таблицу ссылаются:(CASCADE)id
==== account_event_handling ====
Обработка событий — отметки о том, какой обработчик (триггер) и когда обработал событие.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
|| int | | PK, ID | Идентификатор записи |handling_datetime
|| datetime | да | | Дата и время обработки |handler_type
|| int | да | | Тип обработчика |handler_id
|| int | да | | Идентификатор обработчика (например, триггера) |account_event_id
|| int | | FK →account_event.id(CASCADE) | Обработанное событие |id
==== anti_fraud_events ====
События антифрода — предупреждения и блокировки при превышении лимитов применений. См. Антифрод.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
|| int | | PK, ID | Идентификатор события |account_id
|| int | | FK →account.id| Счёт гостя |transaction_id
|| int | да | FK →transaction.id| Транзакция, вызвавшая событие |datetime
|| datetime | да | | Дата и время |event
|| int | да | | Тип события (предупреждение / блокировка) |text
|| varchar(max) | да | | Текст события |id
===== Скидки =====
==== discount ====
Составные скидки/бонусы (лестницы скидок): уровень гостя зависит от суммы его потрат. См. Составные скидки/бонусы.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
|| int | | PK, ID | Идентификатор составной скидки |is_deleted
|| bit | | | Признак удаления |name
|| nvarchar(50) | | | Наименование |limit_period_in_days
|| int | да | | Период накопления суммы потрат, дней (NULL— за всё время) |account.discount_id
На таблицу ссылаются:,account_template.discount_id,discount_level.discount_idid
==== discount_level ====
Уровни составной скидки.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
|| int | | PK, ID | Идентификатор уровня |rk_code
|| int | | | Код скидки (бонуса) r_keeper для уровня |rk_bonus_type_code
|| int | да | | Код типа бонуса r_keeper |level_amount
|| bigint | | | Порог суммы потрат для перехода на уровень |discount_id
|| int | | FK →discount.id| Составная скидка |level_name
|| varchar(max) | | DFНазвание уровня| Название уровня |id
==== discount_temporary ====
Временные скидки — назначенные гостю на срок (например, сегментной акцией «Назначение временной скидки/бонуса»).
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
|| int | | PK, ID | Идентификатор записи |rk_code
|| int | да | | Код скидки (бонуса) r_keeper |rk_bonus_type_code
|| int | да | | Код типа бонуса r_keeper |valid_until
|| date | да | | Действует до (включительно) |reason
|| nvarchar(256) | да | | Причина назначения |account_id
|| int | | FK →account.id| Счёт гостя |id
===== Транзакции и чеки =====
==== transaction ====
Транзакции — каждая операция по счёту: применение карты в чеке (продажа или возврат) либо ручная операция. Все суммы в копейках.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
|| int | | PK, ID | Идентификатор транзакции |check_id
|| int | да | FK →check.id| Чек r_keeper (для кассовых операций) |account_id
|| int | | FK →account.id| Счёт гостя |identifier_id
|| int | да | FK →identifier.id| Идентификатор, по которому применили карту |transaction_manual_id
|| int | да | FK →transaction_manual.id| Ручная операция (для пополнений/изъятий) |date
|| datetime | | | Дата и время транзакции |restaurant
|| int | да | | Код ресторана (устаревшее поле, см.restaurant_id) |rk_date
|| int | да | | Реквизиты чека r_keeper: дата |rk_unit
|| int | да | | Реквизиты чека r_keeper: станция (касса) |rk_check
|| int | да | | Реквизиты чека r_keeper: номер чека |sum_0
|| bigint | да | | Сумма оплаты бонусами (по данным r_keeper; при продаже — отрицательное значение) |sum_1
|| bigint | да | | Скидка (по данным r_keeper; при продаже — отрицательное значение) |sum_2
|| bigint | да | | Начисление бонусов (по данным r_keeper) |sum_3
|| bigint | да | | Сумма к оплате (по данным r_keeper, с учётом скидки) |sum_4
|| bigint | да | | Сумма ручной операции (пополнение или изъятие) |check_guid
|| uniqueidentifier | да | | GUID чека r_keeper |chmode
|| int | да | | Режим чека r_keeper:1— оплата,3— возврат (суммы с обратным знаком);NULL— ручная операция. См. Режимы чека |rest_code
|| nvarchar(9) | да | | Код ресторана r_keeper |restaurant_id
|| int | да | FK →restaurant.id| Ресторан |system_identifier_type
|| int | да | | Тип системного идентификатора, по которому применили карту |is_return
|| bit | да | | Служебный признак; для определения возврата чека используйтеchmode = 3|cash_server_name
|| nvarchar(255) | да | | Имя кассового сервера (MID) |ixtransactioncheck_id_account
Индексы:
*— (check_id), включённые поля: account_id, date, is_return, chmode, фильтр:([check_id] IS NOT NULL)IX_transaction_check_guid_chmode
*— (check_guid, chmode)IX_transaction_check_id
*— (check_id), включённые поля: sum_3IX_transactions
*— (date, account_id, check_guid)account_coupon_dish.transaction_id
На таблицу ссылаются:,anti_fraud_events.transaction_id,transaction_balance.transaction_id,transaction_promo_stamp.transaction_idtag
==== transaction_balance ====
Движение баланса счёта — «порции» бонусов/денег с периодом действия. Начисление создаёт порцию с положительной суммой, списание — записи с отрицательной суммой по той же порции (тот жеи период). Сгорание отдельной записью не фиксируется: порция просто перестаёт учитываться послеdate_stop. Баланс счёта = суммаsumпо записям, действующим на текущий момент.id
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
|| int | | PK, ID | Идентификатор записи |transaction_id
|| int | | FK →transaction.id| Транзакция |account_id
|| int | | FK →account.id| Счёт гостя |tag
|| int | | | Номер порции (из последовательностиtransaction_balance_tag); связывает начисление и его списания |date
|| datetime | | | Дата операции |date_start
|| datetime | | | Начало действия порции (1753-01-01— без ограничения; позднее — отложенное начисление) |date_stop
|| datetime | | | Окончание действия — дата сгорания бонусов |sum
|| bigint | | | Сумма, копейки (+ начисление, − списание) |ixtransaction_balanceaccount_iddates
Индексы:
*ix_transaction_balance_transaction_id— (transaction_id)
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 |
Индексы:
ixdishes_cache_by_checkname_rest_code— (name, rest_code)uqdishes_cache_by_checkcode_rest_code— уникальный, (code, rest_code)
На таблицу ссылаются: 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) | Количество |
Индексы:
ixcheck_cachecheck_id— (check_id)ixcheck_cachedish_check_covering— (dishes_cache_by_check_id, check_id), включённые поля: countixcheck_cachedishes_cache_by_check_id— (dishes_cache_by_check_id)uqcheck_cachecheck_id_dishes_cache_by_check_id— уникальный, (check_id, dishes_cache_by_check_id)
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 | Сумма чека, копейки |
Индексы:
IX_tps_transaction_id— (transaction_id), включённые поля: check_dish_code, check_dish_qnt
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 | Сдвиг запуска относительно начала акции, минут |
Индексы:
ixpromotion_actionpromotion_id— (promotion_id)
На таблицу ссылаются: 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 | Триггер (для триггерных событий) |
Индексы:
ix_promotion_actuation_log_datetime— (datetime)ix_promotion_actuation_log_promotion_actuation_id— (promotion_actuation_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 | Дата и время активации |
Индексы:
uqpromocode_activationpromotion_id_account_id— уникальный, (promotion_action_id, account_id)uq_promocode_activation_promotion_action_account— уникальный, (promotion_action_id, account_id)
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 | да | Когда приглашённый получил вознаграждение |
Индексы:
uqaccount_referralinvited_account_id— уникальный, (invited_account_id)
Рассылки, боты и отзывы
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 | да | Источник сообщения |
Индексы:
IX_mailing_message_sending_status_channel_type— (sending_status, channel_type), включённые поля: id, sending_datetime, channel_destination, message_content_id, account_id
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 | Требовать принятие |
Индексы:
uqpolicy_text_versiontext_typeversion— уникальный, (token)— уникальный, (text_type, version)id
===== Wallet =====
==== wallet_cards_template ====
Шаблон карты Apple/Google Wallet — изображения, цвета и тексты полей карты. См. Настройки Wallet.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
|| int | | PK, ID | Идентификатор шаблона |name
|| varchar(max) | | | Наименование |icon_img
|| varchar(max) | | | Иконка (base64) |logo_img
|| varchar(max) | | | Логотип (base64) |strip_img
|| varchar(max) | | | Изображение-полоса (base64) |back_text
|| varchar(max) | | | Текст оборотной стороны |background_color
|| nvarchar(7) | | | Цвет фона (#RRGGBB) |label_color
|| nvarchar(7) | | | Цвет подписей |foreground_color
|| nvarchar(7) | | | Цвет текста |organization_name
|| varchar(max) | | | Название организации |description
|| varchar(max) | | | Описание карты |sharing_prohibited
|| bit | | | Запретить передачу карты |header_content
|| nvarchar(max) | | | Значение поля в заголовке |secondary_left_content
|| nvarchar(max) | | | Значение левого вторичного поля |secondary_right_content
|| nvarchar(max) | | | Значение правого вторичного поля |header_label
|| nvarchar(max) | | | Подпись поля в заголовке |secondary_left_label
|| nvarchar(max) | | | Подпись левого вторичного поля |secondary_right_label
|| nvarchar(max) | | | Подпись правого вторичного поля |device_id
==== wallet_device_cards ====
Карты Wallet, установленные на устройствах — регистрации устройств для push-обновления карты.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
|| varchar(256) | | PK | Идентификатор устройства |wallet_identifier_code
|| nvarchar(256) | | PK | Код карты Wallet |identifier_id
|| int | да | FK →identifier.id| Идентификатор гостя |client_ip
|| varchar(max) | да | | IP-адрес клиента |device_type
|| varchar(max) | | | Тип устройства / платформы |authentication_token
|| nvarchar(max) | да | | Токен аутентификации карты |user_agent
|| nvarchar(max) | да | | User-Agent устройства |push_token
|| nvarchar(max) | да | | Push-токен |headers
|| nvarchar(max) | да | | HTTP-заголовки регистрации |id
===== Интеграция с r_keeper и кассами =====
==== rkeeper_bonus_types ====
Кэш справочника типов бонусов r_keeper (JSON), загружается при связи с r_keeper.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
|| int | | PK, ID | Идентификатор |bonus_types
|| nvarchar(max) | да | | Справочник типов бонусов (JSON) |bonus_types_data_version
|| int | да | | Версия данных справочника r_keeper |updated_at
|| datetime | да | | Дата обновления |id
==== rkeeper_discount_tree ====
Кэш дерева скидок r_keeper (JSON) — для выбора кодов скидок в веб-интерфейсе.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
|| int | | PK, ID | Идентификатор |discount_tree
|| nvarchar(max) | да | | Дерево скидок (JSON) |discount_data_version
|| int | да | | Версия данных скидок |discount_types_data_version
|| int | да | | Версия данных типов скидок |updated_at
|| datetime | да | | Дата обновления |id
==== cash_registration_settings ====
Настройки регистрации гостей с кассы — профили формы регистрации, доступ по токену. См. Настройка регистрации.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
|| int | | PK, ID | Идентификатор |name
|| nvarchar(100) | | | Наименование профиля |token
|| uniqueidentifier | | | Токен доступа (уникальный) |settings_json
|| nvarchar(max) | | | Настройки формы (JSON) |uqcash_registration_settings__token
Индексы:
*
Пользователи веб-интерфейса
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 | Срок действия токена |
Индексы:
IX_user_refresh_token— (user_id, fingerprint, refresh_token)UX_user_refresh_token_user_fp— уникальный, (user_id, fingerprint)
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) | да | Содержимое диаграммы |
Индексы:
UK_principal_name— уникальный, (principal_id, name)
Последовательности
| Последовательность | Начальное значение | Назначение |
|---|---|---|
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. Значения определены r_keeper — см. XML описание кассового документа для предоставления внешним системам.
В таблицах ProBonus на практике встречаются только значения 1 (оплата) и 3 (возврат) — транзакции по завершённым кассовым операциям. У ручных операций (без чека) transaction.chmode равно NULL.
| Значение | Константа r_keeper | Режим | Встречается в БД ProBonus |
|---|---|---|---|
0 | XMLchmodeNotCheck | Не чек: вызов вне чека или технический вызов (например, получение имени клиента) | нет |
1 | XMLchmodeSale | Оплата — касса проводит оплату заказа | да |
2 | XMLchmodeSaleRollback | Откат оплаты: касса не смогла корректно завершить оплату после подтверждения транзакции | нет |
3 | XMLchmodeReturn | Возврат чека после успешного оформления | да |
4 | XMLchmodeReturnRollback | Откат возврата: касса не смогла корректно завершить возврат после подтверждения | нет |
5 | XMLchmodeOrderEditing | Режим заказа (заказ не завершён) | нет |
6 | XMLchmodeOrderBill | Печать пречека | нет |
7 | XMLchmodeOrderCalc | Режим расчёта (заказ готов к завершению) | нет |
8 | XMLchmodePrintCardInfo | Печать информации о карте | нет |
9 | XMLchmodeInitEntranceCardOrder | Создание заказа в режиме «карта на входе» | нет |
10 | XMLchmodePrintAfterTransaction | Печать слипов после транзакций | нет |
11 | XMLchmodeServPrint | Сервис-печать (заказ не завершён) | нет |
12 | XMLchmodeCancelBill | Отмена пречека | нет |
13 | XMLchmodeBeforeReceipt | Перед транзакциями | нет |
Важно! Для определения возврата используйте 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].
Обслуживание базы
- Размер. Самые объёмные таблицы —
check(XML чеков),promotion_actuation_log,transaction,mailing_messageиtransaction_balance. При использовании MS SQL Express учитывайте ограничение 10 ГБ на размер базы; при приближении к нему потребуется переход на редакцию Standard. - Резервное копирование. Настройте регулярное резервное копирование базы средствами SQL Server. Обязательно сделайте резервную копию перед обновлением ProBonus — при обновлении сервер может изменить структуру БД.
- Доступ для отчётов. Для внешних отчётов и BI-систем создайте отдельного пользователя SQL с правами только на чтение (роль
db_datareader), не используйте учётную запись, под которой работает сервер ProBonus. - Версия схемы. Номер версии в
db_information.version_numпозволяет определить, какой версии ProBonus соответствует база, например при переносе базы между серверами.