# Добавление поля "Данные подтверждены" в 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: ```python # ✅ Проверяем флаг подтверждения данных контакта из 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`, добавить поддержку нового поля: ```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. ⏳ Протестировать: - Создать контакт → поле должно быть "Нет" - Подтвердить форму → поле должно стать "Да" - Загрузить черновик → поля должны быть заблокированы