Files
crm.clientright.ru/ticket_form/docs/CRM_CONTACT_DATA_CONFIRMED_FIELD.md

150 lines
6.0 KiB
Markdown
Raw Normal View 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:
```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. ⏳ Протестировать:
- Создать контакт → поле должно быть "Нет"
- Подтвердить форму → поле должно стать "Да"
- Загрузить черновик → поля должны быть заблокированы