external:pro_bonus:10_probonus_api:50_db_info

Структура базы данных 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 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))
    *
    ix
    phoneis_deleted — (is_deleted)

    ==== email ====
    Адреса электронной почты гостя.

    ^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
    |
    id | int | | PK, ID | Идентификатор записи |
    |
    address | nvarchar(320) | | | Адрес e-mail |
    |
    is_primary | bit | | | Основной адрес |
    |
    account_id | int | | FK → account.id | Счёт гостя |

    Индексы:
    *
    ix
    emailaccount_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) | да | | Код в верхнем регистре — для регистронезависимого поиска |

    Индексы:
    *
    ix
    identifieraccount_id — (account_id)
    *
    ix
    identifieraccount_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) |

    Индексы:
    *
    ix
    transactioncheck_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 | | | Сумма, копейки (+ начисление, − списание) |

    Индексы:
    *
    ix
    transaction_balanceaccount_iddates
    — (account_id, date_start, date_stop), включённые поля: sum
  • ix_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), включённые поля: count
  • ixcheck_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) |

    Индексы:
    *
    uq
    cash_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.
  • Резервное копирование. Настройте регулярное резервное копирование базы средствами SQL Server. Обязательно сделайте резервную копию перед обновлением ProBonus — при обновлении сервер может изменить структуру БД.
  • Доступ для отчётов. Для внешних отчётов и BI-систем создайте отдельного пользователя SQL с правами только на чтение (роль db_datareader), не используйте учётную запись, под которой работает сервер ProBonus.
  • Версия схемы. Номер версии в db_information.version_num позволяет определить, какой версии ProBonus соответствует база, например при переносе базы между серверами.
  • external/pro_bonus/10_probonus_api/50_db_info.txt
  • Последнее изменение: 2026/10/20 08:31
  • — Александр Ильин