В статье описана структура базы данных системы лояльности ProBonus: таблицы, поля, ключи, индексы и связи между ними. Статья предназначена для специалистов, которые сопровождают систему, строят собственные отчёты по данным ProBonus или интегрируют её с внешними системами.
Описание соответствует версии схемы БД 00088 (ProBonus 1.2.86.411). Номер версии схемы конкретной базы хранится в таблице db_information, поле version_num.
Важно! Структуру БД создаёт и обновляет сервер ProBonus при подключении к базе и при обновлении версии. Не изменяйте структуру и данные таблиц вручную — все операции со счетами, балансами и акциями выполняйте через веб-интерфейс или ProBonus API. Прямые SQL-запросы к базе допустимы только на чтение (например, для отчётов).
dbo.transaction_balance_tag).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 — «бессрочно».rk_code, discount_code, dish_code, rest_code содержат коды объектов справочников r_keeper (скидок, типов бонусов, блюд, ресторанов).type, status, kind и т. п.) хранятся целыми числами; их значения определяются сервером ProBonus. Известные значения приведены в разделе Коды и перечисления.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 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 — значение по умолчанию.
Счёт гостя — центральная таблица системы. Хранит анкету гостя, его группу, индивидуальные настройки скидки/бонуса, лимиты и признаки блокировки. Настройки, заданные в счёте, переопределяют настройки шаблона группы. См. Счета.
| Поле | Тип | 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
Группа счетов. Объединяет гостей с одинаковыми условиями лояльности; условия задаются через шаблон. См. Группы счетов.
| Поле | Тип | 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.
| Поле | Тип | 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
Телефоны гостя. У счёта может быть несколько номеров, один из них — основной.
| Поле | Тип | 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), включённые поля: number, фильтр: ([is_deleted]=(0))
* ixphoneis_deleted — (is_deleted)
==== email ====
Адреса электронной почты гостя.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| id | int | | PK, ID | Идентификатор записи |
| address | nvarchar(320) | | | Адрес e-mail |
| is_primary | bit | | | Основной адрес |
| account_id | int | | FK → account.id | Счёт гостя |
Индексы:
* ixemailaccount_id — (account_id), включённые поля: address
==== additional_contact ====
Дополнительные контакты гостя в мессенджерах (Telegram, MAX) — используются ботами и рассылками.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| id | int | | PK, ID | Идентификатор контакта |
| is_deleted | bit | | | Признак удаления |
| type | int | | | Тип контакта (канал мессенджера) |
| value | nvarchar(256) | | | Значение (идентификатор чата/пользователя в мессенджере) |
| account_id | int | | FK → account.id (CASCADE) | Счёт гостя |
| telegram_fail_count | int | | DF 0 | Счётчик неудачных отправок в Telegram |
| max_fail_count | int | | DF 0 | Счётчик неудачных отправок в MAX |
Индексы:
* ix_additional_contact_type_value — (type, value)
На таблицу ссылаются: review.additional_contact_id
==== identifier ====
Идентификаторы гостя — всё, по чему гостя можно найти на кассе: телефон, пластиковая карта, Wallet, системный и временный (QR) коды бота. См. Типы идентификаторов.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| id | 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 — (account_id), включённые поля: code, identifier_type_id, is_blocked, is_sys_code, фильтр: ([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
Справочник типов идентификаторов. Системные типы создаются автоматически: 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
Группы тегов счетов. См. Теги счетов.
| Поле | Тип | NULL | Ключ | Описание |
|---|---|---|---|---|
id | int | PK, ID | Идентификатор группы тегов | |
is_deleted | bit | DF 0 | Признак удаления | |
name | nvarchar(100) | Наименование |
На таблицу ссылаются: tag.group_id
Теги счетов — метки для классификации гостей.
| Поле | Тип | NULL | Ключ | Описание |
|---|---|---|---|---|
id | int | PK, ID | Идентификатор тега | |
is_deleted | bit | DF 0 | Признак удаления | |
name | nvarchar(100) | Наименование тега | ||
group_id | int | FK → tag_group.id | Группа тегов |
На таблицу ссылаются: accounts_tags.tag_id
Назначение тегов счетам с периодом действия. Тег может быть назначен вручную пользователем или автоматически акцией.
| Поле | Тип | 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_end), включённые поля: tag_id
* ix_accounts_tags_account_tag — (account_id, tag_id)
==== account_event ====
События по счёту (регистрация, транзакция, движение по штампикам и т. п.) — источник для триггерных акций и уведомлений.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| id | int | | PK, ID | Идентификатор события |
| type | int | да | | Тип события |
| parameters | nvarchar(max) | да | | Параметры события (JSON) |
| datetime | datetime | да | | Дата и время события |
| account_id | int | | FK → account.id | Счёт гостя |
На таблицу ссылаются: account_event_handling.account_event_id (CASCADE)
==== account_event_handling ====
Обработка событий — отметки о том, какой обработчик (триггер) и когда обработал событие.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| id | int | | PK, ID | Идентификатор записи |
| handling_datetime | datetime | да | | Дата и время обработки |
| handler_type | int | да | | Тип обработчика |
| handler_id | int | да | | Идентификатор обработчика (например, триггера) |
| account_event_id | int | | FK → account_event.id (CASCADE) | Обработанное событие |
==== anti_fraud_events ====
События антифрода — предупреждения и блокировки при превышении лимитов применений. См. Антифрод.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| id | int | | PK, ID | Идентификатор события |
| account_id | int | | FK → account.id | Счёт гостя |
| transaction_id | int | да | FK → transaction.id | Транзакция, вызвавшая событие |
| datetime | datetime | да | | Дата и время |
| event | int | да | | Тип события (предупреждение / блокировка) |
| text | varchar(max) | да | | Текст события |
===== Скидки =====
==== discount ====
Составные скидки/бонусы (лестницы скидок): уровень гостя зависит от суммы его потрат. См. Составные скидки/бонусы.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| id | 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_id
==== discount_level ====
Уровни составной скидки.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| id | 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 Название уровня | Название уровня |
==== discount_temporary ====
Временные скидки — назначенные гостю на срок (например, сегментной акцией «Назначение временной скидки/бонуса»).
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| id | 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 | Счёт гостя |
===== Транзакции и чеки =====
==== transaction ====
Транзакции — каждая операция по счёту: применение карты в чеке (продажа или возврат) либо ручная операция. Все суммы в копейках.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| id | 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_3
* IX_transactions — (date, account_id, check_guid)
На таблицу ссылаются: account_coupon_dish.transaction_id, anti_fraud_events.transaction_id, transaction_balance.transaction_id, transaction_promo_stamp.transaction_id
==== transaction_balance ====
Движение баланса счёта — «порции» бонусов/денег с периодом действия. Начисление создаёт порцию с положительной суммой, списание — записи с отрицательной суммой по той же порции (тот же tag и период). Сгорание отдельной записью не фиксируется: порция просто перестаёт учитываться после date_stop. Баланс счёта = сумма sum по записям, действующим на текущий момент.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| id | 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 — (account_id, date_start, date_stop), включённые поля: sumix_transaction_balance_transaction_id — (transaction_id)Ручные операции — пополнения и изъятия из веб-интерфейса, групповых операций, акций и реферальной программы. См. Пополнение и изъятие.
| Поле | Тип | NULL | Ключ | Описание |
|---|---|---|---|---|
id | int | PK, ID | Идентификатор операции | |
refill_reason | nvarchar(max) | да | Причина (комментарий) операции | |
user_id | int | да | FK → user.id | Пользователь, выполнивший операцию |
type | int | да | Тип ручной операции |
На таблицу ссылаются: transaction.transaction_manual_id
Чеки 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
Справочник блюд из чеков — блюда, встречавшиеся в чеках, по ресторанам. Используется отчётами и выбором блюд в акциях.
| Поле | Тип | 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
Состав чеков — блюда в каждом чеке с количеством (разобранный 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)Рестораны, подключённые к 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
Акции «Штампики 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
Блюда акции «Штампики» — акционные (покупаемые) и подарочные.
| Поле | Тип | 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) | да | Наименование блюда (для отображения) |
Группы счетов, участвующие в акции «Штампики». Нет записей — акция действует для всех групп.
| Поле | Тип | NULL | Ключ | Описание |
|---|---|---|---|---|
promo_stamp_id | int | PK, FK → promo_stamp.id | Акция | |
account_group_id | int | PK, FK → account_group.id | Группа счетов |
Рестораны акции «Штампики». Нет записей — акция действует во всех ресторанах.
| Поле | Тип | NULL | Ключ | Описание |
|---|---|---|---|---|
promo_stamp_id | int | PK, FK → promo_stamp.id | Акция | |
restaurant_id | int | PK, FK → restaurant.id | Ресторан |
Движения по акции «Штампики» — каждая покупка акционного блюда и каждая выдача подарка в чеке. Отдельного счётчика нет: прогресс гостя вычисляется по этой таблице (см. раздел «Типовые запросы»).
| Поле | Тип | 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Товарные купоны (справочник). См. Товарные купоны.
| Поле | Тип | 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
Товарные купоны, выданные гостям.
| Поле | Тип | 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 | Признак удаления |
Сегменты гостей — правила отбора («Все гости», день рождения, составной, ручной по списку, сгорающие бонусы, 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)
Состав сегментов — счета, попавшие в сегмент при последнем пересчёте.
| Поле | Тип | NULL | Ключ | Описание |
|---|---|---|---|---|
account_id | int | PK, FK → account.id (CASCADE) | Счёт гостя | |
segment_id | int | PK, FK → segment.id (CASCADE) | Сегмент |
Сегментные акции — контейнер с расписанием и сегментом, объединяющий одно или несколько действий (с версии 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
Действия акций: назначение временной скидки/бонуса, начисление бонусов, рассылка, начисление товарного купона, промокод. Параметры действия хранятся в 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
Запуски акций — каждое срабатывание действия по расписанию.
| Поле | Тип | 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
Журнал применения акций к гостям — по строке на каждого гостя в каждом запуске или срабатывании триггера. См. Логи акций.
| Поле | Тип | 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)Активации промокодов гостями. Гость может активировать промокод один раз (уникальный индекс). См. Промокоды.
| Поле | Тип | 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)Триггеры — реакции на события по счёту. Системные триггеры: обновление баланса 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)
Настройки триггера по штампикам — шаблон сообщения гостю после покупки/получения подарка.
| Поле | Тип | 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)
Акции «Штампики», по которым срабатывает триггер (при включённом фильтре).
| Поле | Тип | 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) | Акция «Штампики» |
Настройки реферальной программы (одна запись). Вознаграждение пригласившему (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) | Текст сообщения с реферальной ссылкой |
Связи «пригласивший — приглашённый». Приглашённый может быть приглашён только один раз (уникальный индекс).
| Поле | Тип | 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)Рассылки — пакет сообщений, созданный вручную или действием акции. См. Рассылки.
| Поле | Тип | NULL | Ключ | Описание |
|---|---|---|---|---|
id | int | PK, ID | Идентификатор рассылки | |
creating_datetime | datetime | да | Дата и время создания | |
promotion_action_id | int | да | FK → promotion_action.id | Действие акции, создавшее рассылку |
На таблицу ссылаются: mailing_message.mailing_id, promotion_actuation.mailing_id
Сообщения гостям — очередь и история отправки по каналам (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Содержимое сообщений — текст, тема и кнопка-ссылка.
| Поле | Тип | 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)
Вложения сообщений (изображения) с порядком вывода.
| Поле | Тип | NULL | Ключ | Описание |
|---|---|---|---|---|
message_content_id | int | PK, FK → message_content.id (CASCADE) | Содержимое сообщения | |
sort_order | int | PK | Порядковый номер вложения | |
media_id | int | FK → media.id | Файл |
Файлы (изображения рассылок, фото из отзывов), хранятся в БД.
| Поле | Тип | NULL | Ключ | Описание |
|---|---|---|---|---|
id | int | PK, ID | Идентификатор файла | |
contents | varbinary(max) | да | Содержимое файла (двоичные данные) | |
type | nvarchar(50) | да | MIME-тип | |
hash | nvarchar(max) | да | Хэш содержимого (для исключения дублей) |
На таблицу ссылаются: message_content_media.media_id, review_message.media_id
Отзывы гостей из бота. См. Отзывы.
| Поле | Тип | 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
Сообщения в отзыве — текст и фото от гостя.
| Поле | Тип | NULL | Ключ | Описание |
|---|---|---|---|---|
id | int | PK, ID | Идентификатор сообщения | |
datetime | datetime | да | Дата и время | |
text | nvarchar(max) | да | Текст | |
media_id | int | да | FK → media.id | Приложенный файл |
review_id | int | да | FK → review.id | Отзыв |
Версии текстов политик и соглашений, которые гость принимает в боте. Допустимые типы (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 — уникальный, (text_type, version)
===== Wallet =====
==== wallet_cards_template ====
Шаблон карты Apple/Google Wallet — изображения, цвета и тексты полей карты. См. Настройки Wallet.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| id | 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) | | | Подпись правого вторичного поля |
==== wallet_device_cards ====
Карты Wallet, установленные на устройствах — регистрации устройств для push-обновления карты.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| device_id | 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-заголовки регистрации |
===== Интеграция с r_keeper и кассами =====
==== rkeeper_bonus_types ====
Кэш справочника типов бонусов r_keeper (JSON), загружается при связи с r_keeper.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| id | int | | PK, ID | Идентификатор |
| bonus_types | nvarchar(max) | да | | Справочник типов бонусов (JSON) |
| bonus_types_data_version | int | да | | Версия данных справочника r_keeper |
| updated_at | datetime | да | | Дата обновления |
==== rkeeper_discount_tree ====
Кэш дерева скидок r_keeper (JSON) — для выбора кодов скидок в веб-интерфейсе.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| id | int | | PK, ID | Идентификатор |
| discount_tree | nvarchar(max) | да | | Дерево скидок (JSON) |
| discount_data_version | int | да | | Версия данных скидок |
| discount_types_data_version | int | да | | Версия данных типов скидок |
| updated_at | datetime | да | | Дата обновления |
==== cash_registration_settings ====
Настройки регистрации гостей с кассы — профили формы регистрации, доступ по токену. См. Настройка регистрации.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| id | int | | PK, ID | Идентификатор |
| name | nvarchar(100) | | | Наименование профиля |
| token | uniqueidentifier | | | Токен доступа (уникальный) |
| settings_json | nvarchar(max) | | | Настройки формы (JSON) |
Индексы:
* uqcash_registration_settings__token — уникальный, (token)Пользователи веб-интерфейса и 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
Роли. См. Роли.
| Поле | Тип | NULL | Ключ | Описание |
|---|---|---|---|---|
id | int | PK, ID | Идентификатор роли | |
name | nvarchar(max) | Наименование | ||
comment | nvarchar(max) | да | Комментарий |
На таблицу ссылаются: user_role_right.role_id
Права роли — разрешённые методы API (<метод>/<путь>, например get/api/v0/accounts/get).
| Поле | Тип | NULL | Ключ | Описание |
|---|---|---|---|---|
id | int | PK, ID | Идентификатор | |
role_id | int | FK → user_role.id | Роль | |
method | varchar(max) | HTTP-метод и путь API |
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)
Доступ пользователей к объектам — например, к ресторанам (entity_type = restaurant).
| Поле | Тип | NULL | Ключ | Описание |
|---|---|---|---|---|
user_ref | int | PK, FK → user.id | Пользователь | |
entity_ref | int | PK | Идентификатор объекта | |
entity_type | varchar(max) | Тип объекта |
Сведения о БД (одна запись): версия схемы, владелец лицензии, GUID базы.
| Поле | Тип | NULL | Ключ | Описание |
|---|---|---|---|---|
version_num | varchar(32) | PK | Номер версии схемы БД (миграции), например 00088 |
|
owner | nvarchar(max) | да | Владелец | |
name | nvarchar(max) | да | Имя системы | |
guid | uniqueidentifier | да | Уникальный идентификатор базы | |
wallet_agent_id | int | да | Идентификатор агента Wallet |
Счётчики обращений к API по дням (ключ — метод и путь).
| Поле | Тип | NULL | Ключ | Описание |
|---|---|---|---|---|
key | varchar(897) | PK | Ключ метрики (например, base get/api/v0/accounts/get) |
|
date | date | PK | Дата | |
count | int | да | Количество обращений |
Стандартная таблица 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 в таблицах 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].
check (XML чеков), promotion_actuation_log, transaction, mailing_message и transaction_balance. При использовании MS SQL Express учитывайте ограничение 10 ГБ на размер базы; при приближении к нему потребуется переход на редакцию Standard.db_datareader), не используйте учётную запись, под которой работает сервер ProBonus.db_information.version_num позволяет определить, какой версии ProBonus соответствует база, например при переносе базы между серверами.