inCust Knowledge Base
Доменна модельСутності

Сутність «Роздрібний Покупець» в системі inCust

Доменна сутність шару програми лояльності; учасник лояльності Бренду, проекція Користувача на конкретний Бренд. «Клієнт» вживається як неканонічний синонім.

🌐 Public

Сутність «Роздрібний Покупець» в системі inCust

Синоніми: Клієнт (неканонічна назва; канон — «Роздрібний Покупець»).

Що це таке

Роздрібний Покупець — доменна сутність шару програми лояльності inCust, що представляє приватну особу — учасника лояльності конкретного Бренду. Роздрібний Покупець є об'єктом обліку, з яким система пов'язує покупки, кредити, бонусні та клієнтські рахунки, а також купони, додані до гаманця.

Роздрібний Покупець завжди обов'язково асоційований з Користувачем. Запис без зв'язку з Користувачем як Роздрібний Покупець у системі не існує — випадок «обслужений анонімно» представляється окремим конструктом Анонімного покупця, який не є об'єктом цієї сутності та не зберігається як її екземпляр.

Місце в архітектурі

Шар ідентичності (Користувач) → шар лояльності (Роздрібний Покупець) → шар володіння (Бренд) → шар замовника (Бізнес).

Роздрібний Покупець — це проекція Користувача на конкретний Бренд. Один Користувач, який бере участь у лояльності кількох Брендів (у тому числі різних Брендів одного Бізнесу), має окремий запис Роздрібного Покупця в кожному з цих Брендів, з повною ізоляцією даних між ними.

Модель володіння та зв'язки

  • Власник: Бренд. Усі Роздрібні Покупці належать рівно одному Бренду; перенесення між Брендами не передбачено.
  • Унікальність: один Користувач — рівно один Роздрібний Покупець у межах одного Бренду. Дублювання записів на один і той самий Користувач у одному Бренді (наприклад, по одному на Точку продажу або по одному на канал контакту) не допускається.
  • Ізоляція між Брендами: якщо Бізнес має кілька Брендів, Роздрібні Покупці кожного з них є окремими записами і не діляться даними. Спільного «Покупця Бізнесу» не існує.
  • Зв'язок з Користувачем: обов'язковий від моменту створення. Користувач — це шар ідентичності (зареєстрований акаунт inCust); Роздрібний Покупець — це участь цієї ідентичності в лояльності конкретного Бренду.

Атрибути

Канонічно сутність Роздрібний Покупець має такі атрибути:

  • тип доступу Покупця до програми лояльності (access_type) — визначає, які операції з бонусами та рахунками для нього доступні. Канонічні значення:

    • full-bonuses-access — повний доступ до бонусів (нарахування і списання);
    • add-bonuses-only — дозволено лише нарахування бонусів та коштів на рахунки Покупця; списання заблоковано;
    • waiting-for-confirmation — Покупець очікує підтвердження менеджером Бренду; нарахування та списання заблоковані;
    • in-black-list — Покупець у чорному списку.
  • категорія Покупця у програмі лояльності Бренду (card_category) — є окремим керованим об'єктом з полями id, title і type. Поле type має два канонічних значення:

    • base — системна (базова) категорія, наприклад NEW CUSTOMERS;
    • custom — категорія, створена Брендом самостійно (наприклад, GOLD, PLATINUM).

    Категорія Покупця змінюється на Терміналі окремою операцією; присвоєння нової категорії потребує її попереднього існування у переліку категорій Бренду.

  • анкета покупця — список довільних параметрів, склад яких задається Брендом. Кожне поле анкети має ідентифікатор, назву, порядок відображення, тип значення (рядок, словник із фіксованим набором значень, ціле число, дата) і саме значення. Брендом може бути заведена довільна кількість таких полів.

  • номер картки лояльності — власний ідентифікатор Покупця у межах Бренду, який можна використовувати на Терміналі поряд з ідентифікаторами пов'язаного Користувача.

  • картка для Apple Wallet — цифрове представлення картки лояльності Покупця у форматі Apple Wallet.

