Дублікати, видалення, особливості
Дублікати та видалення
Автоматичне виявлення дублікатів
При створенні нового контакту (через форму або API) система перевіряє:
- Чи є вже контакт у вашій компанії з таким же нормалізованим телефоном.
- Якщо телефон не збігся — чи є контакт із таким же email.
Якщо знайдено — повертається помилка 409 CONFLICT з деталями існуючого контакту:
- existingId — ID існуючого
- existingName — ПІБ/назва
- existingPhone — телефон
- existingEmail — email
У UI це показується як модалка «Знайдено схожий контакт — продовжити чи відмінити?». Якщо натиснути «Створити все одно», запит відправляється з параметром force=true і дубль все ж створюється.
Нормалізація телефону
Усі телефони перед збереженням нормалізуються через PhoneNormalizer:
| Що ввели | У БД зберігається |
|---|---|
+38 (097) 123-45-67 | 380971234567 |
0971234567 | 380971234567 |
971234567 | 380971234567 |
+380971234567 | 380971234567 |
80971234567 (стара форма) | 380971234567 |
+1 555 123 4567 (міжнародний) | 15551234567 |
Це означає: пошук, перевірка дублікатів, прив'язка до чатів — все працює незалежно від формату вводу.
Email bounce-tracking
Коли надсилаєте email через CRM і він не доставляється (Mailbox not found, SMTP rejection), у полі emailInvalidAt контакту проставляється дата збою. Майбутні розсилки на цю адресу пропускаються — щоб не псувати репутацію відправника.
Якщо клієнт повідомив правильний email — оновіть поле в картці, emailInvalidAt очиститься.
Видалення контакту
Кнопка «Видалити» внизу картки. Видалення жорстке (hard delete) — запис фізично видаляється з БД, відновити неможливо.
Що відбувається:
- У всіх пов'язаних сутностях поле
clientобнуляється (а не видаляється каскадно):- Чати — лишаються, але без прив'язки до контакту.
- Задачі, нагадування — лишаються, без прив'язки.
- Дзвінки — лишаються, без прив'язки.
- Рахунки — лишаються, без прив'язки.
- Тікети сервісу — лишаються, без прив'язки.
- Угоди (поле
contact) — обнуляється і в soft-deleted угодах.
- Сам контакт hard-видаляється з таблиці
clients. - Якщо БД повернула DataIntegrityViolation (несподіваний зв'язок який ми не очистили) — повертається 409 з деталями.
Чи треба видаляти
Зазвичай не варто — краще змінити статус на BLOCKED або LOST. Видалення:
- Втрачає історію (хоча зв'язки лишаються, побачити «що було з цим клієнтом» уже неможливо).
- Може ламати фінансові звіти (наприклад «оплати від клієнта Х» — контакта вже нема).
- Не відповідає GDPR-вимогам — для GDPR є окремий механізм «забути дані», який обнуляє PII, а не видаляє запис.
Видалення в рамках GDPR
Якщо клієнт вимагає видалити персональні дані за GDPR — використовуйте механізм у Налаштуваннях → Приватність → «Видалити персональні дані контакту X». Це обнулить ім'я/телефон/email/адресу/нотатки, лишаючи історичні записи (для бухгалтерського обліку), але без можливості ідентифікувати особу.
UTM-параметри
Поля utmSource, utmMedium, utmCampaign, utmContent, utmTerm заповнюються один раз — при першому контакті (наприклад заявка з сайту). При наступних взаємодіях не перетираються. Це first-touch attribution — знаємо звідки клієнт уперше прийшов навіть якщо потім переходив з 10 інших джерел.