- Добавлен сервис CrmMySQLService для прямого подключения к MySQL CRM - Обновлён метод get_draft() для получения cf_2624 напрямую из БД - Реализована блокировка полей (readonly) при contact_data_confirmed = true - Добавлен выбор банка для СБП выплат с динамической загрузкой из API - Обновлена документация по работе с cf_2624 и MySQL - Добавлен network_mode: host в docker-compose для доступа к MySQL - Обновлены компоненты формы для поддержки блокировки полей
6.0 KiB
6.0 KiB
Добавление поля "Данные подтверждены" в CRM
Шаг 1: Создание кастомного поля в CRM
-
Зайти в CRM → Настройки → Кастомные поля → Модуль "Контакты"
-
Создать новое поле:
- Название: "Данные подтверждены"
- Тип: "Да/Нет" (Checkbox) или "Список" (Picklist) со значениями "Да"/"Нет"
- Код поля:
cf_2624✅ (уже создано) - По умолчанию: "Нет" (false)
-
ВАЖНО: Записать номер поля (например,
cf_2624)
Шаг 2: Обновление backend для проверки поля в CRM
Файл: ticket_form/backend/app/api/claims.py
В функции get_draft() вместо проверки PostgreSQL, проверяем поле в CRM:
# ✅ Проверяем флаг подтверждения данных контакта из CRM
unified_id = row.get('unified_id')
contact_data_confirmed = False
contact_data_can_edit = True
contact_data_confirmed_at = None
contact_data_from_crm = None
if unified_id:
# Получаем contact_id из payload
contact_id = payload.get('contact_id') if isinstance(payload, dict) else None
if contact_id:
try:
# Получаем данные контакта из CRM
async with httpx.AsyncClient(timeout=30.0) as client:
# 1. Get Challenge
challenge_response = await client.get(
f"{settings.crm_webservice_url}",
params={"operation": "getchallenge", "username": "api"}
)
challenge_data = challenge_response.json()
token = challenge_data.get("result", {}).get("token", "")
# 2. Login
import hashlib
salt = "4r9ANex8PT2IuRV"
access_key = hashlib.md5((token + salt).encode()).hexdigest()
login_response = await client.post(
f"{settings.crm_webservice_url}",
data={
"operation": "login",
"username": "api",
"accessKey": access_key
}
)
login_data = login_response.json()
session_name = login_data.get("result", {}).get("sessionName", "")
# 3. Retrieve Contact
retrieve_response = await client.post(
f"{settings.crm_webservice_url}",
data={
"operation": "retrieve",
"sessionName": session_name,
"id": f"12x{contact_id}"
}
)
retrieve_data = retrieve_response.json()
if retrieve_data.get("success") and retrieve_data.get("result"):
contact_data_from_crm = retrieve_data["result"]
# ✅ Проверяем кастомное поле "Данные подтверждены"
confirmed_field = contact_data_from_crm.get("cf_2624", "0") # "1" = да, "0" = нет
contact_data_confirmed = confirmed_field == "1" or confirmed_field == "true"
contact_data_can_edit = not contact_data_confirmed
logger.info(
f"🔒 Статус данных контакта из CRM: confirmed={contact_data_confirmed}, "
f"field_value={confirmed_field}"
)
except Exception as e:
logger.warning(f"⚠️ Не удалось загрузить данные из CRM: {str(e)}")
Шаг 3: Обновление n8n workflow для установки поля
В workflow 6mxRJ2LLHmQXyaDz
После подтверждения формы (после SMS-верификации) добавить ноду:
Название: HTTP Request: Set Contact Data Confirmed
Метод: POST
URL: {{ $env.CRM_WEBSERVICE_URL }}
Body (form-data):
operation: revise
sessionName: {{ $('Login to CRM').json.sessionName }}
id: 12x{{ JSON.parse($node['CreateWebContacКлиентправ'].json.result).contact_id }}
cf_2624: 1
Где:
cf_2624- поле "Данные подтверждены"1= "Да" (данные подтверждены)
Шаг 4: Обновление UpsertContact (если используется)
Если используется UpsertContact.php, добавить поддержку нового поля:
// В функции vtws_upsertcontact()
if (!empty($data_confirmed)) {
$params['cf_2624'] = $data_confirmed; // "1" или "0"
}
Преимущества подхода:
- ✅ CRM - источник истины - все данные в одном месте
- ✅ Нет синхронизации - не нужно синхронизировать флаги между PostgreSQL и CRM
- ✅ Простота - один флаг в CRM, проверяем его напрямую
- ✅ Видимость - менеджеры видят статус в карточке контакта
- ✅ Гибкость - можно менять статус вручную в CRM
Проверка:
- ✅ Поле создано в CRM:
cf_2624 - ⏳ Обновить код backend (использовать
cf_2624) - ⏳ Обновить n8n workflow (использовать
cf_2624) - ⏳ Протестировать:
- Создать контакт → поле должно быть "Нет"
- Подтвердить форму → поле должно стать "Да"
- Загрузить черновик → поля должны быть заблокированы