Files
aiform_dev/docs/CRM_CONTACT_DATA_CONFIRMED_FIELD.md
AI Assistant 080e7ec105 feat: Получение cf_2624 из MySQL и блокировка полей при подтверждении данных
- Добавлен сервис CrmMySQLService для прямого подключения к MySQL CRM
- Обновлён метод get_draft() для получения cf_2624 напрямую из БД
- Реализована блокировка полей (readonly) при contact_data_confirmed = true
- Добавлен выбор банка для СБП выплат с динамической загрузкой из API
- Обновлена документация по работе с cf_2624 и MySQL
- Добавлен network_mode: host в docker-compose для доступа к MySQL
- Обновлены компоненты формы для поддержки блокировки полей
2025-12-04 12:22:23 +03:00

6.0 KiB
Raw Blame History

Добавление поля "Данные подтверждены" в CRM

Шаг 1: Создание кастомного поля в CRM

  1. Зайти в CRM → Настройки → Кастомные поля → Модуль "Контакты"

  2. Создать новое поле:

    • Название: "Данные подтверждены"
    • Тип: "Да/Нет" (Checkbox) или "Список" (Picklist) со значениями "Да"/"Нет"
    • Код поля: cf_2624 (уже создано)
    • По умолчанию: "Нет" (false)
  3. ВАЖНО: Записать номер поля (например, 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"
}

Преимущества подхода:

  1. CRM - источник истины - все данные в одном месте
  2. Нет синхронизации - не нужно синхронизировать флаги между PostgreSQL и CRM
  3. Простота - один флаг в CRM, проверяем его напрямую
  4. Видимость - менеджеры видят статус в карточке контакта
  5. Гибкость - можно менять статус вручную в CRM

Проверка:

  1. Поле создано в CRM: cf_2624
  2. Обновить код backend (использовать cf_2624)
  3. Обновить n8n workflow (использовать cf_2624)
  4. Протестировать:
    • Создать контакт → поле должно быть "Нет"
    • Подтвердить форму → поле должно стать "Да"
    • Загрузить черновик → поля должны быть заблокированы