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