Дублікати, видалення, особливості

Дублікати та видалення

Автоматичне виявлення дублікатів

При створенні нового контакту (через форму або API) система перевіряє:

  1. Чи є вже контакт у вашій компанії з таким же нормалізованим телефоном.
  2. Якщо телефон не збігся — чи є контакт із таким же email.

Якщо знайдено — повертається помилка 409 CONFLICT з деталями існуючого контакту:

  • existingId — ID існуючого
  • existingName — ПІБ/назва
  • existingPhone — телефон
  • existingEmail — email

У UI це показується як модалка «Знайдено схожий контакт — продовжити чи відмінити?». Якщо натиснути «Створити все одно», запит відправляється з параметром force=true і дубль все ж створюється.

Нормалізація телефону

Усі телефони перед збереженням нормалізуються через PhoneNormalizer:

Що ввелиУ БД зберігається
+38 (097) 123-45-67380971234567
0971234567380971234567
971234567380971234567
+380971234567380971234567
80971234567 (стара форма)380971234567
+1 555 123 4567 (міжнародний)15551234567

Це означає: пошук, перевірка дублікатів, прив'язка до чатів — все працює незалежно від формату вводу.

Email bounce-tracking

Коли надсилаєте email через CRM і він не доставляється (Mailbox not found, SMTP rejection), у полі emailInvalidAt контакту проставляється дата збою. Майбутні розсилки на цю адресу пропускаються — щоб не псувати репутацію відправника.

Якщо клієнт повідомив правильний email — оновіть поле в картці, emailInvalidAt очиститься.

Видалення контакту

Кнопка «Видалити» внизу картки. Видалення жорстке (hard delete) — запис фізично видаляється з БД, відновити неможливо.

Що відбувається:

  1. У всіх пов'язаних сутностях поле client обнуляється (а не видаляється каскадно):
    • Чати — лишаються, але без прив'язки до контакту.
    • Задачі, нагадування — лишаються, без прив'язки.
    • Дзвінки — лишаються, без прив'язки.
    • Рахунки — лишаються, без прив'язки.
    • Тікети сервісу — лишаються, без прив'язки.
    • Угоди (поле contact) — обнуляється і в soft-deleted угодах.
  2. Сам контакт hard-видаляється з таблиці clients.
  3. Якщо БД повернула DataIntegrityViolation (несподіваний зв'язок який ми не очистили) — повертається 409 з деталями.

Чи треба видаляти

Зазвичай не варто — краще змінити статус на BLOCKED або LOST. Видалення:

  • Втрачає історію (хоча зв'язки лишаються, побачити «що було з цим клієнтом» уже неможливо).
  • Може ламати фінансові звіти (наприклад «оплати від клієнта Х» — контакта вже нема).
  • Не відповідає GDPR-вимогам — для GDPR є окремий механізм «забути дані», який обнуляє PII, а не видаляє запис.

Видалення в рамках GDPR

Якщо клієнт вимагає видалити персональні дані за GDPR — використовуйте механізм у Налаштуваннях → Приватність → «Видалити персональні дані контакту X». Це обнулить ім'я/телефон/email/адресу/нотатки, лишаючи історичні записи (для бухгалтерського обліку), але без можливості ідентифікувати особу.

UTM-параметри

Поля utmSource, utmMedium, utmCampaign, utmContent, utmTerm заповнюються один раз — при першому контакті (наприклад заявка з сайту). При наступних взаємодіях не перетираються. Це first-touch attribution — знаємо звідки клієнт уперше прийшов навіть якщо потім переходив з 10 інших джерел.

Ця стаття була корисною?

Не знайшли потрібного?

Напишіть на info@modalcrm.com — відповімо протягом дня.