Решта особистих даних (телефон, email, ім'я, дата народження, стать тощо) належить шару ідентичності — Користувачу — і не дублюється на рівні Роздрібного Покупця.

Канонічне джерело визначень access_type, card_category, анкети покупця — DOC-031, розділи «Отримання категорій покупців», «Отримання даних про покупця», «Зміна типу доступу покупця», «Зміна категорії покупця», «Отримання анкети покупця».

Ідентифікація на Терміналі

Касир знаходить існуючого Роздрібного Покупця за будь-яким ідентифікатором пов'язаного Користувача (телефон, email, зовнішній ідентифікатор тощо) або за номером картки лояльності як додатковим власним ідентифікатором Покупця.

Чим Роздрібний Покупець володіє і з чим пов'язаний

Канонічно з Роздрібним Покупцем пов'язані Купони, баланс Кредитів та історія покупок, проте характер цього зв'язку різний.

Окремі сутності, якими Роздрібний Покупець володіє

  • Купон — стає власністю Покупця тільки після додавання до його гаманця (встановлення зв'язку). До цього моменту Купон існує як самостійна сутність без власника-Покупця.
  • Покупка — кожна покупка є окремою сутністю, пов'язаною з Роздрібним Покупцем.
  • Кредит — кожне нарахування або списання є окремою сутністю, пов'язаною з Роздрібним Покупцем.
  • Екземпляр бонусного рахунку — окрема сутність, пов'язана з Роздрібним Покупцем.
  • Екземпляр клієнтського рахунку — окрема сутність, пов'язана з Роздрібним Покупцем.

Не є окремими сутностями, а є агрегатами, якими володіє Роздрібний Покупець

  • Баланс Кредитів — похідне значення зі списку пов'язаних Кредитів.
  • Історія покупок — список пов'язаних Покупок.
  • Список екземплярів клієнтських рахунків.
  • Список екземплярів бонусних рахунків.
  • Гаманець — складений агрегат, що містить списки Купонів і рахунків (екземплярів бонусних та клієнтських рахунків) Покупця.

Життєвий цикл

Створення

Запис Роздрібного Покупця створюється за одним з трьох канонічних тригерів:

  1. Перша покупка на Терміналі — Покупець заводиться автоматично у процесі обслуговування на Точці продажу.
  2. Ручне додавання касиром — на Терміналі під час або поза процесом покупки.
  3. Ручне додавання або імпорт у Панелі управління Бізнесом — операторами Бізнесу / Бренду.

Реєстрація Користувача сама по собі не створює Роздрібного Покупця в жодному Бренді — Користувач і Роздрібний Покупець є окремими сутностями різних шарів, і участь у програмі лояльності конкретного Бренду — окрема подія. Виняток: реєстрація Користувача через White Label додаток може автоматично створювати Роздрібного Покупця Бренду, якщо це явно задано у налаштуваннях такого додатку.

Видалення Роздрібного Покупця

Видалення Роздрібного Покупця відбувається за моделлю soft-delete: запис не видаляється фізично, а позначається як видалений, зберігаючи цілісність історичних посилань (Покупок, Кредитів, рахунків).

За окремим зверненням пов'язаного Користувача дані Роздрібного Покупця можуть бути повністю анонімізовані згідно з вимогами GDPR — у цьому випадку особисті ідентифікатори видаляються, а агрегатні та операційні записи зберігаються в знеособленому вигляді.

Поведінка при видаленні пов'язаного Користувача

Якщо пов'язаний Користувач видаляється, Роздрібний Покупець переходить у термінальний стан: історичні дані зберігаються, будь-які нові операції з Покупцем неможливі. Цей стан незворотній — відновлення Покупця та продовження роботи з ним за поверненням Користувача не передбачено.

Якщо та сама фізична особа згодом знову захоче брати участь у програмі лояльності Бренду, це можливо лише після повної анонімізації попереднього Користувача. У цьому випадку система розглядає її як нового Користувача, для якого створюється новий Роздрібний Покупець — без жодного зв'язку зі старими записами, історією покупок чи балансами.

Поведінка при видаленні Бренду

Видалення Бренду відбувається виключно за моделлю soft-delete.

API-поверхня

Сутність Роздрібного Покупця має поверхню у трьох з шести API inCust. User API (KNOW-007) і Corporate Client API (KNOW-011) до Роздрібного Покупця не стосуються: перший працює виключно з шаром ідентичності (Користувач), другий — з окремою сутністю Корпоративного Покупця.

Terminal API (канонічне джерело)

Див. Swagger Terminal API (KNOW-009), DOC-031. Інтерфейс касира і Терміналу.

Ідентифікація і пошук:

МетодШляхПризначення
POST/customersЗнайти Покупця за масивом ідентифікаторів і повернути його дані
GET/customers/all/searchРозширений пошук серед Покупців (Роздрібних і Корпоративних)
GET/customers/identificationПерелік ідентифікаторів Покупця
POST/customers/identificationДодати ідентифікатор пов'язаному Користувачу
DELETE/customers/identificationВидалити ідентифікатор
GET/display_customerПоточний Покупець на дисплеї касира

Створення і життєвий цикл:

МетодШляхПризначення
POST/customers/addСтворити Користувача і одночасно Роздрібного Покупця
POST/customers/consentЗафіксувати згоду Покупця

Атрибути:

МетодШляхПризначення
GET PATCH/customers/access_typeПрочитати / змінити access_type
GET PATCH/customers/card_categoryПрочитати / змінити card_category
GET PATCH/questionnaireЗначення полів анкети покупця
GET/customer_fieldsСхема доступних полів анкети (визначається Брендом)

Гаманець та операції з агрегатами:

МетодШляхПризначення
GET/customers/benefits/accountsСписок екземплярів рахунків Покупця
GET/customers/benefits/accounts/{account_id}Один екземпляр рахунку
GET/customers/benefits/bonusesБаланс Кредитів
GET/customers/benefits/bonuses/{currency}Баланс Кредитів у конкретній валюті
GET/customers/benefits/couponsКупони у гаманці
POST/customers/benefits/topupПоповнити рахунок
POST/customers/benefits/write_offСписати з рахунку
POST/customers/benefits/adjustКорекція (одним викликом нарахування або списання)

Чеки і фіскалізація:

МетодШляхПризначення
GET/transactions/receipt/customer/print/requiredТранзакції, для яких треба друкувати чек Покупцю
GET/transactions/receipt/customer/print/{transaction_id}/processedПозначити чек як надрукований

Ендпоінти виду /customers/{user_id_value}/... і /questionnaire/{user_id_value}/... у специфікації позначені як DEPRECATED — це старі варіанти з ID в URL, замінені на ідентифікацію через тіло запиту. У новому коді спиратися на сучасні варіанти зі списків вище.

Business API

Див. Swagger Business API (KNOW-006). Адмін-кабінет Бізнесу/Бренду; третій канонічний тригер створення Покупця (ручне додавання та імпорт).

Адміністрування окремого Покупця:

МетодШляхПризначення
GET POST PATCH/customerЗнайти / створити / змінити Покупця
GET/customer/{user_id}Дані конкретного Покупця
POST/customer/consentДодати згоду Покупця
PATCH/customer/accessЗмінити access_type
POST/customer/importІмпорт списку Покупців
GET/customer/import/preferencesНалаштування формату імпорту
POST/customer/customers_bulk_idsID для bulk-операцій
POST/customersСписок Покупців Бізнесу або програми лояльності
GET/customers/{user_id}/user_profileПрофіль пов'язаного Користувача (cross-layer Customer → User)

Анкета покупця (схема):

МетодШляхПризначення
GET POST PATCH/customer/fieldПоля анкети
DELETE PATCH/customer/field/{field_id}Окреме поле

Кредити Покупця:

МетодШляхПризначення
GET/customer/{user_id}/bonusesБаланс і історія Кредитів
POST/customer/{user_id}/bonuses/{currency}/refillНарахувати
POST/customer/{user_id}/bonuses/{currency}/write_offsСписати
POST/customer/{user_id}/bonuses/{currency}/adjustКорекція

Екземпляри спецрахунків Покупця:

МетодШляхПризначення
GET POST/customer/{user_id}/special_accountsСписок / додати екземпляр
GET PATCH/customer/{user_id}/special_accounts/{account_id}Один екземпляр
POST/customer/{user_id}/special_accounts/{account_id}/refillПоповнити
POST/customer/{user_id}/special_accounts/{account_id}/write_offsСписати
POST/customer/{user_id}/special_accounts/{account_id}/adjustКорекція
GET/customer/{user_id}/special_accounts/{account_id}/goodsДоступні товари за цим спецрахунком
GET PATCH/business/special_account/{account_id}/loyalty/{loyalty_id}/customersСписок Покупців спецрахунку / прив'язати спецрахунок до Покупця

Категорії карток лояльності (конфігурація card_category):

МетодШляхПризначення
GET POST/loyalty/{loyalty_id}/card_categoriesСписок / створити категорію
GET PATCH/loyalty/{loyalty_id}/card_categories/{category_id}Окрема категорія
POST DELETE/loyalty/{loyalty_id}/card_categories/{category_id}/imageЗображення категорії
GET POST PATCH/loyalty/{loyalty_id}/card_categories_rulesПравила переходу між категоріями
GET PATCH/loyalty/{loyalty_id}/card_categories_settingsЗагальні налаштування системи категорій

Існує близько п'ятнадцяти додаткових ендпоінтів виду /card_categories/{id}/currencies/.../price_options і /taxes — конфігурація знижок і податків на рівні категорії; до самої сутності Покупця не стосуються.

Зовнішні форми:

МетодШляхПризначення
GET/customer/{user_id}/external_formsЗовнішні форми, заповнені Покупцем

Client API

Див. Swagger Client API (KNOW-008). Тут Покупець — сам актор. Усі ендпоінти неявно в контексті поточного авторизованого Покупця.

Власний гаманець і агрегати:

МетодШляхПризначення
GET/walletГаманець Покупця (агрегат: купони + рахунки)
GET/loyalty/{loyalty_id}Дані конкретної програми лояльності (= конкретного запису Покупця в одному з Брендів)
GET/loyalty/{loyalty_id}/customers/addДоєднатися до програми лояльності
GET POST/loyalty/{loyalty_id}/customers/cardsКартки лояльності Покупця
GET/loyalty/{loyalty_id}/customers/temporary_code/generateТимчасовий код ідентифікації Покупця для каси

Купони у гаманці:

МетодШляхПризначення
GET/couponsСписок Купонів
POST/couponsДодати Купон у гаманець (момент, коли Купон стає власністю Покупця)
GET/coupon/{coupon_id}Один Купон
GET/coupon/{coupon_id}/redeemАктивувати / використати Купон
GET/coupon/{coupon_id}/shareПоділитися кодом
DELETE/coupon/{coupon_id}Видалити Купон з гаманця
GET/coupons/coupon/{code}Інформація про Купон до додавання

Перекази між Покупцями:

МетодШляхПризначення
POST/loyalty/{loyalty_id}/customers/benefits/transfer/bonusesПереказати Кредити іншому Покупцю того ж Бренду
POST/loyalty/{loyalty_id}/customers/benefits/transfer/accountsПереказати кошти зі спецрахунку

Apple Wallet:

МетодШляхПризначення
GET/pkpass/loyalty/{loyalty_id}/customers/card/{card_id}/generateЗгенерувати .pkpass файл картки лояльності

Платіжний гаманець (/pmt/wallet/*) — окрема підсистема, накладена поверх Покупця:

МетодШляхПризначення
GET/pmt/walletМобільний платіжний гаманець
POST/pmt/wallet/paymentОплата з гаманця
POST/pmt/wallet/payment/otpOTP-підтвердження
POST/pmt/wallet/payment/statusСтатус оплати
POST/pmt/wallet/cardpassword/{action}Керування паролем картки
GET POST/pmt/wallet/{wallet_type}Робота з конкретним типом платіжного гаманця

Зворотний звʼязок:

МетодШляхПризначення
GET POST/customer_feedback/feedbacksСписок / створити відгук Покупця
GET PATCH DELETE/customer_feedback/feedbacks/{feedback_id}Окремий відгук
POST/customer_feedback/feedbacks/{feedback_id}/completeЗавершити відгук
POST GET DELETE/customer_feedback/feedbacks/{feedback_id}/attachments/...Файли (фото / відео / аудіо) до відгуку
GET/customer_feedback/feedback_sources/{source_id}Дані джерела відгуку

Відповідність «атрибут — ендпоінти»

Зведена таблиця для швидкого пошуку: який атрибут якими ендпоінтами читається/змінюється.

Атрибут з канонуКанонічне джерело (Terminal API, DOC-031)Адмін-сторона (Business API)Сторона Покупця (Client API)
access_typeGET/PATCH /customers/access_typePATCH /customer/access
card_categoryGET/PATCH /customers/card_categoryGET/POST/PATCH /loyalty/{id}/card_categories[…] (схема)
анкета покупцяGET/PATCH /questionnaire, GET /customer_fieldsGET/POST/PATCH /customer/field[…] (схема)
номер картки лояльностічерез POST /customers (ідентифікація)GET/POST /loyalty/{id}/customers/cards
картка для Apple WalletGET /pkpass/loyalty/{id}/customers/card/{cid}/generate

Джерела з Shared Drive

  • DOC-031 — REST API Термінала inCust (веб-документація): канонічне джерело визначень access_type, card_category, анкети покупця.

On this page