====== Структура базы данных 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 соответствует база, например при переносе базы между серверами.