====== Структура базы данных ProBonus ======
В статье описана структура базы данных системы лояльности ProBonus: таблицы, поля, ключи, индексы и связи между ними. Статья предназначена для специалистов, которые сопровождают систему, строят собственные отчёты по данным ProBonus или интегрируют её с внешними системами.
Описание соответствует **версии схемы БД 00088** (ProBonus 1.2.86.411). Номер версии схемы конкретной базы хранится в таблице ''db_information'', поле ''version_num''.
**Важно!** Структуру БД создаёт и обновляет сервер ProBonus при подключении к базе и при обновлении версии. Не изменяйте структуру и данные таблиц вручную — все операции со счетами, балансами и акциями выполняйте через [[external:pro_bonus:03_probonus_work:01_webadmin|веб-интерфейс]] или [[external:pro_bonus:10_probonus_api|ProBonus API]]. Прямые SQL-запросы к базе допустимы только **на чтение** (например, для отчётов).
===== Общие сведения =====
* **СУБД:** Microsoft SQL Server 2017 и выше (подходит редакция Express). Подробнее о создании и подключении базы: [[external:pro_bonus:01_setup:03_database|БД. Создание, Подключение, Заполнение]].
* **Схема:** все объекты находятся в схеме ''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]] | ''wallet_cards_template'', ''wallet_device_cards'' | Карты Apple Wallet |
| [[#интеграция_с_r_keeper_и_кассами|Интеграция с r_keeper и кассами]] | ''rkeeper_bonus_types'', ''rkeeper_discount_tree'', ''cash_registration_settings'' | Кэш справочников r_keeper, регистрация гостей с кассы |
| [[#пользователи_веб-интерфейса|Пользователи веб-интерфейса]] | ''user'', ''user_role'', ''user_role_right'', ''user_refresh_token'', ''user_db_object_permission'' | Пользователи, роли, права и сессии |
| [[#служебные_таблицы|Служебные таблицы]] | ''db_information'', ''metric'', ''sysdiagrams'' | Версия схемы, статистика API |
===== Ключевые связи =====
* **Гость** — это запись ''account''. Все данные гостя (телефоны, идентификаторы, транзакции, купоны, теги, сообщения, отзывы) ссылаются на ''account.id''.
* **Условия лояльности** гостя определяются цепочкой ''account'' → ''account_group'' → ''account_template'' → ''discount'' → ''discount_level''. Значения, заданные непосредственно в ''account'', имеют приоритет над шаблоном группы. Временные скидки гостя хранятся в ''discount_temporary''.
* **Применение карты на кассе** создаёт запись ''transaction'', ссылающуюся на ''check'' (данные чека r_keeper). Изменения баланса записываются в ''transaction_balance''; покупки по акции «Штампики» — в ''transaction_promo_stamp''.
* **Ручное пополнение/изъятие** создаёт ''transaction'' со ссылкой на ''transaction_manual'' (без чека).
* **Сегментная акция**: ''promotion'' (расписание, сегмент) → ''promotion_action'' (действия) → ''promotion_actuation'' (запуски) → ''promotion_actuation_log'' (результат по каждому гостю). Рассылки акции — ''mailing'' → ''mailing_message''.
====== Описание таблиц ======
Обозначения в колонке «Ключ»: **PK** — первичный ключ, **ID** — автоинкремент (IDENTITY), **FK** — внешний ключ (в скобках — правило удаления, если оно отличается от ''NO ACTION''), **DF** — значение по умолчанию.
===== Счета гостей =====
==== account ====
**Счёт гостя** — центральная таблица системы. Хранит анкету гостя, его группу, индивидуальные настройки скидки/бонуса, лимиты и признаки блокировки. Настройки, заданные в счёте, переопределяют настройки шаблона группы. См. [[external:pro_bonus:03_probonus_work:01_webadmin:06_accounts|Счета]].
^ Поле ^ Тип ^ 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'' | Не начислять бонусы, если чек оплачен бонусами. См. [[external:pro_bonus:98_dop:25_zapret_oplaty_bonusom|Либо начисление, либо оплата бонусами]] |
**Индексы:**
* ''ix__account__is_deleted__account_group_id__id'' — (is_deleted, account_group_id, id)
* ''IX_account_group_id'' — (account_group_id)
**На таблицу ссылаются:** ''account_coupon_dish.account_id'', ''account_event.account_id'', ''account_referral.invited_account_id'', ''account_referral.inviting_account_id'', ''accounts_tags.account_id'', ''additional_contact.account_id'' (CASCADE), ''anti_fraud_events.account_id'', ''discount_temporary.account_id'', ''email.account_id'', ''identifier.account_id'', ''mailing_message.account_id'', ''phone.account_id'', ''promocode_activation.account_id'', ''promotion_actuation_log.account_id'' (CASCADE), ''review.account_id'', ''segment_account.account_id'' (CASCADE), ''transaction.account_id'', ''transaction_balance.account_id''
==== account_group ====
**Группа счетов**. Объединяет гостей с одинаковыми условиями лояльности; условия задаются через шаблон. См. [[external:pro_bonus:03_probonus_work:01_webadmin:02_accounts_group|Группы счетов]].
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор группы |
| ''is_deleted'' | bit | | | Признак удаления |
| ''name'' | nvarchar(100) | | | Наименование группы |
| ''account_template_id'' | int | да | FK → ''account_template.id'' | Шаблон настроек группы |
| ''except_from_anti_fraud'' | bit | | DF ''0'' | Исключить всю группу из проверок антифрода |
**На таблицу ссылаются:** ''account.account_group_id'', ''promo_stamp_account_group.account_group_id'', ''referral_program.invited_account_group_id''
==== account_template ====
**Шаблон группы счетов** — набор настроек, которые получает счёт группы: скидка/бонус, лимиты, стартовый баланс, сроки жизни бонусов. Поля аналогичны одноимённым полям ''account''.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор шаблона |
| ''message_to_screen'' | nvarchar(max) | да | | Сообщение для экрана по умолчанию |
| ''message_on_check'' | nvarchar(max) | да | | Сообщение для печати по умолчанию |
| ''discount_id'' | int | да | FK → ''discount.id'' | Составная скидка |
| ''discount_limit_period'' | int | да | | Период лимита суммы скидок/бонусов |
| ''discount_limit_amount'' | bigint | да | | Лимит суммы скидок/бонусов |
| ''discount_use_limit_period'' | int | да | | Период лимита количества применений |
| ''discount_use_limit_count'' | int | да | | Лимит количества применений |
| ''pay_limit_period'' | int | да | | Период лимита суммы оплат со счёта |
| ''pay_limit_amount'' | bigint | да | | Лимит суммы оплат со счёта |
| ''pay_use_limit_period'' | int | да | | Период лимита количества оплат |
| ''pay_use_limit_count'' | int | да | | Лимит количества оплат |
| ''rk_code'' | int | да | | Код скидки (бонуса) в r_keeper |
| ''rk_bonus_type_code'' | int | да | | Код типа бонуса в r_keeper |
| ''starting_balance'' | bigint | да | | Стартовый (приветственный) баланс нового счёта |
| ''bonus_lifetime'' | int | да | | Срок жизни начисляемых бонусов, дней |
| ''starting_balance_lifetime'' | int | да | | Срок жизни стартового баланса, дней |
| ''bonus_delayed_days'' | int | да | | Отложенное начисление бонусов, дней |
| ''not_award_bonuses_if_paid_with_bonuses'' | bit | | DF ''0'' | Не начислять бонусы, если чек оплачен бонусами |
**На таблицу ссылаются:** ''account_group.account_template_id''
==== phone ====
**Телефоны гостя**. У счёта может быть несколько номеров, один из них — основной.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор записи |
| ''is_deleted'' | bit | | | Признак удаления |
| ''number'' | nvarchar(15) | | | Номер телефона (цифры, с кодом страны, например ''79991234567'') |
| ''is_primary'' | bit | | | Основной номер |
| ''account_id'' | int | | FK → ''account.id'' | Счёт гостя |
| ''text'' | nvarchar(max) | да | | Комментарий |
**Индексы:**
* ''ix__phone__account_id'' — (account_id)
* ''ix__phone__account_id__is_deleted'' — (account_id), включённые поля: number, фильтр: ''([is_deleted]=(0))''
* ''ix__phone__is_deleted'' — (is_deleted)
==== email ====
**Адреса электронной почты гостя**.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор записи |
| ''address'' | nvarchar(320) | | | Адрес e-mail |
| ''is_primary'' | bit | | | Основной адрес |
| ''account_id'' | int | | FK → ''account.id'' | Счёт гостя |
**Индексы:**
* ''ix__email__account_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) коды бота. См. [[external:pro_bonus:03_probonus_work:01_webadmin:04_ident_types|Типы идентификаторов]].
^ Поле ^ Тип ^ 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__identifier__account_id'' — (account_id)
* ''ix__identifier__account_id__list'' — (account_id), включённые поля: code, identifier_type_id, is_blocked, is_sys_code, фильтр: ''([is_deleted]=(0))''
* ''ix__identifier__identifier_type_id'' — (identifier_type_id)
* ''ix__identifier__is_deleted'' — (is_deleted)
* ''ix__identifier__is_sys_code'' — (is_sys_code)
* ''IX_identifier_code'' — (code)
* ''IX_identifier_code_upper'' — (code_upper), включённые поля: id, account_id, is_deleted, is_blocked, expired
**На таблицу ссылаются:** ''transaction.identifier_id'', ''wallet_device_cards.identifier_id''
==== identifier_type ====
**Справочник типов идентификаторов**. Системные типы создаются автоматически: ''phone'', ''card'', ''wallet'', ''wallet_dynamic'', ''system'', ''temporary'', ''system_tg'', ''temporary_tg'', ''system_max'', ''temporary_max''.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор типа |
| ''is_deleted'' | bit | | | Признак удаления |
| ''name'' | nvarchar(100) | | | Наименование типа |
| ''system'' | bit | | DF ''1'' | Системный тип (нельзя удалить) |
| ''system_type'' | varchar(20) | да | | Код системного типа (см. описание таблицы) |
| ''temporary'' | bit | | DF ''0'' | Временный идентификатор (имеет срок действия) |
| ''front_visible'' | bit | | DF ''1'' | Отображать в веб-интерфейсе |
| ''front_editable'' | bit | | DF ''1'' | Разрешено редактировать в веб-интерфейсе |
**На таблицу ссылаются:** ''identifier.identifier_type_id''
==== tag_group ====
**Группы тегов счетов**. См. [[external:pro_bonus:03_probonus_work:01_webadmin:35_account_tags|Теги счетов]].
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор группы тегов |
| ''is_deleted'' | bit | | DF ''0'' | Признак удаления |
| ''name'' | nvarchar(100) | | | Наименование |
**На таблицу ссылаются:** ''tag.group_id''
==== tag ====
**Теги счетов** — метки для классификации гостей.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор тега |
| ''is_deleted'' | bit | | DF ''0'' | Признак удаления |
| ''name'' | nvarchar(100) | | | Наименование тега |
| ''group_id'' | int | | FK → ''tag_group.id'' | Группа тегов |
**На таблицу ссылаются:** ''accounts_tags.tag_id''
==== accounts_tags ====
**Назначение тегов счетам** с периодом действия. Тег может быть назначен вручную пользователем или автоматически акцией.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор назначения |
| ''tag_id'' | int | | FK → ''tag.id'' | Тег |
| ''account_id'' | int | | FK → ''account.id'' | Счёт гостя |
| ''date_begin'' | date | | DF ''getdate()'' | Дата начала действия тега |
| ''date_end'' | date | да | | Дата окончания (''NULL'' — бессрочно) |
| ''assignment_type'' | int | | DF ''1'' | Способ назначения (вручную / акцией) |
| ''user_id'' | int | да | FK → ''user.id'' | Пользователь, назначивший тег |
| ''promotion_action_id'' | int | да | FK → ''promotion_action.id'' | Действие акции, назначившее тег |
| ''promotion_action_type'' | int | да | | Тип действия акции |
| ''comment'' | nvarchar(max) | да | | Комментарий |
**Индексы:**
* ''ix__accounts_tags__account_id__date_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 ====
**События антифрода** — предупреждения и блокировки при превышении лимитов применений. См. [[external:pro_bonus:03_probonus_work:01_webadmin:15_antifrod|Антифрод]].
^ Поле ^ Тип ^ 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 ====
**Составные скидки/бонусы** (лестницы скидок): уровень гостя зависит от суммы его потрат. См. [[external:pro_bonus:03_probonus_work:01_webadmin:03_composite|Составные скидки/бонусы]].
^ Поле ^ Тип ^ 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'' — ручная операция. См. [[#режимы_чека_chmode|Режимы чека]] |
| ''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__transaction__check_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_balance__account_id__dates'' — (account_id, date_start, date_stop), включённые поля: sum
* ''ix_transaction_balance_transaction_id'' — (transaction_id)
==== transaction_manual ====
**Ручные операции** — пополнения и изъятия из веб-интерфейса, групповых операций, акций и реферальной программы. См. [[external:pro_bonus:03_probonus_work:02_rkeeper:01_card_balanсe|Пополнение и изъятие]].
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор операции |
| ''refill_reason'' | nvarchar(max) | да | | Причина (комментарий) операции |
| ''user_id'' | int | да | FK → ''user.id'' | Пользователь, выполнивший операцию |
| ''type'' | int | да | | Тип ручной операции |
**На таблицу ссылаются:** ''transaction.transaction_manual_id''
==== check ====
**Чеки r_keeper** — исходные данные чека, полученные с кассы через FarCards.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор чека |
| ''date'' | datetime | да | | Дата и время чека |
| ''xml'' | nvarchar(max) | да | | XML чека (текст) |
| ''check_guid'' | uniqueidentifier | да | | GUID чека r_keeper |
| ''chmode'' | int | да | | Режим чека r_keeper: ''1'' — оплата, ''3'' — возврат. См. [[#режимы_чека_chmode|Режимы чека]] |
| ''rest_code'' | nvarchar(9) | да | | Код ресторана r_keeper |
| ''external_data'' | nvarchar(max) | да | | Дополнительные данные чека |
| ''xml_native'' | xml | да | | XML чека (тип ''xml'') |
| ''cash_server_name'' | nvarchar(255) | да | | Имя кассового сервера (MID) |
**На таблицу ссылаются:** ''check_cache.check_id'', ''transaction.check_id''
==== dishes_cache_by_check ====
**Справочник блюд из чеков** — блюда, встречавшиеся в чеках, по ресторанам. Используется отчётами и выбором блюд в акциях.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор записи |
| ''name'' | nvarchar(500) | | | Наименование блюда |
| ''code'' | int | | | Код блюда r_keeper |
| ''rest_code'' | nvarchar(9) | | | Код ресторана r_keeper |
**Индексы:**
* ''ix__dishes_cache_by_check__name_rest_code'' — (name, rest_code)
* ''uq__dishes_cache_by_check__code_rest_code'' — **уникальный**, (code, rest_code)
**На таблицу ссылаются:** ''check_cache.dishes_cache_by_check_id''
==== check_cache ====
**Состав чеков** — блюда в каждом чеке с количеством (разобранный XML для быстрых отчётов).
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор записи |
| ''check_id'' | int | | FK → ''check.id'' | Чек |
| ''dishes_cache_by_check_id'' | int | | FK → ''dishes_cache_by_check.id'' | Блюдо |
| ''count'' | numeric(19,4) | | | Количество |
**Индексы:**
* ''ix__check_cache__check_id'' — (check_id)
* ''ix__check_cache__dish_check_covering'' — (dishes_cache_by_check_id, check_id), включённые поля: count
* ''ix__check_cache__dishes_cache_by_check_id'' — (dishes_cache_by_check_id)
* ''uq__check_cache__check_id_dishes_cache_by_check_id'' — **уникальный**, (check_id, dishes_cache_by_check_id)
==== restaurant ====
**Рестораны**, подключённые к ProBonus (с учётом лицензирования). См. [[external:pro_bonus:01_setup:07_rest_lic|Рестораны]].
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор ресторана |
| ''is_deleted'' | bit | | | Признак удаления |
| ''name'' | nvarchar(100) | | | Наименование |
| ''code'' | nvarchar(9) | | | Код ресторана r_keeper |
**На таблицу ссылаются:** ''promo_stamp_restaurant.restaurant_id'', ''review.restaurant_id'', ''transaction.restaurant_id''
===== Штампики и товарные купоны =====
==== promo_stamp ====
**Акции «Штампики N+1»**. См. [[external:pro_bonus:03_probonus_work:01_webadmin:11_promotions:01_stamps|Штампики]].
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор акции |
| ''is_deleted'' | bit | | | Признак удаления |
| ''name'' | nvarchar(20) | | | Наименование (до 20 символов) |
| ''date_start'' | datetime | | | Начало действия |
| ''date_stop'' | datetime | да | | Окончание действия (''NULL'' — бессрочно) |
| ''discount_code'' | int | | | Код скидки r_keeper для подарочного блюда (уникальная для каждой акции) |
| ''promo_dish_count'' | int | | | «Порций купить» — N, количество акционных блюд для получения подарка |
| ''gift_dish_count'' | int | | | «Подарочных порций» — количество подарков за цикл |
| ''hide_progress_without_activity'' | bit | | DF ''0'' | Не показывать прогресс гостям без покупок по акции |
**На таблицу ссылаются:** ''promo_stamp_account_group.promo_stamp_id'', ''promo_stamp_dish_code.promo_stamp_id'', ''promo_stamp_restaurant.promo_stamp_id'', ''promotion_trigger_promo_stamp_settings_stamp.promo_stamp_id'' (CASCADE), ''transaction_promo_stamp.promo_stamp_id''
==== promo_stamp_dish_code ====
**Блюда акции «Штампики»** — акционные (покупаемые) и подарочные.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''promo_stamp_id'' | int | | **PK**, FK → ''promo_stamp.id'' | Акция |
| ''dish_code'' | int | | **PK** | Код блюда r_keeper |
| ''dish_type'' | int | | **PK** | ''0'' — акционное блюдо, ''1'' — подарочное блюдо |
| ''comment'' | nvarchar(50) | да | | Наименование блюда (для отображения) |
==== promo_stamp_account_group ====
**Группы счетов, участвующие в акции «Штампики»**. Нет записей — акция действует для всех групп.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''promo_stamp_id'' | int | | **PK**, FK → ''promo_stamp.id'' | Акция |
| ''account_group_id'' | int | | **PK**, FK → ''account_group.id'' | Группа счетов |
==== promo_stamp_restaurant ====
**Рестораны акции «Штампики»**. Нет записей — акция действует во всех ресторанах.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''promo_stamp_id'' | int | | **PK**, FK → ''promo_stamp.id'' | Акция |
| ''restaurant_id'' | int | | **PK**, FK → ''restaurant.id'' | Ресторан |
==== transaction_promo_stamp ====
**Движения по акции «Штампики»** — каждая покупка акционного блюда и каждая выдача подарка в чеке. Отдельного счётчика нет: прогресс гостя вычисляется по этой таблице (см. раздел «Типовые запросы»).
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор записи |
| ''promo_stamp_id'' | int | | FK → ''promo_stamp.id'' | Акция |
| ''transaction_id'' | int | | FK → ''transaction.id'' | Транзакция (чек) |
| ''kind'' | int | | | ''0'' — куплено акционное блюдо, ''1'' — выдан подарок |
| ''check_dish_code'' | int | | | Код блюда в чеке |
| ''check_dish_name'' | nvarchar(500) | | | Наименование блюда в чеке |
| ''check_dish_qnt'' | int | | | Количество (отрицательное — возврат/отмена) |
| ''check_dish_sum'' | bigint | | DF ''0'' | Сумма по блюду, копейки |
| ''check_sum'' | bigint | | DF ''0'' | Сумма чека, копейки |
**Индексы:**
* ''IX_tps_transaction_id'' — (transaction_id), включённые поля: check_dish_code, check_dish_qnt
==== coupon_dish ====
**Товарные купоны** (справочник). См. [[external:pro_bonus:03_probonus_work:01_webadmin:30_tovarnie_kuponi|Товарные купоны]].
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор купона |
| ''name'' | nvarchar(max) | | | Наименование |
| ''discount_code'' | int | | | Код скидки r_keeper (уникальный для купона) |
| ''dish_code'' | int | | | Код блюда r_keeper |
**На таблицу ссылаются:** ''account_coupon_dish.coupon_dish_id'', ''referral_program.invited_reward_coupon_dish_id'', ''referral_program.inviting_reward_coupon_dish_id''
==== account_coupon_dish ====
**Товарные купоны, выданные гостям**.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор записи |
| ''account_id'' | int | | FK → ''account.id'' | Счёт гостя |
| ''date_of_issue'' | datetime | | | Дата выдачи |
| ''date_stop'' | datetime | да | | Действует до (''NULL'' — бессрочно) |
| ''coupon_dish_id'' | int | | FK → ''coupon_dish.id'' | Купон |
| ''date_apply'' | datetime | да | | Дата погашения |
| ''transaction_id'' | int | да | FK → ''transaction.id'' | Транзакция погашения |
| ''text'' | nvarchar(max) | да | | Комментарий / основание выдачи |
| ''is_deleted'' | bit | | | Признак удаления |
===== Сегменты и акции =====
==== segment ====
**Сегменты гостей** — правила отбора («Все гости», день рождения, составной, ручной по списку, сгорающие бонусы, RFM и др.). См. [[external:pro_bonus:03_probonus_work:01_webadmin:20_segmemti|Сегменты]].
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор сегмента |
| ''is_deleted'' | bit | | | Признак удаления |
| ''type'' | int | да | | Тип сегмента |
| ''name'' | nvarchar(100) | да | | Наименование |
| ''parameters'' | nvarchar(max) | да | | Параметры отбора (JSON) |
| ''last_update'' | datetime | да | | Дата последнего пересчёта состава |
| ''system'' | bit | | | Системный сегмент (например, «Все гости») |
**На таблицу ссылаются:** ''promotion.segment_id'', ''promotion_action.segment_id'', ''segment_account.segment_id'' (CASCADE)
==== segment_account ====
**Состав сегментов** — счета, попавшие в сегмент при последнем пересчёте.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''account_id'' | int | | **PK**, FK → ''account.id'' (CASCADE) | Счёт гостя |
| ''segment_id'' | int | | **PK**, FK → ''segment.id'' (CASCADE) | Сегмент |
==== promotion ====
**Сегментные акции** — контейнер с расписанием и сегментом, объединяющий одно или несколько действий (с версии 1.2.82.395). См. [[external:pro_bonus:03_probonus_work:01_webadmin:11_promotions:05_segmentnie_akcii|Сегментные акции]].
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор акции |
| ''is_deleted'' | bit | | | Признак удаления |
| ''name'' | nvarchar(100) | да | | Наименование |
| ''date_start'' | date | да | | Дата начала |
| ''date_stop'' | date | да | | Дата окончания |
| ''actuation_type'' | int | да | | Тип применения (единожды / раз в N дней / в N-й день месяца) |
| ''actuation_periodicity'' | int | да | | Периодичность, дней |
| ''actuation_month_date'' | int | да | | День месяца срабатывания |
| ''actuation_time'' | time | да | | Время срабатывания |
| ''segment_id'' | int | да | FK → ''segment.id'' | Сегмент гостей |
| ''is_active'' | bit | | DF ''1'' | Акция активна |
**На таблицу ссылаются:** ''promotion_action.promotion_id''
==== promotion_action ====
**Действия акций**: назначение временной скидки/бонуса, начисление бонусов, рассылка, начисление товарного купона, промокод. Параметры действия хранятся в JSON.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор действия |
| ''is_deleted'' | bit | | | Признак удаления |
| ''type'' | int | да | | Тип действия |
| ''name'' | nvarchar(100) | да | | Наименование |
| ''date_start'' | date | да | | Дата начала |
| ''date_stop'' | date | да | | Дата окончания |
| ''actuation_periodicity'' | int | да | | Периодичность, дней |
| ''actuation_time'' | time | да | | Время срабатывания |
| ''last_actuation'' | datetime | да | | Дата и время последнего срабатывания |
| ''last_actuation_spent_time'' | datetime | да | | Длительность последнего срабатывания |
| ''parameters'' | nvarchar(max) | да | | Параметры действия (JSON: сумма, код скидки, текст рассылки и т. п.) |
| ''segment_id'' | int | да | FK → ''segment.id'' | Сегмент гостей |
| ''is_active'' | bit | | DF ''1'' | Действие активно |
| ''activation_phrase'' | nvarchar(255) | да | | Кодовое слово промокода |
| ''activation_message'' | nvarchar(255) | да | | Сообщение гостю при активации промокода |
| ''account_group_ids'' | nvarchar(max) | да | | Список групп счетов (строка с идентификаторами) |
| ''activation_type'' | int | | DF ''1'' | Способ активации действия |
| ''actuation_type'' | int | да | | Тип применения |
| ''actuation_month_date'' | int | да | | День месяца срабатывания |
| ''promotion_id'' | int | да | FK → ''promotion.id'' | Сегментная акция, в которую входит действие |
| ''delay_minutes'' | int | | DF ''0'' | Сдвиг запуска относительно начала акции, минут |
**Индексы:**
* ''ix__promotion_action__promotion_id'' — (promotion_id)
**На таблицу ссылаются:** ''accounts_tags.promotion_action_id'', ''mailing.promotion_action_id'', ''promocode_activation.promotion_action_id'', ''promotion_actuation.promotion_action_id'', ''promotion_actuation_log.promotion_action_id''
==== promotion_actuation ====
**Запуски акций** — каждое срабатывание действия по расписанию.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор запуска |
| ''datetime'' | datetime | | | Дата и время запуска |
| ''spent_time'' | datetime | да | | Длительность выполнения |
| ''promotion_action_id'' | int | | FK → ''promotion_action.id'' | Действие акции |
| ''promotion_actuation_datetime'' | datetime | да | | Плановое время срабатывания |
| ''is_completed'' | bit | | DF ''0'' | Запуск завершён |
| ''mailing_id'' | int | да | FK → ''mailing.id'' | Созданная рассылка (для действий-рассылок) |
**На таблицу ссылаются:** ''promotion_actuation_log.promotion_actuation_id''
==== promotion_actuation_log ====
**Журнал применения акций** к гостям — по строке на каждого гостя в каждом запуске или срабатывании триггера. См. [[external:pro_bonus:03_probonus_work:01_webadmin:11_promotions:08_log_akciy|Логи акций]].
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор записи |
| ''datetime'' | datetime | | | Дата и время |
| ''text'' | nvarchar(max) | да | | Текст результата |
| ''account_id'' | int | | FK → ''account.id'' (CASCADE) | Счёт гостя |
| ''promotion_actuation_id'' | int | да | FK → ''promotion_actuation.id'' | Запуск акции |
| ''promotion_action_id'' | int | да | FK → ''promotion_action.id'' | Действие акции |
| ''promotion_trigger_id'' | int | да | FK → ''promotion_trigger.id'' | Триггер (для триггерных событий) |
**Индексы:**
* ''ix_promotion_actuation_log_datetime'' — (datetime)
* ''ix_promotion_actuation_log_promotion_actuation_id'' — (promotion_actuation_id)
==== promocode_activation ====
**Активации промокодов** гостями. Гость может активировать промокод один раз (уникальный индекс). См. [[external:pro_bonus:03_probonus_work:01_webadmin:11_promotions:06_promotions|Промокоды]].
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор записи |
| ''promotion_action_id'' | int | | FK → ''promotion_action.id'' | Действие-промокод |
| ''account_id'' | int | | FK → ''account.id'' | Счёт гостя |
| ''activation_datetime'' | datetime | | | Дата и время активации |
**Индексы:**
* ''uq__promocode_activation__promotion_id_account_id'' — **уникальный**, (promotion_action_id, account_id)
* ''uq_promocode_activation_promotion_action_account'' — **уникальный**, (promotion_action_id, account_id)
==== promotion_trigger ====
**Триггеры** — реакции на события по счёту. Системные триггеры: обновление баланса Wallet-карты, вознаграждение и оповещение по реферальной программе; пользовательский — «Транзакция в акции "Штампики"».
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор триггера |
| ''is_deleted'' | bit | | | Признак удаления |
| ''type'' | int | да | | Тип триггера |
| ''name'' | nvarchar(100) | да | | Наименование |
| ''date_start'' | date | да | | Дата начала (''1753-01-01'' — без ограничения) |
| ''date_stop'' | date | да | | Дата окончания |
| ''is_active'' | bit | | | Триггер активен |
| ''is_sys'' | bit | да | | Системный триггер |
**На таблицу ссылаются:** ''promotion_actuation_log.promotion_trigger_id'', ''promotion_trigger_promo_stamp_settings.promotion_trigger_id'' (CASCADE)
==== promotion_trigger_promo_stamp_settings ====
**Настройки триггера по штампикам** — шаблон сообщения гостю после покупки/получения подарка.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''promotion_trigger_id'' | int | | **PK**, FK → ''promotion_trigger.id'' (CASCADE) | Триггер |
| ''text_template'' | nvarchar(max) | да | | Шаблон сообщения; подстановки ''{promo_stamp_name}'', ''{event_kind}'', ''{stamp_progress}'' |
| ''filter_enabled'' | bit | | DF ''0'' | Включён фильтр по акциям (см. следующую таблицу) |
**На таблицу ссылаются:** ''promotion_trigger_promo_stamp_settings_stamp.promotion_trigger_id'' (CASCADE)
==== promotion_trigger_promo_stamp_settings_stamp ====
**Акции «Штампики», по которым срабатывает триггер** (при включённом фильтре).
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''promotion_trigger_id'' | int | | **PK**, FK → ''promotion_trigger_promo_stamp_settings.promotion_trigger_id'' (CASCADE) | Триггер |
| ''promo_stamp_id'' | int | | **PK**, FK → ''promo_stamp.id'' (CASCADE) | Акция «Штампики» |
===== Реферальная программа =====
==== referral_program ====
**Настройки реферальной программы** (одна запись). Вознаграждение пригласившему (''inviting_*'') и приглашённому (''invited_*''): бонусы или товарный купон, условие получения и тексты сообщений для бота и Wallet. См. [[external:pro_bonus:03_probonus_work:01_webadmin:11_promotions:12_referal_programm|Реферальная программа]].
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK** | Идентификатор (всегда одна запись) |
| ''enabled'' | bit | | | Программа включена |
| ''inviting_reward_type'' | int | | | Пригласившему: тип вознаграждения (бонусы / купон) |
| ''inviting_reward_bonuses_amount'' | int | да | | Пригласившему: сумма бонусов |
| ''inviting_reward_coupon_dish_id'' | int | да | FK → ''coupon_dish.id'' | Пригласившему: товарный купон |
| ''inviting_reward_lifetime'' | int | да | | Пригласившему: срок жизни вознаграждения, дней |
| ''inviting_reward_receiving_condition'' | int | | | Пригласившему: условие получения вознаграждения |
| ''inviting_invited_registered_text'' | nvarchar(max) | | | Пригласившему: текст «друг зарегистрировался» (бот) |
| ''inviting_got_reward_text'' | nvarchar(max) | | | Пригласившему: текст «получено вознаграждение» (бот) |
| ''wallet_inviting_invited_registered_text'' | nvarchar(max) | | | Пригласившему: текст «друг зарегистрировался» (Wallet) |
| ''wallet_inviting_got_reward_text'' | nvarchar(max) | | | Пригласившему: текст «получено вознаграждение» (Wallet) |
| ''invited_account_group_id'' | int | да | FK → ''account_group.id'' | Группа счетов для приглашённых |
| ''invited_reward_type'' | int | | | Приглашённому: тип вознаграждения |
| ''invited_reward_bonuses_amount'' | int | да | | Приглашённому: сумма бонусов |
| ''invited_reward_coupon_dish_id'' | int | да | FK → ''coupon_dish.id'' | Приглашённому: товарный купон |
| ''invited_reward_lifetime'' | int | да | | Приглашённому: срок жизни вознаграждения, дней |
| ''invited_reward_receiving_condition'' | int | | | Приглашённому: условие получения |
| ''invited_registered_text'' | nvarchar(max) | | | Приглашённому: текст при регистрации (бот) |
| ''invited_got_reward_text'' | nvarchar(max) | | | Приглашённому: текст «получено вознаграждение» (бот) |
| ''wallet_invited_registered_text'' | nvarchar(max) | | | Приглашённому: текст при регистрации (Wallet) |
| ''wallet_invited_got_reward_text'' | nvarchar(max) | | | Приглашённому: текст «получено вознаграждение» (Wallet) |
| ''get_link_bot_btn_text'' | nvarchar(max) | | | Текст кнопки «Получить ссылку» в боте |
| ''get_link_text'' | nvarchar(max) | | | Текст сообщения с реферальной ссылкой |
==== account_referral ====
**Связи «пригласивший — приглашённый»**. Приглашённый может быть приглашён только один раз (уникальный индекс).
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор записи |
| ''inviting_account_id'' | int | да | FK → ''account.id'' | Пригласивший гость |
| ''invited_account_id'' | int | да | FK → ''account.id'' | Приглашённый гость |
| ''inviting_reward_received'' | datetime | да | | Когда пригласивший получил вознаграждение |
| ''invited_reward_received'' | datetime | да | | Когда приглашённый получил вознаграждение |
**Индексы:**
* ''uq__account_referral__invited_account_id'' — **уникальный**, (invited_account_id)
===== Рассылки, боты и отзывы =====
==== mailing ====
**Рассылки** — пакет сообщений, созданный вручную или действием акции. См. [[external:pro_bonus:03_probonus_work:01_webadmin:25_rassilki|Рассылки]].
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор рассылки |
| ''creating_datetime'' | datetime | да | | Дата и время создания |
| ''promotion_action_id'' | int | да | FK → ''promotion_action.id'' | Действие акции, создавшее рассылку |
**На таблицу ссылаются:** ''mailing_message.mailing_id'', ''promotion_actuation.mailing_id''
==== mailing_message ====
**Сообщения гостям** — очередь и история отправки по каналам (Telegram, MAX, Wallet и др.), в том числе одиночные сообщения и запросы отзывов.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор сообщения |
| ''creating_datetime'' | datetime | да | | Дата и время создания |
| ''sending_status'' | int | да | | Статус отправки |
| ''sending_datetime'' | datetime | да | | Дата и время отправки |
| ''channel_type'' | int | да | | Канал отправки |
| ''channel_destination'' | nvarchar(max) | да | | Адресат в канале |
| ''account_id'' | int | | FK → ''account.id'' | Счёт гостя |
| ''message_content_id'' | int | да | FK → ''message_content.id'' | Содержимое сообщения |
| ''mailing_id'' | int | да | FK → ''mailing.id'' | Рассылка (если сообщение входит в рассылку) |
| ''review_id'' | int | да | FK → ''review.id'' | Отзыв (для запросов оценки) |
| ''creator_user_id'' | int | да | FK → ''user.id'' (CASCADE) | Пользователь — автор сообщения |
| ''creator_type'' | int | да | | Источник сообщения |
**Индексы:**
* ''IX_mailing_message_sending_status_channel_type'' — (sending_status, channel_type), включённые поля: id, sending_datetime, channel_destination, message_content_id, account_id
==== message_content ====
**Содержимое сообщений** — текст, тема и кнопка-ссылка.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор |
| ''text'' | nvarchar(max) | да | | Текст сообщения |
| ''subject'' | nvarchar(150) | да | | Тема |
| ''button_text'' | nvarchar(max) | да | | Текст кнопки |
| ''button_url'' | nvarchar(max) | да | | Ссылка кнопки |
**На таблицу ссылаются:** ''mailing_message.message_content_id'', ''message_content_media.message_content_id'' (CASCADE)
==== message_content_media ====
**Вложения сообщений** (изображения) с порядком вывода.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''message_content_id'' | int | | **PK**, FK → ''message_content.id'' (CASCADE) | Содержимое сообщения |
| ''sort_order'' | int | | **PK** | Порядковый номер вложения |
| ''media_id'' | int | | FK → ''media.id'' | Файл |
==== media ====
**Файлы** (изображения рассылок, фото из отзывов), хранятся в БД.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор файла |
| ''contents'' | varbinary(max) | да | | Содержимое файла (двоичные данные) |
| ''type'' | nvarchar(50) | да | | MIME-тип |
| ''hash'' | nvarchar(max) | да | | Хэш содержимого (для исключения дублей) |
**На таблицу ссылаются:** ''message_content_media.media_id'', ''review_message.media_id''
==== review ====
**Отзывы гостей** из бота. См. [[external:pro_bonus:03_probonus_work:01_webadmin:30_bot_probonus:08_reviews|Отзывы]].
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор отзыва |
| ''status'' | int | да | | Статус отзыва |
| ''grade'' | int | да | | Оценка |
| ''begin_datetime'' | datetime | да | | Начало диалога |
| ''end_datetime'' | datetime | да | | Завершение диалога |
| ''account_id'' | int | | FK → ''account.id'' | Счёт гостя |
| ''additional_contact_id'' | int | да | FK → ''additional_contact.id'' | Контакт мессенджера, через который получен отзыв |
| ''restaurant_id'' | int | да | FK → ''restaurant.id'' | Ресторан |
| ''source'' | nvarchar(255) | да | | Источник отзыва |
| ''ai_ask_datetime'' | datetime | да | | Когда отзыв отправлен на анализ ИИ |
**На таблицу ссылаются:** ''mailing_message.review_id'', ''review_message.review_id''
==== review_message ====
**Сообщения в отзыве** — текст и фото от гостя.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор сообщения |
| ''datetime'' | datetime | да | | Дата и время |
| ''text'' | nvarchar(max) | да | | Текст |
| ''media_id'' | int | да | FK → ''media.id'' | Приложенный файл |
| ''review_id'' | int | да | FK → ''review.id'' | Отзыв |
==== policy_text_version ====
**Версии текстов политик и соглашений**, которые гость принимает в боте. Допустимые типы (CHECK): ''personal_policy'', ''argeement'', ''argeement_advertisement'', ''loyalty_rules'', ''age_confirmation''. См. [[external:pro_bonus:98_dop:06_policy_v_bot|Образцы политик]].
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор |
| ''text'' | nvarchar(max) | | | Текст политики |
| ''text_type'' | nvarchar(32) | | | Тип документа (уникален в паре с версией) |
| ''date'' | datetime | | | Дата версии |
| ''version'' | int | | | Номер версии |
| ''enabled'' | bit | | | Требовать принятие |
**Индексы:**
* ''uq__policy_text_version__text_type__version'' — **уникальный**, (text_type, version)
===== Wallet =====
==== wallet_cards_template ====
**Шаблон карты Apple/Google Wallet** — изображения, цвета и тексты полей карты. См. [[external:pro_bonus:03_probonus_work:01_webadmin:40_wallet:10_wallet_settings|Настройки 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 ====
**Настройки регистрации гостей с кассы** — профили формы регистрации, доступ по токену. См. [[external:pro_bonus:07_registraciya_iz_kassi:01_nastroika_registracii|Настройка регистрации]].
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор |
| ''name'' | nvarchar(100) | | | Наименование профиля |
| ''token'' | uniqueidentifier | | | Токен доступа (уникальный) |
| ''settings_json'' | nvarchar(max) | | | Настройки формы (JSON) |
**Индексы:**
* ''uq__cash_registration_settings__token'' — **уникальный**, (token)
===== Пользователи веб-интерфейса =====
==== user ====
**Пользователи веб-интерфейса и API**. См. [[external:pro_bonus:03_probonus_work:01_webadmin:01_users|Пользователи]].
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор пользователя |
| ''is_deleted'' | bit | | | Признак удаления |
| ''login'' | nvarchar(50) | | | Логин |
| ''password_hash'' | nvarchar(100) | да | | Хэш пароля |
| ''commentary'' | nvarchar(max) | да | | Комментарий |
| ''role_id'' | varchar(max) | да | | Роли пользователя (строка с идентификаторами) |
| ''is_superuser'' | bit | | | Суперпользователь (все права) |
| ''hidden'' | bit | | DF ''0'' | Скрытый служебный пользователь |
| ''create_date_time'' | datetime | да | | Дата и время создания |
| ''api_key'' | varchar(50) | да | | Бессрочный токен пользователя для API |
**На таблицу ссылаются:** ''accounts_tags.user_id'', ''mailing_message.creator_user_id'' (CASCADE), ''transaction_manual.user_id'', ''user_db_object_permission.user_ref'', ''user_refresh_token.user_id''
==== user_role ====
**Роли**. См. [[external:pro_bonus:03_probonus_work:01_webadmin:012_roles|Роли]].
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор роли |
| ''name'' | nvarchar(max) | | | Наименование |
| ''comment'' | nvarchar(max) | да | | Комментарий |
**На таблицу ссылаются:** ''user_role_right.role_id''
==== user_role_right ====
**Права роли** — разрешённые методы API (''<метод>/<путь>'', например ''get/api/v0/accounts/get'').
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор |
| ''role_id'' | int | | FK → ''user_role.id'' | Роль |
| ''method'' | varchar(max) | | | HTTP-метод и путь API |
==== user_refresh_token ====
**Refresh-токены сессий** веб-интерфейса — по одному на пару «пользователь — устройство (fingerprint)».
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''id'' | int | | **PK**, ID | Идентификатор |
| ''user_id'' | int | | FK → ''user.id'' | Пользователь |
| ''fingerprint'' | nvarchar(400) | | | Отпечаток браузера/устройства |
| ''refresh_token'' | nvarchar(400) | | | Refresh-токен |
| ''refresh_token_expires'' | datetime | | | Срок действия токена |
**Индексы:**
* ''IX_user_refresh_token'' — (user_id, fingerprint, refresh_token)
* ''UX_user_refresh_token_user_fp'' — **уникальный**, (user_id, fingerprint)
==== user_db_object_permission ====
**Доступ пользователей к объектам** — например, к ресторанам (''entity_type = restaurant'').
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''user_ref'' | int | | **PK**, FK → ''user.id'' | Пользователь |
| ''entity_ref'' | int | | **PK** | Идентификатор объекта |
| ''entity_type'' | varchar(max) | | | Тип объекта |
===== Служебные таблицы =====
==== db_information ====
**Сведения о БД** (одна запись): версия схемы, владелец лицензии, GUID базы.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''version_num'' | varchar(32) | | **PK** | Номер версии схемы БД (миграции), например ''00088'' |
| ''owner'' | nvarchar(max) | да | | Владелец |
| ''name'' | nvarchar(max) | да | | Имя системы |
| ''guid'' | uniqueidentifier | да | | Уникальный идентификатор базы |
| ''wallet_agent_id'' | int | да | | Идентификатор агента Wallet |
==== metric ====
**Счётчики обращений к API по дням** (ключ — метод и путь).
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''key'' | varchar(897) | | **PK** | Ключ метрики (например, ''base get/api/v0/accounts/get'') |
| ''date'' | date | | **PK** | Дата |
| ''count'' | int | да | | Количество обращений |
==== sysdiagrams ====
Стандартная таблица SQL Server Management Studio для хранения диаграмм БД. Системой ProBonus не используется.
^ Поле ^ Тип ^ NULL ^ Ключ ^ Описание ^
| ''name'' | sysname | | | Имя диаграммы |
| ''principal_id'' | int | | | Владелец |
| ''diagram_id'' | int | | **PK**, ID | Идентификатор диаграммы |
| ''version'' | int | да | | Версия |
| ''definition'' | varbinary(max) | да | | Содержимое диаграммы |
**Индексы:**
* ''UK_principal_name'' — **уникальный**, (principal_id, name)
====== Последовательности ======
^ Последовательность ^ Начальное значение ^ Назначение ^
| ''transaction_balance_tag'' | 1 | Номера «порций» бонусов — поле ''transaction_balance.tag'' |
====== Каскадное удаление ======
Для большинства внешних ключей действует правило ''NO ACTION'': удалить запись, на которую есть ссылки, нельзя. Каскадное удаление (''ON DELETE CASCADE'') настроено для следующих связей:
^ Дочерняя таблица.поле ^ Родительская таблица ^
| ''additional_contact.account_id'' | ''account'' |
| ''segment_account.account_id'' | ''account'' |
| ''promotion_actuation_log.account_id'' | ''account'' |
| ''segment_account.segment_id'' | ''segment'' |
| ''mailing_message.creator_user_id'' | ''user'' |
| ''account_event_handling.account_event_id'' | ''account_event'' |
| ''message_content_media.message_content_id'' | ''message_content'' |
| ''promotion_trigger_promo_stamp_settings.promotion_trigger_id'' | ''promotion_trigger'' |
| ''promotion_trigger_promo_stamp_settings_stamp.promotion_trigger_id'' | ''promotion_trigger_promo_stamp_settings'' |
| ''promotion_trigger_promo_stamp_settings_stamp.promo_stamp_id'' | ''promo_stamp'' |
====== Коды и перечисления ======
Значения перечислений задаются сервером ProBonus. Ниже приведены значения, назначение которых однозначно определено.
^ Поле ^ Значение ^ Смысл ^
| ''transaction.chmode'', ''check.chmode'' | ''1'' | Оплата (продажа). Подробнее — в [[#режимы_чека_chmode|таблице режимов чека]] ниже |
| ::: | ''3'' | Возврат чека (суммы транзакции с обратным знаком) |
| ''transaction_promo_stamp.kind'' | ''0'' | Куплено акционное блюдо |
| ::: | ''1'' | Выдан подарок |
| ''promo_stamp_dish_code.dish_type'' | ''0'' | Акционное блюдо (засчитывается в штампики) |
| ::: | ''1'' | Подарочное блюдо |
| ''identifier_type.system_type'' | ''phone'' | Телефон |
| ::: | ''card'' | Пластиковая карта |
| ::: | ''wallet'' / ''wallet_dynamic'' | Карта Wallet (статический / динамический код) |
| ::: | ''system'' / ''temporary'' | Системный / временный код гостя |
| ::: | ''system_tg'' / ''temporary_tg'' | Системный / временный код Telegram-бота |
| ::: | ''system_max'' / ''temporary_max'' | Системный / временный код MAX-бота |
| ''policy_text_version.text_type'' | ''personal_policy'' | Политика обработки персональных данных |
| ::: | ''argeement'' | Соглашение, принимаемое гостем при регистрации |
| ::: | ''argeement_advertisement'' | Согласие на получение рекламных рассылок |
| ::: | ''loyalty_rules'' | Правила программы лояльности |
| ::: | ''age_confirmation'' | Подтверждение возраста |
| ''promotion_trigger.type'' | ''1'' | Обновление баланса Wallet-карты (системный) |
| ::: | ''2'' | Вознаграждение по реферальной программе (системный) |
| ::: | ''3'' | Оповещение о регистрации по реферальной ссылке (системный) |
| ::: | ''4'' | Транзакция в акции «Штампики» |
**Суммы в ''transaction''** (копейки). Поля ''sum_0''–''sum_3'' заполняются по данным r_keeper при применении карты на кассе:
^ Поле ^ Содержимое ^ Знак ^
| ''sum_0'' | Сумма оплаты бонусами | отрицательная при продаже |
| ''sum_1'' | Скидка | отрицательная при продаже |
| ''sum_2'' | Начисление бонусов | положительная при продаже |
| ''sum_3'' | Сумма к оплате (с учётом скидки) | положительная при продаже |
| ''sum_4'' | Сумма ручной операции (пополнение / изъятие) | + пополнение, − изъятие |
При возврате (''chmode = 3'') знаки сумм меняются на противоположные.
===== Режимы чека (chmode) =====
Поле ''chmode'' в таблицах ''transaction'' и ''check'' (а также атрибут ''chmode'' тега ''CHECK'' в XML чека) содержит режим чека r_keeper, переданный кассой через FarCards.
В таблицах ProBonus на практике встречаются только значения ''1'' (оплата) и ''3'' (возврат) — транзакции по завершённым кассовым операциям. У ручных операций (без чека) ''transaction.chmode'' равно ''NULL''.
^ Значение ^ Константа r_keeper ^ Режим ^ Встречается в БД ProBonus ^
| ''1'' | ''XMLchmodeSale'' | **Оплата** — касса проводит оплату заказа | **да** |
| ''3'' | ''XMLchmodeReturn'' | **Возврат** чека после успешного оформления | **да** |
**Важно!** Для определения возврата используйте ''chmode = 3''. Поле ''transaction.is_return'' признаком возврата чека не является: у кассовых транзакций оно содержит ''0'' или ''NULL'' независимо от режима чека.
====== Типовые запросы ======
Примеры запросов для построения собственных отчётов. Запросы только читают данные.
===== Текущий баланс счёта =====
Баланс — сумма записей ''transaction_balance'', действующих в текущий момент. Сгоревшие порции (с истёкшим ''date_stop'') и порции с отложенным начислением (''date_start'' в будущем) в баланс не входят.
SELECT b.account_id,
SUM(b.sum) / 100.0 AS balance_rub
FROM transaction_balance b
WHERE b.account_id = @account_id
AND b.date_start <= GETDATE()
AND b.date_stop > GETDATE()
GROUP BY b.account_id;
===== Гость по номеру телефона =====
SELECT a.id, a.last_name, a.first_name, a.middle_name, g.name AS account_group
FROM phone p
JOIN account a ON a.id = p.account_id
JOIN account_group g ON g.id = a.account_group_id
WHERE p.number = '79991234567'
AND p.is_deleted = 0
AND a.is_deleted = 0;
===== Прогресс гостей по акции «Штампики» =====
Отдельного счётчика штампиков в БД нет: прогресс вычисляется по ''transaction_promo_stamp''. Возвраты (отрицательное количество) вычитаются.
WITH s AS (
SELECT t.account_id, ps.promo_stamp_id,
SUM(CASE WHEN ps.kind = 0 THEN ps.check_dish_qnt ELSE 0 END) AS bought,
SUM(CASE WHEN ps.kind = 1 THEN ps.check_dish_qnt ELSE 0 END) AS redeemed
FROM transaction_promo_stamp ps
JOIN [transaction] t ON t.id = ps.transaction_id
GROUP BY t.account_id, ps.promo_stamp_id
)
SELECT s.account_id,
p.name AS promo,
s.bought AS dishes_bought,
s.bought / p.promo_dish_count * p.gift_dish_count AS gifts_accrued,
s.redeemed AS gifts_redeemed,
s.bought / p.promo_dish_count * p.gift_dish_count - s.redeemed AS gifts_left,
s.bought % p.promo_dish_count AS in_current_cycle
FROM s
JOIN promo_stamp p ON p.id = s.promo_stamp_id
WHERE p.is_deleted = 0 AND s.bought > 0
ORDER BY s.bought DESC;
===== Операции гостя за период =====
SELECT t.date,
CASE t.chmode WHEN 1 THEN 'Продажа' WHEN 3 THEN 'Возврат' ELSE 'Ручная операция' END AS operation,
r.name AS restaurant,
t.sum_3 / 100.0 AS amount_due,
t.sum_1 / 100.0 AS discount,
t.sum_0 / 100.0 AS paid_with_bonuses,
t.sum_2 / 100.0 AS bonus_accrued,
t.sum_4 / 100.0 AS manual_sum,
m.refill_reason
FROM [transaction] t
LEFT JOIN restaurant r ON r.id = t.restaurant_id
LEFT JOIN transaction_manual m ON m.id = t.transaction_manual_id
WHERE t.account_id = @account_id
AND t.date >= @date_from AND t.date < @date_to
ORDER BY t.date;
**Важно!** Имена таблиц ''transaction'', ''check'' и ''user'' совпадают с зарезервированными словами SQL — в запросах их нужно заключать в квадратные скобки: ''[transaction]'', ''[check]'', ''[user]''.
====== Обслуживание базы ======
* **Размер.** Самые объёмные таблицы — ''check'' (XML чеков), ''promotion_actuation_log'', ''transaction'', ''mailing_message'' и ''transaction_balance''. При использовании MS SQL Express учитывайте ограничение 10 ГБ на размер базы; при приближении к нему потребуется переход на редакцию Standard.
* **Резервное копирование.** Настройте регулярное резервное копирование базы средствами SQL Server. Обязательно сделайте резервную копию перед [[external:pro_bonus:99_history:02_update|обновлением ProBonus]] — при обновлении сервер может изменить структуру БД.
* **Доступ для отчётов.** Для внешних отчётов и BI-систем создайте отдельного пользователя SQL с правами только на чтение (роль ''db_datareader''), не используйте учётную запись, под которой работает сервер ProBonus.
* **Версия схемы.** Номер версии в ''db_information.version_num'' позволяет определить, какой версии ProBonus соответствует база, например при переносе базы между серверами.